Saltu al la enhavo
Reen al Nymbot

Sciobazo Programistoj

Bildoj, aŭdio kaj enmetoj

La generiloj el la aplikaĵo, kaj la konstruiloj por serĉado: bildoj, video, parolo, transskribo kaj enbedoj, ĉiu fakturata laŭ uzado el via saldo.

Generante bildojn

Faras unu ĝis kvar bildojn el instigo kaj redonas ilin kiam ili estas finitaj. Estas la sama aro de generiloj kiel ?image en la aplikaĵo.

POST https://nymbot.ai/api/v1/images/generations — bezonas API-ŝlosilon, aŭ fulmbranda pago por peto.

Idoj venas de GET /api/v1/models?type=image. La norma generilo, @cf/black-forest-labs/flux-1-schnell, kostas fiksan 5 normajn kreditojn (50 sats) por bildo. Ĉiu alia generilo elspezas Pro-kreditojn je sia propra prezo, kun la kutima leĝo kaj margeno, kiel en la aplikaĵo. n bildoj kostas n fojojn pli multe. Kampo, kiun generilo ne prenas, estas forigita anstataŭ malakceptita; la norma generilo uzas nur la instrukcion.

KampoSkribiDezirindataPriskribo
modelŝnuroJesGenerilo-identigilo, kiel ekzemple nano-banana.
promptŝnuroJesKion desegni. Nur la unuaj 2 000 signoj estas uzataj.
nentiera nombroNe1 ĝis 4. Defaŭlto 1. Ankaŭ akceptata kiel num_images.
sizeŝnuroNeProporcio kiel ekzemple "16:9", aŭ OpenAI-grandeco kiel ekzemple "1792x1024", kio fariĝas la plej proksima al 1:1, 16:9, 9:16, 4:3, 3:4, 3:2, 2:3, 21:9, 5:4 kaj 4:5. "auto" lasas tion al la generilo.
aspect_ratioŝnuroNeLa sama kiel size, kaj venkas se ambaŭ estas senditaj.
qualityŝnuroNeGeneril-specifa, kiel ekzemple "low", "medium" aŭ "high".
negative_promptŝnuroNeKion lasi ekster.
output_formatŝnuroNe"png", "jpeg" aŭ "webp".
response_formatŝnuroNe"url" (la defaŭlto) aŭ "b64_json".
image_urlŝnuroNeBildo por komenci de: an https:// ligilo de maksimume 4 096 signoj sen uzantnomo aŭ pasvorto en ĝi, aŭ data:image/…;base64 URL (PNG, JPEG, WebP aŭ GIF; ne SVG). Nur por generiloj kun edit; postulatas de tiuj kun requires_image_url.

resolution ne estas uzata: ĉiu generilo faras sian propran grandeconon. Kun url, ĉiu bildo estas ŝarĝita al publika Blossom-gastigilo kaj vi ricevas ĝian ligilon (nur kelkaj generiloj redonas sian propran ligilon, kiu estas transdonata). Ĉiu kun la ligilo povas malfermi ĝin kaj ĝi ne povas esti denove forigita; vidu kion la API povas vidi. Kun b64_json la bildo revenas en la respondo kaj neniam estas elŝutita. Bildo sendita kiel a data: URL en image_url estas kontrolata laŭlaŭta maniero kiel an redakti kaj unue ŝarĝita al Blossom por ke la generilo povu tiri ĝin; ĝi estas denove forigita se la peto malsukcesas sen fakturado.

Se iuj el la n bildoj malsukcesas, vi ricevas tiujn, kiuj sukcesis, estas pagita nur por tiuj (plus ajn, kiujn la provizanto fakturis malgraŭ malsukceso), kaj nymbot.failed diras kiom da ili mankas. Se ĉiu malsukcesas, la peto revenas 502.

Respondo

