Saltar al contingut
Torna cap a Nymbot

Base de coneixement Desenvolupadors

Xat, respostes i missatges

Hi ha tres maneres de demanar a un model alguna cosa, en els tres formats que els clients ja parlen, tots executant en els mateixos models i facturant de la mateixa manera.

Completa el chat

El format de xat OpenAI, i el que gairebé totes les eines donen suport. Envia la conversa fins ara i rep el següent missatge.

POST https://nymbot.ai/api/v1/chat/completions Necessita una clau de foc.

Només model i messages Un paràmetre de mostreig que el model triat no pren es descarrega sense un error, de manera que un cos de sol·licitud funciona a través dels models. supported_parametersEl que es rebutja en lloc de caure és tot el que el model no pot fer: imatges per a un model que no pot veure, eines per a un model que no pot cridar-los.

El campTipusNecessitatDescripció
modelLíniaSínymbot/auto (o el auto) per a la ruta de Nymbot sobre el saldo estàndard, o un id de model de catàleg com ara anthropic/claude-sonnet-5 a l'equilibri Pro. Els noms curts i alias de l'aplicació també s'accepten. Suficiència.
messagesArribadaSíLa conversa, els rols system, developer (Tractat com a sistema) user, assistant i toolEl contingut és una cadena o una llista de text i image_url parts; imatges només en missatges d'usuari. input_audio Els arxius són rebutjats.
streamBoolíNoEnvia la resposta tal com està escrita.Veure Streaming.
stream_optionsObjecteNo{"include_usage": true} afegeix una part final amb els comptes de token i el cost.
max_tokens
max_completion_tokens
íntegreNoLa majoria de tokens per escriure. Baixat al màxim del model si és més alt. També estableix quant es manté del seu saldo, de manera que un nombre més petit necessita menys crèdit per començar.
temperature
top_p
NúmeroNoControls de mostreig: temperature De 0 a 2, top_p De 0 a 1.
stopArray o arrayNoText que acaba la resposta: una cadena o un màxim de 4 cadenes, cadascuna de 256 caràcters. nymbot/auto.
seedíntegreNoPer a mostreig repetible, on el model el dóna suport.
presence_penalty
frequency_penalty
NúmeroNoControls de repetició, cada un de -2 a 2.
response_formatObjecteNo{"type": "json_object"} o {"type": "json_schema", "json_schema": {…}}, on el model el dóna suport. No utilitzat per nymbot/auto.
tools
tool_choice
parallel_tool_calls
array, string o objecte, booleàNoFunció de crida. veure Taller de trucades. a web_search Les eines es tornen Cerca webA un màxim de 128 eines i 512 KB de definicions, incrustades a un màxim de 64 nivells de profunditat; més és un 400.
reasoning_effort
reasoning
Tàrrega, ObjecteNo"minimal", "low", "medium" o "high", o {"effort": "high"}. "none" o {"enabled": false} Desconnecta’t, veuràs Raonament.
pluginsArribadaNo[{"id": "web", "max_results": 5}] Busca sempre el lloc web primer. Fins a 10 resultats.
níntegreNo1.- Tot el que hi ha torna 400.
logit_bias
user
metadata
Object, String i ObjecteNoAcceptat i no enviat. logit_bias mapes amb un màxim de 300 ids de token a números de -100 a 100; user Té un màxim de 256 caràcters. metadata Pot tenir un màxim de 16 valors de cadena, claus de fins a 64 caràcters i valors de fins a 512.

La resposta és ordinària chat.completionAmb el cost en usage.cost (en dòlars) i en el nymbot l’objecte model és el model resolt id, de manera que un nom curt torna com el complet. Si el model raonava abans de respondre, el seu raonament és en message.reasoning_contentseparats de la 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 es desenvolupa a partir del que va tornar, ja que els proveïdors ho reporten de manera diferent: tool_calls Quan el model demana eines, length quan la resposta va utilitzar cada token permès (o el model els va gastar tots raonant i no va escriure cap resposta), content_filter quan el proveïdor rebutja, i stop En cas contrari. usage.completion_tokens_details.reasoning_tokens sempre és 0: els tokens de raonament ocults es compten, i es carreguen, en completion_tokens.

