Saltar al contenido
Volver a Nymbot

base de conocimientos desarrolladores

Imágenes, audio y embeddings

Los generadores de la aplicación, y los bloques de construcción para la búsqueda: imágenes, vídeo, habla, transcripción y embeddings, cada uno facturado por uso de su balance.

Generar imágenes

Realiza de una a cuatro imágenes desde un prompt y las devuelve cuando se hayan hecho. ?image En la app.

POST https://nymbot.ai/api/v1/images/generations — necesita una clave de API, o Pago Lightning por solicitud.

Los ids vienen de GET /api/v1/models?type=imageEl generador estándar, @cf/black-forest-labs/flux-1-schnell, cuesta un plano 5 créditos estándar (50 sats) una imagen. Cada otro generador gasta créditos Pro a su propio precio, con la tarifa habitual y margen, como en La app. n Las fotos cuestan n Un campo que un generador no toma se cae en lugar de rechazado; el generador estándar utiliza sólo el prompt.

CampoTipoRequiereDescripción
modelStringSíUn generador de identidad, como nano-banana.
promptStringSíSólo se utilizan los primeros 2000 caracteres.
nEntierroNo1 a 4.Default 1.También aceptado como num_images.
sizeStringNoUna proporción de puntos como "16:9", o un tamaño de OpenAI como "1792x1024", que se convierte en el más cercano de 1:1, 16:9, 9:16, 4:3, 3:4, 3:2, 2:3, 21:9, 5:4 y 4:5. "auto" Lo dejo en el generador.
aspect_ratioStringNoLo mismo que sizeY ganará si ambos son enviados.
qualityStringNoGeneradores específicos, como "low", "medium" o "high".
negative_promptStringNoLo que dejar fuera.
output_formatStringNo"png", "jpeg" o "webp".
response_formatStringNo"url" (el defecto) o "b64_json".
image_urlStringNoUna imagen para comenzar con: un https:// un enlace de un máximo de 4096 caracteres sin nombre de usuario ni contraseña en él, o un data:image/…;base64 URL (PNG, JPEG, WebP o GIF; no SVG). editrequeridos por aquellos con requires_image_url.

resolution no se utiliza: cada generador hace su propio tamaño. url, cada imagen se sube a un anfitrión público de Blossom y usted obtiene su enlace (algunos generadores solo devuelven un enlace propio, que se transmite). Lo que el fuego puede vercon b64_json la imagen se vuelve en la respuesta y nunca se sube. Una imagen enviada como data: URL en image_url Se verifica de la misma manera que un Editar y cargado a Blossom primero para que el generador pueda recogerlo; se elimina de nuevo si la solicitud no es descargada.

Si algunas de las n las imágenes fallan, se obtienen las que funcionaron, se cobran solo por aquellas (más cualquiera que el proveedor haya facturado a pesar del fracaso), y nymbot.failed indica cuántos están faltando. Si todos fallan, la solicitud devuelve 502.

Respuesta

