Kennisbank Ontwikkelaars
Chat, reacties en berichten
Drie manieren om een model iets te vragen, in de drie formaten die klanten al spreken, allemaal op dezelfde modellen en op dezelfde manier gefactureerd.
Deze pagina is voor het gemak automatisch vertaald. Het Engelse origineel is de versie die van toepassing is.
Chat voltooien
De OpenAI chat-indeling, en die die bijna elke tool ondersteunt.Stuur het gesprek tot nu toe en ontvang het volgende bericht terug.
POST https://nymbot.ai/api/v1/chat/completions Je hebt een API sleutel nodig.
Alleen model En messages Een bemonsteringsparameter dat het gekozen model niet neemt, wordt zonder een fout gedrukt, dus één verzoek lichaam werkt over modellen. supported_parametersWat wordt geweigerd in plaats van weggelaten is iets wat het model helemaal niet kan doen: foto's voor een model dat niet kan zien, hulpmiddelen voor een model dat ze niet kan bellen.
| Het veld | type | vereist | Beschrijving |
|---|---|---|---|
model | String | Ja | nymbot/auto (of auto) voor de routing van Nymbot op de standaardbalans, of een catalogusmodel-id zoals anthropic/claude-sonnet-5 op de Pro-balans. De korte namen en alias's van de app worden ook geaccepteerd. Genoeg. |
messages | Array | Ja | Het gesprek, de rollen system, developer (behandeld als een systeem) user, assistant En toolContent is een string of een lijst met text En image_url delen; afbeeldingen alleen in gebruikersberichten. input_audio Andere bestandsdelen worden geweigerd. |
stream | Booleaan | niet | Stuur het antwoord zoals het is geschreven. zie Streamen. |
stream_options | Object | niet | {"include_usage": true} voegt een laatste stukje toe met token tellen en de kosten. |
max_tokensmax_completion_tokens | integer | niet | De meeste tokens om te schrijven. Verlaagd tot het maximum van het model als hoger. Ook bepaalt hoeveel wordt gehouden van uw saldo, dus een kleiner aantal heeft minder krediet nodig om te beginnen. |
temperaturetop_p | Aantal | niet | Sampling van controles: temperature van 0 tot 2, top_p van 0 tot 1. |
stop | String of Array | niet | Tekst die het antwoord eindigt: een string of maximaal 4 strings, elk maximaal 256 tekens. nymbot/auto. |
seed | integer | niet | Voor herhaalde sampling, waar het model het ondersteunt. |
presence_penaltyfrequency_penalty | Aantal | niet | Herhaling controles, elk van -2 tot 2. |
response_format | Object | niet | {"type": "json_object"} of {"type": "json_schema", "json_schema": {…}}, waar het model het ondersteunt. Niet gebruikt door nymbot/auto. |
toolstool_choiceparallel_tool_calls | Array, string of object, booleaan | niet | Functie bellen. zie Tool bellen. a web_search Tool draait op Web zoekenOp maximaal 128 tools en 512 KB van definities, ingebed op maximaal 64 niveaus diep; meer is een 400. |
reasoning_effortreasoning | String, voorwerp | niet | "minimal", "low", "medium" of "high", of {"effort": "high"}. "none" of {"enabled": false} Zet het uit. zie redeneren. |
plugins | Array | niet | [{"id": "web", "max_results": 5}] Zoek altijd eerst op het web. Tot 10 resultaten. |
n | integer | niet | Alleen 1 - Alles anders keert terug 400. |
logit_biasusermetadata | Object, String en Object | niet | Geaccepteerd en niet verzonden. logit_bias kaarten met maximaal 300 token-id's naar getallen van -100 tot 100; user maximaal 256 tekens; metadata bevat maximaal 16 stringwaarden, sleutels tot 64 tekens en waarden tot 512. |
Het antwoord is gewoon chat.completionMet de kosten in usage.cost
(in dollars) en in de nymbot het object. model is de opgeloste model id, dus een korte naam komt terug als de volledige. message.reasoning_contentgescheiden van het antwoord.
Reactie
{
"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 is opgebouwd uit wat terugkwam, aangezien providers het anders melden: tool_calls Wanneer het model om gereedschappen vraagt, length wanneer het antwoord elke toegestane token gebruikte (of het model ze allemaal doorbracht met redeneren en geen antwoord schreef), content_filter wanneer de leverancier weigert, en stop
Anders wel. usage.completion_tokens_details.reasoning_tokens is altijd 0: verborgen redenering tokens worden geteld, en geladen, in completion_tokens.
| Status | Wanneer |
|---|---|
400 | niet model of messages (missing_required_parameter); een audio- of bestanddeel, of afbeeldingen voor een model dat ze niet kan zien (unsupported_contentmeer dan 20 foto's (too_many_images); een bemonsteringsparameter van het verkeerde type of buiten bereik (invalid_value); een foto-link die niet openbaar is (invalid_image_url); hulpmiddelen op een model dat ze niet kan noemen (unsupported_tool); n anders dan 1; a :thinking een model dat niet kan redeneren (model_not_found); of de leverancier het verzoek heeft geweigerd (upstream_rejected). |
402 | Het saldo dat het model besteedt, kan de holding niet dekken. |
403 | Het slechtste geval past niet bij de hoes van de sleutel (key_limit_reached• lager max_tokens Of het kapje opheffen. |
404 | Geen model met deze naam (model_not_found). |
429 | De tarieflimiet van de sleutel, of de tarieflimiet van de provider (upstream_rate_limited). |
502, 503 | De leverancier mislukt (upstream_error) of is overbelast (upstream_overloaded, met Retry-AfterEr wordt niets in rekening gebracht tenzij de provider heeft gefactureerd voor de poging. |
De statuscodes van elke endpoint-aandelen worden vermeld onder Fouten.
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);
Streamen
met "stream": true het antwoord komt als server verzonden gebeurtenissen terwijl het model het schrijft. chat.completion.chunk is een data: lijn, en de stroom eindigt met data: [DONE]De redenering komt in
delta.reasoning_contentHet antwoord in delta.content.
Stream iets dat meer dan ongeveer 100 seconden kan duren, zoals een lang antwoord, een groot
max_tokens Een verzoek dat niet wordt gestreamd, stuurt niets totdat het antwoord is voltooid, en het netwerk tussen u en Nymbot kan na ongeveer 100 seconden een lege verbinding sluiten; het model eindigt nog steeds en wat het heeft geschreven wordt geladen, maar het antwoord is verloren.
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]
- Lijnen die beginnen met
:Beoordelingen worden elke 15 seconden verzonden terwijl het model denkt. - Vraag voor
"stream_options": {"include_usage": true}om het laatste stukje boven te krijgen, met een legechoices, de token telt, de kosten en denymbothet object. - Als u de verbinding vroegtijdig sluit, wordt het model niet gestopt: Nymbot leest de rest van de stream van de provider, gedurende maximaal 25 seconden, om het token getal te krijgen, en u betaalt wat de provider rapporteert.
- Een fout voor het eerste stuk, zoals
401of402, komt terug als gewone JSON met zijn statuscode, niet als een stream.data: {"error": {…}}gebeurtenis, en de stroom eindigt zonder[DONE]. - Verzoeken met tools, en modellen op OpenAI's Responses transport, stromen niet van de provider. ze beantwoorden nog steeds met een geldige stream, verzonden zodra het antwoord is voltooid.
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);
}
Tool bellen
Beschrijf functies in tools en het model kan vragen om iemand te bellen in plaats van te antwoorden.U voert de functie uit en voegt het resultaat toe als een tool Boodschap met hetzelfde
tool_call_idNymbot voert nooit uw functies uit; het stuurt het verzoek van het model terug naar u.
tool_choice neemt "auto", "none",
"required" of {"type": "function", "function": {"name": "…"}}De modellijst markeert welke modellen gereedschappen kunnen bellen (capabilities.toolsTools worden geweigerd met 400 unsupported_tool zijn nymbot/auto en op de weinige catalogusmodellen die worden uitgevoerd op OpenAI's Responses transport, waar Nymbot geen hulpmiddelen kan doorgeven.
met "stream": true, een verzoek met hulpmiddelen loopt in één stuk en wordt vervolgens verzonden als een normale chunk-sequentie: de rol, een chunk met elke tool-oproep met zijn index, id, naam en argumenten en de finish-chunk.
De reactie, gedeeltelijk
"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);
Foto's in een verzoek
Modellen met capabilities.vision kan afbeeldingen lezen. voeg een image_url
deel aan een gebruikersbericht, met een publiek https:// Link of een
data:image/…;base64, URL. Tot 20 afbeeldingen per verzoek. SVG-afbeeldingen worden geweigerd, en dus is er een link van meer dan 4.096 tekens of een met een gebruikersnaam of wachtwoord in het (400 invalid_image_urlEen optioneel detail is
auto, low of high.
met nymbot/auto, een verzoek met een afbeelding erin wordt geruiteerd naar een standaardmodel dat kan zien. capabilities.vision Afwijzen van foto's met
400 unsupported_contentEen link moet wijzen op een publieke host; Nymbot geeft de afbeelding door aan de provider van het model en bewaart deze niet.
Een afbeelding wordt in rekening gebracht als de input tokens die de provider ervoor telt, net als de rest van de aanvraag.
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);
redeneren
Modellen met capabilities.reasoning kan nadenken voordat ze antwoorden. vraag om meer of minder van het met reasoning_effort ("minimal", "low",
"medium" of "high") of "reasoning": {"effort": "high"}of toevoegen :thinking naar de modelnaam, wat betekent hoge inspanning. Op een model zonder redenering wordt de instelling genegeerd. nymbot/auto, :thinking stuurt het verzoek naar de standaard redeneringsroute.
Op Anthropic-modellen wordt de inspanning een denkbudget van ongeveer 1.000, 2.000, 8.000 of 16.000 tokens, nooit meer dan max_tokens Het denken is weggelaten wanneer
tool_choice dwingt een tool, en wanneer de verzoek een toolloop voortzet (zijn laatste bericht is een toolresultaat), omdat Anthropic het eerder ondertekende denken nodig heeft om het te hervatten.
De redenering komt terug in message.reasoning_content, of
delta.reasoning_content bij streaming, nooit gemengd in het antwoord. redenering is output en wordt als zodanig in rekening gebracht, binnen completion_tokensSommige aanbieders retourneren de redeneringstekst helemaal niet en het wordt nog steeds in rekening gebracht.
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);
Het model suffixes
Een voorvoegsel op de modelnaam verandert de manier waarop de aanvraag wordt behandeld, zonder een ander veld. anthropic/claude-sonnet-5:online.
| Genoeg | Effect |
|---|---|
:online | Zoekt u eerst op het web, zoals plugins: [{"id": "web"}]Zie Web zoeken. |
:thinking | Hoge redenering inspanning; op nymbot/autoop een model dat geen reden kan geven, 400 model_not_found met “ geen eindpunten gevonden”. |
:nitro, :floor, :exacto, :extended | Elk catalogusmodel heeft één route, dus er is geen snellere, goedkopere of langere route te kiezen; de volgen zijn toegestaan, zodat modelnamen die zijn gekopieerd van andere diensten nog steeds werken. |
De volledige naam wordt eerst geprobeerd, dus een model waarvan de id werkelijk een colon bevat, werkt nog steeds; als dat niet het geval is, worden de suffixes één op een keer van het einde verwijderd totdat een model overeenkomt. 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 zoeken
Nymbot zoekt naar het laatste gebruikersbericht (zijn eerste 2.000 tekens), leest de beste pagina's en geeft ze aan het model met de vraag, gemarkeerd als externe inhoud waarvan het model geen instructies mag nemen.
- Altijd zoeken:
"plugins": [{"id": "web", "max_results": 5}], of een:onlinesuffix op het model. - Zoek wanneer het helpt:
"tools": [{"type": "web_search", "parameters": {"max_results": 5}}]Ook geaccepteerd alsweb_search_previewofopenrouter:web_searchNymbot zoekt alleen wanneer de vraag lijkt te hebben behoefte aan actuele informatie, dezelfde test die de app gebruikt.
max_results is 5 standaard en maximaal 10. de bronnen komen terug in
nymbot.web_search.sourcesIeder met een title, snippet En
urlEn als url_citation aantekeningen op de boodschap.
Elke zoekopdracht die loopt kost $ 0,008, omgezet in sats, bovenaan de tokens, en het is onderdeel van de hold.De pagina's die het leest zijn input tokens ook, dus een antwoord van het web kost meer dan dezelfde vraag vroeg koud, soms meerdere malen meer.
De reactie, gedeeltelijk
"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);
Reacties op API
OpenAI's nieuwere formaat, gebruikt door de OpenAI Agents SDK en door Codex. Het draait op dezelfde modellen, facturering en functies als Chat Completions.
POST https://nymbot.ai/api/v1/responses Je hebt een API sleutel nodig.
| Het veld | type | vereist | Beschrijving |
|---|---|---|---|
model | String | Ja | als voor Chat voltooienDe suffixes zijn inbegrepen. |
input | String of Array | Ja | Een string, of een lijst met items: berichten (rollen user, assistant, system, developer) met input_text, input_image En output_text onderdelen, en function_call En function_call_output items voor gereedschappen. input_image Neem een image_url een link of data-URL, geen bestandsid. reasoning En web_search_call items worden gesleept; item_reference wordt geweigerd |
instructions | String | niet | Instructies van het systeem. |
max_output_tokens | integer | niet | De meeste tokens om te schrijven. |
temperaturetop_p | Aantal | niet | Sampling controles, waar het model ze neemt. |
toolstool_choiceparallel_tool_calls | Array, string of object, booleaan | niet | Functionele hulpmiddelen, in de vorm van Antwoorden ({"type": "function", "name": …, "parameters": …}) a web_search of web_search_preview Tool draait op Web zoeken Wanneer het helpt, worden andere ingebouwde tools geweigerd. |
reasoning | Object | niet | {"effort": "minimal" | "low" | "medium" | "high"}. xhigh En max betekent high; none Draai het uit. |
text.formatresponse_format | Object | niet | gestructureerde output, zoals een JSON-schema of json_object. |
metadata | Object | niet | Bij maximaal 16 stringwaarden, sleutels tot 64 tekens en waarden tot 512. |
stream | Booleaan | niet | Stream evenementen zoals hieronder beschreven. |
store | Booleaan | niet | Niets wordt opgeslagen, en het antwoord zegt altijd: "store": false. |
previous_response_idconversationbackground | String, object en booleaan | niet | Niet ondersteund : 400 unsupported_parameterAntwoorden worden niet opgeslagen, dus stuur het hele gesprek naar input Elke keer |
Reactie
{
"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 }
}
Een toolverzoek verschijnt in output als a function_call Punt met
call_id, name En argumentsStuur het resultaat terug als a
function_call_output Punt met hetzelfde call_idReasoning, wanneer het model het retourneert, is een reasoning Punt met reasoning_text Inhoud, eerst opgenomen status is incomplete Wanneer het antwoord slaat
max_output_tokens De leverancier weigerde, met
incomplete_details.reason Zet twee max_output_tokens of
content_filterHet antwoord weerspiegelt ook de instellingen van de aanvraag (temperatuur, gereedschappen, gereedschapskeuze enzovoort) zoals OpenAI doet, en draagt de nymbot kost het object.
Streamed, elk evenement is een event: Lijn en a data: Lijn met a
sequence_numberIn deze volgorde: response.created,
response.in_progress, response.output_item.added,
response.content_part.addedEen ieder aantal van response.output_text.delta,
response.output_text.done, response.content_part.done,
response.output_item.doneEn ten slotte response.completed met het gebruik en de kosten. een antwoord kort eindigt met response.incomplete plaats, en een mislukking nadat de stroom begon met response.failedReasoning streams als zijn eigen item met response.reasoning_text.delta En .doneTool-oproepen komen na het bericht, elk als een item met response.function_call_arguments.delta
En .done.
| Status | Wanneer |
|---|---|
400 | niet model of input; previous_response_id, conversation, background Of een item_reference (unsupported_parameterEen niet-ondersteunde tool of inhoudstype. |
402, 403, 404, 429, 502, 503 | Wat betreft de chat voltooien. |
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);
Antropische boodschappen
Het formaat van Anthropic, voor de Anthropic SDK's en Claude Code. Het werkt met elk model in de catalogus, niet alleen Claude: de aanvraag wordt vertaald, door dezelfde pijplijn uitgevoerd en terug vertaald.
POST https://nymbot.ai/api/v1/messages - een API-sleutel nodig heeft, zoals x-api-key of Authorization: Bearer.
De anthropic-version En anthropic-beta Antropische modelnamen worden gekoppeld aan de catalogus, dus Claude Code en de SDK's werken met de namen die ze al gebruiken:
- Een naam die de catalogus kent, zoals
claude-sonnet-5ofanthropic/claude-opus-5Het wordt gebruikt zoals het is. - Een andere datum (
-20260514),-latestEen versie zoals-v1Een bracketed tag zoals[1m]en eenanthropic/ofanthropic.voorvoegsel worden verwijderd, en punten en dashes in de versie worden op beide manieren geprobeerd (claude-haiku-4-5vindenclaude-haiku-4.5). - Als dat nog steeds niet overeenkomt, wordt de familie (Opus, Sonnet of Haiku) gebruikt, zolang de versie van de catalogus dezelfde of nieuwere is dan de gevraagde versie.
- Een naam die niets bij elkaar past, keert terug
404not_found_error.
| Het veld | type | vereist | Beschrijving |
|---|---|---|---|
model | String | Ja | Een catalogus model id, of een Anthropic model naam. |
max_tokens | integer | Ja | De meeste tokens om te schrijven. |
messages | Array | Ja | user En assistant Draaien, met text, image (base64 of URL bron) tool_use En tool_result De blokken. thinking Blokken uit eerdere rondes worden geaccepteerd en weggelaten. |
system | String of Array | niet | Systeem prompt, als een string of tekstblokken. |
temperaturetop_p | Aantal | niet | Sampling controles, waar het model ze neemt. top_k wordt geaccepteerd en weggelaten. |
stop_sequences | Array van Strings | niet | Tekst die het antwoord beëindigt. maximaal 4 strings, elk maximaal 256 tekens. |
toolstool_choice | Array, voorwerp | niet | Tools met name, description En input_schema. a web_search Server Tool draait op Web zoekenAndere ingebouwde hulpmiddelen van Anthropic (bash, teksteditor, computergebruik) worden geweigerd met unsupported_tool. tool_choice neemt auto, any, tool of noneen disable_parallel_tool_use. |
thinking | Object | niet | {"type": "enabled", "budget_tokens": 8192}, {"type": "adaptive"} of {"type": "disabled"}Het budget kiest een inspanningsniveau: onder 2.048 minimum, van 2.048 laag, van 8.192 medium, van 16.384 hoog. output_config.effortOf wel hoog. |
stream | Booleaan | niet | Stream in het eventformaat van Anthropic. |
metadata | Object | niet | Geaccepteerd en genegeerd. |
Reactie
{
"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 ook vasthouden tool_use Blokken en een thinking
Blok, van wie signature Het is leeg. stop_reason is
end_turn, max_tokens, tool_use of refusalHij werkte op dezelfde manier als finish_reason zijn
Chat voltooien; stop_sequence is altijd
null, zelfs als een stopreeks het antwoord beëindigde. input_tokens telt alleen verse invoer; de cache-invoer bevindt zich in de twee cache-velden.
nymbot Object en de X-Nymbot-Cost-Sats De header.
Streamed, de evenementen zijn Anthropic's: message_start,
content_block_start, ping, content_block_delta
(text_delta, input_json_delta of thinking_delta),
content_block_stop, message_delta met de stop reden, het gebruik en de nymbot kosten van het object, en message_stop. a ping wordt ook elke 15 seconden verzonden terwijl het model werkt. Tool-oproepen komen na de tekst, elk als een
tool_use blok met zijn hele input in één input_json_delta.
Fouten op dit eindpunt gebruiken het formaat van Anthropic:
{"type": "error", "error": {"type": "not_found_error", "message": "…"}}Een korte balans is 402 billing_errorEen overbelaste provider
503 overloaded_errorEen storing nadat de stream is gestart, wordt verzonden als een error Het evenement.
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);
Token tellen
Een schatting van hoeveel input tokens een Messages-verzoek zou gebruiken, zodat een client kan checken voordat het verzendt.
POST https://nymbot.ai/api/v1/messages/count_tokens Je hebt een API sleutel nodig. gratis.
Het lichaam is hetzelfde als BoodschappenZonder max_tokens; de naam van het model moet worden opgelost. Het tellen is een schatting: de tekens van het systeem prompt, berichten, hulpprogramma's en tooldefinities verdeeld door vier, plus 1600 voor elke afbeelding. Het is niet de eigen tokenizer van de provider, dus het werkelijke aantal kan verschillen.
Reactie
{ "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);
Lijst van modellen
Elke model en generator die de API accepteert, met wat het kost. De lijst wordt gelezen uit dezelfde live catalogus als de picker van de app, dus het is altijd wat de server zal draaien.
GET https://nymbot.ai/api/v1/models — geen sleutel nodig. Verborgen voor vijf minuten.
GET /api/v1/models/{id} 1 ingang teruggeven.
| Het veld | type | vereist | Beschrijving |
|---|---|---|---|
type | De string (query) | niet | chat (Het is een defect) image, video, audio, embedding of allSommige kunnen worden gegeven, zoals image,video. |
Prijzen zijn wat je betaalt, met de vergoeding en marge al in, in dollars en in sats bij de huidige Bitcoin-prijs. balance Dit geeft aan welke balans het model besteedt.
nymbot_key is de korte naam van het model in de app. created is altijd 0, omdat de catalogus niet registreert wanneer een model is toegevoegd. per_request in plaats van.
nymbot/auto is altijd eerst, geprijsd als variable, met een
routes Een lijst die de tarieven van elke standaardroute geeft, bevat visie en redenering, maar geen hulpmiddelen.
GET /api/v1/models/{id} accepteert dezelfde namen en alias's als een verzoek, en retourneert de invoer voor het model dat ze besluiten.
Reactie
{
"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 andere types:
- afbeelding De ingangen hebben
capabilities(accepts_image_url,requires_image_url,edit) en een prijsper_generation. - Video’s De ingangen hebben
max_duration_secondsEnresolutionsEn een prijsper_secondVoor elke resolutie. - Audio De ingangen hebben
audio_typespeechoftranscriptionPrijzenper_1k_charsofper_minute. - ingebouwd De ingangen hebben
dimensions,context_length,max_inputsEn een prijs per miljoen input tokens.
Prijzen gemarkeerd "estimated": true is de schatting van de app voor een generator waarvan de prijs niet wordt gepubliceerd. type terugkeren 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);