{
  "created": 1790726400,
  "model": "nano-banana",
  "cost": 0.2126,
  "data": [
    {
      "url": "https://blossom.example/5c0e4b7d3a91f2e8...c4.png",
      "content_type": "image/png"
    }
  ],
  "nymbot": { "balance": "pro", "charged_credits": 1.817, "charged_sats": 181.7, "balance_credits": 410.608, "balance_sats": 41060.8 }
}
StatoKiam
400Neniu instrukcio; n ekster 1 ĝis 4 (invalid_value); malbona grandeco (invalid_size) aŭ bildo (invalid_image, invalid_image_url); modelo kiu ekzistas sed ne estas bildgenerilo (invalid_model); bildo por generilo kiu ne povas redakti (edit_unsupported); neniu bildo por iu, kiu bezonas ĝin (image_required).
402La saldo ne povas kovri ĉiun bildon petitan.
404Neniu modelo per tiu nomo (model_not_found).
502La generilo malsukcesis (upstream_error). Nio estas ŝarĝata krom se la provizanto fakturis por la provo; tiam la eraro havas charged_sats.
503Bildoj ne povas esti gastigitaj nuntempe (media_hosting_unavailable). b64_json ankoraŭ funkcias.

cURL

curl https://nymbot.ai/api/v1/images/generations \
  -H "Authorization: Bearer $NYMBOT_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "nano-banana",
    "prompt": "A lighthouse at dusk, oil painting",
    "size": "16:9"
  }'

Python

import os
import requests

res = requests.post(
    "https://nymbot.ai/api/v1/images/generations",
    headers={"Authorization": "Bearer " + os.environ["NYMBOT_API_KEY"]},
    json={"model": "nano-banana", "prompt": "A lighthouse at dusk, oil painting", "size": "16:9"},
)
res.raise_for_status()
print(res.json()["data"][0]["url"])

JavaScript

const res = await fetch("https://nymbot.ai/api/v1/images/generations", {
  method: "POST",
  headers: {
    "Authorization": "Bearer " + process.env.NYMBOT_API_KEY,
    "Content-Type": "application/json",
  },
  body: JSON.stringify({ model: "nano-banana", prompt: "A lighthouse at dusk, oil painting", size: "16:9" }),
});
const body = await res.json();
console.log(body.data[0].url);

Redakti bildojn

Ŝanĝas bildon, kiun vi ŝarĝas, laŭ instrukcio. Ĉi tio estas OpenAI-redakta punkto, do la OpenAI SDK-oj images.edit funkcias tiel, kiel ĝi estas. Nur Pro generiloj kun edit en la model listo akceptu ĝin.

POST https://nymbot.ai/api/v1/images/edits — bezonas API-ŝlosilon, aŭ fulmbranda pago por peto. La korpo estas multipart/form-data, ĝis 32 MB.

KampoSkribiDezirindataPriskribo
imagedosieroJesLa bildo por redakti: PNG, JPEG, WebP aŭ GIF, ĝis 20 MB. Ankaŭ akceptata kiel image[]; la unua estas uzata.
promptŝnuroJesKion ŝanĝi.
modelŝnuroJesGenerilo kun edit.
nentiera nombroNe1 ĝis 4.
size
aspect_ratio
quality
negative_prompt
output_format
ŝnuroNeKuvante pri generado.
response_formatŝnuroNe"b64_json" (la defaŭlto ĉi tie) aŭ "url".

La bildo, kiun vi alŝutas, estas kontrolata por esti bone formita PNG, JPEG, WebP aŭ GIF, sendita per sia reala tipo, kaj metita sur publikan Blossom-gastigilon, ĉar la generiloj alŝutas sian enigon per ligilo. Traktu ĝin kiel publika. Se la redakto malsukcesas kaj io ajn ne estas elŝutita, la gastigita kopio estas denove forigita. La respondo havas la saman formon kiel por generado. La prezo estas la prezo de la generilo, kio por iuj generiloj inkluzivas kargon por la eniga bildo.

Respondo

{
  "created": 1790726460,
  "model": "nano-banana",
  "cost": 0.2126,
  "data": [{ "b64_json": "iVBORw0KGgoAAAANSUhEUgAA..." }],
  "nymbot": { "balance": "pro", "charged_credits": 1.817, "charged_sats": 181.7, "balance_credits": 408.791, "balance_sats": 40879.1 }
}
StatoKiam
400Neniu bildo aŭ instrukcio, dosiero kiu ne estas bildo (invalid_image), aŭ generilo, kiu ne povas redakti (edit_unsupported).
413La bildo estas pli ol 20 MB (file_too_large), aŭ la tuta peto super 32 MB.
503La bildo ne povas esti gastigita nuntempe (media_hosting_unavailable).

