Saltà à u cuntenutu
Torna à Nymbot

Base di cunniscenza Sviluppatori

Immagini, audio è embeddings

I generatori di l'app, è i blocchi di costruzione per a ricerca: immagini, video, parlu, trascrizzione è embeddings, ciasunù fatturatu per ogni utilizazione da u vostru saldu.

Generazione di imaghini

Fa da una à quattru imaghjini da un prompt è le restituisce quandu sò fatte. Hè u stessu set di generatori chì ?image in l'app.

POST https://nymbot.ai/api/v1/images/generations — hà bisognu di una chìave API, o un pagamentu Lightning per dumanda.

I ID chjamanu da GET /api/v1/models?type=imageU generatore standard, @cf/black-forest-labs/flux-1-schnell, costa 5 crediti standard fissi (50 sats) per imaghjina. Ogni altru generatore spende crediti Pro à u so prìzu, cù a tariffa è u margine usuali, cum'è in l'app. n prezzu di e foto n vez di tantu. Un campu chì u generatore ùn accetta ùn hè scartatu invece di esse rifiutatu;\n u generatore standard usa solu u prompt.

CampuTipuNecessariuDescrizzione
modelstringIèUn ID di generatore, cum'è nano-banana.
promptstringIèCosa disegnà. Sò solu i primi 2.000 caratteri chì sò utilizati.
nintegruNoda 1 à 4. Per difettu 1. Accettatu ancu ancu cum'è num_images.
sizestringNoUn rapport d'aspect cum'è "16:9", o una dimensione OpenAI cum'è "1792x1024", chì diventa u più vicinu di 1:1, 16:9, 9:16, 4:3, 3:4, 3:2, 2:3, 21:9, 5:4 è 4:5. "auto" lascia u generatore.
aspect_ratiostringNoU stessu ch'e size, è vince si sò mandati tutti dui.
qualitystringNoSpecificu à u generatore, cum'è "low", "medium" o "high".
negative_promptstringNoCosa lascià fora.
output_formatstringNo"png", "jpeg" o "webp".
response_formatstringNo"url" (u per dëfaut) o u "b64_json".
image_urlstringNoUna ritrattu per scumence: un https:// un ligame di al più 4.096 caratteri senza un nome d'utilizatore o una password in ellu, o un data:image/…;base64 URL (PNG, JPEG, WebP o GIF; micca SVG). Solamente per i generatori cù edit; rìquìsitu da quelli cù requires_image_url.

resolution si ùn u usa micca: ogni generatore fà u so propiu dimensione. Cù url, ogni imaghjina hè caricata nantu à un ospite Blossom pulbicu è vi tù u so ligame (alcun generatori solu restituiscinu un ligame propiu, chì hè passatu). Chiconunque hà u ligame pò apre it è ùn pò micca esse rimossa di novu; vede chì pò u API vede. Cum b64_json a ritrattu torna in a risposta è ùn hè mai caricatu. Un ritrattu mandatu cum'è un data: URL in image_url si verifica assai cum'è un modifica è caricatu in Blossom prima perchè u generatore possa pigliàlu; ellu hè eliminatu di novu si a dumanda fallisce senza fatturazione.

Sì una parte di u n l'imaghjini falliscenu, riceviti quelle chì anu funzionatu, vi fatturanu solu per quelle (più quelle chì u fornitore hà fatturatu malgradu u fallimentu), è nymbot.failed dice quantu suntu mancanti. S'ellu tutti falliscenu, a dumanda torna 502.

Risposta

{
  "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 }
}
StatutuQuandu
400Nessun prompt; n fora di 1 à 4 (invalid_value); una brutta misura (invalid_size) o ritrattu (invalid_image, invalid_image_url); un mudellu chì esiste ma ùn hè micca un generatore d'imaghjini (invalid_model); una ritrattu per un generatore chì ùn pò micca edità (edit_unsupported); nisuna foto per unu chì ne hà bisognu (image_required).
402U saldu ùn pò micca copri ogni imaghjina dumandata.
404Nessun mudellu cù u nome di quella (model_not_found).
502U generatore hè fallitu (upstream_error). Niente ùn hè fatturatu a meno chì u fornitore ùn hà fatturatu per u ttentativu; allura l'errorìa hà charged_sats.
503E immagini ùn ponnu micca esse ospitate in questu momentu (media_hosting_unavailable). b64_json ancora funziona.

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);