EstatutQuan
400No model o messages (missing_required_parameter); una part d'àudio o d'arxiu, o imatges per a un model que no els pugui veure (unsupported_content); més de 20 imatges (too_many_images); un paràmetre de mostreig del tipus incorrecte o fora de rang (invalid_value); un enllaç de imatge que no és públic (invalid_image_url); eines en un model que no poden anomenar-los (unsupported_tool); n Més enllà de 1; a :thinking un model que no pot raonar (model_not_found); o el proveïdor ha rebutjat la sol·licitud (upstream_rejected).
402El saldo que el model gasta no pot cobrir la possessió.
403El pitjor cas no encaixa en el cap de la clau (key_limit_reached) més baix max_tokens O aixecar el cap.
404No hi ha cap model amb aquest nom (model_not_found).
429El límit de taxa de la clau, o el del proveïdor (upstream_rate_limited).
502, 503El proveïdor ha fallat (upstream_error) o està sobrecarregat (upstream_overloaded, amb Retry-AfterRes es carrega a menys que el proveïdor facturat per l'intent.

Els codis d'estat de cada acció d'endpoint s'enumeren sota Errors.

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

amb "stream": true La resposta arriba com a esdeveniments enviats pel servidor mentre el model l'escriu. chat.completion.chunk És a data: la línia, i el flux acaba amb data: [DONE]El raonament arriba a delta.reasoning_contentLa resposta en delta.content.

Stream qualsevol cosa que pugui trigar més de 100 segons, com una resposta llarga, una gran max_tokens o un model de raonament. Una sol·licitud que no s'estén no envia res fins que la resposta es completa, i la xarxa entre vostè i Nymbot pot tancar una connexió ininterrompuda després d'uns 100 segons; el model encara s'acaba i el que va escriure es carrega, però la resposta es perd.

El 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]
  • Línies que comencen amb : Els comentaris es mantenen vius, enviats cada 15 segons mentre el model està pensant.
  • Pregunta per "stream_options": {"include_usage": true} per obtenir l'últim tros a dalt, amb un buit choices, el token compta, el cost i el nymbot l’objecte
  • La càrrega es liquida després que s'acabi el flux. Si tanqueu la connexió d'hora, el model no s'atura: Nymbot llegeix la resta del flux del proveïdor, durant fins a 25 segons, per obtenir el seu recompte de token, i vostè paga el que el proveïdor informa.
  • Un error abans de la primera part, com 401 o 402, torna com a JSON ordinari amb el seu codi d'estat, no com a flux. Un error després que el flux hagi començat arriba com a darrer data: {"error": {…}} esdeveniment, i el flux acaba sense [DONE].
  • Les sol·licituds amb eines, i els models en el transport de les respostes d'OpenAI, no flueixen des del proveïdor.

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

Taller de trucades

Descriu les funcions en tools i el model pot demanar a algú que truqui en comptes de respondre. Executeu la funció, afegiu-ne el resultat com a tool Un missatge amb el mateix tool_call_idNymbot mai no executa les seves funcions; transmet la sol·licitud del model de tornada a vostè.