cURL

curl https://nymbot.ai/api/v1/images/edits \
  -H "Authorization: Bearer $NYMBOT_API_KEY" \
  -F model=nano-banana \
  -F [email protected] \
  -F prompt="Make it a snowy evening"

Python

import base64, os
from openai import OpenAI

client = OpenAI(base_url="https://nymbot.ai/api/v1", api_key=os.environ["NYMBOT_API_KEY"])

with open("photo.png", "rb") as f:
    result = client.images.edit(model="nano-banana", image=f, prompt="Make it a snowy evening")

with open("edited.png", "wb") as out:
    out.write(base64.b64decode(result.data[0].b64_json))

JavaScript

import fs from "node:fs";
import { writeFile } from "node:fs/promises";
import OpenAI from "openai";

const client = new OpenAI({ baseURL: "https://nymbot.ai/api/v1", apiKey: process.env.NYMBOT_API_KEY });

const result = await client.images.edit({
  model: "nano-banana",
  image: fs.createReadStream("photo.png"),
  prompt: "Make it a snowy evening",
});
await writeFile("edited.png", Buffer.from(result.data[0].b64_json, "base64"));

Videovideo

Video preĝas minutojn, do ĝi funkcias en la fono. Vi sendas ĝin, ricevas identigilon tuj, kaj demandas pri la identigilo ĝis ĝi estas finita. Ĉiu video-generilo eluzas la Pro-saldon.

POST https://nymbot.ai/api/v1/videos — bezonas API-ŝlosilon, aŭ fulmbranda pago por peto. Reiras 202.

KampoSkribiDezirindataPriskribo
modelŝnuroJesVideo generilo ID de GET /api/v1/models?type=video, kiel veo.
promptŝnuroJesKio devus okazi.
durationnumero aŭ ĉenetoNeLongeco en sekundoj, pli ol 0 kaj ĝis 60. Uzata nur de generiloj, kiuj permesas al vi elekti la longecon; la aliaj faras sian kutiman longecon, kio estas seconds en la respondo kaj la prezo sekvas.
aspect_ratioŝnuroNeKiel ekzemple "16:9" aŭ "9:16"; tamaĝo kiel ekzemple "1280x720" fariĝas la plej proksima raporto.
resolution
quality
ŝnuroNeUnu el la generatitoj de resolutions en la modelo-listo, kiel ekzemple "720p" aŭ "1080p"Ĝi starigas la prezon. Ĉio alia estas rifuzata kun unsupported_resolution.
image_urlŝnuroNeBildo por komenci de: an https:// ligilo aŭ a data:image/… URL, kiu estas unue ŝarĝita al publika Blossom-gastigilo. De uzata de generiloj kun requires_image_url.

La prezo estas fiksita kiam vi submetas, laŭ la generilo, la rezolucio kaj la longo, do ĝi estas elŝargita el via Pro-saldo tuj kiam la provizanto akceptas la taskon, kaj montrita kiel cost, estimated_cost kaj nymbotSe la provizanto rifuzas la taskon, nenio estas elŝargita. Se la rendero poste malsukcesas, aŭ la finita klippo ne povas esti stoka kaj la provizanto ne fakturis ĝin, la elŝarĝo estas ralserita unufoje, aŭtomate. Rendero, kiu ankoraŭ daŭras post unu horo, estas rezignata, kaj konservas sian elŝarĝon, ĉar la provizanto fakturas renderon tuj kiam ĝi akceptas ĝin. Refundado redonas la kreditojn sed ne malpliigas la elspezojn de la ŝlosilo.

Respondo (202)

{
  "id": "vid_3e9a51c07b2f4d86e0a1c4f2",
  "object": "video",
  "model": "veo",
  "status": "in_progress",
  "created": 1790726400,
  "seconds": 8,
  "resolution": "1080p",
  "estimated_cost": 3.18,
  "expires_at": 1790812800,
  "cost": 3.18,
  "nymbot": { "balance": "pro", "charged_credits": 31.8, "charged_sats": 3180, "balance_credits": 378.808, "balance_sats": 37880.8 }
}

