Base de connaissances Développeurs
Images, audio et embeddings
Les générateurs de l'application et les blocs de construction pour la recherche: images, vidéo, discours, transcription et embeddings, chacun facturé par utilisation à partir de votre solde.
Cette page est traduite automatiquement pour plus de commodité. La version originale anglaise est la version qui s’applique.
Générer des images
Créer une à quatre images à partir d'un prompt et les retourner lorsqu'ils sont terminés. ?image dans l’app
POST https://nymbot.ai/api/v1/images/generations — nécessite une clé API, ou Un paiement Lightning sur demande.
Les ides viennent de GET /api/v1/models?type=imageLe générateur standard,
@cf/black-forest-labs/flux-1-schnell, coûte un flat 5 crédits standard (50 sats) une image. Chaque autre générateur dépense des crédits Pro à son propre prix, avec la redevance et la marge habituelle, comme dans L’app. n Les photos coûtent
n Un champ qu'un générateur ne prend pas est abandonné plutôt que refusé; le générateur standard utilise uniquement le prompt.
| champs | Type | Nécessaire | Description |
|---|---|---|---|
model | String à | Oui | Un générateur d’identification, tel que nano-banana. |
prompt | String à | Oui | Seuls les 2000 premiers caractères sont utilisés. |
n | Intégrale | Non pas | 1 à 4. par défaut 1. également accepté comme num_images. |
size | String à | Non pas | Une proportion telle que "16:9"ou une ouverture de taille telle que "1792x1024", qui devient le plus proche de 1:1, 16:9, 9:16, 4:3, 3:4, 3:2, 2:3, 21:9, 5:4 et 4:5. "auto" Je le laisse au générateur. |
aspect_ratio | String à | Non pas | Le même que sizeet gagne si les deux sont envoyés. |
quality | String à | Non pas | générateurs spécifiques, tels que "low", "medium" ou "high". |
negative_prompt | String à | Non pas | Ce qu’il faut laisser dehors. |
output_format | String à | Non pas | "png", "jpeg" ou "webp". |
response_format | String à | Non pas | "url" (le défaut) ou "b64_json". |
image_url | String à | Non pas | Une image à commencer par : un https:// un lien d'au plus 4 096 caractères sans nom d'utilisateur ni mot de passe, ou un data:image/…;base64 URL (PNG, JPEG, WebP ou GIF, pas SVG). editdemandées par ceux qui ont requires_image_url. |
resolution n'est pas utilisé : chaque générateur fait sa propre taille. url, chaque image est téléchargée sur un hébergeur public Blossom et vous obtenez son lien (certains générateurs ne renvoient qu'un lien de leur propre, qui est transmis). Ce que le feu peut voirAvec
b64_json l'image revient dans la réponse et n'est jamais téléchargée. data: URL à image_url Il est contrôlé de la même manière qu'un
Edit et téléchargé à Blossom d'abord afin que le générateur puisse le récupérer; il est supprimé à nouveau si la demande échoue à décharger.
Si certaines des n les images échouent, vous obtenez ceux qui ont fonctionné, ne sont facturés que pour ceux (plus tout le fournisseur facturé malgré l'échec), et nymbot.failed indique combien sont manquants. Si tous échouent, la demande retourne 502.
Réponse
{
"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 }
}
| Statut | Quand |
|---|---|
400 | pas rapide ; n 1 à 4 (invalid_valueUne mauvaise taille (invalid_size) ou de la photo (invalid_image, invalid_image_url) ; un modèle qui existe mais n’est pas un générateur d’images (invalid_model) ; une image pour un générateur qui ne peut pas éditer (edit_unsupportedAucune photo pour celui qui en a besoin (image_required). |
402 | Le bilan ne peut pas couvrir toutes les images demandées. |
404 | Il n'y a pas de modèle avec ce nom (model_not_found). |
502 | Le générateur a échoué (upstream_errorRien n'est facturé à moins que le fournisseur n'ait facturé pour l'essai; alors l'erreur a charged_sats. |
503 | Les photos ne peuvent pas être hébergées en ce moment (media_hosting_unavailable). b64_json Il fonctionne encore. |
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);
Édition des images
Modifie une image que vous téléchargez, suivant une prompt.C'est le point final d'édition d'OpenAI, de sorte que les SDK d'OpenAI images.edit fonctionne comme il est. Seuls les générateurs Pro avec edit Dans la liste des modèles, acceptez-le.
POST https://nymbot.ai/api/v1/images/edits — nécessite une clé API, ou Un paiement Lightning sur demandeLe corps est multipart/form-dataJusqu’à 32 Mo.
| champs | Type | Nécessaire | Description |
|---|---|---|---|
image | fichier | Oui | L'image à éditer: PNG, JPEG, WebP ou GIF, jusqu'à 20 MB. image[]Le premier est utilisé. |
prompt | String à | Oui | que de changer. |
model | String à | Oui | Un générateur avec edit. |
n | Intégrale | Non pas | 1 à 4. |
sizeaspect_ratioqualitynegative_promptoutput_format | String à | Non pas | Quant à la génération. |
response_format | String à | Non pas | "b64_json" (le défaut ici) ou "url". |
L'image que vous téléchargez est vérifiée pour être un PNG, JPEG, WebP ou GIF bien formaté, envoyé comme son type réel, et mis sur un hôte public Blossom, parce que les générateurs prennent leur entrée par lien. Traitez-la comme publique. Si l'édition échoue et que rien n'est chargé, la copie hébergée est supprimée à nouveau. La réponse a la même forme que pour la génération. Le prix est le prix du générateur, qui pour certains générateurs inclut une redevance pour l'image d'entrée.
Réponse
{
"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 }
}
| Statut | Quand |
|---|---|
400 | Aucune image ou prompt, un fichier qui n'est pas une image (invalid_image, ou un générateur qui ne peut pas éditer (edit_unsupported). |
413 | L'image est supérieure à 20 MB (file_too_large), ou toute la demande de plus de 32 MB. |
503 | La photo ne peut pas être hébergée en ce moment (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
Une vidéo prend des minutes, donc elle fonctionne en arrière-plan. Vous la soumettez, obtenez immédiatement un identifiant et demandez l'identifiant jusqu'à ce qu'il soit terminé.
POST https://nymbot.ai/api/v1/videos — nécessite une clé API, ou Un paiement Lightning sur demandeLes retournements 202.
| champs | Type | Nécessaire | Description |
|---|---|---|---|
model | String à | Oui | Générateur de vidéos ID GET /api/v1/models?type=video, tels que veo. |
prompt | String à | Oui | Ce qui devrait arriver. |
duration | Numéro ou chaîne | Non pas | Longueur en secondes, plus de 0 et jusqu'à 60. Utilisé uniquement par les générateurs qui vous permettent de choisir la longueur; les autres font leur longueur habituelle, ce qui seconds La réponse et le prix suivent. |
aspect_ratio | String à | Non pas | tels que "16:9" ou "9:16"Une taille telle que "1280x720" devient le ratio le plus proche. |
resolutionquality | String à | Non pas | L’un des générateurs resolutions Dans la liste des modèles, comme "720p" ou "1080p"Il fixe le prix.Tout le reste est refusé unsupported_resolution. |
image_url | String à | Non pas | Une image à commencer par : un https:// Lien ou A data:image/… URL, qui est d'abord téléchargé sur un hôte public Blossom. requires_image_url. |
Le prix est fixe lorsque vous soumettez, à partir du générateur, de la résolution et de la longueur, de sorte qu'il est facturé de votre solde Pro dès que le fournisseur accepte le travail, et affiché comme
cost, estimated_cost et nymbotSi le fournisseur refuse le travail, rien n'est facturé. Si le rendu échoue plus tard, ou si le clip fini ne peut pas être stocké et que le fournisseur n'a pas facturé pour lui, le paiement est remboursé une fois, automatiquement. Un rendu qui continue après une heure est abandonné, et conserve sa charge, car le fournisseur facture un rendu une fois qu'il l'accepte. Un remboursement renvoie les crédits mais ne réduit pas le nombre de dépenses de la clé.
Répondre à (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 Commence comme in_progressou completed La vidéo est déjà en data Le générateur l’a immédiatement renvoyé.
Vérifier sur une vidéo
GET https://nymbot.ai/api/v1/videos/{id} - besoin d'une clé appartenant à la nym qui l'a soumise. Une clé qui a atteint son cap peut toujours vérifier.
Il répond 202 La vidéo est en cours de réalisation et 200 une fois qu'il est terminé ou a échoué. Demandez toutes les 5 à 10 secondes. Chaque chèque demande au fournisseur une fois et répond immédiatement; il n'attend jamais la vidéo. Un travail est gardé pendant 24 heures après qu'il a été soumis.
GET /api/v1/videos liste les 50 derniers emplois de la clé comme
{"object": "list", "data": […]}.
Répondre à (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 est in_progress, completed ou failedUn travail échoué conduit error ({"code": "generation_failed", "message": …}Si elle est remboursée, cost Il est 0 et nymbot ajoutez
refunded_credits et refunded_satsLa vidéo terminée est sur un hôte public Blossom, comme les images générées.
| Statut | Quand |
|---|---|
400 | Pas de prompt; une durée en dehors de 0 à 60 (invalid_value) ; une résolution que le générateur ne propose pas (unsupported_resolution) ; aucune image pour un générateur qui a besoin d'un (image_required) ; un modèle qui n'est pas un générateur de vidéo (invalid_model). |
402 | Le bilan Pro ne peut pas couvrir la vidéo. |
404 | Pas de générateur (model_not_found), ou pas de travail par cet id pour votre nym, ou il a plus de 24 heures (video_not_found). |
429 | Votre nym a déjà 10 vidéos rendues (video_jobs_limitVérifiez-les et soumettez plus une fois que l'un termine. |
502 | Le générateur a refusé le travail. Rien n'est facturé à moins que le fournisseur n'en ait facturé. |
503 | Les vidéos ne peuvent pas être livrées ou stockées en ce moment (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);
Texte du discours
Lisse le texte à haute voix et renvoie le fichier audio lui-même, pas un lien. audio.speech.create dans les SDK OpenAI fonctionne.
POST https://nymbot.ai/api/v1/audio/speech — nécessite une clé API, ou Un paiement Lightning sur demande.
| champs | Type | Nécessaire | Description |
|---|---|---|---|
model | String à | Non pas | Un modèle de discours de Liste des modèles audioDéfaut : la voix standard, @cf/myshell-ai/melotts. aura-2 Il s’agit de Deepgram Aura 2. |
input | String à | Oui | Le texte à lire: jusqu'à 800 caractères pour la voix standard, 2000 pour Aura 2. |
voice | String à | Non pas | Un identifiant vocal de La liste des voixun haut-parleur aura tel que luna (ou de aura-2-luna-en, ou une langue MeloTTS (en, es, fr, zhLes noms de voix tels que alloy sont acceptées et donnent la voix par défaut du modèle. |
language | String à | Non pas | Un code de langue tel que esSans voix, il en choisit une pour cette langue. Une voix qui parle une autre langue revient 422 voice_language_mismatchet un langage pour lequel le modèle n'a pas de voix 422 unsupported_language. |
response_format | String à | Non pas | La voix standard revient mp3 Aura 2 est de retour mp3 (Le défaut est opus, aac, flac, wav ou pcm. |
speed | Numéro | Non pas | Accepté et ignoré. |
La voix standard coûte 3 crédits standard (30 sats) par requête, comme dans l'application. Aura 2 est Pro, prix par les caractères que vous envoyez.
Content-TypeLe coût est dans la X-Nymbot-Cost-Sats Si le modèle de parole échoue, rien n'est facturé.
Réponse
HTTP/1.1 200 OK
Content-Type: audio/mpeg
X-Nymbot-Cost-Sats: 4.2
X-Nymbot-Balance-Sats: 41055.6
(audio bytes)
| Statut | Quand |
|---|---|
400 | Aucune entrée; entrée au-delà de la limite du modèle (input_too_long) ; un format que le modèle ne peut pas produire (unsupported_response_formatUne voix inconnue (invalid_voiceUn modèle qui n'est pas un modèle de discours (invalid_model). |
422 | La voix ne parle pas la langue donnée, ou le modèle n'a pas de voix pour cela. |
502 | Le modèle de parole a échoué. Rien n'est facturé. |
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()));
Modèles audio et voix
Deux listes publiques pour choisir un modèle de parole et une voix, ou un modèle de transcription.Il y a 41 locuteurs d'anglais Aura 2 et quatre langues MeloTTS.
GET https://nymbot.ai/api/v1/audio/models Pas de clé nécessaire.
GET https://nymbot.ai/api/v1/audio/voices?language=en Pas de clé nécessaire.
| champs | Type | Nécessaire | Description |
|---|---|---|---|
language | String (recherche) | Non pas | Seules les voix pour cette langue. |
model | String (recherche) | Non pas | Seules les voix pour ce modèle. |
La réponse (voix)
{
"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 liste des réponses des modèles {"object": "list", "data": {"tts": […], "stt": […]}}Chaque modèle de discours donne son équilibre, son prix, max_input_chars,
response_formats, languages et default_voiceLe modèle de transcription donne ses aliases, max_file_bytes, max_secondsFormats et prix par minute.
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);
Discours au texte
Transforme un enregistrement en texte avec Whisper. C'est le point final de transcription d'OpenAI, donc
audio.transcriptions.create travaille .
POST https://nymbot.ai/api/v1/audio/transcriptions — nécessite une clé API, ou Un paiement Lightning sur demandeLe corps est multipart/form-data.
| champs | Type | Nécessaire | Description |
|---|---|---|---|
file | fichier | Oui | L'enregistrement, de 256 bytes à 25 MB et jusqu'à 30 minutes: WAV, WebM, MP4 ou M4A, Ogg ou Opus, MP3 et les autres formats Whisper lit. |
model | String à | Non pas | défaut whisperIl s’agit de Whisper Large v3 Turbo. whisper-1, whisper-large-v3-turbo et @cf/openai/whisper-large-v3-turbo signifie la même chose. |
language | String à | Non pas | La langue parlée, comme enDétecté si laissé dehors. |
prompt | String à | Non pas | Des mots ou des orthographies à attendre, tels que des noms. Seuls les 1 000 premiers caractères sont utilisés. |
response_format | String à | Non pas | json (Le défaut est text, srt, vtt ou verbose_json. |
Pour les fichiers WAV, WebM, MP4 et Ogg, la longueur est lue du fichier avant que rien ne fonctionne, de sorte qu'une enregistrement de plus de 30 minutes est refusée en avant (avec 3 secondes de grâce). La longueur d'un fichier WAV provient de son taux d'échantillonnage, de ses canaux et de sa taille d'échantillon. La longueur d'autres formats, tels que MP3, ne peut pas être lue en avant, de sorte qu'ils sont limités par la taille: au plus bas bitrate Nymbot suppose, 8 kbps, 30 minutes est de 1,8 MB, et un fichier plus grand dans un tel format est refusé avec 413
audio_too_long Envoyer des enregistrements plus longs comme WAV, WebM, MP4 ou Ogg. Si Whisper rapporte plus de 30 minutes de toute façon, la demande est refusée avec
413 audio_too_long, et puisque Whisper a été exécuté, 30 minutes sont chargées.
Vous payez pour la longueur de l'audio, arrondie jusqu'à la seconde: la plus longue de la longueur de lecture du fichier, la longueur des rapports de Whisper, et le moins la taille du fichier le permet, au prix par minute de Whisper avec la redevance et la marge habituelle, et au moins 0.05 crédit une demande. 402 Dans l'application, la transcription d'un message vocal peut être gratuite; sur l'API, il est toujours chargé.
Réponse
{
"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 Retour sur le texte clair, srt et vtt Retour aux sous-titres, et
verbose_json ajoute la langue, la durée et les segments temporisés. Pour les trois qui ne sont pas JSON, le coût est dans les en-têtes.
| Statut | Quand |
|---|---|
400 | Pas de fichier, un fichier sans audio utilisable (invalid_audio, un format inconnu, ou un modèle qui n'est pas un modèle de transcription (invalid_model). |
402 | L’équilibre ne peut pas le couvrir. |
413 | Le fichier est supérieur à 25 MB (file_too_largeLa durée de l'enregistrement est supérieure à 30 minutes ou, dans un format dont la longueur n'est pas lisible à l'avant, supérieure à 1,8 Mo (audio_too_long). |
502 | Le whisper ne peut pas traiter l'audio. rien n'est chargé. |
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);
Traduction du discours en anglais
POST https://nymbot.ai/api/v1/audio/translations — nécessite une clé API, ou Un paiement Lightning sur demandeLe corps est multipart/form-data.
Le même que la transcription, avec les mêmes champs en dehors de language, les limites et le prix, mais le texte revient en anglais quelle que soit la langue parlée. 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);
Les embeddings
Convertit le texte en vecteurs pour la recherche, le regroupement et la déduplication. Les modèles s'exécutent sur Cloudflare et dépensent le solde standard.
POST https://nymbot.ai/api/v1/embeddings — nécessite une clé API, ou Un paiement Lightning sur demande.
| champs | Type | Nécessaire | Description |
|---|---|---|---|
model | String à | Oui | Un modèle d’emballage de GET /api/v1/models?type=embedding. |
input | String ou array de strings | Oui | Le texte à intégrer, jusqu'à 100 chaînes non vides. les matrices de jetons sont refusées (token_input_unsupportedChaque entrée doit correspondre au modèle context_length, comptabilisé comme environ quatre bytes un jeton. |
encoding_format | String à | Non pas | float (le défaut) ou base64 (Référence de 32 bits) |
dimensions | Intégrale | Non pas | la taille du modèle, ou pour un modèle avec supported_dimensions Le vecteur est ensuite raccourci et normalisé, tout le reste est refusé. |
| Modèle | Dimensions | Le contexte |
|---|---|---|
@cf/baai/bge-m3 | 1024 dans plusieurs langues | 8 192 cartes |
@cf/qwen/qwen3-embedding-0.6b | 1024 dans plusieurs langues | 8 192 cartes |
@cf/baai/bge-large-en-v1.5 | 1024 en anglais | 512 cartes |
@cf/baai/bge-base-en-v1.5 | 768, Anglais | 512 cartes |
@cf/baai/bge-small-en-v1.5 | 384 Anglais | 512 cartes |
La liste des modèles est la source de vérité pour lesquelles ils sont disponibles et ce qu'ils coûtent; Google's EmbeddingGemma, avec des vecteurs plus courts sur demande, apparaît là aussi lorsque le catalogue a un prix pour elle.
Réponse
{
"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 }
}
| Statut | Quand |
|---|---|
400 | Aucune entrée ou un vide; token array (token_input_unsupported(plus de 100 entrées)too_many_inputs) ; une entrée plus longue que le modèle prend (input_too_long) ; une taille que le modèle ne peut pas donner (unsupported_dimensions). |
402 | L'équilibre standard est trop bas. Les embeddings n'utilisent jamais l'équilibre Pro. |
404 | Pas de modèle avec ce nom. |
502 | Le modèle a échoué.Rien n'est facturé. |
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);