Edizione di imaghjini

Cambia una imaghjina chì avete caricata, seguendu un prompt. Hè u endpoint di editazione di OpenAI, quindi i SDK di OpenAI images.edit funziona com'è. Sò solu i generatori Pro cù edit in a lista di mudelli accettatelu.

POST https://nymbot.ai/api/v1/images/edits — hà bisognu di una chìave API, o un pagamentu Lightning per dumanda. U corpu hè multipart/form-data, finu à 32 MB.

CampuTipuNecessariuDescrizzione
imagefileIèA imaghjina da edità: PNG, JPEG, WebP o GIF, finu à 20 MB. Accettata ancu cum'è image[]; u primu hè usatu.
promptstringIèCosa cambià.
modelstringIèUn generatore cù edit.
nintegruNoda 1 à 4.
size
aspect_ratio
quality
negative_prompt
output_format
stringNoQuant'à a generazione.
response_formatstringNo"b64_json" (u default quì) o "url".

A foto chì vulgate hè verificata per esse un PNG, JPEG, WebP o GIF ben formulatu, mandatu cum'è u so tipu reale, è mettutu nantu à un ospite Blossom publicu, perchè i generatori pighenu u so input per ligame. Trattatelu cum'è publicu. S'ellu a modifica fallisce è ùn hè chjamatu micca nente, a copia ospitata hè eliminata ancu ela. A risposta hè di a stessa forma di quella per a generazione. U prezzu hè u prezzu di u generatore, chì per alcuni generatori include un fattu per a foto d'input.

Risposta

{
  "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 }
}
StatutuQuandu
400Nessuna imaghjina o prompt, un filu chì ùn hè micca una pictura (invalid_image), o un generatore ca ùn pò edità (edit_unsupported).
413A foto hè più di 20 MB (file_too_large), o tutta a dumanda sopra i 32 MB.
503A foto ù pò esse ospitata d'unghjornu (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"));

Vidéo

Un video pigghia minuti, cusì s'una in backgroundu. Vui u sottemettite, pigliate un id subitu, è dumandate di l'id finché ùn hè micca finitu. Ogni generatore di video spende u saldu Pro.

POST https://nymbot.ai/api/v1/videos — hà bisognu di una chìave API, o un pagamentu Lightning per dumanda. Ritorni 202.

CampuTipuNecessariuDescrizzione
modelstringIèUn ID di un generatore di video da GET /api/v1/models?type=video, cumu veo.
promptstringIèChì hè per u deve esse accadè.
durationnumeru o stringaNoDurata in secondi, più di 0 è fin u 60. Sï usatu solu da i generatori chì vi permettenu di sceglie a durata; l'altri fànu a so durata di solitu, chì hè quella seconds in a risposta è u prezzu seguinu.
aspect_ratiostringNoCum'è "16:9" o "9:16"; una dimensione com'è "1280x720" diventa a proporzione più vicina.
resolution
quality
stringNoUna di e generatori resolutions in a lista di i mudelli, cum'è "720p" o "1080p". Ellu ferma u prezzu. Tutte l'altre cose sò rifiutate cù unsupported_resolution.
image_urlstringNoUna ritrattu per scumence: un https:// legame o a data:image/… L'URL, chì hè caricatu prima nantu à un ospite Blossom pulbicu. Rivisitu da i generatori cù requires_image_url.

U prezzu hè fissu quande mandate, da u generatore, a risoluzzione è a lunghezza, dunque hè debitatu da u vostre saldu Pro appena u furnitore accetta u travagliu, è mostratu cum'è cost, estimated_cost è nymbotSì u furnitore rifiuta lu travagliu, ùn si carica nantu à nenti. S'ellu u render fallisce dopu, o u clip finitu ùn pò micca esse ripostu è u furnitore ùn l'ha micca fatturatu, u debitu hè rimandatu una volta, in modu automaticu. Un render chì si sta ancu dopu un'ura hè abbandunatu, è mantene u so debitu, perchè u furnitore fattura un render una volta chì u accetta. Un rimbussu torna i crediti ma ùn abbassa micca u conte di a spesa di a chìave.