status komencas kiel in_progress, aŭ completed kun la video jam en data kiam la generilo tuj redonis ĝin.

Kontrolante videon

GET https://nymbot.ai/api/v1/videos/{id} — bezonas ŝlosilon apartenan al la nimo, kiu sendis ĝin. Ŝlosilo, kiu atingis sian limon, ankoraŭ povas kontroli.

Ĝi respondas 202 dum la video estas farata kaj 200 な once ĝi estas finita aŭ malsukcesis. Demandu ĉiun 5 ĝis 10 sekundojn. Ĉiu kontrolo demandas la provizanton unufoje kaj respondas unufoje; ĝi neniam atendas la videon. Tasko estas konservata dum 24 horoj post kiam ĝi estis sendita. GET /api/v1/videos listigas la lastajn 50 taskojn de la ŝlosilo kiel {"object": "list", "data": […]}.

Respondo (200)

{
  "id": "vid_3e9a51c07b2f4d86e0a1c4f2",
  "object": "video",
  "model": "veo",
  "status": "completed",
  "created": 1790726400,
  "seconds": 8,
  "resolution": "1080p",
  "estimated_cost": 3.18,
  "expires_at": 1790812800,
  "completed_at": 1790726590,
  "data": { "url": "https://blossom.example/9b41d0c2e7a3f658...1e.mp4", "content_type": "video/mp4" },
  "cost": 3.18,
  "nymbot": { "balance": "pro", "charged_credits": 31.8, "charged_sats": 3180 }
}

status estas in_progress, completed aŭ failed. A malkonpletita labor portas error ({"code": "generation_failed", "message": …}); se ĝi estis refundita, cost ĉu 0 kaj nymbot aldonoj refunded_credits kaj refunded_sats. La finita video estas sur publika Blossom gastigilo, kiel generitaj bildoj.

StatoKiam
400Neniu instrukcio; daŭro ekster 0 ĝis 60 (invalid_value); resolvo kiun la generilo ne ofertas (unsupported_resolution); neniu bildo por generilo, kiu bezonas tian (image_required); modelo kiu ne estas videogenerilo (invalid_model).
402La Pro-ekvilibro ne povas kovri la videon.
404Neniu tia generilo (model_not_found), aŭ neniu tasko per tiu identigilo por via nomo, aŭ ĝi estas pli ol 24 horojn malnova (video_not_found).
429Via nomo jam havas 10 videojn rendante (video_jobs_limit). Kontrolu ilin kaj submetu pliajn, kiam unu finos.
502La generilo rifuzis la taskon. Nio estas ŝarĝita krom se la provizanto fakturis ĝin.
503Videoj ne povas esti liveritaj aŭ stokitaj nun (media_hosting_unavailable, service_unavailable).

cURL

curl https://nymbot.ai/api/v1/videos \
  -H "Authorization: Bearer $NYMBOT_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"model": "veo", "prompt": "Waves rolling onto a beach at sunrise", "duration": 8, "aspect_ratio": "16:9"}'

curl https://nymbot.ai/api/v1/videos/vid_3e9a51c07b2f4d86 \
  -H "Authorization: Bearer $NYMBOT_API_KEY"

Python

import os, time
import requests

headers = {"Authorization": "Bearer " + os.environ["NYMBOT_API_KEY"]}

job = requests.post(
    "https://nymbot.ai/api/v1/videos",
    headers=headers,
    json={"model": "veo", "prompt": "Waves rolling onto a beach at sunrise", "duration": 8, "aspect_ratio": "16:9"},
).json()

while True:
    time.sleep(8)
    status = requests.get("https://nymbot.ai/api/v1/videos/" + job["id"], headers=headers).json()
    if status["status"] in ("completed", "failed"):
        break

print(status["data"]["url"] if status["status"] == "completed" else status["error"])

JavaScript

const headers = {
  "Authorization": "Bearer " + process.env.NYMBOT_API_KEY,
  "Content-Type": "application/json",
};

const job = await (await fetch("https://nymbot.ai/api/v1/videos", {
  method: "POST",
  headers,
  body: JSON.stringify({ model: "veo", prompt: "Waves rolling onto a beach at sunrise", duration: 8, aspect_ratio: "16:9" }),
})).json();

