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.
Ĉi tiu paĝo estas maŝintradukita por komforto. La angla originalo estas la versio kiu validas.
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.
| Kampo | Skribi | Dezirindata | Priskribo |
|---|---|---|---|
model | ŝnuro | Jes | Generilo-identigilo, kiel ekzemple nano-banana. |
prompt | ŝnuro | Jes | Kion desegni. Nur la unuaj 2 000 signoj estas uzataj. |
n | entiera nombro | Ne | 1 ĝis 4. Defaŭlto 1. Ankaŭ akceptata kiel num_images. |
size | ŝnuro | Ne | Proporcio 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 | ŝnuro | Ne | La sama kiel size, kaj venkas se ambaŭ estas senditaj. |
quality | ŝnuro | Ne | Generil-specifa, kiel ekzemple "low", "medium" aŭ "high". |
negative_prompt | ŝnuro | Ne | Kion lasi ekster. |
output_format | ŝnuro | Ne | "png", "jpeg" aŭ "webp". |
response_format | ŝnuro | Ne | "url" (la defaŭlto) aŭ "b64_json". |
image_url | ŝnuro | Ne | Bildo 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 }
}
| Stato | Kiam |
|---|---|
400 | Neniu 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). |
402 | La saldo ne povas kovri ĉiun bildon petitan. |
404 | Neniu modelo per tiu nomo (model_not_found). |
502 | La generilo malsukcesis (upstream_error). Nio estas ŝarĝata krom se la provizanto fakturis por la provo; tiam la eraro havas charged_sats. |
503 | Bildoj 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.
| Kampo | Skribi | Dezirindata | Priskribo |
|---|---|---|---|
image | dosiero | Jes | La bildo por redakti: PNG, JPEG, WebP aŭ GIF, ĝis 20 MB. Ankaŭ akceptata kiel image[]; la unua estas uzata. |
prompt | ŝnuro | Jes | Kion ŝanĝi. |
model | ŝnuro | Jes | Generilo kun edit. |
n | entiera nombro | Ne | 1 ĝis 4. |
sizeaspect_ratioqualitynegative_promptoutput_format | ŝnuro | Ne | Kuvante pri generado. |
response_format | ŝnuro | Ne | "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 }
}
| Stato | Kiam |
|---|---|
400 | Neniu bildo aŭ instrukcio, dosiero kiu ne estas bildo (invalid_image), aŭ generilo, kiu ne povas redakti (edit_unsupported). |
413 | La bildo estas pli ol 20 MB (file_too_large), aŭ la tuta peto super 32 MB. |
503 | La 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.
| Kampo | Skribi | Dezirindata | Priskribo |
|---|---|---|---|
model | ŝnuro | Jes | Video generilo ID de GET /api/v1/models?type=video, kiel veo. |
prompt | ŝnuro | Jes | Kio devus okazi. |
duration | numero aŭ ĉeneto | Ne | Longeco 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 | ŝnuro | Ne | Kiel ekzemple "16:9" aŭ "9:16"; tamaĝo kiel ekzemple "1280x720" fariĝas la plej proksima raporto. |
resolutionquality | ŝnuro | Ne | Unu 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 | ŝnuro | Ne | Bildo 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.
| Stato | Kiam |
|---|---|
400 | Neniu 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). |
402 | La Pro-ekvilibro ne povas kovri la videon. |
404 | Neniu 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). |
429 | Via nomo jam havas 10 videojn rendante (video_jobs_limit). Kontrolu ilin kaj submetu pliajn, kiam unu finos. |
502 | La generilo rifuzis la taskon. Nio estas ŝarĝita krom se la provizanto fakturis ĝin. |
503 | Videoj 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.
| Kampo | Skribi | Dezirindata | Priskribo |
|---|---|---|---|
model | ŝnuro | Ne | Parolmodelo de la listo de aŭdaj modeloj. Defaŭlta: la norma voĉo, @cf/myshell-ai/melotts. aura-2 ĉu Deepgram Aura 2. |
input | ŝnuro | Jes | La teksto por legi: ĝis 800 karakteroj por la norma voĉo, 2,000 por Aura 2. |
voice | ŝnuro | Ne | Voĉ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 | ŝnuro | Ne | Lingva 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 | ŝnuro | Ne | La norma voĉo revenas mp3 nur. Aura 2 redonas mp3 (la defaŭlto), opus, aac, flac, wav aŭ pcm. |
speed | numero | Ne | Akceptita 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)
| Stato | Kiam |
|---|---|
400 | Neniu 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). |
422 | La voĉo ne parolas la donitan lingvon, aŭ la modelo ne havas voĉon por ĝi. |
502 | La 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.
| Kampo | Skribi | Dezirindata | Priskribo |
|---|---|---|---|
language | ĉeno (demando) | Ne | Nur voĉoj por ĉi tiu lingvo. |
model | ĉeno (demando) | Ne | Nur 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.
| Kampo | Skribi | Dezirindata | Priskribo |
|---|---|---|---|
file | dosiero | Jes | La 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 | ŝnuro | Ne | Defaŭ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 | ŝnuro | Ne | La parolata lingvo, kiel ekzemple en. Detektita se oligita. |
prompt | ŝnuro | Ne | Vortoj aŭ skribmanieroj atendataj, kiel nomoj. Nur la unuaj 1,000 karakteroj estas uzataj. |
response_format | ŝnuro | Ne | json (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.
| Stato | Kiam |
|---|---|
400 | Neniu dosiero, dosiero sen uzebla aŭdio (invalid_audio), nekonata formato, aŭ modelo kiu ne estas transskribiga modelo (invalid_model). |
402 | Neniu el la saldonoj povas kovri ĝin. |
413 | La 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). |
502 | Whisper 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.
| Kampo | Skribi | Dezirindata | Priskribo |
|---|---|---|---|
model | ŝnuro | Jes | Embedding-modelo de GET /api/v1/models?type=embedding. |
input | ĉeno aŭ vico de ĉenoj | Jes | La 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 | ŝnuro | Ne | float (la defaŭlto) aŭ base64 (malgranda-endenaj 32-bitaj flotantaj nombroj). |
dimensions | entiera nombro | Ne | La 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. |
| Modelo | Dimensionoj | Konteksto |
|---|---|---|
@cf/baai/bge-m3 | 1024, multaj lingvoj | 8,192 tokenoj |
@cf/qwen/qwen3-embedding-0.6b | 1024, multaj lingvoj | 8,192 tokenoj |
@cf/baai/bge-large-en-v1.5 | 1024, Esperanto | 512 tokenoj |
@cf/baai/bge-base-en-v1.5 | 768, Esperanto | 512 tokenoj |
@cf/baai/bge-small-en-v1.5 | 384, angla | 512 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 }
}
| Stato | Kiam |
|---|---|
400 | Neniu 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). |
402 | La norma saldo estas tro malalta. Embeddingoj neniam uzas la Pro-saldon. |
404 | Neniu enmetiga modelo per tiu nomo. |
502 | La 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);