Kunnskapsgrunnlag Utviklere
Chat, svar og meldinger
Tre måter å spørre en modell noe, i de tre formatene kundene allerede snakker, alle kjører på de samme modellene og fakturert på samme måte.
Denne siden er maskinoversatt for enkelhets skyld. Den engelske originalen er versjonen som gjelder.
Chat fullføringer
OpenAI chat-formatet, og det som nesten alle verktøy støtter. Send samtalen så langt og få neste melding tilbake.
POST https://nymbot.ai/api/v1/chat/completions Trenger en API-nøkkel
Bare model og messages En samplingsparameter som den valgte modellen ikke tar faller uten en feil, slik at en forespørsel kropp fungerer på tvers av modeller. supported_parametersDet som blir avvist i stedet for kastet er noe som modellen ikke kan gjøre i det hele tatt: bilder for en modell som ikke kan se, verktøy for en modell som ikke kan ringe dem.
| Feltet | Typen | Krevde | Beskrivelse |
|---|---|---|---|
model | Strenge | Ja | nymbot/auto (eller auto) for Nymbots ruting på standardbalansen, eller en katalogmodell id som anthropic/claude-sonnet-5 på Pro-balansen. Appens korte navn og aliaser aksepteres også. Tilstrekkelig. |
messages | Array | Ja | Samtaler - roller system, developer (behandlet som et system) user, assistant og toolInnhold er en streng eller en liste over text og image_url deler; bilder bare i brukermeldinger. input_audio Noen filer blir avvist. |
stream | Booleansk | Nei | Send svaret slik det er skrevet.Se Streaming av. |
stream_options | Objektet | Nei | {"include_usage": true} legger til et siste stykke med token teller og kostnadene. |
max_tokensmax_completion_tokens | Integrert | Nei | De fleste tokens å skrive. Senket til modellens maksimum hvis høyere. Angir også hvor mye som holdes fra saldoen din, så et mindre antall trenger mindre kreditt for å starte. |
temperaturetop_p | Antall | Nei | Sampling av kontroller: temperature fra 0 til 2, top_p Fra 0 til 1. |
stop | String eller array | Nei | Tekst som slutter svaret: en streng eller maksimalt 4 strenger, hver med maksimalt 256 tegn. nymbot/auto. |
seed | Integrert | Nei | Til repeterbar sampling, der modellen støtter den. |
presence_penaltyfrequency_penalty | Antall | Nei | Gjenta kontroller, hver fra -2 til 2. |
response_format | Objektet | Nei | {"type": "json_object"} eller {"type": "json_schema", "json_schema": {…}}, der modellen støtter den. Ikke brukt av nymbot/auto. |
toolstool_choiceparallel_tool_calls | Array, String eller Object, Boolean | Nei | Funksjonell oppfordring. se Verktøy for å ringe• A web_search Verktøyet blir WEB SøkPå maksimalt 128 verktøy og 512 KB av definisjoner, nestet på maksimalt 64 nivåer dyp; mer er en 400. |
reasoning_effortreasoning | Streng, gjenstand | Nei | "minimal", "low", "medium" eller "high"eller {"effort": "high"}. "none" eller {"enabled": false} Slå den av. se begrunnelse. |
plugins | Array | Nei | [{"id": "web", "max_results": 5}] alltid søker på nettet først. Opptil 10 resultater. |
n | Integrert | Nei | 1 - Alt annet kommer tilbake 400. |
logit_biasusermetadata | String, String og Object | Nei | Godkjent og ikke sendt videre. logit_bias kart på maksimalt 300 token ids til tall fra -100 til 100; user Maksimalt 256 tegn metadata holder opptil 16 strengverdier, nøkler opptil 64 tegn og verdier opptil 512. |
Svaret er vanlig chat.completionMed kostnadene i usage.cost
(i dollar) og i nymbot og objekt. model er den løste modell id, så et kort navn kommer tilbake som den fullstendige. message.reasoning_contentSeparert fra svaret.
Svaret
{
"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 er utarbeidet fra det som kom tilbake, siden leverandørene rapporterer det annerledes: tool_calls Når man ber om verktøy, length når svaret brukte hver token tillatt (eller modellen brukte dem alle resonnement og skrev ingen svar), content_filter Når leverandøren avviser, og stop
Ellers altså. usage.completion_tokens_details.reasoning_tokens er alltid 0: skjulte resonnement tokens telles, og belastes, i completion_tokens.
| Status | Når |
|---|---|
400 | Nei model eller messages (missing_required_parameter); en lyd eller fil del, eller bilder for en modell som ikke kan se dem (unsupported_contentmer enn 20 bilder (too_many_images); en prøveparameter av feil type eller ute av rekkevidde (invalid_value); et bilde link som ikke er offentlig (invalid_image_url); verktøy på en modell som ikke kan kalle dem (unsupported_tool); n annet enn 1; a :thinking For eksempel er det ikke mulig å forklare noe som ikke kan forklare noe som helst (model_not_found(eller leverandøren avviste forespørselen)upstream_rejected). |
402 | Saldoen som modellen bruker, kan ikke dekke holdet. |
403 | I verste fall passer ikke nøkkelens kappe (key_limit_reached• Lavere max_tokens Eller heve hodet. |
404 | Ingen modell med dette navnet (model_not_found). |
429 | Nøkkelens rentegrense, eller leverandørens (upstream_rate_limited). |
502, 503 | Leverandøren mislyktes (upstream_erroreller er overbelastet (upstream_overloaded, med Retry-AfterIngenting er belastet med mindre leverandøren fakturert for forsøket. |
Statuskodene for hver endpoint-aksje er oppført under Feilene.
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
med "stream": true svaret kommer som server-sendt hendelser mens modellen skriver det. chat.completion.chunk er a data: linje, og strømmen slutter med data: [DONE]Fornuft kommer inn i
delta.reasoning_contentSvaret i delta.content.
Stream alt som kan ta mer enn ca. 100 sekunder, for eksempel et langt svar, en stor
max_tokens En forespørsel som ikke strømmes, sender ikke noe før svaret er fullført, og nettverket mellom deg og Nymbot kan stenge en tom forbindelse etter ca 100 sekunder; modellen er fortsatt ferdig og det den skrev er ladet, men svaret er tapt.
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]
- Linjer som begynner med
:er hold-live kommentarer, sendt hver 15 sekunder mens modellen tenker. - Be om
"stream_options": {"include_usage": true}for å få det siste stykket ovenfor, med en tomchoices, token teller, kostnadene ognymbotog objekt. - Hvis du lukker forbindelsen tidlig, stopper ikke modellen: Nymbot leser resten av leverandørens strøm, i opptil 25 sekunder, for å få sin token telle, og du betaler hva leverandøren rapporterer.
- En feil før det første stykket, for eksempel
401eller402, kommer tilbake som vanlig JSON med sin statuskode, ikke som en strøm.data: {"error": {…}}begivenhet, og strømmen slutter uten[DONE]. - Forespørsler med verktøy, og modeller på OpenAI's Responses transport, strømmer ikke fra leverandøren.
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);
}
Verktøy for å ringe
Beskriv funksjonene i tools og modellen kan be om at man ringer i stedet for å svare.Du kjører funksjonen og legger til resultatet som en tool Budskap med samme
tool_call_idNymbot kjører aldri dine funksjoner; det overfører modellens forespørsel tilbake til deg.
tool_choice tar "auto", "none",
"required" eller {"type": "function", "function": {"name": "…"}}Modelllisten markerer hvilke modeller som kan ringe verktøy (capabilities.toolsVerktøyene blir avvist med 400 unsupported_tool er nymbot/auto og på de få katalogmodellene som kjører på OpenAIs Responses transport, som Nymbot ikke kan passere verktøy til.
med "stream": true, en forespørsel med verktøy kjører i ett stykke og sendes deretter som en normal chunk-sekvens: rollen, en chunk som bærer hvert verktøykall med sitt indeks, id, navn og argumenter, og finish-stykket.
Svaret er delvis
"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);
Bilder i forespørsel
Modeller med capabilities.vision kan lese bilder. Legg til en image_url
del til en brukermelding, med enten et publikum https:// Link eller a
data:image/…;base64, URL. Opptil 20 bilder per forespørsel. SVG bilder er avvist, og så er en kobling over 4 096 tegn eller en med brukernavn eller passord i den (400 invalid_image_urlEt valgfritt detail er
auto, low eller high.
med nymbot/auto, en forespørsel med et bilde i den blir rutet til en standardmodell som kan se. capabilities.vision Avviser bilder med
400 unsupported_contentEn kobling må peke til en offentlig vert; Nymbot overfører bildet til modellens leverandør og beholder det ikke.
Et bilde belastes som input tokens leverandøren teller for det, som resten av forespørselen.
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);
begrunnelse
Modeller med capabilities.reasoning kan tenke før de svarer. be om mer eller mindre av det med reasoning_effort ("minimal", "low",
"medium" eller "high") eller "reasoning": {"effort": "high"}eller legge til :thinking til modellnavnet, som betyr høy innsats. På en modell uten begrunnelse blir innstillingen ignorert. nymbot/auto, :thinking sender forespørselen til standard resonnement rute.
På antropiske modeller blir innsatsen et tankebudsjett på rundt 1000, 2 000, 8 000 eller 16 000 tokens, aldri mer enn max_tokens Å tenke er å forlate når
tool_choice tvinger et verktøy, og når forespørselen fortsetter en verktøyløype (det siste meldingen er et verktøyløp), fordi Anthropic trenger den tidligere signerte tenkningen for å gjenoppta den.
Argumentasjonen kommer tilbake message.reasoning_contenteller
delta.reasoning_content når strømming, aldri blandet inn i svaret. Reasoning er utgang og er belastet som sådan, innvendig completion_tokensNoen leverandører returnerer ikke resonnementstekst i det hele tatt, og det blir fortsatt belastet.
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);
Modeller av suffiks
Et suffiks på modellnavnet endrer hvordan forespørselen håndteres, uten et annet felt. anthropic/claude-sonnet-5:online.
| Tilstrekkelig | Effekt |
|---|---|
:online | Søk på nettet først, som plugins: [{"id": "web"}]Se også WEB Søk. |
:thinking | Høy resonnement; på nymbot/autoPå en modell som ikke kan fornuft, 400 model_not_found med “no endpoints found” |
:nitro, :floor, :exacto, :extended | Hver katalogmodell har en rute, så det er ingen raskere, billigere eller lengre en å velge; suffiksene er tillatt slik at modellnavn kopiert fra andre tjenester fortsatt fungerer. |
Enhver annen suffiks blir ignorert. Hele navnet blir prøvd først, så en modell hvis id virkelig inneholder en kolon fortsatt fungerer; hvis ikke, blir suffiksene tatt fra slutten en etter en til en modell matcher. 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);
Web søk
Nymbot søker etter den siste brukermeldingen (sine første 2000 tegn), leser de beste sidene og gir dem til modellen med spørsmålet, merket som eksternt innhold modellen ikke bør ta instruksjoner fra.
- Alltid søk:
"plugins": [{"id": "web", "max_results": 5}]eller a:onlineTilstrekkelig på modellen. - Søk når det hjelper:
"tools": [{"type": "web_search", "parameters": {"max_results": 5}}]Godkjent også somweb_search_previewelleropenrouter:web_searchNymbot søker bare når spørsmålet ser ut til å trenge aktuell informasjon, samme test som appen bruker.
max_results er 5 som standard og maksimalt 10. kildene kommer tilbake i
nymbot.web_search.sourcesHver med en title, snippet og
urlOg som url_citation Notater på meldingen.
Hver søk som kjører koster $ 0,008, konvertert til sats, på toppen av tokens, og det er en del av holdet. sidene det leser er input tokens også, så et svar fra nettet koster mer enn det samme spørsmålet spurte kaldt, noen ganger flere ganger mer.
Svaret er delvis
"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);
Svar fra API
OpenAI's nyere format, brukt av OpenAI Agents SDK og av Codex. Det kjører på de samme modellene, fakturering og funksjoner som Chat Completions.
POST https://nymbot.ai/api/v1/responses Trenger en API-nøkkel
| Feltet | Typen | Krevde | Beskrivelse |
|---|---|---|---|
model | Strenge | Ja | Som for Chat fullføringerInkluderer også suffiks. |
input | String eller array | Ja | En streng, eller en liste over elementer: meldinger (roller user, assistant, system, developer) med input_text, input_image og output_text deler, og function_call og function_call_output elementer for verktøy. input_image tar en image_url link eller data URL, ikke en fil-id. reasoning og web_search_call elementer er overskygget; item_reference er blitt avvist. |
instructions | Strenge | Nei | Instruksjoner for system. |
max_output_tokens | Integrert | Nei | De fleste tokens å skrive. |
temperaturetop_p | Antall | Nei | Sampling kontroller, hvor modellen tar dem. |
toolstool_choiceparallel_tool_calls | Array, String eller Object, Boolean | Nei | Funksjonsverktøy, i form av Responses ({"type": "function", "name": …, "parameters": …}) a web_search eller web_search_preview Verktøyet blir WEB Søk Når det hjelper, blir andre innebygde verktøy avvist. |
reasoning | Objektet | Nei | {"effort": "minimal" | "low" | "medium" | "high"}. xhigh og max Betyr high; none Slå den av. |
text.formatresponse_format | Objektet | Nei | Strukturert utgang, som et JSON-skjema eller json_object. |
metadata | Objektet | Nei | Returneres uendret i svaret Ved maksimalt 16 strengverdier, nøkler opptil 64 tegn og verdier opptil 512. |
stream | Booleansk | Nei | Stream hendelser som beskrevet nedenfor. |
store | Booleansk | Nei | Ignorert: Ingenting lagres, og svaret sier alltid "store": false. |
previous_response_idconversationbackground | String, Object og Boolean | Nei | Ikke støttet: 400 unsupported_parameterSvarene lagres ikke, så send hele samtalen til input Hver gang . |
Svaret
{
"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 }
}
Et verktøy for forespørsel vises i output som a function_call Poeng med
call_id, name og argumentsSend resultatet tilbake som a
function_call_output Artikkel med samme call_idReasoning, når modellen returnerer den, er en reasoning Poeng med reasoning_text Innhold, oppført først status er incomplete Når svaret treffer
max_output_tokens Leverandøren avviser, med
incomplete_details.reason Sett to max_output_tokens eller
content_filterSvaret ekkoer også forespørselsinnstillingene (temperatur, verktøy, verktøyvalg og så videre) som OpenAI gjør, og bærer den nymbot Kostnad for objekt.
Streamed, hver begivenhet er en event: linje og a data: linje med a
sequence_numberI denne rekkefølgen: response.created,
response.in_progress, response.output_item.added,
response.content_part.addedEt hvilket som helst antall response.output_text.delta,
response.output_text.done, response.content_part.done,
response.output_item.doneOg til slutt response.completed med bruk og kostnad. Et svar kutter korte ender med response.incomplete i stedet, og et svikt etter at strømmen startet med response.failedReasoning streams som sitt eget element med response.reasoning_text.delta og .doneVerktøykall kommer etter meldingen, hver som et element med response.function_call_arguments.delta
og .done.
| Status | Når |
|---|---|
400 | Nei model eller input; previous_response_id, conversation, background eller en item_reference (unsupported_parameterEt verktøy eller en innholdstype som ikke støttes. |
402, 403, 404, 429, 502, 503 | Når det gjelder chat fullføringer. |
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);
Antropiske budskap
Det fungerer med alle modeller i katalogen, ikke bare Claude: forespørselen blir oversatt, kjørt gjennom samme rør og oversatt tilbake.
POST https://nymbot.ai/api/v1/messages - trenger en API-nøkkel, som x-api-key eller Authorization: Bearer.
Den anthropic-version og anthropic-beta Antropiske modellnavn matches med katalogen, så Claude Code og SDK-ene fungerer med navnene de allerede bruker:
- Et navn som katalogen kjenner, slik som
claude-sonnet-5elleranthropic/claude-opus-5Den brukes som den er. - Hvis det er en dato (
-20260514),-latestEn versjon som-v1Et bracketed tag som[1m]og enanthropic/elleranthropic.Det er ikke mulig å bruke forhåndsinnstilling, og forhåndsinnstilling og forhåndsinnstilling kan gjøres på begge måter (claude-haiku-4-5Finnesclaude-haiku-4.5). - Hvis det fortsatt ikke stemmer, brukes familien (Opus, Sonnet eller Haiku), så lenge katalogversjonen er den samme eller nyere enn den som ble bedt om.
- Et navn som ikke matcher noe returnerer
404not_found_error.
| Feltet | Typen | Krevde | Beskrivelse |
|---|---|---|---|
model | Strenge | Ja | Et katalogmodell-id, eller et antropisk modellnavn. |
max_tokens | Integrert | Ja | De fleste tokens å skrive. |
messages | Array | Ja | user og assistant Turneringer, med text, image (base64 eller URL kilde) tool_use og tool_result av blokkene. thinking Blokkene fra tidligere turer blir akseptert og kastet. |
system | String eller array | Nei | System prompt, som en streng eller tekstblokker. |
temperaturetop_p | Antall | Nei | Sampling kontroller, hvor modellen tar dem. top_k er akseptert og droppet. |
stop_sequences | Array av strings | Nei | Tekst som avslutter svaret: Maksimalt 4 strenger, hver med maksimalt 256 tegn. |
toolstool_choice | Array, gjenstand | Nei | Verktøy med name, description og input_schema• A web_search Serververktøyet blir WEB SøkAnthropics andre innebygde verktøy (bash, tekstredigerer, datamaskinbruk) er avvist med unsupported_tool. tool_choice tar auto, any, tool eller noneog disable_parallel_tool_use. |
thinking | Objektet | Nei | {"type": "enabled", "budget_tokens": 8192}, {"type": "adaptive"} eller {"type": "disabled"}Budsjettet velger et innsatsnivå: under 2,048 minimum, fra 2,048 lavt, fra 8,192 medium, fra 16,384 høyt. output_config.effortEller høyt. |
stream | Booleansk | Nei | Stream i Anthropics arrangement format. |
metadata | Objektet | Nei | Godkjent og ignorert. |
Svaret
{
"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 Kan også holde tool_use Blokkene og a thinking
Blokkering, som signature Den er tom. stop_reason er
end_turn, max_tokens, tool_use eller refusalArbeidet på samme måte som finish_reason er
Chat fullføringer; stop_sequence er alltid
null, selv når en stop-sekvens endte svaret. input_tokens teller bare fersk input; cachede input er i de to cache-feltene.
nymbot Objektet og X-Nymbot-Cost-Sats og header.
Streamed, hendelsene er Anthropic's: message_start,
content_block_start, ping, content_block_delta
(text_delta, input_json_delta eller thinking_delta),
content_block_stop, message_delta med den stopper årsaken, bruk og nymbot kostnad objekt, og message_stop• A ping sendes også hvert 15. sekund mens modellen er i drift. Verktøykall kommer etter teksten, hver som en
tool_use Blokk med hele innspillingen i ett input_json_delta.
Feil på dette endepunktet bruker Anthropics format:
{"type": "error", "error": {"type": "not_found_error", "message": "…"}}En kort balanse er 402 billing_errorEn overbelastet leverandør
503 overloaded_errorEn feil etter at strømmen har startet sendes som en error av hendelsen.
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);
Telle tokens
En estimat av hvor mange input tokens en meldingsforespørsel ville bruke, slik at en klient kan sjekke før den sender.
POST https://nymbot.ai/api/v1/messages/count_tokens - Trenger en API nøkkel. gratis
Kroppen er den samme som MeldingerUten å max_tokens; modellnavnet må løse. Tellingen er en estimat: tegnene i systemprøven, meldinger, verktøykallinger og verktøydefinisjoner delt med fire, pluss 1,600 for hvert bilde. Det er ikke leverandørens egen tokenizer, så det virkelige tallet kan variere.
Svaret
{ "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);
Liste over modeller
Hver modell og generator som API aksepterer, med hva det koster.Listen leses fra samme live katalog som appens plukker, så det er alltid hva serveren vil kjøre.
GET https://nymbot.ai/api/v1/models - Ingen nøkkel nødvendig. skjult i fem minutter.
GET /api/v1/models/{id} Returnerer én inngang.
| Feltet | Typen | Krevde | Beskrivelse |
|---|---|---|---|
type | String (forespørsel) | Nei | chat (Dette er et forsinkelse) image, video, audio, embedding eller allFlere kan brukes, som image,video. |
Priser er hva du betaler, med avgiften og margin allerede i, i dollar og i satser til gjeldende Bitcoin-pris. balance Det forteller hvilken balanse modellen bruker.
nymbot_key er modellens korte navn i appen. created er alltid 0, siden katalogen ikke registrerer når en modell ble lagt til. per_request i stedet.
nymbot/auto er alltid først, prissatt som variableMed a
routes Det viser visjon og resonnement, men ikke verktøy.
GET /api/v1/models/{id} aksepterer de samme navnene og aliasene som en forespørsel, og returnerer oppføringen for modellen de bestemmer seg for.
Svaret
{
"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"
}
]
}
De andre typene:
- bilde Inngangen har
capabilities(accepts_image_url,requires_image_url,edit) og en prisper_generation. - Videoer Inngangen har
max_duration_secondsogresolutionsOg en prisper_secondfor hver av resolusjonene. - - Audio Inngangen har
audio_typespeechellertranscriptionPrisen erper_1k_charsellerper_minute. - Embedded Inngangen har
dimensions,context_length,max_inputsOg en pris per million input tokens.
Priser merket "estimated": true er appens estimat for en generator hvis pris ikke er publisert. type Tilbake 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);