Saltu al la enhavo
Reen al Nymbot

Sciobazo Programistoj

Babiladoj, Respondoj kaj Mesaĝoj

Tri manieroj demandi ion al modelo, en la tri formatoj kiel klientoj jam parolas, ĉio funkciante sur la samaj modeloj kaj fakturiĝante de la sama maniero.

Ĉat-kompletigoj

La OpenAI-ĉata formato, kaj tiu, kiun preskaŭ ĉiu ilo subtenas. Sendu la konversacion ĝis nun kaj ricevu la sekvan mesaĝon reen.

POST https://nymbot.ai/api/v1/chat/completions — bezonas API-ŝlavenon.

Nur model kaj messages estas necesaj. Pliŝancon de provado, kiun la elektita modelo ne akceptas, oni forigas sen eraro, tiel ke unu petkorpo funkcias tra ĉiuj modeloj. La listo de modeloj donas ĉiu modelos supported_parameters. Kio estas rifuzata anstataŭ forigita estas ĉio, kion la modelo tute ne povas fari: bildoj por modelo, kiu ne povas vidi, iloj por modelo, kiu ne povas voki ilin.

KampoSkribiDezirindataPriskribo
modelŝnuroJesnymbot/auto (aŭ auto) por Nymbot-rutigo sur la norma ekvilibro, aŭ kataloga modelo-identigilo kiel ekzemple anthropic/claude-sonnet-5 sur la Pro-ekvilibro. La mallongaj nomoj kaj ali nomoj de la aplikaĵo estas ankaŭ akceptataj. Povus fini per a sufikso.
messagesmatriĉoJesLa konversacio. Roloj system, developer (traktata kiel sistemo), user, assistant kaj tool. Enhavo estas ĉu ĉeneto aŭ listo de text kaj image_url partoj; bildoj nur en uzantmesaĝoj. input_audio kaj dosierpartoj estas rifuzitaj.
streambooleanaNeSendu la respondon tiel kiel ĝi estas skribita. Vidu fluigado.
stream_optionsobjektoNe{"include_usage": true} aldonas finan pezonon kun token-kvantoj kaj la kosto.
max_tokens
max_completion_tokens
entiera nombroNeLa plej multaj jetonoj por skribi. Malpliigita al la maksimumo de la modelo se pli alta. Ankaŭ agostas kiom estas rezervata el via saldo, do pli malgranda nombro bezonas malpli da kredito por komenci.
temperature
top_p
numeroNeEkzamenaj kontroloj: temperature de 0 ĝis 2, top_p de 0 ĝis 1.
stopĉeno aŭ listoNeTeksto, kiu finas la respondon: ĉu unu ĉenĝo de karakteroj aŭ plej malmultaj 4 ĉenĝoj de karakteroj, ĉiu plej malmulte 256 karakteroj. Ne uzata de nymbot/auto.
seedentiera nombroNePor ripetebla provizado, kie la modelo subtenas ĝin.
presence_penalty
frequency_penalty
numeroNeRepetaj kontroliloj, ĉiu de -2 ĝis 2.
response_formatobjektoNe{"type": "json_object"} aŭ {"type": "json_schema", "json_schema": {…}}, kie la modelo subtenas ĝin. Ne uzata de nymbot/auto.
tools
tool_choice
parallel_tool_calls
aro, ĉeno aŭ objekto, booleanaNeFunkcia vokado. Vidu vokoj de iloj. A web_search ilo ŝaltas retserĉo. Maksimume 128 iloj kaj 512 KB da difinoj, ennestigitaj plej multajn 64 nivelojn profunde; pli estas... 400.
reasoning_effort
reasoning
ŝnetaĵo, objektoNe"minimal", "low", "medium" aŭ "high", aŭ {"effort": "high"}. "none" aŭ {"enabled": false} turnas ĝin malŝtonde. Vidu logiko.
pluginsmatriĉoNe[{"id": "web", "max_results": 5}] ĉiam serĉas la interreton unue. Ĝis 10 rezultoj.
nentiera nombroNeNur 1. Ĉio alia revenas 400.
logit_bias
user
metadata
objekto, ĉeno, objektoNeAkceptita kaj ne transsendita. logit_bias mappas al plej malmultaj 300 token-identigilojn al nombroj de -100 ĝis 100; user estas maksimume 256 karakteroj; metadata tenas maksimume 16 ĉenajn valorojn, ŝlosilojn ĝis 64 signofon kaj valorojn ĝis 512.