tool_choice agafa "auto", "none", "required" o {"type": "function", "function": {"name": "…"}}La llista de models marca quins models poden trucar a eines (capabilities.toolsLes eines es rebutgen amb 400 unsupported_tool És nymbot/auto i en els pocs models de catàleg que s'executen en el transport de Responses d'OpenAI, als quals Nymbot no pot passar eines.

amb "stream": true, una sol·licitud amb eines s'executa en una peça i després s'envia com una seqüència normal: el paper, una peça portant cada trucada d'eina amb el seu índex, id, nom i arguments, i la peça final.

La resposta, en part

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

Imatges en una sol·licitud

Models amb capabilities.vision Podeu llegir imatges.Adicionar image_url part a un missatge d'usuari, amb un públic https:// Enllaç o a data:image/…;base64, URL. Fins a 20 imatges per sol·licitud. imatges SVG són rebutjades, i així és un enllaç de més de 4.096 caràcters o un amb un nom d'usuari o contrasenya en ell (400 invalid_image_urlUna opció detail És auto, low o high.

amb nymbot/auto, una sol·licitud amb una imatge en ella es dirigeix a un model estàndard que pot veure. capabilities.vision Rebutja fotografies amb 400 unsupported_contentUn enllaç ha de apuntar a un host públic; Nymbot transmet la imatge al proveïdor del model i no la guarda.

Una imatge es carrega com els tokens d'entrada que el proveïdor compta per a ella, com la resta de la sol·licitud.

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

Raonament

Models amb capabilities.reasoning pot pensar abans de respondre. demanar-li més o menys amb reasoning_effort ("minimal", "low", "medium" o "high") o "reasoning": {"effort": "high"}o afegir :thinking al nom del model, que significa gran esforç. En un model sense raonament, la configuració és ignorada. nymbot/auto, :thinking Envia la sol·licitud a la ruta de raonament estàndard.

En els models antropològics l'esforç es converteix en un pressupost de pensament d'uns 1.000, 2.000, 8.000 o 16.000 tokens, mai més que max_tokens El pensament es deixa enrere quan tool_choice força una eina, i quan la sol·licitud continua un bucle d'eines (el seu darrer missatge és un resultat de l'eina), perquè Anthropic necessita el pensament signat anterior per reprendre'l.

El raonament torna a message.reasoning_content, o delta.reasoning_content quan es transmet, mai es barreja en la resposta. Raonament és la sortida i es carrega com a tal, dins completion_tokensAlguns proveïdors no retornen el text de raonament en absolut, i encara es carrega.

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

Model de suffixes

Un sufix en el nom del model canvia la forma en què es gestiona la sol·licitud, sense un altre camp. Treballen tant en ids complets com en noms curts, com en anthropic/claude-sonnet-5:online.

SuficiènciaEfecte
:onlineBusca la web primer, com plugins: [{"id": "web"}]Això Cerca web.
:thinkingUn gran esforç de raonament; en nymbot/auto, la via del raonament. En un model que no pot raonar, 400 model_not_found amb “no s'han trobat punts finals”.
:nitro, :floor, :exacto, :extendedCada model de catàleg té una ruta, de manera que no hi ha una més ràpida, més barata o més llarga per triar; es permeten els sufix perquè els noms de models copiats d'altres serveis encara funcionin.

Qualsevol altre sufix és ignorat. El nom sencer es prova primer, de manera que un model el nom del qual realment conté un còlon encara funciona; en cas contrari, els sufix es prenen de la fi un a un temps fins que un model coincideix. Un nom del model pot ser de fins a 200 caràcters de llarg amb un màxim de 4 sufix; un més llarg es nega amb 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);

Qualsevol model de xat pot respondre des de la web en viu.Nymbot cerca l'últim missatge d'usuari (els seus primers 2.000 caràcters), llegeix les millors pàgines i les dóna al model amb la pregunta, marcada com a contingut extern del model no hauria de prendre instruccions.

  • Sempre buscant: "plugins": [{"id": "web", "max_results": 5}], o a :online Suficiència en el model.
  • Descobreix quan ajuda: "tools": [{"type": "web_search", "parameters": {"max_results": 5}}]També es va acceptar com web_search_preview o openrouter:web_searchNymbot només cerca quan la pregunta sembla que necessita informació actual, la mateixa prova que l'aplicació utilitza.

max_results és 5 per defecte i a un màxim de 10. les fonts tornen a nymbot.web_search.sourcesCadascú amb una title, snippet i urlI com url_citation anotacions al missatge.

Cada cerca que s'executa costa $ 0,008, convertit a sats, a més dels tokens, i és part de la retenció. Les pàgines que llegeix són tokens d'entrada també, de manera que una resposta de la web costa més que la mateixa pregunta preguntada fred, de vegades diverses vegades més.

La resposta, en part

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

Reaccions a les flames

El format més recent d'OpenAI, utilitzat pel OpenAI Agents SDK i pel Codex. S'executa en els mateixos models, facturació i característiques que Chat Completions.

POST https://nymbot.ai/api/v1/responses Necessita una clau de foc.