Risposta (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 cumencia cum'è in_progress, o completed cu u videu già in data quandu u generatore l'ha rimandatu subitu.

Verificà un video

GET https://nymbot.ai/api/v1/videos/{id} — serve una chiave ca appartene à u nym chì l'ha sottumettu. Una chiave chì hà raggiuntu u so capu pò tutt'avanti verificà.

Ùn risponde 202 mentre u videu hè in pruduzzione è 200 una volta chì hè finitu o hè fallitu. Chjamate ogni 5 à 10 sicunzioni. Ogni verificazione chjamate u fornitore una volta è risponde subitu; ùn aspetta mai u videu. Un travagliu hè conservatu per 24 ore dopu chì hè stati sottumessu. GET /api/v1/videos lista i azzeultimi 50 impieghi di a chìave cum'è {"object": "list", "data": […]}.

Risposta (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 è in_progress, completed o failed. A un travagliu fallitu porta error ({"code": "generation_failed", "message": …}); se era rimandatu, cost hè 0 è nymbot aghjunti refunded_credits è refunded_satsU videu finitu hè nantu à un host Blossom publicu, cum'è e immagini generate.

StatutuQuandu
400Nessun prompt; una durata fora da 0 à 60 (invalid_value); una risoluzione chì u generatore ùn offre micca (unsupported_resolution); nisuna imaghjina per un generatore chì ne hà bisognu (image_required); un mudellu chì ùn hè micca un generatore di video (invalid_model).
402U balance Pro ùn pò micca cunvè righju u videu.
404Nessun tale generatore (model_not_found), o nisun travagliu per quellu ID per u vost namesake, o hè più di 24 ore vechju (video_not_found).
429U vostru nime hà digià 10 videi in rendering (video_jobs_limit). Verificà i è sottemette più una volta chì unu hè finitu.
502U generatore hà rifiutatu u travagliu. Nada ùn hè fatturatu à meno chì u furnituri ùn l'ha micca fatturatu.
503I videi ùn ponnu micca esse mandati o stuvati tù tù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);

Testu à parlatura

Legge u test audio.speech.create in i SDK di OpenAI funziona.

POST https://nymbot.ai/api/v1/audio/speech — hà bisognu di una chìave API, o un pagamentu Lightning per dumanda.

CampuTipuNecessariuDescrizzione
modelstringNoUn mudellu di parla da a lista di i mudelli audio. Difaut: a voce standard, @cf/myshell-ai/melotts. aura-2 hè Deepgram Aura 2.
inputstringIèU testu da liggi: finu à 800 caratteri per a voce standard, 2.000 per Aura 2.
voicestringNoUn'identificazione di voce da a lista di e voci: un parlatore Aura cum'è luna (o aura-2-luna-en), o una lingua MeloTTS (en, es, fr, zh). Nomi di voci di OpenAI cum'è alloy s accettati è dànu a voce per difettu di u mudellu.
languagestringNoUn codice di lingua cum'è esSenza una voce, sceglie una per quella lingua. Una voce chì parla un'altri lingua torna 422 voice_language_mismatch, è una lingua per a quale u mudellu ùn hà micca voce 422 unsupported_language.
response_formatstringNoA voce standardu torna mp3 solu. Aura 2 torna mp3 (u per default), opus, aac, flac, wav o pcm.
speednumeruNoAccettatu è ignoratu.

A voce standard costa 3 crediti standard (30 sats) per ogni richiesta, cum'è in l'app. Aura 2 hè Pro, prizzatu in base à i caratteri chì mandate. U corpu di a risposta hè l'audio, cù un corrispondente Content-Type; u prezzu hè in u X-Nymbot-Cost-Sats intestazione. S'ellu u mudellu di fala fallisce, niente ùn hè chjargu.

Risposta

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

(audio bytes)
StatutuQuandu
400Nessuna entrata; l'entrata hè sopra u limite di u mudellu (input_too_long); un format chì u mudellu ùn pò micca pruduce (unsupported_response_format); una voce sconosciuta (invalid_voice); un mudellu chì ùn hè micca un mudellu di parlatura (invalid_model).
422A voce ùn parla micca a lingua datata, o u mudellu ùn ha micca una voce per essa.
502U mudellu di parlu hè fallitu. Niente ùn hè addebitatu.

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()));