La respondo estas ordinara chat.completion, kun la kosto en usage.cost (en dolaroj) kaj en la nymbot objekto. model estas la solvita modelo-identigilo, do mallonga nomo revenas kiel la plena. Se la modelo pripensis antaŭ ol respondi, sia pripenso estas en message.reasoning_content, apartenanta al la respondo.

Respondo

{
  "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 estiĝis el tio, kio revenis, ĉar provizantoj raportas ĝin malsammaniere: tool_calls kiam la modelo petis ilojn, length kiam la respondo uzis ĉiun permesitan tokenon (aŭ kiam la modelo eluzis ĉiujn dum pripensego kaj skribis neniun respondon), content_filter kiam la provizanto rifuzis, kaj stop ĉiwise. usage.completion_tokens_details.reasoning_tokens estas ĉiam 0: kaŝitaj pensaj tokenoj estas kalklitaj, kaj oni pagas por ili, en completion_tokens.

StatoKiam
400Ne model aŭ messages (missing_required_parameter); audioa aŭ dosiera parto, aŭ bildoj por modelo, kiu ne povas vidi ilin (unsupported_content); pli ol 20 bildoj (too_many_images); provizita prismo-parametro de malĝusta tipo aŭ ekster la limo (invalid_value); bild-ligilo kiu ne estas publika (invalid_image_url); iloj sur modelo, kiu ne povas voki ilin (unsupported_tool); n krom 1; a :thinking sufikso sur modelo kiu ne povas rasoni (model_not_found); aŭ la provizanto malakceptis la peton (upstream_rejected).
402La saldo, kiun la modelo elspezas, ne povas kovri la rezervon.
403La plej malbona kazo ne kongruas kun la ĉapelo de la ŝlosilo (key_limit_reached). Malpliĝas max_tokens aŭ altigu la plafon.
404Neniu modelo per tiu nomo (model_not_found).
429La limigo de la ŝlosilo, aŭ tiu de la provizanto (upstream_rate_limited).
502, 503La provizanto malsukcesis (upstream_error) aŭ estas superŝarĝita (upstream_overloaded, kun Retry-After). Nio estas ŝarĝita krom se la provizanto fakturis por la provo.

La status-kodoj, kiujn ĉiu fino-punkto dividas, estas listigitaj sube sub eraraĵoj.

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

Fluigo

Kun "stream": true la respondo alvenas kiel server-senditaj eventoj dum la modelo skribas ĝin. Ĉiu evento estas chat.completion.chunk sur a data: linio, kaj la fluo finiĝas per data: [DONE]. Razonado alvenas en delta.reasoning_content, la respondo en delta.content.

Fluu ĉion ajn, kiu povus preni pli ol proksimume 100 sekundojn, kiel longa respondo, granda max_tokens aŭ racia modelo. Peto, kiu ne estas fluigita, ne sendas ion ajn ĝis la respondo estas kompleta, kaj la reto inter vi kaj Nymbot povas fermi senuŝan konekton post proksimume 100 sekundoj; la modelo ankoraŭ finiĝas kaj tio, kion ĝi skribis, estas pagita, sed la respondo estas perdita. Fluigo sendas vivtenilojn, do ĝi restas malferma dum la tempo, kiom longe la modelo skribas.

Fluo

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]
  • Linioj komencantaj per : estas keep-alive komentoj, sendataj ĉiujn 15 sekundojn dum la modelo pensas. SSE-klientoj preterlasas ilin.
  • Petu por "stream_options": {"include_usage": true} por ricevi la lastan pezon supra, kun malplena choices, la jeton-kvantoj, la kosto kaj la nymbot objekto.
  • La pagado fariĝas definitiva post kiam la fluo finiĝas. Se vi fermas la konekton antaŭ tempo, la modelo ne estas haltigita: Nymbot legas la reston de la fluo de la provizanto, ĝis 25 sekundoj, por ricevi ĝian token-kvanton, kaj vi pagas tion, kion la provizanto raportas. Sen tiu kvanto la pagado estas taksimata el via enigo kaj tio, kio estis skribita, plus la tuta eliga kvanto por modelo, kiu pripensiĝas.
  • Ero antaŭ la unua peco, kiel ekzemple 401 aŭ 402, revenas kiel ordinara JSON kun sia status-kodo, ne kiel fluo. Eraro post kiam la fluo komenciĝis aperas kiel lasta data: {"error": {…}} evento, kaj la fluo finiĝas sen [DONE].
  • Petoj kun iloj, kaj modeloj sur OpenAI-responsa transporto, ne elfluas de la provizanto. Ili tamen respondas per valida fluo, sendita kiam la respondo estas kompleta.

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