let status;
do {
  await new Promise((r) => setTimeout(r, 8000));
  status = await (await fetch("https://nymbot.ai/api/v1/videos/" + job.id, { headers })).json();
} while (status.status !== "completed" && status.status !== "failed");

console.log(status.status === "completed" ? status.data.url : status.error);

Teksto al parolo

Legas tekston voĉe kaj redonas la aŭdofilon mem, ne ligilon. Estas la parolado-punkto de OpenAI, do audio.speech.create funkcias en la OpenAI SDKs.

POST https://nymbot.ai/api/v1/audio/speech — bezonas API-ŝlosilon, aŭ fulmbranda pago por peto.

KampoSkribiDezirindataPriskribo
modelŝnuroNeParolmodelo de la listo de aŭdaj modeloj. Defaŭlta: la norma voĉo, @cf/myshell-ai/melotts. aura-2 ĉu Deepgram Aura 2.
inputŝnuroJesLa teksto por legi: ĝis 800 karakteroj por la norma voĉo, 2,000 por Aura 2.
voiceŝnuroNeVoĉidentigilo de La listo de voĉoj: Aura-parolilo kiel luna (aŭ aura-2-luna-en), aŭ MeloTTS-lingvo (en, es, fr, zh). OpenAI voĉnomoj kiel ekzemple alloy estas akceptataj kaj donas la defaŭltan voĉon de la modelo.
languageŝnuroNeLingva kodo kiel ekzemple es. Sen voĉo, ĝi elektas unu por tiu lingvo. Voĉo, kiu parolas alian lingvon, revenas 422 voice_language_mismatch, kaj lingvon por kiu la modelo ne havas voĉon 422 unsupported_language.
response_formatŝnuroNeLa norma voĉo revenas mp3 nur. Aura 2 redonas mp3 (la defaŭlto), opus, aac, flac, wav aŭ pcm.
speednumeroNeAkceptita kaj ignorita.

La standarda voĉo kostas fiksan 3 standardajn kreditojn (30 sat) po peto, kiel en la aplikaĵo. Aura 2 estas Pro, prece laŭ la karakteroj kiujn vi sendas. La responda korpo estas la aŭdio, kun kongrua Content-Type; la kosto estas en la X-Nymbot-Cost-Sats Kapo. Se la parola modelo malsukcesas, nenio estas fakturita.

Respondo

HTTP/1.1 200 OK
Content-Type: audio/mpeg
X-Nymbot-Cost-Sats: 4.2
X-Nymbot-Balance-Sats: 41055.6

(audio bytes)
StatoKiam
400Neniu enigo; enigo super la limito de la modelo (input_too_long); formato kiun la modelo ne povas produkti (unsupported_response_format); nekonata voĉo (invalid_voice); modelo kiu ne estas parola modelo (invalid_model).
422La voĉo ne parolas la donitan lingvon, aŭ la modelo ne havas voĉon por ĝi.
502La parolmodelo malsukcesis. Nio estas ŝarjita.

cURL

curl https://nymbot.ai/api/v1/audio/speech \
  -H "Authorization: Bearer $NYMBOT_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"model": "aura-2", "voice": "luna", "input": "Your invoice has been paid."}' \
  --output speech.mp3

Python

import os
from openai import OpenAI

client = OpenAI(base_url="https://nymbot.ai/api/v1", api_key=os.environ["NYMBOT_API_KEY"])

audio = client.audio.speech.create(
    model="aura-2",
    voice="luna",
    input="Your invoice has been paid.",
)
audio.write_to_file("speech.mp3")

JavaScript

import { writeFile } from "node:fs/promises";
import OpenAI from "openai";

const client = new OpenAI({ baseURL: "https://nymbot.ai/api/v1", apiKey: process.env.NYMBOT_API_KEY });

const audio = await client.audio.speech.create({
  model: "aura-2",
  voice: "luna",
  input: "Your invoice has been paid.",
});
await writeFile("speech.mp3", Buffer.from(await audio.arrayBuffer()));

Aŭdiaj modeloj kaj voĉoj

Du publikaj listoj por elekti parolan modelon kaj voĉon, aŭ transskriban modelon. Estas 41 Aura 2 anglosaj parolantoj kaj kvar MeloTTS lingvoj.