El campTipusNecessitatDescripció
modelLíniaSíCom per Completa el chatInclou els sufixos.
inputArray o arraySíUna cadena, o una llista d'elements: missatges (rols user, assistant, system, developer) amb input_text, input_image i output_text Parts i function_call i function_call_output Objectes per a les eines. input_image Pren una image_url enllaç o URL de dades, no un id de fitxer. reasoning i web_search_call Els objectes són trencats; item_reference Es va negar.
instructionsLíniaNoInstruccions del sistema.
max_output_tokensíntegreNoLa majoria de cartes per escriure.
temperature
top_p
NúmeroNoControls de mostreig, on el model els pren.
tools
tool_choice
parallel_tool_calls
array, string o objecte, booleàNoLes funcions de les eines, en la forma de les respostes ({"type": "function", "name": …, "parameters": …}) a web_search o web_search_preview Les eines es tornen Cerca web quan ajuda. Altres eines incorporades es rebutgen.
reasoningObjecteNo{"effort": "minimal" | "low" | "medium" | "high"}. xhigh i max Significa high; none Torneu a apagar-ho
text.format
response_format
ObjecteNoUna sortida estructurada, com a esquema JSON o json_object.
metadataObjecteNoRetornat sense canvis en la resposta. a un màxim de 16 valors de cadena, claus de fins a 64 caràcters i valors de fins a 512.
streamBoolíNoStream esdeveniments com es descriu a continuació.
storeBoolíNoRes no s'emmagatzema, i la resposta sempre diu "store": false.
previous_response_id
conversation
background
String, objecte i booleàNoNo es dóna suport: 400 unsupported_parameterLes respostes no s'emmagatzemen, així que envieu tota la conversa a input Cada vegada

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 }
}

Una sol·licitud d'eina apareix en output com a function_call Punt amb call_id, name i argumentsEnviar el resultat de nou com a function_call_output Punt amb el mateix call_idEl raonament, quan el model el retorna, és un reasoning Punt amb reasoning_text Els continguts, en primer lloc. status És incomplete Quan la resposta arriba max_output_tokens o el proveïdor ha rebutjat, amb incomplete_details.reason Estableix max_output_tokens o content_filterLa resposta també fa eco de la configuració de la sol·licitud (temperatura, eines, selecció d'eines, etc.) com fa l'OpenAI, i porta la nymbot Cost de l’objecte.

En aquest sentit, cada esdeveniment és un event: Línia i a data: Línia amb a sequence_numberEn aquest ordre: response.created, response.in_progress, response.output_item.added, response.content_part.addedQualsevol nombre de response.output_text.delta, response.output_text.done, response.content_part.done, response.output_item.doneI finalment response.completed amb l'ús i el cost. Una resposta corta els extrems amb response.incomplete En lloc d'això, i un fracàs després que el flux va començar amb response.failedRaonant fluxos com el seu propi objecte amb response.reasoning_text.delta i .doneLes trucades d'eines vénen després del missatge, cadascuna com un element amb response.function_call_arguments.delta i .done.

EstatutQuan
400No model o input; previous_response_id, conversation, background o una item_reference (unsupported_parameter); una eina o tipus de contingut no compatible.
402, 403, 404, 429, 502, 503Sobre les complicacions del 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);

Missatges antropològics

Funciona amb tots els models del catàleg, no només Claude: la sol·licitud es tradueix, s'executa a través del mateix tub i es tradueix de nou.

POST https://nymbot.ai/api/v1/messages — necessita una clau API, com x-api-key o Authorization: Bearer.

El anthropic-version i anthropic-beta Els noms dels models antropològics s'ajusten al catàleg, de manera que Claude Code i els SDK funcionen amb els noms que ja utilitzen:

  • Un nom que el catàleg coneix, com claude-sonnet-5 o anthropic/claude-opus-5S’utilitza tal com és.
  • En cas contrari, una data (-20260514), -latestUna versió com la -v1Un dia de bressol com [1m] i un anthropic/ o anthropic. El prefix s'elimina, i els punts i les taques en la versió s'experimenten de les dues maneres (claude-haiku-4-5 Troba claude-haiku-4.5).
  • Si això encara no coincideix, s'utilitza la família (Opus, Sonnet o Haiku), sempre que la versió del catàleg sigui la mateixa o més nova que la sol·licitada.
  • Un nom que no coincideix amb res torna 404 not_found_error.