Vokonoj de iloj

Priskribu funkciojn en tools kaj la modelo povas peti, ke oni voku unufoje anstataŭ respondi. Vi rulas la funkcion, aldonas ĝian rezulton kiel tool mesaĝo kun la sama tool_call_id, kaj denove sendu la konversacion. Nymbot neniam rulas viajn funkciojn; ĝi pasigas la peton de la modelo reen al vi.

tool_choice prenas "auto", "none", "required" aŭ {"type": "function", "function": {"name": "…"}}La listo de modeloj indikas kiujn modelojn povas voki ilojn (capabilities.tools). Istrumentoj estas rifuzataj kun 400 unsupported_tool sur nymbot/auto kaj pri la kelkaj katalogaj modeloj, kiuj funkcias sur OpenAI-Responses transporto, al kiu Nymbot ne povas transdoni ilojn.

Kun "stream": true, peto kun iloj funkcias en unu peco kaj poste estas sendita kiel norma peca sekvenco: la rolo, unu peco portanta ĉiun il-vokon kun sia indekso, id, nomo kaj argumentoj, kaj la finiĝa peco. Klientoj, kiuj legas fluigitajn il-vokojn, traktas ĝin kiel kutime.

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

Bildoj en peto

Modeloj kun capabilities.vision povas legi bildojn. Aldonu... image_url parto de uzantmesaĝo, kun ĉiu okaze publika https:// ligilo aŭ a data:image/…;base64, URL. Ĝis 20 bildoj po peto. SVG-bildoj estas malakceptataj, same kiel ligilo pli longa ol 4 096 ĉarakteroj aŭ unu kun uzantnomo aŭ pasvorto en ĝi (400 invalid_image_url). Volopla detail estas auto, low aŭ high.

Kun nymbot/auto, peto kun bildo en ĝi estas ruteigita al standarda modelo, kiu povas vidi. Katalog-modelo sen capabilities.vision denesas bildojn kun 400 unsupported_content. Bildoj povas esti nur en mesaĝoj de uzanto. Ligilo devas direkti al publika gastiganto; Nymbot pasigas la bildon al la provizanto de la modelo kaj ne konservas ĝin.

Bildo estas pagita kiel la enigo-tokenoj, kiujn la provizanto kalkulas por ĝi, kiel la restas de la peto.

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

Raciado

Modeloj kun capabilities.reasoning povas pensi antaŭ ol ili respondas. Petu pli aŭ malpli de ĝi per reasoning_effort ("minimal", "low", "medium" aŭ "high") aŭ "reasoning": {"effort": "high"}, aŭ aldonu :thinking al la nomo de la modelo, kiu signifas altan eforton. Sur modelo sen raciado, la agordo estas ignorata. Kun nymbot/auto, :thinking sendas la peton al la norma razonad-vojo.

