Ir ao contido
Volver a Nymbot

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.

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.

CampoTipoNecesarioDescrición
modelunha stringSinymbot/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.
messagesArranxoSiAs 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.
streambooleánnonEnvía a resposta tal e como está escrita.Ver Streaming.
stream_optionsObxectonon{"include_usage": true} engade unha parte final con contas de token e o custo.
max_tokens
max_completion_tokens
enteirononA 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.
temperature
top_p
NúmerononControl de mostraxe: temperature De 0 a 2, top_p De 0 a 1.
stopstring ou arraynonTexto que remata a resposta: unha cadea ou un máximo de 4 cadeas, cada unha con un máximo de 256 caracteres. nymbot/auto.
seedenteirononPara a mostraxe repetible, onde o modelo o apoie.
presence_penalty
frequency_penalty
NúmerononControles de repetición, cada un de -2 a 2.
response_formatObxectonon{"type": "json_object"} ou {"type": "json_schema", "json_schema": {…}}, onde o modelo o soporta.Non se usa por nymbot/auto.
tools
tool_choice
parallel_tool_calls
array, string ou obxecto, booleanononFunció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_effort
reasoning
Xénero, obxectonon"minimal", "low", "medium" ou "high"ou {"effort": "high"}. "none" ou {"enabled": false} Deixámolo fóra.Vexamos razoamento.
pluginsArranxonon[{"id": "web", "max_results": 5}] sempre busca a web primeiro. ata 10 resultados.
nenteironon1 Todo o demais volve 400.
logit_bias
user
metadata
obxecto, liña, obxectononAceptado 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.

Estatutocando
400non 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).
402O saldo que o modelo gasta non pode cubrir a posesión.
403O peor caso non se encaixa no capó da chave (key_limit_reached) máis baixo max_tokens ou levantar a cabeza.
404Ningún modelo con ese nome (model_not_found).
429O límite de taxa da clave, ou a do provedor (upstream_rate_limited).
502, 503O 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 baleiro choices, o token conta, o custo e o nymbot O 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 401 ou 402, 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.

SuficienteEfecto
:onlineBusca a web primeiro, como plugins: [{"id": "web"}]que se Busca web.
:thinkingesforzo 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, :extendedCada 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);

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 :online Suficiente para o modelo.
  • Buscar cando axuda: "tools": [{"type": "web_search", "parameters": {"max_results": 5}}]Tamén aceptado como web_search_preview ou openrouter: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.

CampoTipoNecesarioDescrición
modelunha stringSicomo para Chat ComplementosInclúe os sufixos.
inputstring ou arraySiUnha 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.
instructionsunha stringnonInstrucións do sistema.
max_output_tokensenteirononA maioría dos xogos para escribir.
temperature
top_p
NúmerononSampling controls, onde o modelo os leva.
tools
tool_choice
parallel_tool_calls
array, string ou obxecto, booleanononFunció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.
reasoningObxectonon{"effort": "minimal" | "low" | "medium" | "high"}. xhigh e max Significa high; none que o apaga.
text.format
response_format
Obxectononsaída estruturada, como un esquema JSON ou json_object.
metadataObxectononDevolve sen cambios na resposta. a un máximo de 16 valores de cadea, chaves de ata 64 caracteres e valores de ata 512.
streambooleánnonStream eventos como se describe a continuación.
storebooleánnonNada se almacena, e a resposta sempre di "store": false.
previous_response_id
conversation
background
liña, obxecto, booleanononNon 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.

Estatutocando
400non 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, 503En 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-5 ou anthropic/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 unha anthropic/ ou anthropic. Os prefixos son eliminados, e os puntos e os dashes na versión son probados de ambos os xeitos (claude-haiku-4-5 atopa claude-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 404 not_found_error.
CampoTipoNecesarioDescrición
modelunha stringSiIdentificador de modelo de catálogo ou nome de modelo antropolóxico.
max_tokensenteiroSiA maioría dos xogos para escribir.
messagesArranxoSiuser 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.
systemstring ou arraynonSistema prompt, como unha cadea ou bloques de texto.
temperature
top_p
NúmerononSampling controls, onde o modelo os leva. top_k Foi aceptado e descartado.
stop_sequencesRexión de StringsnonTexto que remata a resposta. Máximo 4 cadeas, cada unha con máximo 256 caracteres.
tools
tool_choice
array, obxectononFerramentas 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.
thinkingObxectonon{"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.
streambooleánnonStream en formato de evento de Anthropic.
metadataObxectononaceptado 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.

CampoTipoNecesarioDescrición
typeConexión (query)nonchat (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 prezo per_generation.
  • Vídeo As entradas teñen max_duration_seconds e resolutionse un prezo per_second para cada resolución.
  • Audios As entradas teñen audio_type speech ou transcriptionPrezo per_1k_chars ou per_minute.
  • Embaixada As entradas teñen dimensions, context_length, max_inputs e 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);