El campTipusNecessitatDescripció
modelLíniaSíUn id de model de catàleg, o un nom de model antropològic.
max_tokensíntegreSíLa majoria de cartes per escriure.
messagesArribadaSíuser i assistant Torna, amb text, image (base64 o font d’URL) tool_use i tool_result dels blocs. thinking Els blocs de torns anteriors són acceptats i descartats.
systemArray o arrayNoInstruccions del sistema, com una cadena o blocs de text.
temperature
top_p
NúmeroNoControls de mostreig, on el model els pren. top_k S’accepta i es descarta.
stop_sequencesArray de cordesNoText que acaba la resposta. A màxim 4 cadenes, cadascuna de màxim 256 caràcters.
tools
tool_choice
Àrea, ObjecteNoEines amb name, description i input_schema. a web_search L’eina del servidor s’inicia Cerca web; Les altres eines integrades d'Anthropic (bash, editor de text, ús informàtic) es rebutgen amb unsupported_tool. tool_choice agafa auto, any, tool o none, i disable_parallel_tool_use.
thinkingObjecteNo{"type": "enabled", "budget_tokens": 8192}, {"type": "adaptive"} o {"type": "disabled"}El pressupost tria un nivell d'esforç: per sota de 2.048 mínim, de 2.048 baix, de 8.192 mitjà, de 16.384 alt. output_config.effortO és alt.
streamBoolíNoStream en format d'esdeveniment d'Anthropic.
metadataObjecteNoAcceptat i ignorat.

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é es pot mantenir tool_use Els blocs i a thinking El bloc, el qual signature Està buit stop_reason És end_turn, max_tokens, tool_use o refusalVa treballar de la mateixa manera que finish_reason És Completa el chat; stop_sequence Sempre és null, fins i tot quan una seqüència d'aturada va acabar la resposta. input_tokens només compta amb entrades fresques; les entrades en memòria cau es troben en els dos camps de memòria cau. nymbot Objecte i el X-Nymbot-Cost-Sats El Header.

En streaming, els esdeveniments són d'Anthropic: message_start, content_block_start, ping, content_block_delta (text_delta, input_json_delta o thinking_delta), content_block_stop, message_delta amb la raó de parar, l'ús i la nymbot Objecte de cost, i message_stop. a ping també s'envia cada 15 segons mentre el model està en funcionament. Les trucades d'eines arriben després del text, cadascuna com a tool_use bloc amb tota la seva entrada en un input_json_delta.

Errors en aquest punt final utilitzen el format d'Anthropic: {"type": "error", "error": {"type": "not_found_error", "message": "…"}}Un equilibri curt és 402 billing_errorUn proveïdor sobrecarregat 503 overloaded_errorUn error després d'haver començat el flux s'envia com un error Un esdeveniment

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

Compta amb tokens

Una estimació de quants tokens d'entrada utilitzaria una sol·licitud de missatges, de manera que un client pugui comprovar abans d'enviar.

POST https://nymbot.ai/api/v1/messages/count_tokens — Necessita una clau API. lliure.

El cos és el mateix que el MissatgesI sense max_tokens; el nom del model ha de resoldre. El recompte és una estimació: els caràcters de la prompt del sistema, missatges, trucades d'eines i definicions d'eines dividits per quatre, més 1.600 per a cada imatge. No és el propi tokenizador del proveïdor, de manera que el recompte real pot 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);

Llista de models

Cada model i generador de l'API accepta, amb el que costa. La llista es llegeix del mateix catàleg en viu que el selector de l'aplicació, de manera que sempre és el que funcionarà el servidor.

GET https://nymbot.ai/api/v1/models — no necessita clau. Ocultat durant cinc minuts.

GET /api/v1/models/{id} Retorna una entrada.

El campTipusNecessitatDescripció
typeCàlcul (query)Nochat (en el seu defecte) image, video, audio, embedding o allPoden donar-se diverses, com image,video.

Els preus són el que vostè paga, amb la tarifa i el marge ja en, en dòlars i en tarifes al preu actual de Bitcoin. balance Diu quin equilibri gasta el model. nymbot_key és el nom curt del model en l'aplicació. created sempre és 0, ja que el catàleg no registra quan es va afegir un model. per_request en canvi.

nymbot/auto És sempre el primer, preu com variable, amb una routes Llista donant les tarifes de cada ruta estàndard. Enumera la visió i el raonament, però no les eines.

GET /api/v1/models/{id} accepta els mateixos noms i alias com a sol·licitud, i retorna l'entrada per al model a què es 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"
    }
  ]
}

Els altres tipus:

  • Imatge Les entrades tenen capabilities (accepts_image_url, requires_image_url, editi un preu per_generation.
  • Vídeo Les entrades tenen max_duration_seconds i resolutionsI un preu per_second per a cada resolució.
  • Audió Les entrades tenen audio_type speech o transcriptionEl preu per_1k_chars o per_minute.
  • Integració Les entrades tenen dimensions, context_length, max_inputs i un preu per milió de tokens d'entrada.

Preus marcats "estimated": true és l'estimació de l'aplicació per a un generador el preu del qual no es publica. type Retorns 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);