Base di conoscenza sviluppatori
Immagini, audio e embeddings
I generatori dall'app, e i blocchi di costruzione per la ricerca: immagini, video, voce, trascrizione e incorporazioni, ciascuno fatturato per uso dal tuo saldo.
Questa pagina è tradotta automaticamente per comodità. Si applica l'originale inglese.
Generare immagini
Crea da una a quattro immagini da un prompt e le restituisce quando sono state eseguite. ?image In questa app.
POST https://nymbot.ai/api/v1/images/generations - ha bisogno di una chiave API, o Pagamento Lightning su richiesta.
Gli idri provengono da GET /api/v1/models?type=imageIl generatore standard,
@cf/black-forest-labs/flux-1-schnell, costa un piatto 5 crediti standard (50 sats) un'immagine. Ogni altro generatore spende i crediti Pro al suo prezzo, con la tariffa e il margine abituali, come in L’app. n Le foto costano
n Un campo che un generatore non prende viene scartato piuttosto che rifiutato; il generatore standard utilizza solo il prompt.
| campo | Tipo | richiesto | Descrizione |
|---|---|---|---|
model | Stringa | SÌ | Un generatore di ID, come nano-banana. |
prompt | Stringa | SÌ | Si utilizzano solo i primi 2000 caratteri. |
n | integrale | non | 1 a 4. impostazione predefinita 1. anche accettato come num_images. |
size | Stringa | non | Un aspetto proporzionale, come "16:9"o una dimensione aperta, come "1792x1024", che diventa il più vicino di 1:1, 16:9, 9:16, 4:3, 3:4, 3:2, 2:3, 21:9, 5:4 e 4:5. "auto" Lasciatelo al generatore. |
aspect_ratio | Stringa | non | Lo stesso come sizee vince se entrambi vengono inviati. |
quality | Stringa | non | Generatori specifici, come "low", "medium" o "high". |
negative_prompt | Stringa | non | Cosa lasciare fuori. |
output_format | Stringa | non | "png", "jpeg" o "webp". |
response_format | Stringa | non | "url" (il default) o "b64_json". |
image_url | Stringa | non | Un'immagine da iniziare da: un https:// collegamento di un massimo di 4.096 caratteri senza nome utente o password, o un data:image/…;base64 URL (PNG, JPEG, WebP o GIF; non SVG). editrichiesto da coloro che hanno requires_image_url. |
resolution non viene utilizzato: ogni generatore fa la sua dimensione. url, ogni immagine viene caricata su un host pubblico Blossom e ottieni il suo link (alcuni generatori restituiscono solo un link proprio, che viene trasmesso). chiunque abbia il link può aprirlo e non può essere rimosso di nuovo; vedi Cosa può vedere il fuococon
b64_json l'immagine viene restituita nella risposta e non viene mai caricata. data: URL di image_url Viene controllato allo stesso modo di un
edit e caricato a Blossom prima in modo che il generatore possa prenderlo; viene cancellato di nuovo se la richiesta non viene rilasciata.
Se alcuni dei n immagini falliscono, si ottengono quelli che hanno funzionato, sono addebitati solo per quelli (più qualsiasi fornitore addebitato nonostante il fallimento), e nymbot.failed indica quanti sono mancanti. se tutti falliscono, la richiesta viene restituita 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 }
}
| Statuto | Quando |
|---|---|
400 | senza fretta; n dal 1 al 4 (invalid_valueUn’altra cosa è che non c’è nessun problema.invalid_size) o immagine (invalid_image, invalid_image_url); un modello che esiste ma non è un generatore di immagini (invalid_model); un'immagine per un generatore che non può modificare (edit_unsupported(Nessuna foto per chi ne ha bisogno)image_required). |
402 | Il bilancio non può coprire ogni immagine richiesta. |
404 | Nessun modello con questo nome (model_not_found). |
502 | Il generatore è fallito (upstream_errorNiente viene addebitato a meno che il fornitore non abbia addebitato per il tentativo; poi l'errore ha charged_sats. |
503 | Le immagini non possono essere ospitate in questo momento (media_hosting_unavailable). b64_json Funziona ancora |
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);
Editing Immagini
Modifica un'immagine che carica, seguendo un prompt. Questo è l'endpoint di editing di OpenAI, quindi gli OpenAI SDK' images.edit funziona come è. Solo i generatori Pro con edit nell'elenco dei modelli accetta.
POST https://nymbot.ai/api/v1/images/edits - ha bisogno di una chiave API, o Pagamento Lightning su richiestaIl corpo è multipart/form-datafino a 32 MB.
| campo | Tipo | richiesto | Descrizione |
|---|---|---|---|
image | Il file | SÌ | L'immagine da modificare: PNG, JPEG, WebP o GIF, fino a 20 MB. image[]Il primo è usato. |
prompt | Stringa | SÌ | Che cosa cambiare. |
model | Stringa | SÌ | Un generatore con edit. |
n | integrale | non | 1 a 4. |
sizeaspect_ratioqualitynegative_promptoutput_format | Stringa | non | Quanto alla generazione. |
response_format | Stringa | non | "b64_json" (il default qui) o "url". |
L'immagine che si carica viene controllata per essere un PNG, JPEG, WebP o GIF ben formato, inviata come suo tipo reale, e messa su un host pubblico Blossom, perché i generatori raccolgono il loro input tramite link. Trattalo come pubblico. Se l'editing fallisce e nulla viene caricato, la copia ospitata viene cancellata di nuovo. La risposta ha la stessa forma della generazione. Il prezzo è il prezzo del generatore, che per alcuni generatori include un costo per l'immagine di 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 }
}
| Statuto | Quando |
|---|---|
400 | Nessuna immagine o prompt, un file che non è un'immagine (invalid_image), o un generatore che non può modificare (edit_unsupported). |
413 | L'immagine è superiore a 20 MB (file_too_large), o l'intera richiesta di più di 32 MB. |
503 | L'immagine non può essere ospitata in questo momento (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"));
Il video
Un video richiede minuti, quindi funziona sullo sfondo. Lo invii, ottieni immediatamente un id e chiedi l'id fino a quando non è finito.
POST https://nymbot.ai/api/v1/videos - ha bisogno di una chiave API, o Pagamento Lightning su richiestaIl ritorno 202.
| campo | Tipo | richiesto | Descrizione |
|---|---|---|---|
model | Stringa | SÌ | Un generatore di video id da GET /api/v1/models?type=videoE così come veo. |
prompt | Stringa | SÌ | Cosa dovrebbe accadere. |
duration | Numero o stringa | non | Lunghezza in secondi, più di 0 e fino a 60. Utilizzato solo da generatori che ti permettono di scegliere la lunghezza; gli altri fanno la loro lunghezza abituale, che è quello che seconds La risposta e il prezzo seguono. |
aspect_ratio | Stringa | non | Come come "16:9" o "9:16"Una dimensione come "1280x720" diventa il rapporto più vicino. |
resolutionquality | Stringa | non | Uno dei generatori resolutions Nella lista dei modelli, come "720p" o "1080p"Determina il prezzo, tutto il resto è rifiutato. unsupported_resolution. |
image_url | Stringa | non | Un'immagine da iniziare da: un https:// collegamento o a data:image/… URL, che viene caricato su un host pubblico Blossom prima. Richiesto dai generatori con requires_image_url. |
Il prezzo è fisso quando invii, dal generatore, risoluzione e lunghezza, quindi viene addebitato dal tuo saldo Pro non appena il fornitore accetta il lavoro, e mostrato come
cost, estimated_cost E nymbotSe il fornitore rifiuta il lavoro, non viene addebitato nulla. Se il rendering non riesce più tardi, o il clip finito non può essere memorizzato e il fornitore non ha fatturato per esso, il costo viene rimborsato una volta, automaticamente. Un rendering che sta ancora andando dopo un'ora viene abbandonato e mantiene il suo costo, perché il fornitore addebitano un rendering una volta che lo accetta. Un rimborso restituisce i crediti ma non riduce il conteggio delle spese della chiave.
Risposta alla domanda (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 Inizia come in_progress, o completed Il video è già in data Il generatore lo restituisce immediatamente.
Controllare su un video
GET https://nymbot.ai/api/v1/videos/{id} - ha bisogno di una chiave appartenente alla nym che l'ha inviata. Una chiave che ha raggiunto il suo capo può ancora controllare.
risponde 202 Nel frattempo il video è stato realizzato e 200 chiedere ogni 5 a 10 secondi. ogni controllo chiede al fornitore una volta e risponde all'istante; non aspetta mai il video. Un lavoro viene mantenuto per 24 ore dopo che è stato inviato.
GET /api/v1/videos elenca gli ultimi 50 posti di lavoro della chiave come
{"object": "list", "data": […]}.
La 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 failedUn lavoro fallito porta error ({"code": "generation_failed", "message": …}Se è stato rimborsato, cost è 0 e nymbot Aggiungi
refunded_credits E refunded_satsIl video finito è su un host pubblico Blossom, come le immagini generate.
| Statuto | Quando |
|---|---|
400 | Nessun prompt; una durata esterna da 0 a 60 (invalid_value); una risoluzione che il generatore non offre (unsupported_resolution); nessuna immagine per un generatore che ha bisogno di uno (image_required); un modello che non è un generatore di video (invalid_model). |
402 | Il saldo Pro non può coprire il video. |
404 | Nessun generatore (model_not_found), o nessun lavoro da quel id per il tuo nym, o è più di 24 ore vecchio (video_not_found). |
429 | Il tuo nym ha già 10 video rendering (video_jobs_limitControlla su di loro e inviare di più una volta che uno finisce. |
502 | Il generatore ha rifiutato il lavoro. Niente viene addebitato a meno che il fornitore non ne faccia una fattura. |
503 | I video non possono essere consegnati o memorizzati in questo momento (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);
Il testo del discorso
Legge il testo ad alta voce e restituisce il file audio stesso, non un link. audio.speech.create In OpenAI SDKs funziona.
POST https://nymbot.ai/api/v1/audio/speech - ha bisogno di una chiave API, o Pagamento Lightning su richiesta.
| campo | Tipo | richiesto | Descrizione |
|---|---|---|---|
model | Stringa | non | Un modello di discorso da Elenco dei modelli audio• Default: la voce standard, @cf/myshell-ai/melotts. aura-2 Il primo è Deepgram Aura 2. |
input | Stringa | SÌ | Il testo da leggere: fino a 800 caratteri per la voce standard, 2.000 per Aura 2. |
voice | Stringa | non | Un id vocale da La lista delle voci: un altoparlante Aura come luna (o di aura-2-luna-en, o un linguaggio MeloTTS (en, es, fr, zh). OpenAI nomi vocali come alloy sono accettate e danno la voce predefinita del modello. |
language | Stringa | non | Un codice linguistico come esSenza una voce, sceglie una per quella lingua. Una voce che parla un'altra lingua ritorna 422 voice_language_mismatche un linguaggio per il quale il modello non ha voce 422 unsupported_language. |
response_format | Stringa | non | La voce standard ritorna mp3 Ritorno di Aura 2 mp3 e il default, opus, aac, flac, wav o pcm. |
speed | Numero | non | accettato e ignorato. |
La voce standard costa un piatto 3 crediti standard (30 sats) una richiesta, come nell'app. Aura 2 è Pro, preziato dai caratteri che invia. Il corpo di risposta è l'audio, con una corrispondenza
Content-TypeIl costo è nel X-Nymbot-Cost-Sats Se il modello del discorso fallisce, non viene caricato nulla.
Risposta
HTTP/1.1 200 OK
Content-Type: audio/mpeg
X-Nymbot-Cost-Sats: 4.2
X-Nymbot-Balance-Sats: 41055.6
(audio bytes)
| Statuto | Quando |
|---|---|
400 | Nessun ingresso; ingresso oltre il limite del modello (input_too_long); un formato che il modello non può produrre (unsupported_response_formatUna voce sconosciuta (invalid_voiceUn modello che non è un modello di discorso (invalid_model). |
422 | La voce non parla la lingua data, o il modello non ha voce per esso. |
502 | Il modello del discorso è fallito. Niente è caricato. |
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 e voci
Due elenchi pubblici per selezionare un modello di parola e voce, o un modello di trascrizione. Ci sono 41 parlanti di inglese Aura 2 e quattro lingue MeloTTS.
GET https://nymbot.ai/api/v1/audio/models Nessuna chiave necessaria.
GET https://nymbot.ai/api/v1/audio/voices?language=en Nessuna chiave necessaria.
| campo | Tipo | richiesto | Descrizione |
|---|---|---|---|
language | String di ricerca (Query) | non | Solo voci per questa lingua. |
model | String di ricerca (Query) | non | Solo voci per questo modello. |
La 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 }
]
}
La lista delle risposte dei modelli {"object": "list", "data": {"tts": […], "stt": […]}}Ogni modello di discorso dà il suo equilibrio, il suo prezzo, max_input_chars,
response_formats, languages E default_voiceil modello di trascrizione dà i suoi alias, max_file_bytes, max_seconds, formati e prezzo al 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);
Discorso al testo
Trasforma una registrazione in testo con Whisper. Questo è l'endpoint di trascrizione di OpenAI, quindi
audio.transcriptions.create funziona .
POST https://nymbot.ai/api/v1/audio/transcriptions - ha bisogno di una chiave API, o Pagamento Lightning su richiestaIl corpo è multipart/form-data.
| campo | Tipo | richiesto | Descrizione |
|---|---|---|---|
file | Il file | SÌ | La registrazione, da 256 byte a 25 MB e fino a 30 minuti: WAV, WebM, MP4 o M4A, Ogg o Opus, MP3 e gli altri formati Whisper legge. |
model | Stringa | non | difetto whisperQuesto è Whisper Large v3 Turbo. whisper-1, whisper-large-v3-turbo E @cf/openai/whisper-large-v3-turbo Significa lo stesso. |
language | Stringa | non | Il linguaggio parlato, come enScoperto se lasciato fuori. |
prompt | Stringa | non | Parole o ortografie da aspettarsi, come nomi. vengono utilizzati solo i primi 1000 caratteri. |
response_format | Stringa | non | json e il default, text, srt, vtt o verbose_json. |
Per i file WAV, WebM, MP4 e Ogg la lunghezza viene letta dal file prima di eseguire qualsiasi cosa, quindi una registrazione di più di 30 minuti viene rifiutata in anticipo (con 3 secondi di grazia). La lunghezza di un file WAV deriva dalla sua velocità di campionamento, dai canali e dalla dimensione del campione. La lunghezza di altri formati, come MP3, non può essere letta in anticipo, quindi sono limitate dalla dimensione: al bitrate più basso Nymbot assume, 8 kbps, 30 minuti è 1.8 MB, e un file più grande in tale formato è rifiutato con 413
audio_too_long Invia registrazioni più lunghe come WAV, WebM, MP4 o Ogg. Se poi Whisper segnala più di 30 minuti comunque, la richiesta viene rifiutata con
413 audio_too_long, e dal momento che Whisper ha funzionato, 30 minuti sono caricati.
Paghi per la lunghezza dell'audio, arrotondata fino al secondo: la lunghezza più lunga letta dal file, la lunghezza rapporti Whisper, e il minimo la dimensione del file consente, al prezzo per minuto di Whisper con la tariffa abituale e margine, e almeno 0,05 credito una richiesta. 402 In app, la trascrizione di un messaggio vocale può essere gratuita; sull'API viene sempre caricata.
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 restituisce il testo chiaro, srt E vtt ritorno dei sottotitoli, e
verbose_json aggiunge la lingua, la durata e i segmenti temporizzati. Per i tre segmenti che non sono JSON, il costo è nei titoli.
| Statuto | Quando |
|---|---|
400 | Nessun file, un file senza audio utilizzabile (invalid_audio, un formato sconosciuto, o un modello che non è un modello di trascrizione (invalid_model). |
402 | Nessun equilibrio può coprirlo. |
413 | Il file è superiore a 25 MB (file_too_large- la registrazione superiore a 30 minuti, o, in un formato la cui lunghezza non può essere letta in avanti, superiore a 1,8 MB (audio_too_long). |
502 | Sussurro non poteva elaborare l'audio. Niente è caricato. |
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);
Traduzione del discorso in inglese
POST https://nymbot.ai/api/v1/audio/translations - ha bisogno di una chiave API, o Pagamento Lightning su richiestaIl corpo è multipart/form-data.
Lo stesso che la trascrizione, con gli stessi campi tranne language, limiti e prezzo, ma il testo ritorna in inglese indipendentemente dalla lingua parlata. 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);
Inserimento
Trasforma il testo in vettori per la ricerca, il raggruppamento e la deduplicazione. I modelli vengono eseguiti su Cloudflare e spendono il saldo standard.
POST https://nymbot.ai/api/v1/embeddings - ha bisogno di una chiave API, o Pagamento Lightning su richiesta.
| campo | Tipo | richiesto | Descrizione |
|---|---|---|---|
model | Stringa | SÌ | Un modello di ingresso da GET /api/v1/models?type=embedding. |
input | string o array di string | SÌ | Il testo da incorporare, fino a 100 stringhe non vuote. gli array di token sono rifiutati (token_input_unsupportedOgni ingresso deve corrispondere al modello context_length, calcolato come circa quattro byte un token. |
encoding_format | Stringa | non | float (il default) o base64 (Little-endian 32-bit flottazioni di bit) |
dimensions | integrale | non | dimensioni del modello stesso, o per un modello con supported_dimensions Uno di questi; il vettore viene quindi abbreviato e normalizzato. |
| Modello | Dimensioni | Il contesto |
|---|---|---|
@cf/baai/bge-m3 | 1024 in molte lingue | 8,192 pagine |
@cf/qwen/qwen3-embedding-0.6b | 1024 in molte lingue | 8,192 pagine |
@cf/baai/bge-large-en-v1.5 | 1024 in inglese | 512 tasselli |
@cf/baai/bge-base-en-v1.5 | 768, inglese | 512 tasselli |
@cf/baai/bge-small-en-v1.5 | 384 in inglese | 512 tasselli |
L'elenco dei modelli è la fonte di verità per cui sono disponibili e quanto costano; Google's EmbeddingGemma, con vettori più brevi su richiesta, appare lì anche quando il catalogo ha un prezzo per esso.
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 }
}
| Statuto | Quando |
|---|---|
400 | Nessun ingresso o uno vuoto; token array (token_input_unsupported(più di 100 ingressi)too_many_inputs); un ingresso più lungo del modello prende (input_too_long(una dimensione che il modello non può dare)unsupported_dimensions). |
402 | Il saldo standard è troppo basso. gli embeddings non usano mai il saldo Pro. |
404 | Nessun modello con questo nome. |
502 | Il modello è fallito. Niente è caricato. |
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);