En la modeloj de Anthropic la klopodo fariĝas pensbudĝeto de proksimume 1,000, 2,000, 8,000 aŭ 16,000 tokenoj, neniam pli ol max_tokens permesas. Pensado estas malŝaltita kiam tool_choice devigas ilon, kaj kiam la peto daŭrigas il-ciklon (lia lasta mesaĝo estas il-rezulto), ĉar Anthropic bezonas la pli fruan subskribitan pripensegon por resume gi. La sama aplikas al la Response- kaj Message-unuopunktoj.

La razonado revenas en message.reasoning_content, aŭ delta.reasoning_content dum fluigo, neniam miksita en la respondon. Konceptado estas eligo kaj estas pagita tiel, interne completion_tokens. Kelkaj provizantoj tute ne rezultigas la razonadon tekston, kaj ĝi tamen estas pagita.

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

Modelaj sufiksoj

Sufikso ĉe la modelo-nomo ŝanĝas kiel la peto estas traktata, sen alia kampo. Ili funkcias per plenaj identigilo-oj kaj mallongaj nomoj alike, kiel en anthropic/claude-sonnet-5:online.

SufiksoEfiko
:onlineSerĉas la interreton unue, kiel plugins: [{"id": "web"}]. Vidu retserĉo.
:thinkingAlta penado de rezonado; ŝaltita nymbot/auto, la vojo de raciado. Sur modelo, kiu ne povas racii, 400 model_not_found kun „neniuj finpunktoj trovitaj“.
:nitro, :floor, :exacto, :extendedAkceptite kaj ignorite. Ĉiu kataloga modelo havas unu itinerojn, do ne ekzistas pli rapida, pli malmultekosta aŭ pli longa por elekti; la sufiksoj estas permesitaj por ke modelnomoj kopiataj el aliaj servoj ankoraŭ funkciu.

Ĉiu alia sufikso estas ignorata. La tuta nomo estas provata unue, do modelo, kies id vere enhavas duonkolonon, ankoraŭ funkcias; se tio malsukcesas, sufiksoj estas forigitaj de la fino unu post unu ĝis modelo kongruas. Modelnomo povas esti maksimume 200 karakteroj longaj kun maksimume 4 sufiksoj; pli longa unu estas rifuzata per 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);

Ĉiu babilema modelo povas respondi el la viva reto. Nymbot serĉas la lastan uzantmesaĝon (siajn unuan 2,000 signojn), legas la plej bonajn paĝojn kaj donas ilin al la modelo kun la demando, markitajn kiel eksteran enhavon el kiu la modelo ne devus ricevi instrukciojn. Estas du modoj:

  • Ĉiam serĉu: "plugins": [{"id": "web", "max_results": 5}], aŭ a :online sufikso sur la modelo.
  • Serĉu kiam ĝi helpas: "tools": [{"type": "web_search", "parameters": {"max_results": 5}}], ankaŭ akceptata kiel web_search_preview aŭ openrouter:web_search. Nymbot serĉas nur kiam la demando ŝajnas bezoni aktualajn informojn, la saman teston kiun la aplikaĵo uzas.

max_results estas 5 defaŭlte kaj maksimume 10. La fontoj revenas en nymbot.web_search.sources, ĉiu kun title, snippet kaj url, kaj kiel url_citation anstataŭnotoj pri la mesaĝo.

Ĉiu serĉo, kiu okazas, kostas 0,008 $, konvertitaj al sats, krome de la tokenoj, kaj ĝi estas parto de la tenado. La paĝoj, kiujn ĝi legis, estas ankaŭ enigo-tokenoj, do respondo el la reto kostas pli ol la sama demando demandita senpreta, foje plurfoje pli.

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

API de Respondoj

La pli nova formato de OpenAI, uzata de la OpenAI Agents SDK kaj de Codex. Ĝi funkcias sur la samaj modeloj, fakturado kaj funkcioj kiel Chat Completions.