GET https://nymbot.ai/api/v1/audio/models — neniu ŝlosilo bezonata.

GET https://nymbot.ai/api/v1/audio/voices?language=en — neniu ŝlosilo bezonata.

KampoSkribiDezirindataPriskribo
languageĉeno (demando)NeNur voĉoj por ĉi tiu lingvo.
modelĉeno (demando)NeNur voĉoj por ĉi tiu modelo.

Respondo (voĉoj)

{
  "object": "list",
  "data": [
    { "id": "luna", "name": "Luna", "provider": "deepgram", "model_id": "aura-2", "models": ["aura-2"], "language": "en", "description": "Aura 2 English voice", "gender": "female", "preview_url": null },
    { "id": "en", "name": "MeloTTS English", "provider": "myshell", "model_id": "@cf/myshell-ai/melotts", "models": ["@cf/myshell-ai/melotts", "melotts"], "language": "en", "description": "English (MeloTTS)", "gender": null, "preview_url": null }
  ]
}

La modeloj listigas respondojn {"object": "list", "data": {"tts": […], "stt": […]}}. Ĉiu parolmodelo donas sian ekvilibron, prezon, max_input_chars, response_formats, languages kaj default_voice; la transkrib modelo donas siajn aliĝnomojn, max_file_bytes, max_seconds, formatoj kaj prezo po minuto.

cURL

curl https://nymbot.ai/api/v1/audio/models
curl "https://nymbot.ai/api/v1/audio/voices?language=en"

Python

import requests

print(requests.get("https://nymbot.ai/api/v1/audio/models").json())
for voice in requests.get("https://nymbot.ai/api/v1/audio/voices", params={"language": "en"}).json()["data"]:
    print(voice["id"], voice["model_id"])

JavaScript

console.log(await (await fetch("https://nymbot.ai/api/v1/audio/models")).json());
const voices = await (await fetch("https://nymbot.ai/api/v1/audio/voices?language=en")).json();
for (const v of voices.data) console.log(v.id, v.model_id);

Parolo al teksto

Turnas registron en tekston per Whisper. Ĉi tio estas la transskribiga fina punkto de OpenAI, do audio.transcriptions.create funkcias.

POST https://nymbot.ai/api/v1/audio/transcriptions — bezonas API-ŝlosilon, aŭ fulmbranda pago por peto. La korpo estas multipart/form-data.

KampoSkribiDezirindataPriskribo
filedosieroJesLa registriĝo, de 256 bajtoj ĝis 25 MB kaj ĝis 30 minutoj: WAV, WebM, MP4 aŭ M4A, Ogg aŭ Opus, MP3 kaj la aliaj formatoj kiujn Whisper legas. MP3 kaj aliaj formatoj kies longon ne povas esti legita antaŭe estas limigitaj al 1.8 MB.
modelŝnuroNeDefaŭlto whisper, kiu estas Whisper Large v3 Turbo. whisper-1, whisper-large-v3-turbo kaj @cf/openai/whisper-large-v3-turbo signifas la saman aferon.
languageŝnuroNeLa parolata lingvo, kiel ekzemple en. Detektita se oligita.
promptŝnuroNeVortoj aŭ skribmanieroj atendataj, kiel nomoj. Nur la unuaj 1,000 karakteroj estas uzataj.
response_formatŝnuroNejson (la defaŭlto), text, srt, vtt aŭ verbose_json.

Por WAV-, WebM-, MP4- kaj Ogg-dosieroj, la longeco estas legata el la dosiero antaŭ ol io ajn funkcias, tial registrado pli ol 30 minutoj estas rifuzata tuj (kun 3 sekundoj da gratia tempo). La longeco de WAV-dosiero venas de ĝia eksempleca frekvenco, kanaloj kaj ekzempa grandeco. La longeco de aliaj formatoj, kiel MP3, ne povas esti legata tuj, do ili estas limigitaj per grandeco: ĉe la plej malalta bitŝpeco Nymbot supozas, 8 kbps, 30 minutoj estas 1.8 MB, kaj pli granda dosiero en tia formato estas rifuzata kun 413 audio_too_long antaŭ ol io ajn funkcias. Sendu pli longajn registriojn kiel WAV, WebM, MP4 aŭ Ogg. Se Whisper tamen raportas pli ol 30 minutojn, la peto estas rifuzita per 413 audio_too_long, kaj ĉar Whisper efektive funkciis, 30 minutoj estas ŝarĝitaj.

