Base de coñecemento desenvolvedores
Chat, respostas e mensaxes
Tres xeitos de preguntar a un modelo algo, nos tres formatos os clientes xa falan, todos executados nos mesmos modelos e facturados do mesmo xeito.
Esta páxina está traducida por máquina para maior comodidade. O orixinal en inglés é a versión que se aplica.
Chat Complementos
O formato de chat OpenAI, e o que soporta case todas as ferramentas. Envía a conversa ata agora e recibe a seguinte mensaxe de volta.
POST https://nymbot.ai/api/v1/chat/completions Necesita unha chave de API.
só model e messages Un parámetro de mostraxe que o modelo elixido non toma cae sen un erro, polo que un corpo de solicitude funciona entre modelos. supported_parametersO que se rexeita en lugar de caer é algo que o modelo non pode facer: imaxes para un modelo que non pode ver, ferramentas para un modelo que non pode chamalos.
| Campo | Tipo | Necesario | Descrición |
|---|---|---|---|
model | unha string | Si | nymbot/auto ou auto) para o enrutamento de Nymbot no saldo estándar, ou un identificador de modelo de catálogo como anthropic/claude-sonnet-5 no balance Pro. Tamén se aceptan os nomes curtos e alias da aplicación. Suficiente. |
messages | Arranxo | Si | As conversacións, os roles system, developer (Tratado como un sistema) user, assistant e toolContido é unha cadea ou unha lista de text e image_url partes; imaxes só en mensaxes de usuario. input_audio As partes do ficheiro son rexeitadas. |
stream | booleán | non | Envía a resposta tal e como está escrita.Ver Streaming. |
stream_options | Obxecto | non | {"include_usage": true} engade unha parte final con contas de token e o custo. |
max_tokensmax_completion_tokens | enteiro | non | A maioría dos tokens para escribir. Baixado ao máximo do modelo se é maior. Tamén establece canto se mantén do seu saldo, polo que un número máis pequeno necesita menos crédito para comezar. |
temperaturetop_p | Número | non | Control de mostraxe: temperature De 0 a 2, top_p De 0 a 1. |
stop | string ou array | non | Texto que remata a resposta: unha cadea ou un máximo de 4 cadeas, cada unha con un máximo de 256 caracteres. nymbot/auto. |
seed | enteiro | non | Para a mostraxe repetible, onde o modelo o apoie. |
presence_penaltyfrequency_penalty | Número | non | Controles de repetición, cada un de -2 a 2. |
response_format | Obxecto | non | {"type": "json_object"} ou {"type": "json_schema", "json_schema": {…}}, onde o modelo o soporta.Non se usa por nymbot/auto. |
toolstool_choiceparallel_tool_calls | array, string ou obxecto, booleano | non | Funcións de chamada. ver Ferramentas de chamadas. a web_search As ferramentas están en Busca webA un máximo de 128 ferramentas e 512 KB de definicións, anexadas a un máximo de 64 niveis de profundidade; máis é un 400. |
reasoning_effortreasoning | Xénero, obxecto | non | "minimal", "low", "medium" ou "high"ou {"effort": "high"}. "none" ou {"enabled": false} Deixámolo fóra.Vexamos razoamento. |
plugins | Arranxo | non | [{"id": "web", "max_results": 5}] sempre busca a web primeiro. ata 10 resultados. |
n | enteiro | non | 1 Todo o demais volve 400. |
logit_biasusermetadata | obxecto, liña, obxecto | non | Aceptado e non enviado. logit_bias mapas con máis de 300 token ids a números de -100 a 100; user Ten un máximo de 256 caracteres. metadata Ten un máximo de 16 valores de cadea, teclas de ata 64 caracteres e valores de ata 512. |
A resposta é ordinaria chat.completionAínda que o custo en usage.cost
(en dólares) e na súa nymbot O obxecto. model é o modelo resolto id, polo que un nome curto volve como o completo. message.reasoning_contentseparados da resposta.
Resposta
{
"id": "chatcmpl-5f1c0a9e27d84b3c",
"object": "chat.completion",
"created": 1790726400,
"model": "anthropic/claude-sonnet-5",
"choices": [
{
"index": 0,
"message": {
"role": "assistant",
"content": "A Lightning invoice is a one-time payment request..."
},
"logprobs": null,
"finish_reason": "stop"
}
],
"usage": {
"prompt_tokens": 1240,
"completion_tokens": 380,
"total_tokens": 1620,
"prompt_tokens_details": { "cached_tokens": 0 },
"completion_tokens_details": { "reasoning_tokens": 0 },
"cost": 0.01895
},
"nymbot": {
"balance": "pro",
"charged_credits": 0.162,
"charged_sats": 16.2,
"balance_credits": 412.425,
"balance_sats": 41242.5
}
}
finish_reason é elaborado a partir do que volveu, xa que os provedores relatan de forma diferente: tool_calls Cando o modelo pediu ferramentas, length cando a resposta usou todos os tokens permitidos (ou o modelo pasou todos razoando e non escribiu ningunha resposta), content_filter cando o prestador rexeita, e stop
doutro xeito. usage.completion_tokens_details.reasoning_tokens é sempre 0: os tokens de razoamento ocultos son contados, e cargados, en completion_tokens.
| Estatuto | cando |
|---|---|
400 | non model ou messages (missing_required_parameter); unha parte de audio ou ficheiro, ou imaxes para un modelo que non os vexa (unsupported_content); máis de 20 imaxes (too_many_images); un parámetro de mostraxe do tipo incorrecto ou fóra de rango (invalid_value); unha imaxe que non é pública (invalid_image_url); ferramentas sobre un modelo que non poden chamarlles (unsupported_tool); n máis que 1; a :thinking Un modelo que non pode razoar (model_not_found); ou o provedor rexeitou a solicitude (upstream_rejected). |
402 | O saldo que o modelo gasta non pode cubrir a posesión. |
403 | O peor caso non se encaixa no capó da chave (key_limit_reached) máis baixo max_tokens ou levantar a cabeza. |
404 | Ningún modelo con ese nome (model_not_found). |
429 | O límite de taxa da clave, ou a do provedor (upstream_rate_limited). |
502, 503 | O propietario falou (upstream_error) ou está sobrecargado (upstream_overloaded, con Retry-AfterNon se cobra nada a menos que o provedor faga unha factura polo intento. |
Os códigos de estado de todas as accións de punto final están listados baixo Erros.
cURL
curl https://nymbot.ai/api/v1/chat/completions \
-H "Authorization: Bearer $NYMBOT_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "anthropic/claude-sonnet-5",
"messages": [
{"role": "system", "content": "Answer in one short paragraph."},
{"role": "user", "content": "What is a Lightning invoice?"}
],
"max_tokens": 400
}'
Python
import os
from openai import OpenAI
client = OpenAI(base_url="https://nymbot.ai/api/v1", api_key=os.environ["NYMBOT_API_KEY"])
reply = client.chat.completions.create(
model="anthropic/claude-sonnet-5",
messages=[
{"role": "system", "content": "Answer in one short paragraph."},
{"role": "user", "content": "What is a Lightning invoice?"},
],
max_tokens=400,
)
print(reply.choices[0].message.content)
print(reply.usage.cost)
JavaScript
import OpenAI from "openai";
const client = new OpenAI({ baseURL: "https://nymbot.ai/api/v1", apiKey: process.env.NYMBOT_API_KEY });
const reply = await client.chat.completions.create({
model: "anthropic/claude-sonnet-5",
messages: [
{ role: "system", content: "Answer in one short paragraph." },
{ role: "user", content: "What is a Lightning invoice?" },
],
max_tokens: 400,
});
console.log(reply.choices[0].message.content);
console.log(reply.usage.cost);
Streaming
con "stream": true a resposta chega como eventos enviados polo servidor mentres o modelo a escribe. chat.completion.chunk Unha a data: liña, e o fluxo remata con data: [DONE]O razoamento chega á
delta.reasoning_contentA resposta en delta.content.
Stream calquera cousa que pode levar máis de 100 segundos, como unha resposta longa, unha gran
max_tokens Unha solicitude que non é transmitida non envía nada ata que a resposta estea completa, e a rede entre vostede e Nymbot pode pechar unha conexión baleira despois de aproximadamente 100 segundos; o modelo aínda remata e o que escribiu está cargado, pero a resposta está perdida.
Fluxo
data: {"id":"chatcmpl-5f1c0a9e27d84b3c","object":"chat.completion.chunk","created":1790726400,"model":"anthropic/claude-sonnet-5","choices":[{"index":0,"delta":{"role":"assistant","content":""},"finish_reason":null}]}
data: {"id":"chatcmpl-5f1c0a9e27d84b3c","object":"chat.completion.chunk","created":1790726400,"model":"anthropic/claude-sonnet-5","choices":[{"index":0,"delta":{"content":"A Lightning invoice"},"finish_reason":null}]}
: keep-alive
data: {"id":"chatcmpl-5f1c0a9e27d84b3c","object":"chat.completion.chunk","created":1790726400,"model":"anthropic/claude-sonnet-5","choices":[{"index":0,"delta":{},"finish_reason":"stop"}]}
data: {"id":"chatcmpl-5f1c0a9e27d84b3c","object":"chat.completion.chunk","created":1790726400,"model":"anthropic/claude-sonnet-5","choices":[],"usage":{"prompt_tokens":1240,"completion_tokens":380,"total_tokens":1620,"cost":0.01895},"nymbot":{"balance":"pro","charged_credits":0.162,"charged_sats":16.2,"balance_credits":412.425,"balance_sats":41242.5}}
data: [DONE]
- Liñas que comezan con
:Son comentarios permanentes, enviados cada 15 segundos mentres o modelo está a pensar. - Pregunta para
"stream_options": {"include_usage": true}para obter o último anaco de arriba, cun baleirochoices, o token conta, o custo e onymbotO obxecto. - Se pecha a conexión cedo, o modelo non se detén: Nymbot le o resto do fluxo do provedor, durante ata 25 segundos, para obter a súa conta de token, e paga o que o provedor informa.
- Un erro antes do primeiro chunk, como
401ou402, volve como JSON ordinario co seu código de estado, non como un fluxo.data: {"error": {…}}acontecemento, e o fluxo remata sen[DONE]. - As solicitudes con ferramentas, e os modelos no transporte de Responses de OpenAI, non flúen desde o provedor.
cURL
curl -N https://nymbot.ai/api/v1/chat/completions \
-H "Authorization: Bearer $NYMBOT_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "nymbot/auto",
"stream": true,
"stream_options": {"include_usage": true},
"messages": [{"role": "user", "content": "Write a haiku about sats."}]
}'
Python
import os
from openai import OpenAI
client = OpenAI(base_url="https://nymbot.ai/api/v1", api_key=os.environ["NYMBOT_API_KEY"])
stream = client.chat.completions.create(
model="nymbot/auto",
stream=True,
stream_options={"include_usage": True},
messages=[{"role": "user", "content": "Write a haiku about sats."}],
)
for chunk in stream:
if chunk.choices:
print(chunk.choices[0].delta.content or "", end="", flush=True)
elif chunk.usage:
print("\ncost:", chunk.usage.cost)
JavaScript
import OpenAI from "openai";
const client = new OpenAI({ baseURL: "https://nymbot.ai/api/v1", apiKey: process.env.NYMBOT_API_KEY });
const stream = await client.chat.completions.create({
model: "nymbot/auto",
stream: true,
stream_options: { include_usage: true },
messages: [{ role: "user", content: "Write a haiku about sats." }],
});
for await (const chunk of stream) {
if (chunk.choices.length) process.stdout.write(chunk.choices[0].delta.content || "");
else if (chunk.usage) console.log("\ncost:", chunk.usage.cost);
}
Ferramentas de chamadas
Describe as funcións en tools e o modelo pode solicitar unha chamada en lugar de responder. Executa a función, engade o seu resultado como unha tool mensaxe coa mesma
tool_call_idNymbot nunca executa as túas funcións; transmite a solicitude do modelo de volta a ti.
tool_choice Toma "auto", "none",
"required" ou {"type": "function", "function": {"name": "…"}}A lista de modelos marca os modelos que poden chamar ferramentas (capabilities.toolsAs ferramentas son rexeitadas 400 unsupported_tool que nymbot/auto e sobre os poucos modelos de catálogo que se executan no transporte de Responses de OpenAI, ao que Nymbot non pode pasar ferramentas.
con "stream": true, unha solicitude con ferramentas execútase nunha peza e entón é enviada como unha secuencia normal: o papel, unha peza que leva cada chamada de ferramenta co seu índice, id, nome e argumentos, e a peza final.
A resposta, en parte
"choices": [
{
"index": 0,
"message": {
"role": "assistant",
"content": null,
"tool_calls": [
{
"id": "call_7d2e",
"type": "function",
"function": { "name": "get_invoice_status", "arguments": "{\"invoice_id\":\"a41f\"}" }
}
]
},
"finish_reason": "tool_calls"
}
]
cURL
curl https://nymbot.ai/api/v1/chat/completions \
-H "Authorization: Bearer $NYMBOT_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "anthropic/claude-sonnet-5",
"messages": [{"role": "user", "content": "Has invoice a41f been paid?"}],
"tools": [{
"type": "function",
"function": {
"name": "get_invoice_status",
"description": "Look up whether an invoice is paid.",
"parameters": {
"type": "object",
"properties": {"invoice_id": {"type": "string"}},
"required": ["invoice_id"]
}
}
}]
}'
Python
import json, os
from openai import OpenAI
client = OpenAI(base_url="https://nymbot.ai/api/v1", api_key=os.environ["NYMBOT_API_KEY"])
tools = [{
"type": "function",
"function": {
"name": "get_invoice_status",
"description": "Look up whether an invoice is paid.",
"parameters": {
"type": "object",
"properties": {"invoice_id": {"type": "string"}},
"required": ["invoice_id"],
},
},
}]
messages = [{"role": "user", "content": "Has invoice a41f been paid?"}]
reply = client.chat.completions.create(model="anthropic/claude-sonnet-5", messages=messages, tools=tools)
call = reply.choices[0].message.tool_calls[0]
args = json.loads(call.function.arguments)
messages.append(reply.choices[0].message)
messages.append({"role": "tool", "tool_call_id": call.id, "content": json.dumps({"paid": True})})
final = client.chat.completions.create(model="anthropic/claude-sonnet-5", messages=messages, tools=tools)
print(final.choices[0].message.content)
JavaScript
import OpenAI from "openai";
const client = new OpenAI({ baseURL: "https://nymbot.ai/api/v1", apiKey: process.env.NYMBOT_API_KEY });
const tools = [{
type: "function",
function: {
name: "get_invoice_status",
description: "Look up whether an invoice is paid.",
parameters: {
type: "object",
properties: { invoice_id: { type: "string" } },
required: ["invoice_id"],
},
},
}];
const messages = [{ role: "user", content: "Has invoice a41f been paid?" }];
const reply = await client.chat.completions.create({ model: "anthropic/claude-sonnet-5", messages, tools });
const call = reply.choices[0].message.tool_calls[0];
const args = JSON.parse(call.function.arguments);
messages.push(reply.choices[0].message);
messages.push({ role: "tool", tool_call_id: call.id, content: JSON.stringify({ paid: true }) });
const final = await client.chat.completions.create({ model: "anthropic/claude-sonnet-5", messages, tools });
console.log(final.choices[0].message.content);
Imaxes nunha solicitude
Modelos con capabilities.vision Pode ler imaxes. engadir unha image_url
parte a unha mensaxe de usuario, con un público https:// ligazón ou a
data:image/…;base64, O artigo principal desta categoría é: Impreso ou non, Impreso ou non, Impreso ou non, Impreso ou non, Impreso ou non, Impreso ou non.400 invalid_image_urlUnha opción detail é
auto, low ou high.
con nymbot/auto, unha solicitude cunha imaxe nela é dirixida a un modelo estándar que pode ver. capabilities.vision Rexeitar imaxes con
400 unsupported_contentUnha ligazón debe apuntar a un host público; Nymbot transmite a imaxe ao provedor do modelo e non a conserva.
Unha imaxe cobra como os tokens de entrada que o provedor conta para ela, como o resto da solicitude.
cURL
curl https://nymbot.ai/api/v1/chat/completions \
-H "Authorization: Bearer $NYMBOT_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "anthropic/claude-sonnet-5",
"messages": [{
"role": "user",
"content": [
{"type": "text", "text": "What is in this picture?"},
{"type": "image_url", "image_url": {"url": "https://example.com/receipt.jpg"}}
]
}]
}'
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("receipt.jpg", "rb") as f:
data_url = "data:image/jpeg;base64," + base64.b64encode(f.read()).decode()
reply = client.chat.completions.create(
model="anthropic/claude-sonnet-5",
messages=[{
"role": "user",
"content": [
{"type": "text", "text": "What is in this picture?"},
{"type": "image_url", "image_url": {"url": data_url}},
],
}],
)
print(reply.choices[0].message.content)
JavaScript
import { readFile } 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 dataUrl = "data:image/jpeg;base64," + (await readFile("receipt.jpg")).toString("base64");
const reply = await client.chat.completions.create({
model: "anthropic/claude-sonnet-5",
messages: [{
role: "user",
content: [
{ type: "text", text: "What is in this picture?" },
{ type: "image_url", image_url: { url: dataUrl } },
],
}],
});
console.log(reply.choices[0].message.content);
razoamento
Modelos con capabilities.reasoning Pode pensar antes de responder.Preguntar por máis ou menos con reasoning_effort ("minimal", "low",
"medium" ou "high") ou "reasoning": {"effort": "high"}ou engadir :thinking ao nome do modelo, o que significa alto esforzo. Nun modelo sen razoamento, a configuración é ignorada. nymbot/auto, :thinking Envía a solicitude á ruta de razoamento estándar.
En modelos Anthropic o esforzo convértese nun orzamento de pensamento de preto de 1.000, 2.000, 8.000 ou 16.000 tokens, nunca máis que max_tokens O pensamento deixa de existir cando
tool_choice Forza unha ferramenta, e cando a solicitude continúa un loop de ferramentas (a súa última mensaxe é un resultado de ferramenta), porque Anthropic necesita o pensamento asinado anteriormente para retomalo.
O raciocinio volve á message.reasoning_contentou
delta.reasoning_content cando a transmisión, nunca se mestura na resposta. razoamento é saída e é cargado como tal, dentro completion_tokensAlgúns provedores non devolven o texto de razoamento en absoluto, e aínda se cobra.
cURL
curl https://nymbot.ai/api/v1/chat/completions \
-H "Authorization: Bearer $NYMBOT_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "anthropic/claude-sonnet-5",
"reasoning_effort": "high",
"messages": [{"role": "user", "content": "Is 2^61 - 1 prime? Show why."}]
}'
Python
import os
from openai import OpenAI
client = OpenAI(base_url="https://nymbot.ai/api/v1", api_key=os.environ["NYMBOT_API_KEY"])
reply = client.chat.completions.create(
model="anthropic/claude-sonnet-5",
reasoning_effort="high",
messages=[{"role": "user", "content": "Is 2^61 - 1 prime? Show why."}],
)
message = reply.choices[0].message
print(getattr(message, "reasoning_content", None))
print(message.content)
JavaScript
import OpenAI from "openai";
const client = new OpenAI({ baseURL: "https://nymbot.ai/api/v1", apiKey: process.env.NYMBOT_API_KEY });
const reply = await client.chat.completions.create({
model: "anthropic/claude-sonnet-5",
reasoning_effort: "high",
messages: [{ role: "user", content: "Is 2^61 - 1 prime? Show why." }],
});
console.log(reply.choices[0].message.reasoning_content);
console.log(reply.choices[0].message.content);
Modelo Sufixos
Un sufixo no nome do modelo cambia como se xestiona a solicitude, sen outro campo. anthropic/claude-sonnet-5:online.
| Suficiente | Efecto |
|---|---|
:online | Busca a web primeiro, como plugins: [{"id": "web"}]que se Busca web. |
:thinking | esforzo razoable; en nymbot/auto, o camiño do razoamento.Sobre un modelo que non pode razoar, 400 model_not_found con “non se atoparon puntos finais”. |
:nitro, :floor, :exacto, :extended | Cada modelo de catálogo ten unha ruta, polo que non hai unha máis rápida, máis barata ou máis longa para escoller; os sufixos están permitidos para que os nomes de modelos copiados doutros servizos aínda funcionen. |
Calquera outro sufixo é ignorado. O nome enteiro é probado primeiro, polo que un modelo cuxo ID realmente contén un colon aínda funciona; sen iso, os sufixos son retirados do final un a un tempo ata que un modelo coincida. 400 invalid_value.
cURL
curl https://nymbot.ai/api/v1/chat/completions \
-H "Authorization: Bearer $NYMBOT_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "anthropic/claude-sonnet-5:thinking",
"messages": [{"role": "user", "content": "Plan a three-day trip to Lisbon."}]
}'
Python
import os
from openai import OpenAI
client = OpenAI(base_url="https://nymbot.ai/api/v1", api_key=os.environ["NYMBOT_API_KEY"])
reply = client.chat.completions.create(
model="anthropic/claude-sonnet-5:thinking",
messages=[{"role": "user", "content": "Plan a three-day trip to Lisbon."}],
)
print(reply.choices[0].message.content)
JavaScript
import OpenAI from "openai";
const client = new OpenAI({ baseURL: "https://nymbot.ai/api/v1", apiKey: process.env.NYMBOT_API_KEY });
const reply = await client.chat.completions.create({
model: "anthropic/claude-sonnet-5:thinking",
messages: [{ role: "user", content: "Plan a three-day trip to Lisbon." }],
});
console.log(reply.choices[0].message.content);
Busca web
Nymbot busca a última mensaxe do usuario (os seus primeiros 2.000 caracteres), le as mellores páxinas e dálles ao modelo coa pregunta, marcada como contido externo do que o modelo non debería tomar instrucións.
- Buscar sempre:
"plugins": [{"id": "web", "max_results": 5}]ou a:onlineSuficiente para o modelo. - Buscar cando axuda:
"tools": [{"type": "web_search", "parameters": {"max_results": 5}}]Tamén aceptado comoweb_search_previewouopenrouter:web_searchNymbot busca só cando a pregunta parece que necesita información actual, a mesma proba que usa a aplicación.
max_results é 5 por defecto e no máximo 10. as fontes volven en
nymbot.web_search.sourcesCada un con unha title, snippet e
urle como url_citation Anotacións sobre a mensaxe.
Cada busca que corre custa $ 0,008, convertido en sats, enriba dos tokens, e é parte da tenda.As páxinas que le son tokens de entrada tamén, polo que unha resposta da web custa máis que a mesma pregunta preguntada fría, ás veces varias veces máis.
A resposta, en parte
"nymbot": {
"balance": "pro",
"charged_credits": 0.431,
"charged_sats": 43.1,
"balance_credits": 411.994,
"balance_sats": 41199.4,
"web_search": {
"sources": [
{ "title": "Lightning Network - Wikipedia", "snippet": "The Lightning Network is a payment protocol...", "url": "https://en.wikipedia.org/wiki/Lightning_Network" }
]
}
}
cURL
curl https://nymbot.ai/api/v1/chat/completions \
-H "Authorization: Bearer $NYMBOT_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "anthropic/claude-sonnet-5",
"plugins": [{"id": "web", "max_results": 5}],
"messages": [{"role": "user", "content": "What changed in the latest Bitcoin Core release?"}]
}'
Python
import os
from openai import OpenAI
client = OpenAI(base_url="https://nymbot.ai/api/v1", api_key=os.environ["NYMBOT_API_KEY"])
reply = client.chat.completions.create(
model="anthropic/claude-sonnet-5",
messages=[{"role": "user", "content": "What changed in the latest Bitcoin Core release?"}],
extra_body={"plugins": [{"id": "web", "max_results": 5}]},
)
print(reply.choices[0].message.content)
for source in reply.model_extra["nymbot"]["web_search"]["sources"]:
print(source["url"])
JavaScript
import OpenAI from "openai";
const client = new OpenAI({ baseURL: "https://nymbot.ai/api/v1", apiKey: process.env.NYMBOT_API_KEY });
const reply = await client.chat.completions.create({
model: "anthropic/claude-sonnet-5",
plugins: [{ id: "web", max_results: 5 }],
messages: [{ role: "user", content: "What changed in the latest Bitcoin Core release?" }],
});
console.log(reply.choices[0].message.content);
for (const source of reply.nymbot.web_search.sources) console.log(source.url);
Resposta ao lume
O formato máis recente de OpenAI, usado polo OpenAI Agents SDK e polo Codex. Funciona nos mesmos modelos, facturación e características que Chat Completions.
POST https://nymbot.ai/api/v1/responses Necesita unha chave de API.
| Campo | Tipo | Necesario | Descrición |
|---|---|---|---|
model | unha string | Si | como para Chat ComplementosInclúe os sufixos. |
input | string ou array | Si | Unha cadea, ou unha lista de elementos: mensaxes (roles user, assistant, system, developer) coa input_text, input_image e output_text partes, e function_call e function_call_output Elementos para ferramentas. input_image Toma unha image_url ligazón ou URL de datos, non un identificador de ficheiro. reasoning e web_search_call Os obxectos son salpicados; item_reference que se rexeita. |
instructions | unha string | non | Instrucións do sistema. |
max_output_tokens | enteiro | non | A maioría dos xogos para escribir. |
temperaturetop_p | Número | non | Sampling controls, onde o modelo os leva. |
toolstool_choiceparallel_tool_calls | array, string ou obxecto, booleano | non | Funcións das ferramentas, na forma de respostas ({"type": "function", "name": …, "parameters": …}) a web_search ou web_search_preview As ferramentas están en Busca web cando axuda. Outras ferramentas incorporadas son rexeitadas. |
reasoning | Obxecto | non | {"effort": "minimal" | "low" | "medium" | "high"}. xhigh e max Significa high; none que o apaga. |
text.formatresponse_format | Obxecto | non | saída estruturada, como un esquema JSON ou json_object. |
metadata | Obxecto | non | Devolve sen cambios na resposta. a un máximo de 16 valores de cadea, chaves de ata 64 caracteres e valores de ata 512. |
stream | booleán | non | Stream eventos como se describe a continuación. |
store | booleán | non | Nada se almacena, e a resposta sempre di "store": false. |
previous_response_idconversationbackground | liña, obxecto, booleano | non | Non se apoia: 400 unsupported_parameterAs respostas non se almacenan, así que envíe toda a conversa en input Cada vez que. |
Resposta
{
"id": "resp_8c1e4b0f9a2d4e61",
"object": "response",
"created_at": 1790726400,
"status": "completed",
"model": "anthropic/claude-sonnet-5",
"output": [
{
"type": "message",
"id": "msg_2b7f",
"role": "assistant",
"status": "completed",
"content": [{ "type": "output_text", "text": "A Lightning invoice is...", "annotations": [] }]
}
],
"output_text": "A Lightning invoice is...",
"usage": {
"input_tokens": 1240,
"input_tokens_details": { "cached_tokens": 0 },
"output_tokens": 380,
"output_tokens_details": { "reasoning_tokens": 0 },
"total_tokens": 1620
},
"incomplete_details": null,
"error": null,
"instructions": null,
"store": false,
"previous_response_id": null,
"metadata": {},
"nymbot": { "balance": "pro", "charged_credits": 0.162, "charged_sats": 16.2, "balance_credits": 412.425, "balance_sats": 41242.5 }
}
Unha ferramenta de solicitude aparece en output como a function_call punto con
call_id, name e argumentsEnviar o resultado de volta como a
function_call_output puntos coa mesma call_idrazoamento, cando o modelo o devolve, é unha reasoning punto con reasoning_text contido, enumerado primeiro. status é incomplete Cando a resposta chega
max_output_tokens ou o propietario rexeitou, con
incomplete_details.reason poñer max_output_tokens ou
content_filterA resposta tamén ecoa as opcións da solicitude (temperatura, ferramentas, elección de ferramentas e así por diante) como fai OpenAI, e leva o nymbot Obxecto de custo.
En liña, cada evento é un event: liña e a data: liña con a
sequence_numberPor esta orde: response.created,
response.in_progress, response.output_item.added,
response.content_part.addedCalquera número de response.output_text.delta,
response.output_text.done, response.content_part.done,
response.output_item.donee finalmente response.completed con uso e custo. unha resposta corta finais con response.incomplete en vez, e un fracaso despois de que o fluxo comezou con response.failedrazoando os fluxos como o seu propio elemento con response.reasoning_text.delta e .doneAs chamadas de ferramentas veñen despois da mensaxe, cada unha como un elemento con response.function_call_arguments.delta
e .done.
| Estatuto | cando |
|---|---|
400 | non model ou input; previous_response_id, conversation, background ou unha item_reference (unsupported_parameter); unha ferramenta ou tipo de contido non soportado. |
402, 403, 404, 429, 502, 503 | En canto aos chat completos. |
cURL
curl https://nymbot.ai/api/v1/responses \
-H "Authorization: Bearer $NYMBOT_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "anthropic/claude-sonnet-5",
"instructions": "Answer in one short paragraph.",
"input": "What is a Lightning invoice?"
}'
Python
import os
from openai import OpenAI
client = OpenAI(base_url="https://nymbot.ai/api/v1", api_key=os.environ["NYMBOT_API_KEY"])
response = client.responses.create(
model="anthropic/claude-sonnet-5",
instructions="Answer in one short paragraph.",
input="What is a Lightning invoice?",
)
print(response.output_text)
JavaScript
import OpenAI from "openai";
const client = new OpenAI({ baseURL: "https://nymbot.ai/api/v1", apiKey: process.env.NYMBOT_API_KEY });
const response = await client.responses.create({
model: "anthropic/claude-sonnet-5",
instructions: "Answer in one short paragraph.",
input: "What is a Lightning invoice?",
});
console.log(response.output_text);
Mensaxes antropolóxicas
O formato de Anthropic, para os SDK Anthropic e Claude Code. Funciona con todos os modelos do catálogo, non só Claude: a solicitude é traducida, executado a través do mesmo tubo, e traducido de volta.
POST https://nymbot.ai/api/v1/messages - Necesita unha clave de API, como x-api-key ou Authorization: Bearer.
A súa anthropic-version e anthropic-beta Os nomes dos modelos antropoides coinciden co catálogo, polo que Claude Code e os SDKs funcionan cos nomes que xa usan:
- Un nome que o catálogo coñece, como
claude-sonnet-5ouanthropic/claude-opus-5Utilízase como é. - Aínda que a data (
-20260514),-latestUnha versión como a-v1Unha vez máis, un marcapáxinas como[1m]e unhaanthropic/ouanthropic.Os prefixos son eliminados, e os puntos e os dashes na versión son probados de ambos os xeitos (claude-haiku-4-5atopaclaude-haiku-4.5). - Se iso aínda non coincide, utilízase a familia (Opus, Sonnet ou Haiku), sempre que a versión do catálogo sexa a mesma ou máis nova que a solicitada.
- Un nome que non coincide con nada volve
404not_found_error.
| Campo | Tipo | Necesario | Descrición |
|---|---|---|---|
model | unha string | Si | Identificador de modelo de catálogo ou nome de modelo antropolóxico. |
max_tokens | enteiro | Si | A maioría dos xogos para escribir. |
messages | Arranxo | Si | user e assistant xira, con text, image (base64 ou fonte de URL), tool_use e tool_result os bloques. thinking Os bloques de quendas anteriores son aceptados e descartados. |
system | string ou array | non | Sistema prompt, como unha cadea ou bloques de texto. |
temperaturetop_p | Número | non | Sampling controls, onde o modelo os leva. top_k Foi aceptado e descartado. |
stop_sequences | Rexión de Strings | non | Texto que remata a resposta. Máximo 4 cadeas, cada unha con máximo 256 caracteres. |
toolstool_choice | array, obxecto | non | Ferramentas con name, description e input_schema. a web_search Servidor de ferramentas en liña Busca webOutras ferramentas incorporadas de Anthropic (bash, editor de texto, uso de ordenador) son rexeitadas con unsupported_tool. tool_choice Toma auto, any, tool ou none, e disable_parallel_tool_use. |
thinking | Obxecto | non | {"type": "enabled", "budget_tokens": 8192}, {"type": "adaptive"} ou {"type": "disabled"}O orzamento elixe un nivel de esforzo: baixo 2.048 mínimo, de 2.048 baixo, de 8.192 medio, de 16.384 alto. output_config.effortOu moi alto. |
stream | booleán | non | Stream en formato de evento de Anthropic. |
metadata | Obxecto | non | aceptado e ignorado. |
Resposta
{
"id": "msg_01c7a2f93e5b4d08",
"type": "message",
"role": "assistant",
"model": "anthropic/claude-sonnet-5",
"content": [{ "type": "text", "text": "A Lightning invoice is..." }],
"stop_reason": "end_turn",
"stop_sequence": null,
"usage": {
"input_tokens": 1240,
"output_tokens": 380,
"cache_read_input_tokens": 0,
"cache_creation_input_tokens": 0
},
"nymbot": { "balance": "pro", "charged_credits": 0.162, "charged_sats": 16.2, "balance_credits": 412.425, "balance_sats": 41242.5 }
}
content Tamén se pode manter tool_use Os bloques e a thinking
O Bloque, que signature que está baleiro. stop_reason é
end_turn, max_tokens, tool_use ou refusaltraballou do mesmo xeito que finish_reason que
Chat Complementos; stop_sequence Sempre é
null, mesmo cando unha secuencia de parada terminou a resposta. input_tokens conta só con entradas frescas; a entrada en caché está nos dous campos de caché.
nymbot O obxecto e o X-Nymbot-Cost-Sats O header.
As seguintes páxinas ligan con Anthropic: message_start,
content_block_start, ping, content_block_delta
(text_delta, input_json_delta ou thinking_delta),
content_block_stop, message_delta coa razón de parar, o uso e nymbot custo obxecto, e message_stop. a ping tamén se envía cada 15 segundos mentres o modelo está a traballar. as chamadas de ferramentas chegan despois do texto, cada unha como un
tool_use bloque coa súa entrada enteira nun input_json_delta.
Os erros neste punto final usan o formato de Anthropic:
{"type": "error", "error": {"type": "not_found_error", "message": "…"}}O equilibrio curto é 402 billing_error, un provedor sobrecargado
503 overloaded_errorUn fracaso despois de que o fluxo comezou é enviado como un error O evento .
cURL
curl https://nymbot.ai/api/v1/messages \
-H "x-api-key: $NYMBOT_API_KEY" \
-H "anthropic-version: 2023-06-01" \
-H "Content-Type: application/json" \
-d '{
"model": "claude-sonnet-5",
"max_tokens": 1024,
"messages": [{"role": "user", "content": "What is a Lightning invoice?"}]
}'
Python
import os
import anthropic
client = anthropic.Anthropic(base_url="https://nymbot.ai/api", api_key=os.environ["NYMBOT_API_KEY"])
message = client.messages.create(
model="claude-sonnet-5",
max_tokens=1024,
messages=[{"role": "user", "content": "What is a Lightning invoice?"}],
)
print(message.content[0].text)
JavaScript
import Anthropic from "@anthropic-ai/sdk";
const client = new Anthropic({ baseURL: "https://nymbot.ai/api", apiKey: process.env.NYMBOT_API_KEY });
const message = await client.messages.create({
model: "claude-sonnet-5",
max_tokens: 1024,
messages: [{ role: "user", content: "What is a Lightning invoice?" }],
});
console.log(message.content[0].text);
Coñecer tokens
Unha estimación de cantos tokens de entrada usaría unha solicitude de mensaxes, para que un cliente poida comprobar antes de envialo.
POST https://nymbot.ai/api/v1/messages/count_tokens Necesita unha chave de API.
O corpo é o mesmo que Mensaxese sen max_tokens; o nome do modelo ten que resolver. A conta é unha estimación: os caracteres do prompt do sistema, mensaxes, chamadas de ferramentas e definicións de ferramentas divididas por catro, máis 1.600 para cada imaxe. Non é o propio tokenizer do provedor, polo que a conta real pode diferir.
Resposta
{ "input_tokens": 318 }
cURL
curl https://nymbot.ai/api/v1/messages/count_tokens \
-H "x-api-key: $NYMBOT_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "claude-sonnet-5",
"messages": [{"role": "user", "content": "What is a Lightning invoice?"}]
}'
Python
import os
import anthropic
client = anthropic.Anthropic(base_url="https://nymbot.ai/api", api_key=os.environ["NYMBOT_API_KEY"])
count = client.messages.count_tokens(
model="claude-sonnet-5",
messages=[{"role": "user", "content": "What is a Lightning invoice?"}],
)
print(count.input_tokens)
JavaScript
import Anthropic from "@anthropic-ai/sdk";
const client = new Anthropic({ baseURL: "https://nymbot.ai/api", apiKey: process.env.NYMBOT_API_KEY });
const count = await client.messages.countTokens({
model: "claude-sonnet-5",
messages: [{ role: "user", content: "What is a Lightning invoice?" }],
});
console.log(count.input_tokens);
Listaxe de modelos
Cada modelo e xerador da API acepta, co que custa.A lista é lida do mesmo catálogo en directo que o buscador da aplicación, polo que sempre é o que o servidor executará.
GET https://nymbot.ai/api/v1/models - Non é necesaria ningunha clave. Ocultado durante cinco minutos.
GET /api/v1/models/{id} Devolve unha entrada.
| Campo | Tipo | Necesario | Descrición |
|---|---|---|---|
type | Conexión (query) | non | chat (A miña debilidade) image, video, audio, embedding ou allAlgúns poden darse, como image,video. |
Os prezos son o que pagas, coa taxa e marxe xa en, en dólares e en tarifas ao prezo actual de Bitcoin. balance Indica en que modelo se gastan os cartos.
nymbot_key é o nome curto do modelo na aplicación. created é sempre 0, xa que o catálogo non rexistra cando se engadiu un modelo. per_request en cambio.
nymbot/auto é sempre primeiro, prezo como variable, con unha
routes lista dando as taxas de cada ruta estándar. lista visión e razoamento, pero non ferramentas.
GET /api/v1/models/{id} acepta os mesmos nomes e alias como unha solicitude e devolve a entrada para o modelo ao que se resolen.
Resposta
{
"object": "list",
"data": [
{
"id": "anthropic/claude-sonnet-5",
"object": "model",
"type": "chat",
"owned_by": "anthropic",
"name": "Claude Sonnet 5",
"created": 0,
"context_length": 1000000,
"max_output_tokens": 64000,
"architecture": { "input_modalities": ["text", "image"], "output_modalities": ["text"] },
"supported_parameters": ["max_tokens", "temperature", "tools", "tool_choice", "reasoning", "response_format", "stop"],
"capabilities": { "vision": true, "video": false, "tools": true, "reasoning": true, "web_search": true },
"balance": "pro",
"pricing": {
"type": "per_token",
"currency": "USD",
"input_per_1M_tokens": 4.725,
"output_per_1M_tokens": 23.625,
"cache_read_per_1M_tokens": 0.4725,
"sats_input_per_1M_tokens": 4038,
"sats_output_per_1M_tokens": 20192
},
"description": "...",
"nymbot_key": "claude-sonnet"
}
]
}
Os outros tipos:
- Imaxe As entradas teñen
capabilities(accepts_image_url,requires_image_url,edite un prezoper_generation. - Vídeo As entradas teñen
max_duration_secondseresolutionse un prezoper_secondpara cada resolución. - Audios As entradas teñen
audio_typespeechoutranscriptionPrezoper_1k_charsouper_minute. - Embaixada As entradas teñen
dimensions,context_length,max_inputse un prezo por millón de tokens de entrada.
Prezo marcado "estimated": true é a estimación da aplicación para un xerador cuxo prezo non se publica. type Regreso 400.
cURL
curl "https://nymbot.ai/api/v1/models?type=chat"
Python
import requests
models = requests.get("https://nymbot.ai/api/v1/models", params={"type": "chat"}).json()["data"]
for m in models:
print(m["id"], m["balance"], m["pricing"].get("input_per_1M_tokens"))
JavaScript
const res = await fetch("https://nymbot.ai/api/v1/models?type=chat");
const { data } = await res.json();
for (const m of data) console.log(m.id, m.balance, m.pricing.input_per_1M_tokens);