Passer au contenu
Retour à Nymbot

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.

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.

champsTypeNécessaireDescription
modelString àOuiUn générateur d’identification, tel que nano-banana.
promptString àOuiSeuls les 2000 premiers caractères sont utilisés.
nIntégraleNon pas1 à 4. par défaut 1. également accepté comme num_images.
sizeString àNon pasUne 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_ratioString àNon pasLe même que sizeet gagne si les deux sont envoyés.
qualityString àNon pasgénérateurs spécifiques, tels que "low", "medium" ou "high".
negative_promptString àNon pasCe qu’il faut laisser dehors.
output_formatString àNon pas"png", "jpeg" ou "webp".
response_formatString àNon pas"url" (le défaut) ou "b64_json".
image_urlString àNon pasUne 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 }
}
StatutQuand
400pas 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).
402Le bilan ne peut pas couvrir toutes les images demandées.
404Il n'y a pas de modèle avec ce nom (model_not_found).
502Le 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.
503Les 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.

champsTypeNécessaireDescription
imagefichierOuiL'image à éditer: PNG, JPEG, WebP ou GIF, jusqu'à 20 MB. image[]Le premier est utilisé.
promptString àOuique de changer.
modelString àOuiUn générateur avec edit.
nIntégraleNon pas1 à 4.
size
aspect_ratio
quality
negative_prompt
output_format
String àNon pasQuant à la génération.
response_formatString à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 }
}
StatutQuand
400Aucune 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).
413L'image est supérieure à 20 MB (file_too_large), ou toute la demande de plus de 32 MB.
503La 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.

champsTypeNécessaireDescription
modelString àOuiGénérateur de vidéos ID GET /api/v1/models?type=video, tels que veo.
promptString àOuiCe qui devrait arriver.
durationNuméro ou chaîneNon pasLongueur 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_ratioString àNon pastels que "16:9" ou "9:16"Une taille telle que "1280x720" devient le ratio le plus proche.
resolution
quality
String àNon pasL’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_urlString àNon pasUne 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.

StatutQuand
400Pas 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).
402Le bilan Pro ne peut pas couvrir la vidéo.
404Pas 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).
429Votre nym a déjà 10 vidéos rendues (video_jobs_limitVérifiez-les et soumettez plus une fois que l'un termine.
502Le générateur a refusé le travail. Rien n'est facturé à moins que le fournisseur n'en ait facturé.
503Les 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.

champsTypeNécessaireDescription
modelString àNon pasUn 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.
inputString àOuiLe texte à lire: jusqu'à 800 caractères pour la voix standard, 2000 pour Aura 2.
voiceString àNon pasUn 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.
languageString àNon pasUn 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_formatString àNon pasLa voix standard revient mp3 Aura 2 est de retour mp3 (Le défaut est opus, aac, flac, wav ou pcm.
speedNuméroNon pasAccepté 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)
StatutQuand
400Aucune 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).
422La voix ne parle pas la langue donnée, ou le modèle n'a pas de voix pour cela.
502Le 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.

champsTypeNécessaireDescription
languageString (recherche)Non pasSeules les voix pour cette langue.
modelString (recherche)Non pasSeules 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.

champsTypeNécessaireDescription
filefichierOuiL'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.
modelString àNon pasdé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.
languageString àNon pasLa langue parlée, comme enDétecté si laissé dehors.
promptString àNon pasDes mots ou des orthographies à attendre, tels que des noms. Seuls les 1 000 premiers caractères sont utilisés.
response_formatString àNon pasjson (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.

StatutQuand
400Pas 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).
402L’équilibre ne peut pas le couvrir.
413Le 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).
502Le 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.

champsTypeNécessaireDescription
modelString àOuiUn modèle d’emballage de GET /api/v1/models?type=embedding.
inputString ou array de stringsOuiLe 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_formatString àNon pasfloat (le défaut) ou base64 (Référence de 32 bits)
dimensionsIntégraleNon pasla 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èleDimensionsLe contexte
@cf/baai/bge-m31024 dans plusieurs langues8 192 cartes
@cf/qwen/qwen3-embedding-0.6b1024 dans plusieurs langues8 192 cartes
@cf/baai/bge-large-en-v1.51024 en anglais512 cartes
@cf/baai/bge-base-en-v1.5768, Anglais512 cartes
@cf/baai/bge-small-en-v1.5384 Anglais512 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 }
}
StatutQuand
400Aucune 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).
402L'équilibre standard est trop bas. Les embeddings n'utilisent jamais l'équilibre Pro.
404Pas de modèle avec ce nom.
502Le 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);