Vi pagas por la longeco de la aŭdio, rande supren al la sekundo: la plej longa el la longeco legita el la dosiero, la longeco kiun Whisper raportas, kaj la malplianto kiun la dosiera grandeco ebligas, laŭ la po minuto-prezo de Whisper kun la kutima leĝo kaj marĝo, kaj almenaŭ 0.05 kredito por peto. Ĝi estas pagita el la norma saldo kiam tio povas kovri la rezervon, kaj el Pro otherwise; a 402 donacas kion ĉiu saldo bezonos. En la aplikaĵo, transskribado de voĉmesaĝo povas esti senpaga; en la API ĝi estas ĉiam pagata. Se Whisper malsukcesas, nenio estas pagata.

Respondo

{
  "text": "Your invoice has been paid.",
  "usage": { "type": "duration", "seconds": 3 },
  "nymbot": { "balance": "standard", "charged_credits": 0.05, "charged_sats": 0.5, "balance_credits": 120.35, "balance_sats": 1203.5 }
}

text reduktas al simpla teksto, srt kaj vtt redonu subtitrojn, kaj verbose_json aldonas la lingvon, la daŭron kaj la temponigitajn segmentojn. Por la tri, kiuj ne estas JSON, la kosto estas en la ĉefoj.

StatoKiam
400Neniu dosiero, dosiero sen uzebla aŭdio (invalid_audio), nekonata formato, aŭ modelo kiu ne estas transskribiga modelo (invalid_model).
402Neniu el la saldonoj povas kovri ĝin.
413La dosiero estas pli ol 25 MB (file_too_large) aŭ la registritaĵo pli ol 30 minutojn, aŭ, en formato kies longeco ne povas esti legata antaŭe, pli ol 1.8 MB (audio_too_long).
502Whisper ne povis procesi la aŭdon. Neniu kosto estas debitita.

cURL

curl https://nymbot.ai/api/v1/audio/transcriptions \
  -H "Authorization: Bearer $NYMBOT_API_KEY" \
  -F [email protected] \
  -F model=whisper \
  -F response_format=json

Python

import os
from openai import OpenAI

client = OpenAI(base_url="https://nymbot.ai/api/v1", api_key=os.environ["NYMBOT_API_KEY"])

with open("memo.m4a", "rb") as f:
    transcript = client.audio.transcriptions.create(model="whisper", file=f)
print(transcript.text)

JavaScript

import fs from "node:fs";
import OpenAI from "openai";

const client = new OpenAI({ baseURL: "https://nymbot.ai/api/v1", apiKey: process.env.NYMBOT_API_KEY });

const transcript = await client.audio.transcriptions.create({
  model: "whisper",
  file: fs.createReadStream("memo.m4a"),
});
console.log(transcript.text);

Traduki parolon al la angla

POST https://nymbot.ai/api/v1/audio/translations — bezonas API-ŝlosilon, aŭ fulmbranda pago por peto. La korpo estas multipart/form-data.

La sama kiel transkribo, kun la samaj kampoj krom language, limoj kaj prezo, sed la teksto revenas en la angla ĉiumalkonforme de la lingvo parolata. La OpenAI SDK-oj vokas ĝin per audio.translations.create.

cURL

curl https://nymbot.ai/api/v1/audio/translations \
  -H "Authorization: Bearer $NYMBOT_API_KEY" \
  -F [email protected] \
  -F model=whisper

Python

import os
from openai import OpenAI

client = OpenAI(base_url="https://nymbot.ai/api/v1", api_key=os.environ["NYMBOT_API_KEY"])

with open("nota.m4a", "rb") as f:
    translation = client.audio.translations.create(model="whisper", file=f)
print(translation.text)

JavaScript

import fs from "node:fs";
import OpenAI from "openai";

const client = new OpenAI({ baseURL: "https://nymbot.ai/api/v1", apiKey: process.env.NYMBOT_API_KEY });

const translation = await client.audio.translations.create({
  model: "whisper",
  file: fs.createReadStream("nota.m4a"),
});
console.log(translation.text);