POST https://nymbot.ai/api/v1/responses — bezonas API-ŝlavenon.

KampoSkribiDezirindataPriskribo
modelŝnuroJesKoncerne Ĉat-kompletigoj, inkluzive de sufiksoj.
inputĉeno aŭ listoJesStringType, aŭ listo de itemoj: mesaĝoj (roloj user, assistant, system, developer) kun input_text, input_image kaj output_text partoj, kaj function_call kaj function_call_output ĵetoj por iloj. input_image prenas unu image_url ligilo aŭ data URL, ne dosieridentigilo. reasoning kaj web_search_call ĵetoj estas preterlasitaj; item_reference estas rifuzita.
instructionsŝnuroNeSistemaj instrukcioj.
max_output_tokensentiera nombroNeLa plej multaj tokenoj por skribi.
temperature
top_p
numeroNeEkzamenaj kontroloj, kie la modelo prenas ilin.
tools
tool_choice
parallel_tool_calls
aro, ĉeno aŭ objekto, booleanaNeFunkciaj iloj, en la formo de la Responsoj ({"type": "function", "name": …, "parameters": …}). A web_search aŭ web_search_preview ilo ŝaltas retserĉo kiam ĝi helpas. Aliaj integritaj iloj estas rifuzataj.
reasoningobjektoNe{"effort": "minimal" | "low" | "medium" | "high"}. xhigh kaj max anstataŭigi high; none malŝaltas ĝin.
text.format
response_format
objektoNeStrukturita eldato, kiel JSON-skemo aŭ json_object.
metadataobjektoNeNeplej ŝanĝita en la respondo. Maksimume 16 ĉenaj valoroj, ŝlosiloj ĝis 64 signoj kaj valoroj ĝis 512.
streambooleanaNeFluigu eventojn kiel priskribite malsupre.
storebooleanaNeIgnorita. Nenio estas konservita, kaj la respondo ĉiam diras "store": false.
previous_response_id
conversation
background
ĉeno, objekto, booleanoNeNe subtenata: 400 unsupported_parameter. Respondoj ne estas konservataj, do sendu la tutan konversacion en input ĉiumerfo.

Respondo

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

Irugo peto aperas en output kiel function_call itemo kun call_id, name kaj arguments; sendu la rezulton reen kiel a function_call_output itemo kun la sama call_id. Resonado, kiam la modelo redonas ĝin, estas reasoning itemo kun reasoning_text enhavo, listigita unue. status estas incomplete kiam la respondo frapis max_output_tokens aŭ la provizanto rifuzis, kun incomplete_details.reason agordi al max_output_tokens aŭ content_filter. La respondo ankaŭ spegulas la agordojn de la peto (temperaturon, ilojn, il-elekton kaj tiel plu) kiel OpenAI faras, kaj portas la nymbot kosto objekto.

Fluigita, ĉiu evento estas event: linio kaj a data: linio kun a sequence_number, en ĉi tiu ordo: response.created, response.in_progress, response.output_item.added, response.content_part.added, ajna nombro da response.output_text.delta, response.output_text.done, response.content_part.done, response.output_item.done, kaj fine response.completed kun la uzado kaj kosto. Respondo mallongigita finiĝas per response.incomplete anstataŭe, kaj malsukceso post kiam la fluo komenciĝis per response.failed. Mortigo-fluoj kiel sia propra artikolo kun response.reasoning_text.delta kaj .done. Vokoj de iloj venas post la mesaĝo, ĉiu kiel itemo kun response.function_call_arguments.delta kaj .done.

StatoKiam
400Ne model aŭ input; previous_response_id, conversation, background aŭ aŭ item_reference (unsupported_parameter); ne subtenata ilo aŭ enhavtipo.
402, 403, 404, 429, 502, 503Koncerne Chat Completions.

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

Anthropic-mesaĝoj

