Vidensgrundlag Udviklere
Chat, svar og beskeder
Tre måder at spørge en model noget, i de tre formater klienter allerede taler, alle kører på de samme modeller og faktureret på samme måde.
Denne side er maskinoversat for nemheds skyld. Den engelske original er den version, der gælder.
Chat færdiggørelse
Den OpenAI chat format, og den, næsten alle værktøjer understøtter. Send samtalen så langt og få den næste besked tilbage.
POST https://nymbot.ai/api/v1/chat/completions Det kræver en API-nøgle.
Kun til model og messages En samplingsparameter, som den valgte model ikke tager, falder uden en fejl, så en anmodning krop fungerer på tværs af modeller. supported_parametersHvad der bliver afvist i stedet for droppet er noget, som modellen slet ikke kan gøre: billeder for en model, der ikke kan se, værktøjer til en model, der ikke kan ringe til dem.
| Feltet | Type af | Kræves | Beskrivelse af |
|---|---|---|---|
model | Strenge | Ja | nymbot/auto (eller auto) for Nymbots routing på standardbalancen, eller en katalogmodellid såsom anthropic/claude-sonnet-5 på Pro-balancen. Appens korte navne og aliaser accepteres også. Tilstrækkeligt. |
messages | Array | Ja | Samtaler - roller system, developer (behandlet som et system) user, assistant og toolIndhold er en streng eller en liste over text og image_url dele; billeder kun i brugerbeskeder. input_audio og dele af filen afvises. |
stream | Booleansk | Nej ikke | Send svaret, som det er skrevet. Streaming af. |
stream_options | Objektet | Nej ikke | {"include_usage": true} tilføjer et sidste stykke med token tæller og omkostningerne. |
max_tokensmax_completion_tokens | Integer | Nej ikke | De fleste tokens til at skrive. Sænket til modelens maksimum, hvis højere. Det angiver også, hvor meget der holdes fra din balance, så et mindre antal har brug for mindre kredit til at starte. |
temperaturetop_p | Nummeret | Nej ikke | Sampling af kontrol: temperature Fra 0 til 2, top_p Fra 0 til 1. |
stop | String eller array | Nej ikke | Tekst, der slutter svaret: en streng eller højst 4 strenge, hver med højst 256 tegn. nymbot/auto. |
seed | Integer | Nej ikke | Til gentagelig prøveudtagning, hvor modellen understøtter det. |
presence_penaltyfrequency_penalty | Nummeret | Nej ikke | Kontrol af gentagelser, hver fra -2 til 2. |
response_format | Objektet | Nej ikke | {"type": "json_object"} eller {"type": "json_schema", "json_schema": {…}}, hvor modellen understøtter det. Ikke anvendt af nymbot/auto. |
toolstool_choiceparallel_tool_calls | Array, String eller Object, Boolean | Nej ikke | Funktionen kalder. se Værktøj til opkalda) a web_search Værktøjet bliver til WebsøgningPå maksimalt 128 værktøjer og 512 KB definitioner, indlejret på maksimalt 64 niveauer dybt; mere er en 400. |
reasoning_effortreasoning | Streng, genstand | Nej ikke | "minimal", "low", "medium" eller "high"eller {"effort": "high"}. "none" eller {"enabled": false} Sluk det op. Se begrundelse. |
plugins | Array | Nej ikke | [{"id": "web", "max_results": 5}] altid søger på nettet først. Op til 10 resultater. |
n | Integer | Nej ikke | 1: Alt andet kommer tilbage 400. |
logit_biasusermetadata | Værktøj, String og Object | Nej ikke | Godkendt og ikke sendt videre. logit_bias kort på højst 300 token-id'er til tal fra -100 til 100; user Der er højst 256 tegn. metadata kan indeholde op til 16 strengværdier, nøgler op til 64 tegn og værdier op til 512. |
Svaret er almindeligt chat.completionMed omkostningerne i usage.cost
(i dollars) og i nymbot Et objekt . model er den løste model id, så et kort navn kommer tilbage som den fulde. message.reasoning_contentadskilt 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 udarbejdet ud fra, hvad der kom tilbage, da udbydere rapporterer det anderledes: tool_calls Når man har brug for værktøjer, length når svaret brugte hver tilladte token (eller modellen brugte dem alle begrundelse og skrev ingen svar), content_filter Hvis udbyderen afviser, og stop
Ellers er det. usage.completion_tokens_details.reasoning_tokens er altid 0: skjulte ræsonnement tokens tælles, og opkræves, i completion_tokens.
| Status er | Når |
|---|---|
400 | Nej ikke model eller messages (missing_required_parameter); en lyd eller fil del, eller billeder for en model, der ikke kan se dem (unsupported_content); mere end 20 billeder (too_many_images); en stikprøveparameter af den forkerte type eller ud af rækkevidde (invalid_value); et link, der ikke er offentligt tilgængeligt (invalid_image_url); værktøjer på en model, der ikke kan kalde dem (unsupported_tool); n andet end 1; a :thinking en fornemmelse af, at der ikke er tale om en fornemmelse (model_not_found); eller leverandøren afviste anmodningen (upstream_rejected). |
402 | Den balance, som modellen bruger, kan ikke dække holdet. |
403 | Det værste tilfælde passer ikke til nøgleens cap (key_limit_reached• Lavere max_tokens Eller hæve hovedet. |
404 | Ingen model med dette navn (model_not_found). |
429 | Den pågældende udbyder eller udbyder (upstream_rate_limited). |
502, 503 | Leverandøren har undladt (upstream_error) eller er overbelastet (upstream_overloaded, med Retry-AfterIntet opkræves, medmindre udbyderen har faktureret for forsøget. |
Statuskoderne for hver endpoint aktie er angivet under Fejl.
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 af
med "stream": true svaret kommer som server-sendte begivenheder, mens modellen skriver det. chat.completion.chunk er a data: linje, og strømmen slutter med data: [DONE]Fornuft kommer ind i
delta.reasoning_contentSvaret er i delta.content.
Stream noget, der kan tage mere end ca. 100 sekunder, f.eks. et langt svar, et stort
max_tokens En anmodning, der ikke streames, sender ikke noget, før svaret er færdigt, og netværket mellem dig og Nymbot kan lukke en tom forbindelse efter ca. 100 sekunder; modellen er stadig færdig, og det, den skrev, oplades, men svaret er tabt.
strømmen
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, der starter med
:er live-kommentarer, der sendes hvert 15. sekund, mens modellen tænker. - Spørg om
"stream_options": {"include_usage": true}for at få det sidste stykke ovenfor, med et tomtchoices, token tæller, omkostningerne ognymbotEt objekt . - Hvis du lukker forbindelsen tidligt, stopper modellen ikke: Nymbot læser resten af udbyderens strøm, i op til 25 sekunder, for at få sit tokental, og du betaler, hvad udbyderen rapporterer.
- En fejl før den første chunk, såsom
401eller402, kommer tilbage som almindelig JSON med sin statuskode, ikke som en stream.data: {"error": {…}}begivenhed, og strømmen slutter uden[DONE]. - Anmodninger med værktøjer, og modeller på OpenAI's Responses transport, strømmer ikke fra udbyderen.
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);
}
Værktøj til opkald
Beskriv funktionerne i tools og modellen kan bede om, at man ringer i stedet for at svare. Du kører funktionen, tilføjer dens resultat som en tool En besked med samme
tool_call_idNymbot kører aldrig dine funktioner; det sender modelens anmodning tilbage til dig.
tool_choice tager "auto", "none",
"required" eller {"type": "function", "function": {"name": "…"}}Modellen liste markerer, hvilke modeller kan kalde værktøjer (capabilities.toolsVærktøjer afvises med 400 unsupported_tool er nymbot/auto og på de få katalogmodeller, der kører på OpenAI's Responses transport, som Nymbot ikke kan passere værktøjer til.
med "stream": true, en anmodning med værktøjer kører i et stykke og sendes derefter som en normal chunk sekvens: rollen, en chunk bærer hvert værktøj opkald med dets indeks, id, navn og argumenter, og finish chunk.
Svaret er delvist
"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);
Billeder i en anmodning
Modeller med capabilities.vision Du kan læse billeder. Tilføj en image_url
dele til en brugerbesked, med enten et publikum https:// Link eller A
data:image/…;base64, URL. Op til 20 billeder pr. anmodning. SVG-billeder afvises, og så er et link over 4 096 tegn eller en med et brugernavn eller en adgangskode i den (400 invalid_image_urlEt valgfrit detail er
auto, low eller high.
med nymbot/auto, en forespørgsel med et billede i den bliver rettet til en standardmodel, der kan se. capabilities.vision Afviser billeder med
400 unsupported_contentBilleder kan kun være i brugerbeskeder.En link skal pege til en offentlig vært; Nymbot videregiver billedet til modelens udbyder og gemmer det ikke.
Et billede opkræves som de input tokens, som udbyderen tæller for det, ligesom resten af anmodningen.
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);
begrundelse
Modeller med capabilities.reasoning kan tænke, før de svarer. spørg om mere eller mindre af det med reasoning_effort ("minimal", "low",
"medium" eller "high") eller "reasoning": {"effort": "high"}Eller tilføje :thinking modellenavnet, hvilket betyder høj indsats. På en model uden begrundelse ignoreres indstillingen. nymbot/auto, :thinking sender anmodningen til den standardiserede rute.
På Anthropic-modellerne bliver indsatsen et tankebudget på omkring 1.000, 2.000, 8.000 eller 16.000 tokens, aldrig mere end max_tokens Tænk, tænk, tænk, når der er
tool_choice Når forespørgslen fortsætter med en værktøjsloop (det sidste budskab er et værktøjsresultat), fordi Anthropic har brug for den tidligere underskrevne tænkning for at genoptage den.
Argumentationen vender tilbage til message.reasoning_contenteller
delta.reasoning_content når streaming, aldrig blandet ind i svaret. begrundelse er output og opkræves som sådan, inde i completion_tokensNogle udbydere returnerer ikke begrundelsesteksten overhovedet, og den opkræves stadig.
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 af suffixes
Et suffix på modelnavnet ændrer, hvordan anmodningen håndteres, uden et andet felt. anthropic/claude-sonnet-5:online.
| Tilstrækkeligt | Effekt |
|---|---|
:online | Søg på internettet først, som plugins: [{"id": "web"}]Se det Websøgning. |
:thinking | Høj resonansindsats; på nymbot/autoPå en model, der ikke kan begrunde, 400 model_not_found med “ ingen slutpunkter fundet”. |
:nitro, :floor, :exacto, :extended | Hver katalogmodel har en rute, så der er ingen hurtigere, billigere eller længere at vælge; efterfølgerne er tilladt, så modelnavne kopieret fra andre tjenester stadig fungerer. |
Enhver anden efterfølger ignoreres. Det fulde navn prøves først, så en model, hvis id virkelig indeholder en kolon, stadig fungerer; hvis ikke, bliver efterfølgerne fjernet fra slutningen en ad gangen, indtil en model 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);
Websøgning
Nymbot søger efter den sidste brugerbesked (deres første 2.000 tegn), læser de bedste sider og giver dem til modellen med spørgsmålet, markeret som eksternt indhold modellen ikke bør tage instruktioner fra.
- Søger altid:
"plugins": [{"id": "web", "max_results": 5}]eller a:onlinesuffix på modellen. - Søg når det hjælper:
"tools": [{"type": "web_search", "parameters": {"max_results": 5}}]Også accepteret somweb_search_previewelleropenrouter:web_searchNymbot søger kun, når spørgsmålet ser ud til, at det har brug for aktuelle oplysninger, det samme test, som appen bruger.
max_results er 5 som standard og højst 10. Kilderne kommer tilbage i
nymbot.web_search.sourcesHver med et title, snippet og
urlOg som url_citation Noter på budskabet.
Hver søgning, der kører, koster $ 0,008, konverteret til sats, på toppen af tokenerne, og det er en del af holdet.
Svaret er delvist
"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);
Besvarelse af API
OpenAI's nyere format, der anvendes af OpenAI Agents SDK og af Codex. Det kører på de samme modeller, fakturering og funktioner som Chat Completions.
POST https://nymbot.ai/api/v1/responses Det kræver en API-nøgle.
| Feltet | Type af | Kræves | Beskrivelse af |
|---|---|---|---|
model | Strenge | Ja | Som for Chat færdiggørelseSupplementer er inkluderet. |
input | String eller array | Ja | En streng eller en liste over elementer: meddelelser (roller user, assistant, system, developer) med input_text, input_image og output_text dele, og function_call og function_call_output Materialer til værktøjer. input_image tager en image_url link eller data-URL, ikke et fil-id. reasoning og web_search_call genstande er overskygget; item_reference er blevet afvist. |
instructions | Strenge | Nej ikke | Systemets instruktioner . |
max_output_tokens | Integer | Nej ikke | De fleste tokens at skrive. |
temperaturetop_p | Nummeret | Nej ikke | Sampling kontroller, hvor modellen tager dem. |
toolstool_choiceparallel_tool_calls | Array, String eller Object, Boolean | Nej ikke | Funktionsværktøjer, i form af Responses ({"type": "function", "name": …, "parameters": …}) a web_search eller web_search_preview Værktøjet bliver til Websøgning Når det hjælper, afvises andre indbyggede værktøjer. |
reasoning | Objektet | Nej ikke | {"effort": "minimal" | "low" | "medium" | "high"}. xhigh og max betyder high; none Gør det af. |
text.formatresponse_format | Objektet | Nej ikke | Struktureret output, som et JSON-schema eller json_object. |
metadata | Objektet | Nej ikke | Returneret uændret i svaret Ved højst 16 strengværdier, nøgler op til 64 tegn og værdier op til 512. |
stream | Booleansk | Nej ikke | Stream begivenheder som beskrevet nedenfor. |
store | Booleansk | Nej ikke | Intet gemmes, og svaret siger altid "store": false. |
previous_response_idconversationbackground | String, Objekt og Boolean | Nej ikke | Ikke støttet af: 400 unsupported_parameterSvar gemmes 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 }
}
En værktøjsanmodning vises i output som a function_call Punkt med
call_id, name og argumentsSend resultatet tilbage som a
function_call_output Et emne med samme call_idReasoning, når modellen returnerer det, er en reasoning Punkt med reasoning_text Indholdet er opført først. status er incomplete Når svaret rammer
max_output_tokens eller afviste leverandøren, med
incomplete_details.reason Sæt to max_output_tokens eller
content_filterSvaret afspejler også anmodningens indstillinger (temperatur, værktøj, værktøjsvalg og så videre), som OpenAI gør, og bærer nymbot Omkostningerne ved objektet.
Streamed, hver begivenhed er en event: linje og a data: linje med a
sequence_numberI denne rækkefølge: response.created,
response.in_progress, response.output_item.added,
response.content_part.addedEt hvilket som helst antal response.output_text.delta,
response.output_text.done, response.content_part.done,
response.output_item.doneOg endelig response.completed med brug og omkostninger. Et svar skærer korte ender med response.incomplete i stedet, og et fiasko efter strømmen begyndte med response.failedRationalisere strømme som sit eget emne med response.reasoning_text.delta og .doneVærktøjsopkald kommer efter meddelelsen, hver som et element med response.function_call_arguments.delta
og .done.
| Status er | Når |
|---|---|
400 | Nej ikke model eller input; previous_response_id, conversation, background eller en item_reference (unsupported_parameterEt værktøj eller en indholdstype, der ikke understøttes. |
402, 403, 404, 429, 502, 503 | Hvad angår chat færdiggørelse. |
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 budskaber
Det fungerer med alle modeller i kataloget, ikke kun Claude: anmodningen oversættes, kører gennem samme rørledning og oversættes tilbage.
POST https://nymbot.ai/api/v1/messages - har brug for en API-nøgle, som x-api-key eller Authorization: Bearer.
Den anthropic-version og anthropic-beta Antropiske modelnavne matches med kataloget, så Claude Code og SDK'erne arbejder med de navne, de allerede bruger:
- Et navn, som kataloget kender, såsom
claude-sonnet-5elleranthropic/claude-opus-5Den bruges som den er. - Hvis der er en dato (
-20260514),-latestEn version som-v1En brækkede dag som[1m]og enanthropic/elleranthropic.Derudover er det også muligt at udskifte og udskifte de forskellige former for udskifter i begge versioner (claude-haiku-4-5Findesclaude-haiku-4.5). - Hvis det stadig ikke matcher noget, anvendes familien (Opus, Sonnet eller Haiku), så længe katalogets version er den samme eller nyere end den, der blev anmodet om.
- Et navn, der ikke matcher noget, returnerer
404not_found_error.
| Feltet | Type af | Kræves | Beskrivelse af |
|---|---|---|---|
model | Strenge | Ja | Et katalogmodellid eller et antropisk modelnavn. |
max_tokens | Integer | Ja | De fleste tokens at skrive. |
messages | Array | Ja | user og assistant Turnering, med text, image (base64 eller URL kilde) tool_use og tool_result af blokke. thinking Blokke fra tidligere omgange accepteres og droppes. |
system | String eller array | Nej ikke | System prompt, som en streng eller tekst blokke. |
temperaturetop_p | Nummeret | Nej ikke | Sampling kontroller, hvor modellen tager dem. top_k Det er accepteret og droppet. |
stop_sequences | Array af strings | Nej ikke | Tekst, der slutter svaret. I højst 4 strenge, hver højst 256 tegn. |
toolstool_choice | Array og Object | Nej ikke | Værktøjer med name, description og input_schemaa) a web_search Serverværktøjet bliver til WebsøgningAnthropics andre indbyggede værktøjer (bash, teksteditor, computerbrug) afvises med unsupported_tool. tool_choice tager auto, any, tool eller noneog disable_parallel_tool_use. |
thinking | Objektet | Nej ikke | {"type": "enabled", "budget_tokens": 8192}, {"type": "adaptive"} eller {"type": "disabled"}Budgettet vælger et indsatsniveau: under 2.048 minimum, fra 2.048 lavt, fra 8.192 medium, fra 16.384 højt. output_config.effortEller høj. |
stream | Booleansk | Nej ikke | Stream i Anthropics begivenhedsformat. |
metadata | Objektet | Nej ikke | Accepteret og ignoreret. |
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 Blokke og a thinking
Blok, hvis signature Den er tom. stop_reason er
end_turn, max_tokens, tool_use eller refusalArbejdede på samme måde som finish_reason er
Chat færdiggørelse; stop_sequence er altid
nullSelv når en stop sekvens afsluttede svaret. input_tokens tæller kun friske input; cachede input er i de to cachefelter.
nymbot Objektet og den X-Nymbot-Cost-Sats af Header.
Streamed, begivenhederne 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 hensyn til årsagen, brugen og nymbot omkostninger, og message_stopa) a ping sendes også hvert 15. sekund, mens modellen arbejder. Værktøjsopkald ankommer efter teksten, hver som en
tool_use Blok med hele sin input i en input_json_delta.
Fejl på dette endpoint bruger Anthropics format:
{"type": "error", "error": {"type": "not_found_error", "message": "…"}}En kort balance er 402 billing_errorEn overbelastet udbyder
503 overloaded_errorEn fejl, når strømmen er startet, sendes som en error begivenhed .
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);
Tælling af tokens
En estimat af, hvor mange input tokens en meddelelsesforespørgsel ville bruge, så en klient kan tjekke, før den sender.
POST https://nymbot.ai/api/v1/messages/count_tokens Du har brug for en API-nøgle.
Kroppen er den samme som Meddelelseruden at max_tokens; modelnavnet skal løse. Tællingen er en estimering: tegnene i systemopfordringen, meddelelser, værktøjsopkald og værktøjsdefinitioner divideret med fire, plus 1,600 for hvert billede. Det er ikke udbyderens egen tokenizer, så det faktiske tal 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);
Listen over modeller
Hver model og generator, som API accepterer, med hvad det koster.Listen læses fra den samme live-katalog som appens picker, så det er altid, hvad serveren vil køre.
GET https://nymbot.ai/api/v1/models - Ingen nøgle nødvendig. skjult i fem minutter.
GET /api/v1/models/{id} Returnerer en indgang.
| Feltet | Type af | Kræves | Beskrivelse af |
|---|---|---|---|
type | String (Kørsel) | Nej ikke | chat (Det er et underskud) image, video, audio, embedding eller allDer kan gives flere, som image,video. |
Priser er, hvad du betaler, med gebyr og margin allerede i, i dollars og i sats til den nuværende Bitcoin pris. balance Det angiver, hvilken balance modellen bruger.
nymbot_key er modelens korte navn i appen. created er altid 0, da kataloget ikke registrerer, hvornår en model blev tilføjet. per_request i stedet.
nymbot/auto er altid først, prissat som variable, med en
routes Listen giver hver standard rute priser. Det lister vision og begrundelse, men ikke værktøjer.
GET /api/v1/models/{id} accepterer de samme navne og aliaser som en anmodning, og returnerer posten for den model, de beslutter sig 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 typer:
- Billede Entréerne har
capabilities(accepts_image_url,requires_image_url,edit) og en prisper_generation. - Videoer Entréerne har
max_duration_secondsogresolutionsOg en prisper_secondfor hver enkelt beslutning. - Audio af Entréerne har
audio_typespeechellertranscriptionPrisen erper_1k_charsellerper_minute. - Indlejring Entréerne har
dimensions,context_length,max_inputsPrisen er pr. million input tokens.
Priser mærket "estimated": true er app’s estimat for en generator, hvis pris ikke offentliggøres. type Tilbage 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);