Modelli audio è voci

Dui liste pubbliche per sceglie un mudellu di discorsu è una voce, o un mudellu di trascrizione. Ci sò 41 parlanti Aura 2 in inglese è quattru lingue MeloTTS.

GET https://nymbot.ai/api/v1/audio/models — micca di chìave necessariu.

GET https://nymbot.ai/api/v1/audio/voices?language=en — micca di chìave necessariu.

CampuTipuNecessariuDescrizzione
languagestringa (ricerca)NoSolu voci per questa lingua.
modelstringa (ricerca)NoSò solu voci per stu mudellu.

Risposta (voci)

{
  "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 }
  ]
}

A lista di i mudelli risponde {"object": "list", "data": {"tts": […], "stt": […]}}Ogni mudellu di parlatura dà u so equilibru, u so prezzu, max_input_chars, response_formats, languages è default_voice; u mudellu di trascrizione dà i so aliassi, max_file_bytes, max_seconds, formatu è u prezzu per minutu.

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);

Parlà à u testu

Trasforma una registrazione in testu cù Whisper. Questu hè l'endpoint di trascrizione di OpenAI, quindi audio.transcriptions.create funziuna.

POST https://nymbot.ai/api/v1/audio/transcriptions — hà bisognu di una chìave API, o un pagamentu Lightning per dumanda. U corpu hè multipart/form-data.

CampuTipuNecessariuDescrizzione
filefileIèA registrazione, da 256 bytes à 25 MB è fin à 30 minuti: WAV, WebM, MP4 o M4A, Ogg o Opus, MP3 è l'altri furmatu chì Whisper legge. MP3 è l'altri furmatu a i quali a lunghezza ùn pò micca esse letta prima hè limitati à 1.8 MB.
modelstringNoDi default whisper, chì hè Whisper Large v3 Turbo. whisper-1, whisper-large-v3-turbo è @cf/openai/whisper-large-v3-turbo vòli dì a stessa cosa.
languagestringNoA lingua parlatu, cum'è enDetectatu s'ellu hè lasciatu fora.
promptstringNoParole o ortografi chì aspettà, cum'è i nomi. Sadece i primi 1.000 caratteri sò utilizati.
response_formatstringNojson (u per default), text, srt, vtt o verbose_json.