Embedoj

Turnas tekston en vektors por serĉado, klustrado kaj deduplikado. La modeloj funkcias sur Cloudflare kaj eluzas la norman saldon.

POST https://nymbot.ai/api/v1/embeddings — bezonas API-ŝlosilon, aŭ fulmbranda pago por peto.

KampoSkribiDezirindataPriskribo
modelŝnuroJesEmbedding-modelo de GET /api/v1/models?type=embedding.
inputĉeno aŭ vico de ĉenojJesLa teksto por enmeti, ĝis 100 ne-malplenaj ĉenoj. Token-arooj estas rifuzataj (token_input_unsupported). Ĉiu enigo devas kuŝi en la modelo's context_length, kalkulata kiel ĉirkaŭ kvar bajtoj por tokeno.
encoding_formatŝnuroNefloat (la defaŭlto) aŭ base64 (malgranda-endenaj 32-bitaj flotantaj nombroj).
dimensionsentiera nombroNeLa propra grandeco de la modelo, aŭ por modelo kun supported_dimensions unu el tiuj; la vektoro estas tiam mallongigita kaj normaligita. Ĉio alia estas rifuzita.
ModeloDimensionojKonteksto
@cf/baai/bge-m31024, multaj lingvoj8,192 tokenoj
@cf/qwen/qwen3-embedding-0.6b1024, multaj lingvoj8,192 tokenoj
@cf/baai/bge-large-en-v1.51024, Esperanto512 tokenoj
@cf/baai/bge-base-en-v1.5768, Esperanto512 tokenoj
@cf/baai/bge-small-en-v1.5384, angla512 tokenoj

La listo de modeloj estas la vera fonto pri tio, kiuj estas disponeblaj kaj kio ili kostas; Google-ese EmbeddingGemma, kun pli mallongaj vektoroj laŭpete, aperas tie ankaŭ kiam la katalogo havas prezon por ĝi. Embeddingoj estas mezurataj laŭ ĉiu enigo-tono, kaj la 0.05-kredita minimumo aplikas al ĉiu peto, ne al ĉiu enigo, do grupigi multajn tekstojn en unu peton estas multe pli malmultekoste ol sendi ilin unu post la alia.

Respondo

{
  "object": "list",
  "data": [
    { "object": "embedding", "index": 0, "embedding": [0.0213, -0.0487, 0.0112] }
  ],
  "model": "@cf/baai/bge-m3",
  "usage": { "prompt_tokens": 9, "total_tokens": 9 },
  "nymbot": { "balance": "standard", "charged_credits": 0.05, "charged_sats": 0.5, "balance_credits": 1204.35, "balance_sats": 12043.5 }
}
StatoKiam
400Neniu enigo aŭ malplena; token-matricoj (token_input_unsupported); pli ol 100 enigoj (too_many_inputs); enigo pli longa ol kion la modelo akceptas (input_too_long); grandeco kiun la modelo ne povas doni (unsupported_dimensions).
402La norma saldo estas tro malalta. Embeddingoj neniam uzas la Pro-saldon.
404Neniu enmetiga modelo per tiu nomo.
502La modelo malsukcesis. Nio estas elŝarĝita.

cURL

curl https://nymbot.ai/api/v1/embeddings \
  -H "Authorization: Bearer $NYMBOT_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"model": "@cf/baai/bge-m3", "input": ["Lightning invoices expire.", "Invoices on Lightning have a time limit."]}'

Python

import os
from openai import OpenAI

client = OpenAI(base_url="https://nymbot.ai/api/v1", api_key=os.environ["NYMBOT_API_KEY"])

result = client.embeddings.create(
    model="@cf/baai/bge-m3",
    input=["Lightning invoices expire.", "Invoices on Lightning have a time limit."],
)
print(len(result.data), len(result.data[0].embedding))

JavaScript

import OpenAI from "openai";

const client = new OpenAI({ baseURL: "https://nymbot.ai/api/v1", apiKey: process.env.NYMBOT_API_KEY });

const result = await client.embeddings.create({
  model: "@cf/baai/bge-m3",
  input: ["Lightning invoices expire.", "Invoices on Lightning have a time limit."],
});
console.log(result.data.length, result.data[0].embedding.length);