Base de conhecimento Desenvolvedores
Chat, respostas e mensagens
Três maneiras de perguntar a um modelo algo, nos três formatos que os clientes já falam, todos executando nos mesmos modelos e faturando da mesma maneira.
Esta página foi traduzida automaticamente por conveniência. O original em inglês é a versão aplicável.
Chat Completo
O formato de bate-papo OpenAI, e que quase todas as ferramentas suportam. Envie a conversa até agora e receba a próxima mensagem de volta.
POST https://nymbot.ai/api/v1/chat/completions Precisa de uma chave de fogo.
somente model e messages Um parâmetro de amostragem que o modelo escolhido não toma é descartado sem um erro, de modo que um corpo de solicitação funciona em todos os modelos. supported_parametersO que é recusado em vez de descartado é tudo o que o modelo não pode fazer: imagens para um modelo que não pode ver, ferramentas para um modelo que não pode chamá-los.
| Campo | Tipo | Requerido | Descrição |
|---|---|---|---|
model | string | Sim | nymbot/auto (ou auto) para o roteamento do Nymbot no saldo padrão, ou um id de modelo de catálogo, como anthropic/claude-sonnet-5 no balanço Pro. Os nomes curtos e alias do aplicativo também são aceitos. Suficiência. |
messages | Arraiá | Sim | Conversação - Papéis system, developer (Tratado como um sistema) user, assistant e toolConteúdo é uma cadeia ou lista de text e image_url partes; imagens apenas em mensagens de usuário. input_audio As partes do arquivo são recusadas. |
stream | Booleão | Não | Envie a resposta como está escrita. veja Transmissão. |
stream_options | Objeto | Não | {"include_usage": true} adiciona um pedaço final com contagens de token e o custo. |
max_tokensmax_completion_tokens | inteiro | Não | A maioria dos tokens para escrever. Abaixado para o máximo do modelo se maior. Também define quanto é mantido do seu saldo, então um número menor precisa de menos crédito para começar. |
temperaturetop_p | Número | Não | Controles de amostragem: temperature De 0 a 2, top_p de 0 a 1. |
stop | string ou array | Não | Texto que termina a resposta: uma cadeia ou no máximo 4 cadeias, cada uma com no máximo 256 caracteres. nymbot/auto. |
seed | inteiro | Não | Para amostragem repetível, onde o modelo o suporta. |
presence_penaltyfrequency_penalty | Número | Não | Controles de repetição, cada um de -2 a 2. |
response_format | Objeto | Não | {"type": "json_object"} ou {"type": "json_schema", "json_schema": {…}}, onde o modelo o suporta.Não utilizado por nymbot/auto. |
toolstool_choiceparallel_tool_calls | Array, string ou objeto, booleano | Não | Função de chamada. veja Ferramentas de chamadas. a web_search A ferramenta torna-se Pesquisa WebNo máximo 128 ferramentas e 512 KB de definições, aninhadas em no máximo 64 níveis de profundidade; mais é um 400. |
reasoning_effortreasoning | Título, Objeto | Não | "minimal", "low", "medium" ou "high"ou {"effort": "high"}. "none" ou {"enabled": false} Desligue isso. veja raciocínio. |
plugins | Arraiá | Não | [{"id": "web", "max_results": 5}] Pesquisar sempre em primeiro lugar. até 10 resultados. |
n | inteiro | Não | 1 – Tudo o que há de novo 400. |
logit_biasusermetadata | Objeto, String e Objeto | Não | aceito e não enviado. logit_bias mapas em até 300 token ids para números de -100 a 100; user Tem no máximo 256 caracteres. metadata possui um máximo de 16 valores de cadeia, chaves de até 64 caracteres e valores de até 512. |
A resposta é comum chat.completionCom o custo em usage.cost
(em dólares) e em nymbot do objeto. model é o modelo resolvido id, então um nome curto retorna 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 é trabalhado a partir do que voltou, uma vez que os provedores relatam de forma diferente: tool_calls Quando o modelo pede ferramentas, length quando a resposta usou todos os tokens permitidos (ou o modelo os gastou todos raciocinando e não escreveu nenhuma resposta), content_filter Quando o cliente recusa, e stop
do contrário. usage.completion_tokens_details.reasoning_tokens é sempre 0: tokens de raciocínio ocultos são contados, e carregados, em completion_tokens.
| Estatuto | Quando |
|---|---|
400 | Não model ou messages (missing_required_parameter); uma parte de áudio ou arquivo, ou imagens para um modelo que não pode vê-los (unsupported_content); mais de 20 imagens (too_many_images); um parâmetro de amostragem do tipo errado ou fora do intervalo (invalid_value); um link de imagem que não é público (invalid_image_url); ferramentas em um modelo que não pode chamá-los (unsupported_tool); n Mais do que 1; a :thinking um modelo que não pode raciocinar (model_not_found(ou o fornecedor recusou a solicitação)upstream_rejected). |
402 | O saldo que o modelo gasta não pode cobrir a posse. |
403 | O pior caso não se encaixa no capô da chave (key_limit_reached) mais baixo max_tokens Ou levantar o cap. |
404 | Nenhum modelo com esse nome (model_not_found). |
429 | O limite de taxa da chave, ou o fornecedor (upstream_rate_limited). |
502, 503 | O fornecedor falhou (upstream_error) ou é sobrecarregado (upstream_overloaded, com Retry-AfterNada é cobrado a menos que o provedor tenha cobrado pela tentativa. |
Os códigos de status de todas as ações de endpoint estão listados abaixo 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
com "stream": true a resposta chega como eventos enviados pelo servidor enquanto o modelo a escreve. chat.completion.chunk É a data: linha, e o fluxo termina com data: [DONE]O raciocínio entra em
delta.reasoning_contentA resposta em delta.content.
Stream qualquer coisa que possa demorar mais de cerca de 100 segundos, como uma resposta longa, uma grande
max_tokens Um pedido que não é transmitido não envia nada até que a resposta seja completa, e a rede entre você e o Nymbot pode fechar uma conexão vazia após cerca de 100 segundos; o modelo ainda termina e o que escreveu é carregado, mas a resposta é perdida.
Stream
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]
- Linhas começando com
:são comentários permanentes, enviados a cada 15 segundos enquanto o modelo está pensando. - Peça para
"stream_options": {"include_usage": true}para obter o último pedaço acima, com um vaziochoices, o token conta, o custo e onymbotdo objeto. - Se você fechar a conexão cedo, o modelo não é interrompido: o Nymbot lê o resto do fluxo do provedor, por até 25 segundos, para obter sua contagem de token, e você paga o que o provedor relata.
- Um erro antes do primeiro pedaço, como
401ou402, retorna como JSON comum com seu código de status, não como um fluxo. Um erro depois que o fluxo começou chega como um últimodata: {"error": {…}}evento, e o fluxo termina sem[DONE]. - As solicitações com ferramentas e modelos no transporte de respostas da OpenAI não fluem do provedor. Eles ainda respondem com um fluxo válido, enviado uma vez que a resposta está completa.
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
Descreva as funções em tools e o modelo pode pedir que alguém seja chamado em vez de responder. Você executa a função, adicione seu resultado como um tool Uma mensagem com o mesmo
tool_call_idNymbot nunca executa suas funções; ele transmite o pedido do modelo de volta para você.
tool_choice Toma "auto", "none",
"required" ou {"type": "function", "function": {"name": "…"}}A lista de modelos marca quais modelos podem chamar ferramentas (capabilities.toolsAs ferramentas são recusadas com 400 unsupported_tool É nymbot/auto e nos poucos modelos de catálogo que funcionam no transporte Responses da OpenAI, para o qual o Nymbot não pode passar ferramentas.
com "stream": true, uma solicitação com ferramentas é executada em uma peça e é então enviada como uma seqüência de pedaços normais: o papel, um pedaço carregando cada chamada de ferramenta com seu índice, id, nome e argumentos e o pedaço de final.
A resposta, em 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);
Imagens em um pedido
Modelos com capabilities.vision Pode ler imagens. adicionar um image_url
parte para uma mensagem de usuário, com um público https:// link ou a
data:image/…;base64, URL. Até 20 imagens por solicitação. imagens SVG são rejeitadas, e assim é um link de mais de 4.096 caracteres ou um com um nome de usuário ou senha nele (400 invalid_image_url) é opcional detail É
auto, low ou high.
com nymbot/auto, um pedido com uma imagem nele é encaminhado para um modelo padrão que pode ser visto. capabilities.vision Recusa-se a tirar fotos com
400 unsupported_contentUma ligação deve apontar para um host público; o Nymbot transmite a imagem ao provedor do modelo e não a mantém.
Uma imagem é cobrada como os tokens de entrada que o provedor conta para ela, como o resto da solicitação.
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);
raciocínio
Modelos com capabilities.reasoning Você pode pensar antes de responder, pedir mais ou menos. reasoning_effort ("minimal", "low",
"medium" ou "high") ou "reasoning": {"effort": "high"}ou adicionar :thinking para o nome do modelo, o que significa grande esforço. Em um modelo sem raciocínio, a configuração é ignorada. nymbot/auto, :thinking Envie a solicitação para a rota de raciocínio padrão.
Em modelos antropológicos, o esforço se torna um orçamento de pensamento de cerca de 1.000, 2.000, 8.000 ou 16.000 tokens, nunca mais do que max_tokens O pensamento é deixado de lado quando
tool_choice Força uma ferramenta, e quando a solicitação continua um loop de ferramentas (sua última mensagem é um resultado de ferramenta), porque o Anthropic precisa do pensamento assinado anteriormente para retomá-lo.
O raciocínio retorna ao message.reasoning_contentou
delta.reasoning_content quando o streaming, nunca misturado na resposta. raciocínio é saída e é cobrado como tal, dentro completion_tokensAlguns provedores não devolvem o texto de raciocínio, e ainda é cobrado.
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 de Sufixo
Um sufixo no nome do modelo altera a forma como o pedido é tratado, sem outro campo. anthropic/claude-sonnet-5:online.
| Suficiência | Efeito |
|---|---|
:online | Procure pela internet primeiro, como plugins: [{"id": "web"}]O SEI Pesquisa Web. |
:thinking | Grande esforço de raciocínio; nymbot/autoO caminho do raciocínio, em um modelo que não pode raciocinar, 400 model_not_found com “ nenhum endpoint encontrado”. |
:nitro, :floor, :exacto, :extended | Cada modelo de catálogo tem um caminho, então não há um mais rápido, mais barato ou mais longo para escolher; os sufixos são permitidos para que os nomes dos modelos copiados de outros serviços ainda funcionem. |
Qualquer outro sufixo é ignorado. O nome inteiro é tentado primeiro, de modo que um modelo cujo ID realmente contém um cólon ainda funciona; caso contrário, os sufixos são retirados do final um de cada vez até que um modelo corresponda. Um nome do modelo pode ser de no máximo 200 caracteres com no máximo 4 sufixos; um mais longo é recusado com 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);
Pesquisa Web
Qualquer modelo de bate-papo pode responder da web ao vivo.Nymbot procura a última mensagem do usuário (seus primeiros 2.000 caracteres), lê as melhores páginas e as dá ao modelo com a pergunta, marcada como conteúdo externo do qual o modelo não deve tomar instruções.
- Sempre em busca:
"plugins": [{"id": "web", "max_results": 5}]Ou a:onlineO suficiente para o modelo. - Procure quando ajuda:
"tools": [{"type": "web_search", "parameters": {"max_results": 5}}]Também aceita comoweb_search_previewouopenrouter:web_searchO Nymbot pesquisa apenas quando a pergunta parece precisar de informações atuais, o mesmo teste que o aplicativo usa.
max_results é 5 por padrão e no máximo 10. as fontes retornam em
nymbot.web_search.sourcesCada um com uma title, snippet e
urlE como url_citation anotações na mensagem.
Cada pesquisa que corre custa US $ 0,008, convertida em sats, em cima dos tokens, e faz parte da posse.As páginas que ele lê são tokens de entrada também, então uma resposta da web custa mais do que a mesma pergunta feita frio, às vezes várias vezes mais.
A resposta, em 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);
Reações a Fogo
O formato mais recente da OpenAI, usado pelo OpenAI Agents SDK e pelo Codex. Ele é executado nos mesmos modelos, faturamento e recursos que o Chat Completions.
POST https://nymbot.ai/api/v1/responses Precisa de uma chave de fogo.
| Campo | Tipo | Requerido | Descrição |
|---|---|---|---|
model | string | Sim | Como para Chat CompletoOs sufixos estão incluídos. |
input | string ou array | Sim | Uma cadeia, ou uma lista de itens: mensagens (roles user, assistant, system, developer) com input_text, input_image e output_text Partes e function_call e function_call_output itens para ferramentas. input_image Tome um image_url link ou URL de dados, não um ID de arquivo. reasoning e web_search_call Os itens são esquecidos; item_reference é recusado |
instructions | string | Não | Instruções do sistema. |
max_output_tokens | inteiro | Não | A maior quantidade de tokens para escrever. |
temperaturetop_p | Número | Não | Amostragem de controles, onde o modelo os leva. |
toolstool_choiceparallel_tool_calls | Array, string ou objeto, booleano | Não | As ferramentas de função, na forma de Respostas ({"type": "function", "name": …, "parameters": …}) a web_search ou web_search_preview A ferramenta torna-se Pesquisa Web quando ajuda. Outras ferramentas incorporadas são recusadas. |
reasoning | Objeto | Não | {"effort": "minimal" | "low" | "medium" | "high"}. xhigh e max Significa high; none e desligue isso. |
text.formatresponse_format | Objeto | Não | A saída estruturada, como um esquema JSON ou json_object. |
metadata | Objeto | Não | Retornou inalterado na resposta, com um máximo de 16 valores de cadeia, chaves de até 64 caracteres e valores de até 512. |
stream | Booleão | Não | Stream eventos como descrito abaixo. |
store | Booleão | Não | Nada é armazenado, e a resposta sempre diz "store": false. |
previous_response_idconversationbackground | String, Objeto e Boolean | Não | Não apoiado : 400 unsupported_parameterAs respostas não são armazenadas, por isso envie toda a conversa em input cada vez . |
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 }
}
Uma ferramenta de solicitação aparece em output Como a function_call item com
call_id, name e argumentsEnvie o resultado de volta como a
function_call_output item com o mesmo call_idraciocínio, quando o modelo o devolve, é um reasoning item com reasoning_text conteúdo, listado em primeiro lugar. status É incomplete Quando a resposta atinge
max_output_tokens Ou o proprietário se recusou a
incomplete_details.reason Coloque em max_output_tokens ou
content_filterA resposta também ecoa as configurações da solicitação (temperatura, ferramentas, escolha de ferramentas e assim por diante) como o OpenAI faz, e carrega o nymbot custo do objeto.
“Todos os eventos são um evento event: Linha e a data: Linha com a
sequence_numberNessa ordem: response.created,
response.in_progress, response.output_item.added,
response.content_part.addedQualquer número de response.output_text.delta,
response.output_text.done, response.content_part.done,
response.output_item.doneE por fim response.completed com o uso e o custo. uma resposta cortar finais curtos com response.incomplete em vez disso, e um fracasso depois que o fluxo começou com response.failedRaciocinar os fluxos como seu próprio item com response.reasoning_text.delta e .doneAs chamadas de ferramentas vêm após a mensagem, cada uma como um item com response.function_call_arguments.delta
e .done.
| Estatuto | Quando |
|---|---|
400 | Não model ou input; previous_response_id, conversation, background Ou um item_reference (unsupported_parameter); uma ferramenta ou tipo de conteúdo não suportado. |
402, 403, 404, 429, 502, 503 | Completando o chat. |
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);
Mensagens Antropológicas
O formato Anthropic, para os SDKs Anthropic e Claude Code. Ele funciona com todos os modelos no catálogo, não apenas Claude: o pedido é traduzido, executado pelo mesmo pipeline e traduzido de volta.
POST https://nymbot.ai/api/v1/messages necessita de uma chave de API, como x-api-key ou Authorization: Bearer.
O anthropic-version e anthropic-beta Os nomes dos modelos antropogênicos são correspondidos ao catálogo, de modo que o Claude Code e os SDKs funcionam com os nomes que já usam:
- Um nome que o catálogo conhece, como
claude-sonnet-5ouanthropic/claude-opus-5É usado como é. - Por exemplo, uma data (
-20260514),-latest, uma versão tag como-v1Por exemplo, um bracketed tag como[1m]e umanthropic/ouanthropic.Os prefixos são removidos, e os pontos e dashes na versão são tentados de ambas as maneiras (claude-haiku-4-5Encontroclaude-haiku-4.5). - Se isso ainda não corresponde, a família (Opus, Sonnet ou Haiku) é usada, desde que a versão do catálogo seja a mesma ou mais recente do que a solicitada.
- Um nome que não corresponde a nada retorna
404not_found_error.
| Campo | Tipo | Requerido | Descrição |
|---|---|---|---|
model | string | Sim | Um ID de modelo de catálogo, ou um nome de modelo antropológico. |
max_tokens | inteiro | Sim | A maior quantidade de tokens para escrever. |
messages | Arraiá | Sim | user e assistant Voltou, com text, image (base64 ou fonte de URL), tool_use e tool_result dos blocos. thinking Blocos de turnos anteriores são aceitos e descartados. |
system | string ou array | Não | O sistema prompt, como uma cadeia ou blocos de texto. |
temperaturetop_p | Número | Não | Amostragem de controles, onde o modelo os leva. top_k É aceito e descartado. |
stop_sequences | Array de cordas | Não | Texto que termina a resposta. No máximo 4 cordas, cada um com no máximo 256 caracteres. |
toolstool_choice | Array, Objeto | Não | Ferramentas com name, description e input_schema. a web_search O servidor de ferramentas está em Pesquisa WebOutras ferramentas incorporadas do Anthropic (bash, editor de texto, uso de computador) são recusadas com unsupported_tool. tool_choice Toma auto, any, tool ou nonee disable_parallel_tool_use. |
thinking | Objeto | Não | {"type": "enabled", "budget_tokens": 8192}, {"type": "adaptive"} ou {"type": "disabled"}O orçamento escolhe um nível de esforço: abaixo de 2.048 mínimo, de 2.048 baixo, de 8.192 médio, de 16.384 alto. output_config.effortOu muito alto. |
stream | Booleão | Não | Stream no formato de evento do Anthropic. |
metadata | Objeto | Não | aceito 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 Também pode segurar tool_use Blocos e a thinking
O bloco, que signature é vazio stop_reason É
end_turn, max_tokens, tool_use ou refusalTrabalhou da mesma forma que finish_reason É
Chat Completo; stop_sequence É sempre
null, mesmo quando uma seqüência de parada terminou a resposta. input_tokens Apenas as entradas frescas contam; as entradas em cache estão nos dois campos de cache.
nymbot Objeto e o X-Nymbot-Cost-Sats do header.
Streamed, os eventos são da Anthropic: message_start,
content_block_start, ping, content_block_delta
(text_delta, input_json_delta ou thinking_delta),
content_block_stop, message_delta com a razão de parar, o uso e o nymbot custo do objeto, e message_stop. a ping também é enviado a cada 15 segundos enquanto o modelo está funcionando. Chamadas de ferramentas chegam após o texto, cada uma como uma
tool_use bloco com toda a sua entrada em um input_json_delta.
Erros neste endpoint usam o formato do Anthropic:
{"type": "error", "error": {"type": "not_found_error", "message": "…"}}Um equilíbrio curto é 402 billing_errorUm fornecedor sobrecarregado
503 overloaded_errorUma falha após o fluxo ter começado é enviada como um 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);
Contagem de tokens
Uma estimativa de quantos tokens de entrada uma solicitação de mensagens usaria, para que um cliente possa verificar antes de enviar.
POST https://nymbot.ai/api/v1/messages/count_tokens Precisa de uma chave de API.
O corpo é o mesmo que MensagensE sem max_tokens; o nome do modelo tem que resolver. A contagem é uma estimativa: os caracteres do prompt do sistema, mensagens, chamadas de ferramentas e definições de ferramentas divididas por quatro, mais 1.600 para cada imagem. Não é o próprio tokenizer do provedor, então a contagem 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);
Lista de modelos
Cada modelo e gerador aceita a API, com o que custa.A lista é lida do mesmo catálogo ao vivo que o picker do aplicativo, por isso é sempre o que o servidor irá executar.
GET https://nymbot.ai/api/v1/models - Não é necessária nenhuma chave. Ocultado por cinco minutos.
GET /api/v1/models/{id} Retorna uma entrada.
| Campo | Tipo | Requerido | Descrição |
|---|---|---|---|
type | Redação de Query (String) | Não | chat (O que é o defeito) image, video, audio, embedding ou allAlguns podem ser usados, como image,video. |
Os preços são o que você paga, com a taxa e a margem já em, em dólares e em sats ao preço atual do Bitcoin. balance O balanço que o modelo gasta.
nymbot_key é o nome curto do modelo no aplicativo. created é sempre 0, uma vez que o catálogo não registra quando um modelo foi adicionado. per_request em vez de.
nymbot/auto É sempre o primeiro, preços como variable, com a
routes lista dando as taxas de cada rota padrão. Ele lista visão e raciocínio, mas não ferramentas.
GET /api/v1/models/{id} aceita os mesmos nomes e alias como um pedido, e retorna a entrada para o modelo que eles resolvem.
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:
- Imagem As entradas têm
capabilities(accepts_image_url,requires_image_url,edite um preçoper_generation. - Vídeo As entradas têm
max_duration_secondseresolutionsE um preçoper_secondpara cada resolução. - Áudio As entradas têm
audio_typespeechoutranscriptionPreçoper_1k_charsouper_minute. - Embaixada As entradas têm
dimensions,context_length,max_inputsum preço por milhão de tokens de entrada.
Preços marcados "estimated": true é a estimativa do aplicativo para um gerador cujo preço não é publicado. type regressão 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);