Pular para o conteúdo
Voltar para Nymbot

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.

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.

CampoTipoRequeridoDescrição
modelstringSimnymbot/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.
messagesArraiáSimConversaçã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.
streamBooleãoNãoEnvie a resposta como está escrita. veja Transmissão.
stream_optionsObjetoNão{"include_usage": true} adiciona um pedaço final com contagens de token e o custo.
max_tokens
max_completion_tokens
inteiroNãoA 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.
temperature
top_p
NúmeroNãoControles de amostragem: temperature De 0 a 2, top_p de 0 a 1.
stopstring ou arrayNãoTexto que termina a resposta: uma cadeia ou no máximo 4 cadeias, cada uma com no máximo 256 caracteres. nymbot/auto.
seedinteiroNãoPara amostragem repetível, onde o modelo o suporta.
presence_penalty
frequency_penalty
NúmeroNãoControles de repetição, cada um de -2 a 2.
response_formatObjetoNão{"type": "json_object"} ou {"type": "json_schema", "json_schema": {…}}, onde o modelo o suporta.Não utilizado por nymbot/auto.
tools
tool_choice
parallel_tool_calls
Array, string ou objeto, booleanoNãoFunçã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_effort
reasoning
Título, ObjetoNão"minimal", "low", "medium" ou "high"ou {"effort": "high"}. "none" ou {"enabled": false} Desligue isso. veja raciocínio.
pluginsArraiáNão[{"id": "web", "max_results": 5}] Pesquisar sempre em primeiro lugar. até 10 resultados.
ninteiroNão1 – Tudo o que há de novo 400.
logit_bias
user
metadata
Objeto, String e ObjetoNãoaceito 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.

EstatutoQuando
400Nã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).
402O saldo que o modelo gasta não pode cobrir a posse.
403O pior caso não se encaixa no capô da chave (key_limit_reached) mais baixo max_tokens Ou levantar o cap.
404Nenhum modelo com esse nome (model_not_found).
429O limite de taxa da chave, ou o fornecedor (upstream_rate_limited).
502, 503O 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 vazio choices, o token conta, o custo e o nymbot do 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 401 ou 402, 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 último data: {"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ênciaEfeito
:onlineProcure pela internet primeiro, como plugins: [{"id": "web"}]O SEI Pesquisa Web.
:thinkingGrande 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, :extendedCada 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);

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 :online O suficiente para o modelo.
  • Procure quando ajuda: "tools": [{"type": "web_search", "parameters": {"max_results": 5}}]Também aceita como web_search_preview ou openrouter: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.

CampoTipoRequeridoDescrição
modelstringSimComo para Chat CompletoOs sufixos estão incluídos.
inputstring ou arraySimUma 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
instructionsstringNãoInstruções do sistema.
max_output_tokensinteiroNãoA maior quantidade de tokens para escrever.
temperature
top_p
NúmeroNãoAmostragem de controles, onde o modelo os leva.
tools
tool_choice
parallel_tool_calls
Array, string ou objeto, booleanoNãoAs 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.
reasoningObjetoNão{"effort": "minimal" | "low" | "medium" | "high"}. xhigh e max Significa high; none e desligue isso.
text.format
response_format
ObjetoNãoA saída estruturada, como um esquema JSON ou json_object.
metadataObjetoNãoRetornou inalterado na resposta, com um máximo de 16 valores de cadeia, chaves de até 64 caracteres e valores de até 512.
streamBooleãoNãoStream eventos como descrito abaixo.
storeBooleãoNãoNada é armazenado, e a resposta sempre diz "store": false.
previous_response_id
conversation
background
String, Objeto e BooleanNãoNã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.

EstatutoQuando
400Nã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, 503Completando 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-5 ou anthropic/claude-opus-5É usado como é.
  • Por exemplo, uma data (-20260514), -latest, uma versão tag como -v1Por exemplo, um bracketed tag como [1m] e um anthropic/ ou anthropic. Os prefixos são removidos, e os pontos e dashes na versão são tentados de ambas as maneiras (claude-haiku-4-5 Encontro claude-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 404 not_found_error.
CampoTipoRequeridoDescrição
modelstringSimUm ID de modelo de catálogo, ou um nome de modelo antropológico.
max_tokensinteiroSimA maior quantidade de tokens para escrever.
messagesArraiáSimuser 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.
systemstring ou arrayNãoO sistema prompt, como uma cadeia ou blocos de texto.
temperature
top_p
NúmeroNãoAmostragem de controles, onde o modelo os leva. top_k É aceito e descartado.
stop_sequencesArray de cordasNãoTexto que termina a resposta. No máximo 4 cordas, cada um com no máximo 256 caracteres.
tools
tool_choice
Array, ObjetoNãoFerramentas 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.
thinkingObjetoNã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.
streamBooleãoNãoStream no formato de evento do Anthropic.
metadataObjetoNãoaceito 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.

CampoTipoRequeridoDescrição
typeRedação de Query (String)Nãochat (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ço per_generation.
  • Vídeo As entradas têm max_duration_seconds e resolutionsE um preço per_second para cada resolução.
  • Áudio As entradas têm audio_type speech ou transcriptionPreço per_1k_chars ou per_minute.
  • Embaixada As entradas têm dimensions, context_length, max_inputs um 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);