Per i file WAV, WebM, MP4 è Ogg, a durata hè letta da u file prima chì quarchì cosa sia executata, dunque una registrazione di più di 30 minuti hè rifiutata subitu (cum'è un margine di 3 sicondi). A durata di un file WAV vene da a so frequenza di campionamentu, i canali è a dimensione di u campionamentu. A durata di altri furmati, cum'è l'MP3, ùn pò micca esse letta subitu, dunque sò limitati da u dimensione: à u bitrate più bassu chì Nymbot assume, 8 kbps, 30 minuti sò 1.8 MB, è un file più grande in un tale furmatu hè rifiutatu cù 413 audio_too_long prima chì quìsiellu runne. Mandate registrazioni più lunghe in WAV, WebM, MP4 o Ogg. Si Whisper raporta comunque più di 30 minuti, a dumanda hè rifiutata cù 413 audio_too_long, è sicché Whisper hà funzionatu, 30 minuti sò fatturati.

Vivu paghjate per a lunghezza di l'audio, arrotondata à a seconda superiore: a più lunga di a lunghezza letta da u file, a lunghezza chì Whisper riferisce, è a più chjuca chì a dimensione di u file permette, à u prezzu di Whisper per minutu cum'è a tarifa è u margine usuali, è almenu 0.05 creditu per una richiesta. Si paga da u saldu standard quandu questu pò cunvèrsi u bloccu, è da Pro altri casu; a 402 indica ciò chì ogni bilanciu avaria bisognu. In l'app, a trascrizione di un messaghju vocale pò esse gratuita; nantu à l'API hè sempre fatturata. Si Whisper fallisce, ùn si fattura nente.

Risposta

{
  "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 trase testu semplice, srt è vtt restituite i sottituli, è verbose_json aghjunge a lingua, a durata è i segmenti temporale. Per i tre chì ùn sò micca JSON, u coste hè in i headers.

StatutuQuandu
400Niente file, un file senza alcun audio utilizabile (invalid_audio), un format sconosciutu, o un mudellu chì ùn hè micca un mudellu di trascrizzione (invalid_model).
402Ni u saldu nè u suntu ponu cunvè chì u fattu.
413U file hè più di 25 MB (file_too_large) o a registrazione sopra i 30 minuti, o, in un formatu chì a so lunghezza ùn pò micca esse letta prima, sopra 1.8 MB (audio_too_long).
502Whisper ùn pudia micca processà l'audio. Rien ùn hè fattu addebitatu.

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);

Traduciendu u parlu in inglese

POST https://nymbot.ai/api/v1/audio/translations — hà bisognu di una chìave API, o un pagamentu Lightning per dumanda. U corpu hè multipart/form-data.

U medemu cum'è a trascrizione, cù i medemi campi eccettu language, limiti è prezzu, ma u testu torna in inglese qualunque lingua sia stata parlatu. I SDK di OpenAI u chjamanu cù 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);

Embeddings

Trasforma u testu in vettori per a ricerca, u raggruppamentu è a deduplicazione. I mudelli funzionanu nantu à Cloudflare è spennenu u saldu standard.

POST https://nymbot.ai/api/v1/embeddings — hà bisognu di una chìave API, o un pagamentu Lightning per dumanda.

CampuTipuNecessariuDescrizzione
modelstringIèUn mudellu d'embedding da GET /api/v1/models?type=embedding.
inputstring o array di stringheIèU testu da embed, finu à 100 stringhe non vuote. I 배열 di token sò rifiutati (token_input_unsupported). Ogni input deve adatta u mudellu's context_length, cuntati cum'è circa quattru byte per token.
encoding_formatstringNofloat (u per dëfaut) o u base64 (floats à 32-bit little-endian).
dimensionsintegruNoA taglia di u mudellu نفسه, o per un mudellu cù supported_dimensions unu di quelli; u vektore hè dopu accurtatu è normalizatu. Qualche altra cosa hè rifiutata.
ModelluDimensioneContessu
@cf/baai/bge-m31024, assai lingue8,192 tokeni
@cf/qwen/qwen3-embedding-0.6b1024, assai lingue8,192 tokeni
@cf/baai/bge-large-en-v1.51024, Corsu512 tokeni
@cf/baai/bge-base-en-v1.5768, Corsu512 tokeni
@cf/baai/bge-small-en-v1.5384, Corsu512 tokeni

A lista di i mudelli hè a sùrzi di a verità per ciò chì hè dispunsibule è u so prezzu; l'EmbeddingGemma di Google, cù vettori più curti su dumanda, hè ancu lì quandu u catalughe hà un prezzu per ellu. I "embeddings" sò misurati per ogni token d'input, è u minimu di 0,05 crediti si applica à ogni dumanda, micca à ogni input, dunque raggruppà molti testi in una sola dumanda hè assai più conveniente chì mandà elli unu per unu.

Risposta

{
  "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 }
}
StatutuQuandu
400Nessun input o unu vuotu; array di token (token_input_unsupported); più di 100 inputi (too_many_inputs); un input più longu di ciò chì u mudellu pighia (input_too_long); una dimensione chì u mudellu ùn pò micca dà (unsupported_dimensions).
402U bilanciu standard hè troppo bassu. I embeddings ùn usanu mai u bilanciu Pro.
404Nessun mudellu d'embedding cù quellu nome.
502U mudellu hà fallitu. Nada ùn hè chjahrge.

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);