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.
Ĉi tiu paĝo estas maŝintradukita por komforto. La angla originalo estas la versio kiu validas.
Ĉ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.
| Kampo | Skribi | Dezirindata | Priskribo |
|---|---|---|---|
model | ŝnuro | Jes | nymbot/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. |
messages | matriĉo | Jes | La 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. |
stream | booleana | Ne | Sendu la respondon tiel kiel ĝi estas skribita. Vidu fluigado. |
stream_options | objekto | Ne | {"include_usage": true} aldonas finan pezonon kun token-kvantoj kaj la kosto. |
max_tokensmax_completion_tokens | entiera nombro | Ne | La 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. |
temperaturetop_p | numero | Ne | Ekzamenaj kontroloj: temperature de 0 ĝis 2, top_p de 0 ĝis 1. |
stop | ĉeno aŭ listo | Ne | Teksto, 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. |
seed | entiera nombro | Ne | Por ripetebla provizado, kie la modelo subtenas ĝin. |
presence_penaltyfrequency_penalty | numero | Ne | Repetaj kontroliloj, ĉiu de -2 ĝis 2. |
response_format | objekto | Ne | {"type": "json_object"} aŭ {"type": "json_schema", "json_schema": {…}}, kie la modelo subtenas ĝin. Ne uzata de nymbot/auto. |
toolstool_choiceparallel_tool_calls | aro, ĉeno aŭ objekto, booleana | Ne | Funkcia 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_effortreasoning | ŝnetaĵo, objekto | Ne | "minimal", "low", "medium" aŭ "high", aŭ {"effort": "high"}. "none" aŭ {"enabled": false} turnas ĝin malŝtonde. Vidu logiko. |
plugins | matriĉo | Ne | [{"id": "web", "max_results": 5}] ĉiam serĉas la interreton unue. Ĝis 10 rezultoj. |
n | entiera nombro | Ne | Nur 1. Ĉio alia revenas 400. |
logit_biasusermetadata | objekto, ĉeno, objekto | Ne | Akceptita 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.
| Stato | Kiam |
|---|---|
400 | Ne 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). |
402 | La saldo, kiun la modelo elspezas, ne povas kovri la rezervon. |
403 | La plej malbona kazo ne kongruas kun la ĉapelo de la ŝlosilo (key_limit_reached). Malpliĝas max_tokens aŭ altigu la plafon. |
404 | Neniu modelo per tiu nomo (model_not_found). |
429 | La limigo de la ŝlosilo, aŭ tiu de la provizanto (upstream_rate_limited). |
502, 503 | La 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 malplenachoices, la jeton-kvantoj, la kosto kaj lanymbotobjekto. - 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
401aŭ402, revenas kiel ordinara JSON kun sia status-kodo, ne kiel fluo. Eraro post kiam la fluo komenciĝis aperas kiel lastadata: {"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.
| Sufikso | Efiko |
|---|---|
:online | Serĉas la interreton unue, kiel plugins: [{"id": "web"}]. Vidu retserĉo. |
:thinking | Alta 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, :extended | Akceptite 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);
Retserĉo
Ĉ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:onlinesufikso sur la modelo. - Serĉu kiam ĝi helpas:
"tools": [{"type": "web_search", "parameters": {"max_results": 5}}], ankaŭ akceptata kielweb_search_previewaŭ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.
| Kampo | Skribi | Dezirindata | Priskribo |
|---|---|---|---|
model | ŝnuro | Jes | Koncerne Ĉat-kompletigoj, inkluzive de sufiksoj. |
input | ĉeno aŭ listo | Jes | StringType, 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 | ŝnuro | Ne | Sistemaj instrukcioj. |
max_output_tokens | entiera nombro | Ne | La plej multaj tokenoj por skribi. |
temperaturetop_p | numero | Ne | Ekzamenaj kontroloj, kie la modelo prenas ilin. |
toolstool_choiceparallel_tool_calls | aro, ĉeno aŭ objekto, booleana | Ne | Funkciaj 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. |
reasoning | objekto | Ne | {"effort": "minimal" | "low" | "medium" | "high"}. xhigh kaj max anstataŭigi high; none malŝaltas ĝin. |
text.formatresponse_format | objekto | Ne | Strukturita eldato, kiel JSON-skemo aŭ json_object. |
metadata | objekto | Ne | Neplej ŝanĝita en la respondo. Maksimume 16 ĉenaj valoroj, ŝlosiloj ĝis 64 signoj kaj valoroj ĝis 512. |
stream | booleana | Ne | Fluigu eventojn kiel priskribite malsupre. |
store | booleana | Ne | Ignorita. Nenio estas konservita, kaj la respondo ĉiam diras "store": false. |
previous_response_idconversationbackground | ĉeno, objekto, booleano | Ne | Ne 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.
| Stato | Kiam |
|---|---|
400 | Ne model aŭ input; previous_response_id, conversation, background aŭ aŭ item_reference (unsupported_parameter); ne subtenata ilo aŭ enhavtipo. |
402, 403, 404, 429, 502, 503 | Koncerne 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-5aŭanthropic/claude-opus-5, estas uzata kiel ĝi estas. - Alie dato (
-20260514),-latest, versio-etikedo kiel ekzemple-v1, braketita etikedo kiel ekzemple[1m]kajanthropic/aŭanthropic.prefiksoj estas forhavataj, kaj punktoj kaj strekoj en la versio estas provataj ambaŭ manieroj (claude-haiku-4-5trovasclaude-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
404not_found_error.
| Kampo | Skribi | Dezirindata | Priskribo |
|---|---|---|---|
model | ŝnuro | Jes | Kataloga modelo-identigilo, aŭ Anthropic-modelo-nomo. |
max_tokens | entiera nombro | Jes | La plej multaj tokenoj por skribi. |
messages | matriĉo | Jes | user 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ŭ listo | Ne | Sistemsistema instrukcio, kiel ĉenaĵo aŭ tekstblokoj. |
temperaturetop_p | numero | Ne | Ekzamenaj kontroloj, kie la modelo prenas ilin. top_k estas akceptata kaj forigita. |
stop_sequences | aro de ĉefaj tekstoj | Ne | Teksto, kiu finas la respondon. Maksimume 4 ĉenoj, ĉiu maksimume 256 karakteroj. |
toolstool_choice | matrico, objekto | Ne | Iloj 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. |
thinking | objekto | Ne | {"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. |
stream | booleana | Ne | Fluu en la eventformato de Anthropic. |
metadata | objekto | Ne | Akceptita 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.
| Kampo | Skribi | Dezirindata | Priskribo |
|---|---|---|---|
type | ĉeno (demando) | Ne | chat (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 prezoper_generation. - Videovideo eniroj havas
max_duration_secondskajresolutions, kaj prezoper_secondpor ĉiu rezolucio. - Audio eniroj havas
audio_typespeechaŭtranscription, prezigitaper_1k_charsaŭper_minute. - Enmetiĝo eniroj havas
dimensions,context_length,max_inputskaj 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);