{
  "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 }
}
EstatusCuando
400No de prisa; n de 1 a 4 (invalid_value); un mal tamaño (invalid_size) o la imagen (invalid_image, invalid_image_url); un modelo que existe pero no es un generador de imagen (invalid_model); una imagen para un generador que no puede editar (edit_unsupported); no hay imagen para uno que lo necesite (image_required).
402El balance no puede cubrir todas las imágenes solicitadas.
404No hay modelo con ese nombre (model_not_found).
502El generador falló (upstream_errorNada se cobra a menos que el proveedor haya facturado por el intento; entonces el error ha charged_sats.
503Las imágenes no se pueden alojar en este momento (media_hosting_unavailable). b64_json sigue funcionando.

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

Editar imágenes

Cambia una imagen que sube, siguiendo una promesa. Este es el punto final de edición de OpenAI, por lo que los SDK de OpenAI images.edit funcionan como son. Solo los generadores Pro con edit en la lista de modelos lo acepta.

POST https://nymbot.ai/api/v1/images/edits — necesita una clave de API, o Pago Lightning por solicitudEl cuerpo es multipart/form-datahasta 32 MB.

CampoTipoRequiereDescripción
imagearchivoSíLa imagen a editar: PNG, JPEG, WebP o GIF, hasta 20 MB. image[]El primero se utiliza.
promptStringSíLo que cambiar.
modelStringSíUn generador con edit.
nEntierroNo1 a 4.
size
aspect_ratio
quality
negative_prompt
output_format
StringNoEn cuanto a la generación.
response_formatStringNo"b64_json" (el defecto aquí) o "url".

La imagen que sube se verifica para ser un bien formado PNG, JPEG, WebP o GIF, enviado como su tipo real, y colocado en un anfitrión público Blossom, porque los generadores recogen su entrada por enlace. Tratarlo como público. Si la edición falla y nada se carga, la copia alojada se borra de nuevo. La respuesta tiene la misma forma que para la generación. El precio es el precio del generador, que para algunos generadores incluye una tarifa para la imagen de entrada.

Respuesta

{
  "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 }
}
EstatusCuando
400No hay imagen o prompt, un archivo que no es una imagen (invalid_image), o un generador que no puede editar (edit_unsupported).
413La imagen es de más de 20 MB (file_too_large), o toda la solicitud de más de 32 MB.
503La imagen no se puede alojar en este 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"));

Vídeo

Un vídeo toma minutos, por lo que se ejecuta en el fondo. Lo envías, obtendrás una identificación inmediatamente, y preguntarás sobre la identificación hasta que se haga.

POST https://nymbot.ai/api/v1/videos — necesita una clave de API, o Pago Lightning por solicitud- Regreso 202.

CampoTipoRequiereDescripción
modelStringSíUn generador de video id de GET /api/v1/models?type=video, tales como veo.
promptStringSíLo que debería suceder.
durationNúmero o stringNoLongitud en segundos, más de 0 y hasta 60. Utilizado sólo por generadores que te permiten elegir la longitud; los otros hacen su longitud habitual, que es lo que seconds en la respuesta y el precio sigue.
aspect_ratioStringNoTal como "16:9" o "9:16"Un tamaño como el "1280x720" se convierte en la proporción más cercana.
resolution
quality
StringNoUno de los generadores resolutions En la lista de modelos, como "720p" o "1080p"Establece el precio.Todo lo demás se rechaza con unsupported_resolution.
image_urlStringNoUna imagen para comenzar con: un https:// Enlace o a data:image/… URL, que se sube primero a un servidor público Blossom. Requiere generadores con requires_image_url.

El precio es fijo cuando se envía, desde el generador, la resolución y la longitud, por lo que se cobra de su saldo Pro tan pronto como el proveedor acepte el trabajo, y se muestra como cost, estimated_cost y nymbotSi el proveedor rechaza el trabajo, no se cobra nada. Si la renderización fallece más tarde, o el clip acabado no puede almacenarse y el proveedor no ha facturado por él, la factura se reembolsará una vez, automáticamente. Una renderización que todavía está pasando después de una hora se abandona, y mantiene su cargo, porque el proveedor factura una renderización una vez que la acepta.

La respuesta (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 Comienza como in_progress, o completed El video ya está en data cuando el generador lo devuelve inmediatamente.

Comprobar en un video

GET https://nymbot.ai/api/v1/videos/{id} - Necesita una llave perteneciente al nim que la envió.Una llave que haya alcanzado su límite todavía puede comprobar.

Él responde 202 En el momento en que se realiza el video y 200 una vez que se haya terminado o ha fracasado. Pregunta cada 5 a 10 segundos. Cada cheque pregunta al proveedor una vez y responde a la vez; nunca espera el vídeo. GET /api/v1/videos lista los últimos 50 empleos de la clave como {"object": "list", "data": […]}.

La respuesta (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 es in_progress, completed o failedUn trabajo fallido lleva error ({"code": "generation_failed", "message": …}Si se le ha devuelto, cost Es 0 y nymbot Añadir refunded_credits y refunded_satsEl vídeo terminado está en un anfitrión público de Blossom, como las imágenes generadas.

EstatusCuando
400No hay prompt; una duración fuera de 0 a 60 (invalid_value); una resolución que el generador no ofrece (unsupported_resolution); no hay imagen para un generador que necesite una (image_required); un modelo que no es un generador de vídeo (invalid_model).
402El balance Pro no puede cubrir el vídeo.
404No hay generador (model_not_found), o ningún trabajo por ese id para su nym, o es más de 24 horas de edad (video_not_found).
429Tu nimo ya tiene 10 videos de renderización (video_jobs_limitCompruebe en ellos y envíe más una vez que uno termina.
502El generador rechazó el trabajo. Nada se cobra a menos que el proveedor lo haya facturado.
503Los videos no pueden ser entregados o almacenados en este 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);

Texto del discurso

Lee texto en voz alta y devuelve el archivo de audio en sí, no un enlace. audio.speech.create En el OpenAI SDKs funciona.

POST https://nymbot.ai/api/v1/audio/speech — necesita una clave de API, o Pago Lightning por solicitud.

CampoTipoRequiereDescripción
modelStringNoUn modelo de discurso de Lista de modelos de audioPor defecto: la voz estándar, @cf/myshell-ai/melotts. aura-2 Es el Deepgram Aura 2.
inputStringSíEl texto a leer: hasta 800 caracteres para la voz estándar, 2.000 para Aura 2.
voiceStringNoUna identidad de voz de La lista de voces: un hablante de aura como luna (o el aura-2-luna-en, o un lenguaje MeloTTS (en, es, fr, zhOpenAI nombres de voz tales como alloy son aceptados y dan la voz predeterminada del modelo.
languageStringNoUn código de idiomas como esSin una voz, se selecciona una para ese idioma. Una voz que habla otro idioma vuelve 422 voice_language_mismatchy un lenguaje para el que el modelo no tiene voz 422 unsupported_language.
response_formatStringNoLa voz estándar regresa mp3 Aura 2 regresa mp3 (en el caso del defecto), opus, aac, flac, wav o pcm.
speednúmeroNoaceptado y ignorado.

La voz estándar cuesta un plano 3 créditos estándar (30 sats) una solicitud, como en la aplicación. Aura 2 es Pro, precio por los caracteres que envía. El cuerpo de respuesta es el audio, con un Content-TypeEl costo está en la X-Nymbot-Cost-Sats Si el modelo de habla falla, nada se cargará.

Respuesta

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

(audio bytes)
EstatusCuando
400No hay entrada; entrada por encima del límite del modelo (input_too_long); un formato que el modelo no puede producir (unsupported_response_formatUna voz desconocida (invalid_voice); un modelo que no es un modelo de habla (invalid_model).
422La voz no habla el idioma dado, o el modelo no tiene voz para ello.
502El modelo de discurso fracasó.Nada está cargado.

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

Modelos y voces de audio

Dos listas públicas para elegir un modelo de habla y voz, o un modelo de transcripción. Hay 41 Aura 2 hablantes de inglés y cuatro idiomas MeloTTS.

GET https://nymbot.ai/api/v1/audio/models No es necesaria la llave.

GET https://nymbot.ai/api/v1/audio/voices?language=en No es necesaria la llave.

CampoTipoRequiereDescripción
languageConexión (Query)NoSólo voces para este idioma.
modelConexión (Query)NoSólo voces para este modelo.

Respuestas (en voz alta)

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

Los modelos de la lista de respuestas {"object": "list", "data": {"tts": […], "stt": […]}}Cada modelo de discurso da su equilibrio, precio, max_input_chars, response_formats, languages y default_voiceEl modelo de transcripción da sus alias, max_file_bytes, max_secondsPrecio y formato por 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);

Discurso en texto

Convierte una grabación en texto con Whisper. Este es el punto final de transcripción de OpenAI, así que audio.transcriptions.create Los trabajos.

POST https://nymbot.ai/api/v1/audio/transcriptions — necesita una clave de API, o Pago Lightning por solicitudEl cuerpo es multipart/form-data.

CampoTipoRequiereDescripción
filearchivoSíLa grabación, de 256 bytes a 25 MB y hasta 30 minutos: WAV, WebM, MP4 o M4A, Ogg o Opus, MP3 y los otros formatos Whisper lee.
modelStringNodefecto whisper¿Qué es Whisper Large v3 Turbo? whisper-1, whisper-large-v3-turbo y @cf/openai/whisper-large-v3-turbo Significa lo mismo.
languageStringNoEl lenguaje hablado, como enDetectado si se deja fuera.
promptStringNoPalabras o ortografías a esperar, como nombres. Sólo se utilizan los primeros 1000 caracteres.
response_formatStringNojson (en el caso del defecto), text, srt, vtt o verbose_json.

Para los archivos WAV, WebM, MP4 y Ogg, la longitud se lee desde el archivo antes de que nada se ejecute, por lo que una grabación de más de 30 minutos se rechaza de antemano (con 3 segundos de gracia). La longitud de un archivo WAV proviene de su tasa de muestreo, canales y tamaño de muestreo. La longitud de otros formatos, como MP3, no se puede leer de antemano, por lo que están limitados por el tamaño: en la tasa de bit más baja Nymbot asume, 8 kbps, 30 minutos es de 1,8 MB, y un archivo más grande en tal formato se rechaza con 413 audio_too_long Enviar grabaciones más largas como WAV, WebM, MP4 o Ogg. Si Whisper luego reporta más de 30 minutos de todos modos, la solicitud se rechaza con 413 audio_too_long, y desde que Whisper se ejecutó, 30 minutos se cargan.

Usted paga por la longitud del audio, redondeado hasta el segundo: la más larga de la longitud leída del archivo, la longitud Whisper informes, y lo menos el tamaño del archivo permite, al precio por minuto de Whisper con la tarifa habitual y margen, y al menos 0.05 crédito una solicitud. 402 En la aplicación, la transcripción de un mensaje de voz puede ser gratuita; en la API siempre se carga.

Respuesta

{
  "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 Devuelve el texto claro. srt y vtt devolver los subtítulos, y verbose_json añade el idioma, la duración y los segmentos temporalizados. Para los tres que no son JSON, el coste está en los encabezados.

EstatusCuando
400No hay archivo, un archivo sin audio usable (invalid_audio, un formato desconocido, o un modelo que no es un modelo de transcripción (invalid_model).
402Tampoco el equilibrio puede cubrirlo.
413El archivo es de más de 25 MB (file_too_largeLa duración de la grabación es de más de 30 minutos o, en un formato cuya longitud no se puede leer por delante, de más de 1,8 MB (audio_too_long).
502El susurro no podía procesar el audio.

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

Traducción del discurso al inglés

POST https://nymbot.ai/api/v1/audio/translations — necesita una clave de API, o Pago Lightning por solicitudEl cuerpo es multipart/form-data.

El mismo que la transcripción, con los mismos campos aparte de language, límites y precio, pero el texto vuelve en inglés cualquiera que sea el idioma hablado. 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);

Embajadores

Convierte texto en vectores para buscar, agrupar y deduplicar.Los modelos se ejecutan en Cloudflare y gastan el saldo estándar.

POST https://nymbot.ai/api/v1/embeddings — necesita una clave de API, o Pago Lightning por solicitud.

CampoTipoRequiereDescripción
modelStringSíUn modelo de embalaje de GET /api/v1/models?type=embedding.
inputArray o array de cuerdasSíEl texto a incorporar, hasta 100 cuerdas no vacías. arreglos de token se rechazan (token_input_unsupportedCada entrada debe coincidir con la del modelo. context_length, contado como aproximadamente cuatro bytes un token.
encoding_formatStringNofloat (el defecto) o base64 (Little-endian floats de 32 bits)
dimensionsEntierroNotamaño del modelo, o para un modelo con supported_dimensions Uno de ellos; el vector es entonces acortado y normalizado.
ModeloDimensionesContexto
@cf/baai/bge-m31024 en varios idiomas8.192 fichas
@cf/qwen/qwen3-embedding-0.6b1024 en varios idiomas8.192 fichas
@cf/baai/bge-large-en-v1.51024 en Inglés512 Títulos
@cf/baai/bge-base-en-v1.5768, Inglés512 Títulos
@cf/baai/bge-small-en-v1.5384 Inglés512 Títulos

La lista de modelos es la fuente de verdad para cuáles están disponibles y cuánto cuestan; el EmbeddingGemma de Google, con vectores más cortos a petición, aparece allí también cuando el catálogo tiene un precio para ello.

Respuesta

{
  "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 }
}
EstatusCuando
400No hay entrada ni uno vacío; matriz de token (token_input_unsupported); más de 100 entradas (too_many_inputs); una entrada más larga que el modelo toma (input_too_long); un tamaño que el modelo no puede dar (unsupported_dimensions).
402El saldo estándar es demasiado bajo. Los embeddings nunca usan el saldo Pro.
404No hay modelo con ese nombre.
502El modelo falló.No se cobra nada.

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