La formato de Anthropic, por la Anthropic SDK-oj kaj Claude Code. Ĝi funkcias kun ĉiu modelo en la katalogo, ne nur Claude: la peto estas tradukita, pasigita tra la sama pipelono, kaj re-tradukita.

POST https://nymbot.ai/api/v1/messages — bezonas API-ŝlosilon, ĉar x-api-key aŭ Authorization: Bearer.

La anthropic-version kaj anthropic-beta intestaroj estas akceptataj kaj ignorataj. Anthropic-modelnomoj estas kongruigitaj al la katalogo, do Claude Code kaj la SDK-oj funkcias per la nomoj, kiujn ili jam uzas:

  • Nomo, kiun la katalogo konas, kiel ekzemple claude-sonnet-5 aŭ anthropic/claude-opus-5, estas uzata kiel ĝi estas.
  • Alie dato (-20260514), -latest, versio-etikedo kiel ekzemple -v1, braketita etikedo kiel ekzemple [1m] kaj anthropic/ aŭ anthropic. prefiksoj estas forhavataj, kaj punktoj kaj strekoj en la versio estas provataj ambaŭ manieroj (claude-haiku-4-5 trovas claude-haiku-4.5).
  • Se tio ankoraŭ ne kongruas kun io ajn, la familio (Opus, Sonnet aŭ Haiku) estas uzata, tiel longe kiel la versio de la katalogo estas la sama aŭ pli nova ol tiu demandita.
  • Nomo, kiu ne kongruas kun io ajn, reternas 404 not_found_error.
KampoSkribiDezirindataPriskribo
modelŝnuroJesKataloga modelo-identigilo, aŭ Anthropic-modelo-nomo.
max_tokensentiera nombroJesLa plej multaj tokenoj por skribi.
messagesmatriĉoJesuser kaj assistant turnoj, kun text, image (base64 aŭ URL-fonto), tool_use kaj tool_result blokoj. thinking blokoj el pli fruaj turnoj estas akceptataj kaj forlasataj.
systemĉeno aŭ listoNeSistemsistema instrukcio, kiel ĉenaĵo aŭ tekstblokoj.
temperature
top_p
numeroNeEkzamenaj kontroloj, kie la modelo prenas ilin. top_k estas akceptata kaj forigita.
stop_sequencesaro de ĉefaj tekstojNeTeksto, kiu finas la respondon. Maksimume 4 ĉenoj, ĉiu maksimume 256 karakteroj.
tools
tool_choice
matrico, objektoNeIloj kun name, description kaj input_schema. A web_search server ilo ŝaltas retserĉo; Anthropic-is aliaj integritaj iloj (bash, tekstredaktilo, komputila uzo) estas rifuzitaj kun unsupported_tool. tool_choice prenas auto, any, tool aŭ none, kaj disable_parallel_tool_use.
thinkingobjektoNe{"type": "enabled", "budget_tokens": 8192}, {"type": "adaptive"} aŭ {"type": "disabled"}La buĝeto elektas klopodan nivelon: sub 2,048 minimuma, de 2,048 malalta, de 8,192 meza, de 16,384 alta. Adaptiva uzas output_config.effort, aŭ alta.
streambooleanaNeFluu en la eventformato de Anthropic.
metadataobjektoNeAkceptita kaj ignorita.

Respondo

