Kunskapsbas Utvecklare
Chat, svar och meddelanden
Tre sätt att fråga en modell något, i de tre format som klienterna redan talar, alla körs på samma modeller och faktureras på samma sätt.
Den här sidan är maskinöversatt för enkelhetens skull. Det engelska originalet är den version som gäller.
Chat kompletterar
OpenAI chattformat, och det som nästan alla verktyg stöder. Skicka konversationen så långt och få nästa meddelande tillbaka.
POST https://nymbot.ai/api/v1/chat/completions Behöver en API nyckel.
Endast model och messages En provtagningsparameter som den valda modellen inte tar droppas utan ett fel, så en begäran kropp fungerar över modeller. supported_parametersVad som avvisas snarare än droppas är något som modellen inte kan göra alls: bilder för en modell som inte kan se, verktyg för en modell som inte kan ringa dem.
| fältet | Typ av | nödvändigt | Beskrivning |
|---|---|---|---|
model | Strängar | Ja | nymbot/auto (eller auto) för Nymbots routing på standardbalansen, eller en katalogmodell-id som anthropic/claude-sonnet-5 på Pro-balansen. Appens korta namn och alias accepteras också. tillräckligt. |
messages | Array | Ja | Samtal - roller system, developer (behandlas som ett system) user, assistant och toolInnehåll är en sträng eller en lista över text och image_url delar; bilder endast i användarmeddelanden. input_audio och fildelar avvisas. |
stream | Booleanska | Nej | Skicka svaret som det är skrivet.Se Streaming är. |
stream_options | Objektet | Nej | {"include_usage": true} lägger till en sista bit med token räkningar och kostnaden. |
max_tokensmax_completion_tokens | integer | Nej | De flesta tokens att skriva. Sänkt till modellens max om högre. Anger också hur mycket som hålls från din balans, så ett mindre antal behöver mindre kredit för att starta. |
temperaturetop_p | Antalet | Nej | Sampling av kontroller: temperature från 0 till 2, top_p Från 0 till 1. |
stop | String eller array | Nej | Text som avslutar svaret: en sträng eller högst 4 strängar, var och en högst 256 tecken. nymbot/auto. |
seed | integer | Nej | För repeterbar provtagning, där modellen stöder den. |
presence_penaltyfrequency_penalty | Antalet | Nej | Upprepa kontrollerna, var och en från -2 till 2. |
response_format | Objektet | Nej | {"type": "json_object"} eller {"type": "json_schema", "json_schema": {…}}där modellen stöder den. Används inte av nymbot/auto. |
toolstool_choiceparallel_tool_calls | array, sträng eller objekt, boolean | Nej | Funktion att ringa. se Verktyg för samtaloch a web_search Verktyget vänder sig WebbsökningPå högst 128 verktyg och 512 KB av definitioner, inbäddade på högst 64 nivåer djup; mer är en 400. |
reasoning_effortreasoning | sträng, föremål | Nej | "minimal", "low", "medium" eller "high"eller {"effort": "high"}. "none" eller {"enabled": false} Stäng av den. se Argumentera. |
plugins | Array | Nej | [{"id": "web", "max_results": 5}] alltid söker på webben först. upp till 10 resultat. |
n | integer | Nej | Avsnitt 1 - Allt annat kommer tillbaka 400. |
logit_biasusermetadata | String, String och Object | Nej | Godkänd och inte skickad. logit_bias kartor på högst 300 token-id till nummer från -100 till 100; user är högst 256 tecken; metadata Håller upp till 16 strängvärden, nycklar upp till 64 tecken och värden upp till 512. |
Svaret är ett vanligt chat.completionMed kostnaden i usage.cost
(i dollar) och i nymbot och objekt. model är den lösta modellen id, så ett kort namn kommer tillbaka som den fullständiga. message.reasoning_contentskiljer sig från svaret.
svarar
{
"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 är utarbetad från vad som kom tillbaka, eftersom leverantörer rapporterar det annorlunda: tool_calls När man frågar efter verktyg, length när svaret använde varje tillåten token (eller modellen spenderade dem alla resonerar och skrev inget svar), content_filter när leverantören vägrar, och stop
Annars alltså. usage.completion_tokens_details.reasoning_tokens är alltid 0: dolda resonemang tokens räknas, och debiteras, i completion_tokens.
| statusen | När |
|---|---|
400 | Nej model eller messages (missing_required_parameter); en ljud- eller fildel eller bilder för en modell som inte kan se dem (unsupported_content); mer än 20 bilder (too_many_images); en provtagningsparameter av fel typ eller utanför intervallet (invalid_value); en bild länk som inte är offentlig (invalid_image_url); verktyg på en modell som inte kan kalla dem (unsupported_tool); n annat än 1; a :thinking ett argument som inte kan motiveras (model_not_found) eller leverantören avvisade begäran (upstream_rejected). |
402 | Balansen som modellen spenderar kan inte täcka innehavet. |
403 | Det värsta fallet passar inte nyckelns lock (key_limit_reached) lägre max_tokens Eller höja huvudet. |
404 | Ingen modell med det namnet (model_not_found). |
429 | Tillhandahålls av leverantören eller leverantören (upstream_rate_limited). |
502, 503 | Leverantören har misslyckats (upstream_error) eller är överbelastad (upstream_overloaded, med Retry-AfterInget debiteras om inte leverantören faktureras för försöket. |
Statuskoderna för varje endpoint aktier är listade under misstag.
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 är
med "stream": true Svaret kommer som en server-sänd händelse medan modellen skriver det. chat.completion.chunk är a data: linje, och strömmen slutar med data: [DONE]Förnuftet kommer in i
delta.reasoning_contentSvaret i delta.content.
Streama allt som kan ta mer än cirka 100 sekunder, till exempel ett långt svar, en stor
max_tokens En begäran som inte streamas skickar ingenting tills svaret är komplett, och nätverket mellan dig och Nymbot kan stänga en tom anslutning efter ca 100 sekunder; modellen är fortfarande klar och vad den skrev laddas, men svaret är förlorat.
strömma
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 börjar med
:är levande kommentarer, skickas var 15: e sekund medan modellen tänker. - fråga för
"stream_options": {"include_usage": true}för att få den sista delen ovanför, med en tomchoices, token räknas, kostnaden och dennymbotoch objekt. - Om du stänger anslutningen tidigt stoppas inte modellen: Nymbot läser resten av leverantörens ström, i upp till 25 sekunder, för att få sitt tokental, och du betalar vad leverantören rapporterar.
- Ett misstag före den första delen, till exempel
401eller402, kommer tillbaka som vanlig JSON med sin statuskod, inte som en ström.data: {"error": {…}}händelse, och strömmen slutar utan[DONE]. - Förfrågningar med verktyg och modeller på OpenAI:s Responses-transport strömmar inte från leverantören.De svarar fortfarande med en giltig ström, skickad när svaret är komplett.
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);
}
Verktyg för samtal
Beskriv funktionerna i tools och modellen kan be om ett samtal i stället för att svara. Du kör funktionen och lägger till resultatet som ett tool Ett meddelande med samma
tool_call_idNymbot kör aldrig dina funktioner; det skickar modellens begäran tillbaka till dig.
tool_choice tar "auto", "none",
"required" eller {"type": "function", "function": {"name": "…"}}Modellistan markerar vilka modeller som kan ringa verktyg (capabilities.tools) Verktyg avvisas med 400 unsupported_tool är nymbot/auto och på de få katalogmodeller som körs på OpenAI: s Responses transport, som Nymbot inte kan passera verktyg till.
med "stream": true, en begäran med verktyg körs i ett stycke och skickas sedan som en normal chunk-sekvens: rollen, en chunk som bär varje verktygsamtal med dess index, id, namn och argument och slutpunkten.
Svaret är 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 en begäran
Modeller med capabilities.vision kan läsa bilder. Lägg till en image_url
del till ett användarmeddelande, med antingen en publik https:// Länk eller a
data:image/…;base64, URL. Upp till 20 bilder per begäran SVG bilder nekas, och så är en länk över 4 096 tecken eller en med ett användarnamn eller lösenord i den (400 invalid_image_url) ett valfritt detail är
auto, low eller high.
med nymbot/autoEn begäran med en bild i den omdirigeras till en standardmodell som kan ses. capabilities.vision Avvisa bilder med
400 unsupported_contentEn länk måste peka på en offentlig värd; Nymbot skickar bilden till modellens leverantör och behåller den inte.
En bild debiteras som de input tokens leverantören räknar för det, som resten av begäran.
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);
Förnuft
Modeller med capabilities.reasoning kan tänka innan de svarar. be om mer eller mindre av det med reasoning_effort ("minimal", "low",
"medium" eller "high") eller "reasoning": {"effort": "high"}eller lägga till :thinking till modellnamnet, vilket betyder hög ansträngning. På en modell utan resonemang ignoreras inställningen. nymbot/auto, :thinking skickar begäran till standardvägledningen.
På Anthropic-modeller blir ansträngningen en tänkande budget på cirka 1 000, 2 000, 8 000 eller 16 000 tokens, aldrig mer än max_tokens tillåter. tänkandet lämnas av när
tool_choice tvingar ett verktyg, och när begäran fortsätter ett verktygslopp (det sista meddelandet är ett verktygsresultat), eftersom Anthropic behöver det tidigare signerade tänkandet för att återuppta det.
Resonemanget kommer tillbaka i message.reasoning_contenteller
delta.reasoning_content när strömma, aldrig blandas i svaret. Rationering är utgång och laddas som sådan, inuti completion_tokensVissa leverantörer returnerar inte resonemangstexten alls, och den debiteras fortfarande.
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);
Typ av suffix
Ett tillägg på modellnamnet ändrar hur begäran hanteras, utan ett annat fält. De fungerar på fullständiga ids och korta namn lika, som i anthropic/claude-sonnet-5:online.
| tillräckligt | Effekt |
|---|---|
:online | Sök på webben först, som plugins: [{"id": "web"}]och se Webbsökning. |
:thinking | Högt resonemang; på nymbot/autoPå en modell som inte kan förneka, 400 model_not_found med “no endpoints found”. |
:nitro, :floor, :exacto, :extended | Varje katalogmodell har en väg, så det finns ingen snabbare, billigare eller längre att välja; efterföljarna är tillåtna så att modellnamn kopierade från andra tjänster fortfarande fungerar. |
Alla andra efterföljare ignoreras. Hela namnet prövas först, så en modell vars id verkligen innehåller en kolon fungerar fortfarande; om inte, efterföljare tas bort från änden en i taget tills en modell matchar. 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);
Webbsökning
Nymbot söker efter det senaste användarmeddelandet (sitt första 2000 tecken), läser de bästa sidorna och ger dem till modellen med frågan, märkt som yttre innehåll som modellen inte ska ta instruktioner från.
- Alltid söka:
"plugins": [{"id": "web", "max_results": 5}]eller a:onlinetillräckligt på modellen. - Sök när det hjälper:
"tools": [{"type": "web_search", "parameters": {"max_results": 5}}]Även accepterat somweb_search_previewelleropenrouter:web_searchNymbot söker bara när frågan verkar behöva aktuell information, samma test som appen använder.
max_results är 5 som standard och högst 10. källorna återkommer i
nymbot.web_search.sourcesVar och en med en title, snippet och
urloch som url_citation anteckningar på meddelandet.
Varje sökning som kör kostar $ 0,008, omvandlas till sats, på toppen av tokens, och det är en del av hållet.Sidorna det läser är input tokens också, så ett svar från webben kostar mer än samma fråga kallt, ibland flera gånger mer.
Svaret är 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 från API
OpenAI:s nyare format, som används av OpenAI Agents SDK och av Codex. Det körs på samma modeller, fakturering och funktioner som Chat Completions.
POST https://nymbot.ai/api/v1/responses Behöver en API nyckel.
| fältet | Typ av | nödvändigt | Beskrivning |
|---|---|---|---|
model | Strängar | Ja | Som för Chat kompletterarInkluderar även suffix. |
input | String eller array | Ja | En sträng, eller en lista över objekt: meddelanden (roller user, assistant, system, developer) med input_text, input_image och output_text delar, och function_call och function_call_output föremål för verktyg. input_image tar en image_url länk eller data URL, inte en fil-id. reasoning och web_search_call Föremålen är borttappade; item_reference är vägrat . |
instructions | Strängar | Nej | Systemets instruktioner . |
max_output_tokens | integer | Nej | De flesta tokens att skriva. |
temperaturetop_p | Antalet | Nej | Sampling kontroller, där modellen tar dem. |
toolstool_choiceparallel_tool_calls | array, sträng eller objekt, boolean | Nej | Funktionsverktyg, i form av Svar ({"type": "function", "name": …, "parameters": …}) a web_search eller web_search_preview Verktyget vänder sig Webbsökning när det hjälper. Andra inbyggda verktyg nekas. |
reasoning | Objektet | Nej | {"effort": "minimal" | "low" | "medium" | "high"}. xhigh och max betyder high; none Vänd den av. |
text.formatresponse_format | Objektet | Nej | strukturerad utgång, som ett JSON-schema eller json_object. |
metadata | Objektet | Nej | Returneras oförändrad i svaret Vid högst 16 strängvärden, nycklar upp till 64 tecken och värden upp till 512. |
stream | Booleanska | Nej | Stream händelser som beskrivs nedan. |
store | Booleanska | Nej | Ignorerad. Inget lagras, och svaret säger alltid "store": false. |
previous_response_idconversationbackground | String, Objekt och Boolean | Nej | Inte stöds av: 400 unsupported_parameterSvar sparas inte, så skicka hela konversationen till input Varje gång . |
svarar
{
"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 verktygsförfrågan visas i output som a function_call Punkt med
call_id, name och argumentsSkicka tillbaka resultatet som a
function_call_output Punkt med samma call_idRationering, när modellen returnerar den, är en reasoning Punkt med reasoning_text Innehållet listas först. status är incomplete När svaret träffar
max_output_tokens eller avvisade leverantören, med
incomplete_details.reason Sätt två max_output_tokens eller
content_filterSvaret återspeglar också begäran inställningar (temperatur, verktyg, verktygsval och så vidare) som OpenAI gör, och bär den nymbot Kostnad för objekt.
Streamed, varje händelse är en event: linje och a data: linje med a
sequence_numberi denna ordning: response.created,
response.in_progress, response.output_item.added,
response.content_part.addedVarje antal av response.output_text.delta,
response.output_text.done, response.content_part.done,
response.output_item.doneoch slutligen response.completed med användning och kostnad. Ett svar skära kort slut med response.incomplete istället, och ett misslyckande efter att strömmen började med response.failedRationalisera strömmar som sitt eget objekt med response.reasoning_text.delta och .doneVerktygssamtal kommer efter meddelandet, var och en som ett objekt med response.function_call_arguments.delta
och .done.
| statusen | När |
|---|---|
400 | Nej model eller input; previous_response_id, conversation, background eller en item_reference (unsupported_parameter); ett verktyg eller en innehållstyp som inte stöds. |
402, 403, 404, 429, 502, 503 | När det gäller chatt slutför. |
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);
Antropiska budskap
Det fungerar med alla modeller i katalogen, inte bara Claude: begäran översätts, körs genom samma rörledning och översätts tillbaka.
POST https://nymbot.ai/api/v1/messages - behöver en API-nyckel, som x-api-key eller Authorization: Bearer.
den anthropic-version och anthropic-beta Antropiska modellnamn matchas med katalogen, så Claude Code och SDK fungerar med namnen de redan använder:
- Ett namn som katalogen känner till, som
claude-sonnet-5elleranthropic/claude-opus-5Den används som den är. - Ett annat datum (
-20260514),-latestEn version taggad som-v1En bracketed tag som[1m]och enanthropic/elleranthropic.Prefixet tas bort, och prickar och dash i versionen prövas på båda sätt (claude-haiku-4-5Hittarclaude-haiku-4.5). - Om det fortfarande inte matchar något, används familjen (Opus, Sonnet eller Haiku) så länge katalogens version är densamma eller nyare än den som begärts.
- Ett namn som matchar ingenting returnerar
404not_found_error.
| fältet | Typ av | nödvändigt | Beskrivning |
|---|---|---|---|
model | Strängar | Ja | En katalogmodell-id eller ett antropiskt modellnamn. |
max_tokens | integer | Ja | De flesta tokens att skriva. |
messages | Array | Ja | user och assistant vänder, med text, image (base64 eller URL källa) tool_use och tool_result och block. thinking Block från tidigare turer accepteras och släpps. |
system | String eller array | Nej | System prompt, som en sträng eller textblock. |
temperaturetop_p | Antalet | Nej | Sampling kontroller, där modellen tar dem. top_k Accepteras och släpps. |
stop_sequences | Array av strings | Nej | Text som avslutar svaret. Högst 4 strängar, vardera högst 256 tecken. |
toolstool_choice | Array och Object | Nej | Verktyg med name, description och input_schemaoch a web_search Serververktyget är på WebbsökningAnthropics andra inbyggda verktyg (bash, textredigerare, datoranvändning) vägras med unsupported_tool. tool_choice tar auto, any, tool eller noneoch disable_parallel_tool_use. |
thinking | Objektet | Nej | {"type": "enabled", "budget_tokens": 8192}, {"type": "adaptive"} eller {"type": "disabled"}Budgeten väljer en ansträngningsnivå: under 2 048 minimum, från 2 048 låg, från 8 192 medium, från 16 384 hög. output_config.effortEller högt . |
stream | Booleanska | Nej | Stream i Anthropics eventformat. |
metadata | Objektet | Nej | Accepterat och ignorerat. |
svarar
{
"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 även hålla tool_use Blocker och a thinking
Blocket, vars signature är tomt . stop_reason är
end_turn, max_tokens, tool_use eller refusalarbetade på samma sätt som finish_reason är
Chat kompletterar; stop_sequence är alltid
null, även när en stop-sekvens slutade svaret. input_tokens räknas endast färska inmatningar; cachade inmatningar finns i de två cache-fälten.
nymbot Objekt och den X-Nymbot-Cost-Sats och header.
Streamed, händelserna är Anthropics: message_start,
content_block_start, ping, content_block_delta
(text_delta, input_json_delta eller thinking_delta),
content_block_stop, message_delta med den stoppa orsaken, användningen och nymbot kostnaden för objektet och message_stopoch a ping skickas också var 15:e sekund medan modellen är igång. Verktygssamtal anländer efter texten, var och en som en
tool_use block med hela inmatningen i ett input_json_delta.
Fel på den här slutpunkten använder Anthropics format:
{"type": "error", "error": {"type": "not_found_error", "message": "…"}}En kort balans är 402 billing_errorEn överbelastad leverantör
503 overloaded_errorEtt misslyckande efter att strömmen har startat skickas som en error Ett evenemang .
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);
Räkna med tokens
En uppskattning av hur många input tokens en Messages-förfrågan skulle använda, så att en klient kan kontrollera innan den skickar.
POST https://nymbot.ai/api/v1/messages/count_tokens - Behöver en API nyckel. gratis
Kroppen är densamma som för Meddelandenoch utan max_tokens; modellnamnet måste lösa. räkningen är en uppskattning: tecknen i systemmeddelandet, meddelanden, verktygsamtal och verktygsdefinitioner dividerade med fyra, plus 1,600 för varje bild. Det är inte leverantörens egen tokenizer, så det verkliga antalet kan skilja sig.
svarar
{ "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);
Lista över modeller
Varje modell och generator som API accepterar, med vad det kostar.Listan läses från samma levande katalog som appens plocker, så det är alltid vad servern kommer att köra.
GET https://nymbot.ai/api/v1/models Ingen nyckel behövs. Dold i fem minuter.
GET /api/v1/models/{id} Returnerar en ingång.
| fältet | Typ av | nödvändigt | Beskrivning |
|---|---|---|---|
type | sträng (förfrågan) | Nej | chat (Det är en defekt) image, video, audio, embedding eller allFlera kan ges, som image,video. |
Priser är vad du betalar, med avgiften och marginalen redan i, i dollar och i satser till det nuvarande Bitcoin-priset. balance Berätta vilken balans som modellen spenderar.
nymbot_key är modellens korta namn i appen. created är alltid 0, eftersom katalogen inte registrerar när en modell läggs till. En modell utan publicerade tokenpriser prissätts per_request i stället.
nymbot/auto är alltid först, prissatt som variable, med en
routes Det listar vision och resonemang, men inte verktyg.
GET /api/v1/models/{id} accepterar samma namn och alias som en begäran, och returnerar posten för den modell de bestämmer sig för.
svarar
{
"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 andra typerna:
- Bilden Ingångar har
capabilities(accepts_image_url,requires_image_url,edit) och ett prisper_generation. - Videor Ingångar har
max_duration_secondsochresolutionsoch ett prisper_secondför varje resolution. - Lyssna Ingångar har
audio_typespeechellertranscriptionPriset ärper_1k_charsellerper_minute. - Inbäddat Ingångar har
dimensions,context_length,max_inputsoch ett pris per miljon input tokens.
Priser märkta "estimated": true är appens uppskattning för en generator vars pris inte publiceras. type Återvänder 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);