{
  "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 ankaŭ povas teni tool_use blokoj kaj a thinking bloko, kiu signature estas malplena. stop_reason estas end_turn, max_tokens, tool_use aŭ refusal, kalkulita la saman manieron kiel finish_reason sur Ĉat-kompletigoj; stop_sequence estas ĉiam null, eĉ kiam haltiga sekvenco finis la respondon. input_tokens kontoj nur freŝa enigo; kaŝita enigo estas en la du kaŝaj kampoj. La kosto estas en la nymbot objekto kaj la X-Nymbot-Cost-Sats ĉef titolo.

Transmitataj, la eventoj estas Anthropic-aj: message_start, content_block_start, ping, content_block_delta (text_delta, input_json_delta aŭ thinking_delta), content_block_stop, message_delta kun la ĉeso-kazo, la uzo kaj la nymbot kostobjekto, kaj message_stop. A ping estas ankaŭ sendita ĉiuj 15 sekundoj dum la modelo laboras. Ilvokoj al iloj alvenas post la teksto, ĉiu kiel tool_use bloku kun sia tuta enigo en unuĵo input_json_delta.

Eraroj en ĉi tiu fino uzas la formaton de Anthropic: {"type": "error", "error": {"type": "not_found_error", "message": "…"}}. A mallonga saldo estas 402 billing_error, superŝarĝita provizanto 503 overloaded_error. Eraro post la komenco de la fluo estas sendita kvankam error 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);

Kontado de tokenoj

Estimato de kiom da enigo-tokenoj peto de Mesaĝoj uzus, por ke kliento povos kontroli antaŭ ol ĝi sendas. Ĝi estas senpaga, sed ankoraŭ bezonas ŝlosilon.

POST https://nymbot.ai/api/v1/messages/count_tokens — bezonas API-ŝlosilon. Senpaga.

La korpo estas la sama kiel por Mesagejoj, sen max_tokens; la nomo de la modelo devas esti rezolvita. La nombro estas estimo: la karakteroj de la sistemsperaĵo, mesaĝoj, ilvokoj kaj il-definoj dividitaj per kvar, plus 1 600 por ĉiu bildo. Ĝi ne estas la propra tokenizilo de la provizanto, do la reala nombro povas diferi. Klavo, kiu atingis sian limon, ankoraŭ povas uzi ĝin.

Respondo

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

Listigo de modeloj

Ĉiu modelo kaj generilo, kiun la API akceptas, kun kio ĝi kostas. La listo estas legata el la sama vivanta katalogo kiel la elektilo de la aplikaĵo, do ĝi ĉiam estas tio, kion la servilo rultos.

GET https://nymbot.ai/api/v1/models — neniu ŝlosilo bezonata. Cacheita dum kvin minutoj.

GET /api/v1/models/{id} redonas unu eniron.

KampoSkribiDezirindataPriskribo
typeĉeno (demando)Nechat (la defaŭlto), image, video, audio, embedding aŭ all. Plurajn oni povas doni, kiel image,video.

Prezoj estas tio, kion vi pagas, kun la kosto kaj marĝo jam inkluditaj, en dolaroj kaj en satoj laŭ la nuna Bitcoin-prezo. balance diras kiun saldon la modelo elspezas nymbot_key Ĉu la mallonga nomo de la modelo estas en la aplikaĵo. created estas ĉiam 0, ĉar la katalogo ne registras kiam modelo estis aldonita. Modelo sen publikigitaj jetkostoj estas pralagiĝita per_request anstataŭe.

nymbot/auto estas ĉiam unua, prezigata kiel variable, kun ᵃ routes listo donante la tarifojn de ĉiu norma vojo. Ĝi listigas vidon kaj razonadon, sed ne ilojn.

GET /api/v1/models/{id} akceptas la samaj nomoj kaj pseŭdonimoj kiel peto, kaj revenas la eniron por la modelo, al kiu ili rezolvas.

Respondo

{
  "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"
    }
  ]
}

La aliaj specoj:

  • Bildo eniroj havas capabilities (accepts_image_url, requires_image_url, edit) kaj prezo per_generation.
  • Videovideo eniroj havas max_duration_seconds kaj resolutions, kaj prezo per_second por ĉiu rezolucio.
  • Audio eniroj havas audio_type speech aŭ transcription, prezigita per_1k_chars aŭ per_minute.
  • Enmetiĝo eniroj havas dimensions, context_length, max_inputs kaj prezo por miliono da enigo-tokenoj.

Prezoj markitaj "estimated": true estas la estimatoj de la aplikaĵo por generatilo, kies prezo ne estas publikigita. Nekonata type rezultoj 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);