Kennisbasis Ontwikkelaar
Chat, antwoorde en boodskappe
Drie maniere om 'n model iets te vra, in die drie formate kliënte reeds praat, almal op dieselfde modelle en op dieselfde manier gefactureer.
Hierdie bladsy is gerieflikheidshalwe masjienvertaal. Die Engelse oorspronklike is die weergawe wat van toepassing is.
Chat voltooiing
Die OpenAI chat formaat, en die een wat byna elke instrument ondersteun. Stuur die gesprek tot dusver en kry die volgende boodskap terug.
POST https://nymbot.ai/api/v1/chat/completions Jy het 'n API sleutel nodig.
slegs model en messages 'N bemonsteringsparameter wat die gekose model nie neem nie, word sonder 'n fout neergelê, so 'n versoek lichaam werk oor modelle. supported_parametersWat geweier word in plaas van weggegooi word, is iets wat die model nie kan doen nie: foto's vir 'n model wat nie kan sien nie, gereedskap vir 'n model wat hulle nie kan bel nie.
| Die veld | Die tipe | vereis | Beskrywing |
|---|---|---|---|
model | String | Ja | nymbot/auto (en die auto) vir Nymbot se routing op die standaardbalans, of 'n katalogusmodel-id soos anthropic/claude-sonnet-5 op die Pro-balans. Die app se kort name en alias word ook aanvaar. Genoeg. |
messages | die array | Ja | Die gesprekke. rolle system, developer (Hierdie word as 'n stelsel behandel) user, assistant en toolInhoud is 'n string of 'n lys van text en image_url dele; beelde slegs in gebruikersboodskappe. input_audio Die bestanddele word verwerp. |
stream | Booleaan | nie | Stuur die antwoord soos dit geskryf is. Die streaming. |
stream_options | Die voorwerp | nie | {"include_usage": true} voeg 'n finale stuk met token getalle en die koste. |
max_tokensmax_completion_tokens | Integraal | nie | Die meeste tokens om te skryf. Verlaag na die maksimum van die model as hoër. Dit stel ook hoeveel van jou balans gehou word, sodat 'n kleiner aantal minder krediet nodig het om te begin. |
temperaturetop_p | Die nommer | nie | Kontrole van sampling: temperature van 0 tot 2, top_p van 0 tot 1. |
stop | String of Array | nie | Tekst wat die antwoord eindig: 'n reeks of ten hoogste 4 reeks, elkeen ten hoogste 256 karakters. nymbot/auto. |
seed | Integraal | nie | Vir herhaalbare sampling, waar die model dit ondersteun. |
presence_penaltyfrequency_penalty | Die nommer | nie | Herhalingsbeheer, elkeen van -2 tot 2. |
response_format | Die voorwerp | nie | {"type": "json_object"} of {"type": "json_schema", "json_schema": {…}}waar die model dit ondersteun. nie gebruik word deur nymbot/auto. |
toolstool_choiceparallel_tool_calls | array, string of voorwerp, booleaan | nie | Die funksie van die oproep. sien Tool oproepe· a web_search Die gereedskap word Web soekOp die meeste 128 gereedskap en 512 KB van definisies, ingebed by die meeste 64 vlakke diep; meer is 'n 400. |
reasoning_effortreasoning | String, die voorwerp | nie | "minimal", "low", "medium" of "high"of {"effort": "high"}. "none" of {"enabled": false} Sluit dit af. sien Redensies. |
plugins | die array | nie | [{"id": "web", "max_results": 5}] soek altyd die web eerste. Tot 10 resultate. |
n | Integraal | nie | 1 Alles wat terugkom 400. |
logit_biasusermetadata | String, String en Object | nie | Aanvaar en nie gestuur nie. logit_bias kaarte met nie meer as 300 token-id's tot getalle van -100 tot 100; user Dit is 'n maksimum van 256 karakters. metadata hou tot 16 string waardes, sleutels tot 64 karakters en waardes tot 512. |
Die antwoord is gewoonlik chat.completionMet die koste in usage.cost
(In dollars) en in die nymbot die voorwerp. model is die opgeloste model id, so 'n kort naam kom terug as die volle een. message.reasoning_contentafsonderlik van die antwoord.
Reaksies
{
"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 wat teruggekom het, aangesien verskaffers dit anders rapporteer: tool_calls Wanneer die model vir gereedskap gevra het, length wanneer die antwoord elke toelaatbare token gebruik het (of die model hulle almal oorweeg en geen antwoord geskryf het), content_filter wanneer die verskaffer geweier het, en stop
Anders so. usage.completion_tokens_details.reasoning_tokens is altyd 0: verborge rede tokens word getel, en in rekening geneem, in completion_tokens.
| Status | Wanneer |
|---|---|
400 | nie model of messages (missing_required_parameter); 'n klank- of lêerdeel, of beelde vir 'n model wat dit nie kan sien nie (unsupported_contentmeer as 20 foto's (too_many_images); 'n steekproefparameter van die verkeerde tipe of uit die bereik (invalid_value); 'n foto skakel wat nie openbaar is nie (invalid_image_url); gereedskap op 'n model wat hulle nie kan noem nie (unsupported_tool); n anders as 1; a :thinking 'n Model wat geen rede kan gee nie (model_not_found(of die verskaffer die versoek geweier het)upstream_rejected). |
402 | Die saldo wat die model spandeer, kan nie die hold dek nie. |
403 | In die ergste geval pas die sleutelkap nie (key_limit_reached· Laer max_tokens Of verhoog die kop. |
404 | Geen model met hierdie naam (model_not_found). |
429 | die aankoop van die produk, of die gebruik van die produk (upstream_rate_limited). |
502, 503 | Die verskaffer het misluk (upstream_error(Of dit is oorbelast)upstream_overloaded, met Retry-AfterNiks word in rekening gestel tenzij die verskaffer vir die poging in rekening gestel het nie. |
Die statuscodes van elke eindpunt-aandeel word opgelys onder Die foute.
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
met "stream": true die antwoord kom as server-gestuurde gebeure terwyl die model dit skryf. chat.completion.chunk Die a data: die lyn, en die stroom eindig met data: [DONE]Die rede kom in
delta.reasoning_contentDie antwoord in delta.content.
Stream iets wat meer as ongeveer 100 sekondes kan neem, soos 'n lang antwoord, 'n groot
max_tokens 'N Verzoek wat nie gestream word nie, stuur niks totdat die antwoord voltooi is nie, en die netwerk tussen jou en Nymbot kan na ongeveer 100 sekondes 'n leegverbinding sluit; die model eindig nog en wat dit geskryf het, word geladen, maar die antwoord is verlore.
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]
- Lines wat begin met
:is hou-lewe kommentaar, gestuur elke 15 sekondes terwyl die model dink. - Vra vir
"stream_options": {"include_usage": true}om die laaste stuk hierbo te kry, met 'n leëchoices, die token tel, die koste en dienymbotdie voorwerp. - As jy die verbinding vroeër sluit, word die model nie gestop nie: Nymbot lees die res van die verskaffer se stroom, vir tot 25 sekondes, om sy token telling te kry, en jy betaal wat die verskaffer rapporteer.
- 'N Fout voor die eerste stuk, soos
401of402, kom terug as gewone JSON met sy status kode, nie as 'n stroom nie. 'n Fout nadat die stroom begin het, kom as 'n laastedata: {"error": {…}}gebeur, en die stroom eindig sonder[DONE]. - Vrae met gereedskap, en modelle op OpenAI se Antwoorde vervoer, vloei nie van die verskaffer nie.
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 oproepe
Beskryf die funksies in tools en die model kan vra vir een om geroep te word in plaas van om te antwoord. Jy voer die funksie uit, voeg sy resultaat by as 'n tool Boodskap met dieselfde
tool_call_idNymbot voer nooit jou funksies uit nie; dit stuur die model se versoek terug na jou.
tool_choice neem "auto", "none",
"required" of {"type": "function", "function": {"name": "…"}}Die model lys teken wat modelle kan roep gereedskap (capabilities.toolsDie gereedskap word verwerp met 400 unsupported_tool die nymbot/auto en op die paar katalogumodelle wat op OpenAI se Responses-vervoer hardloop, wat Nymbot nie gereedskap kan oordra nie.
met "stream": true, 'n versoek met gereedskap loop in een stuk en word dan as 'n normale stukke volgorde gestuur: die rol, een stuk wat elke gereedskapoproep met sy indeks, id, naam en argumente dra, en die eindstuk.
Die antwoord, gedeeltelik
"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 'n versoek
Modelle met capabilities.vision kan lees foto's. Voeg 'n image_url
deel aan 'n gebruikersboodskap, met 'n publiek https:// Link of 'n
data:image/…;base64, URL. Tot 20 foto's per versoek. SVG-foto's word verwerp, en so is 'n skakel oor 4.096 karakters of een met 'n gebruikersnaam of wagwoord daarin (400 invalid_image_urlEen van die optionele detail is
auto, low of high.
met nymbot/auto, 'n versoek met 'n prentjie daarin word geruiteer na 'n standaardmodel wat kan sien. capabilities.vision Weier foto's met
400 unsupported_contentFoto's kan slegs in gebruikersboodskappe wees. 'N skakel moet na 'n openbare gasheer dui; Nymbot stuur die beeld na die model se verskaffer en hou dit nie.
'N Afbeelding word in rekening geneem as die invoer tokens wat die verskaffer daarvoor tel, soos die res van die versoek.
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);
Reaksies
Modelle met capabilities.reasoning kan dink voordat hulle antwoord. vra vir meer of minder daarvan met reasoning_effort ("minimal", "low",
"medium" of "high") of "reasoning": {"effort": "high"}of byvoeg :thinking na die modelnaam, wat beteken hoë inspanning. Op 'n model sonder om te rede, word die instelling geïgnoreer. nymbot/auto, :thinking stuur die versoek na die standaard redeweging pad.
Op Anthropic modelle word die poging 'n denke begroting van ongeveer 1,000, 2,000, 8,000 of 16,000 tokens, nooit meer as max_tokens Die gedagtes word verlaat wanneer
tool_choice dwing 'n instrument, en wanneer die versoek 'n werktuigloop voortduur (sy laaste boodskap is 'n werktuigresultaat), want Anthropic benodig die vroeër ondertekende denke om dit te hervat.
Die rede kom terug in message.reasoning_contentof
delta.reasoning_content wanneer streaming, nooit gemeng in die antwoord nie. Reasoning is output en word as sodanig in rekening geneem, binne completion_tokensSommige verskaffers retourneer nie die redeverklaringsteks nie, en dit word nog steeds in rekening geneem.
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);
Modelleer die suffiks
'N Suffix op die modelnaam verander hoe die versoek hanteer word, sonder 'n ander veld. anthropic/claude-sonnet-5:online.
| Genoeg | effekte |
|---|---|
:online | Soek die web eerste, soos plugins: [{"id": "web"}]Ek sien Web soek. |
:thinking | Hoë verstandige poging; op nymbot/autoop 'n model wat nie kan rede nie, 400 model_not_found met “ geen eindpunte gevind”. |
:nitro, :floor, :exacto, :extended | Elke kataloogmodel het een roete, so daar is geen vinniger, goedkoper of langer een om te kies nie; die gevolgtrekkings is toegelaat sodat model name wat van ander dienste gekopieer word, nog steeds werk. |
Die hele naam word eers probeer, so 'n model wie se id regtig 'n kolon bevat, werk nog steeds; anders word die aanhangsels een op 'n tyd geneem totdat 'n model ooreenstem. 'n modelnaam kan tot 200 karakters lank wees met ten hoogste 4 aanhangsels; 'n langer een word geweier met 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 soek
Nymbot soek na die laaste gebruikersboodskap (sy eerste 2000 karakters), lees die beste bladsye en gee dit aan die model met die vraag, gemerk as buitelandse inhoud waarvan die model nie instruksies moet neem nie.
- Altijd soek:
"plugins": [{"id": "web", "max_results": 5}]of a:onlineVoldoen aan die model. - Soek wanneer dit help:
"tools": [{"type": "web_search", "parameters": {"max_results": 5}}]Ook aanvaar asweb_search_previewofopenrouter:web_searchNymbot soek net wanneer die vraag lyk asof dit huidige inligting benodig, dieselfde toets wat die app gebruik.
max_results is 5 standaard en by maksimum 10. die bronne kom terug in
nymbot.web_search.sourcesElkeen met 'n title, snippet en
urlEn as url_citation aantekeninge op die boodskap.
Elke soektog wat hardloop, kos $ 0,008, omskep na sats, bo die tokens, en dit is deel van die hou. Die bladsye wat dit lees, is input tokens ook, dus 'n antwoord van die web kos meer as dieselfde vraag wat koud gevra is, soms 'n paar keer meer.
Die antwoord, gedeeltelik
"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);
Reaksies op vuur
OpenAI se nuwer formaat, wat deur die OpenAI Agents SDK en deur Codex gebruik word. Dit loop op dieselfde modelle, faktureer en funksies as Chat Completions.
POST https://nymbot.ai/api/v1/responses Jy het 'n API sleutel nodig.
| Die veld | Die tipe | vereis | Beskrywing |
|---|---|---|---|
model | String | Ja | As vir Chat voltooiingDie suffixes is inbegrepen. |
input | String of Array | Ja | 'N string, of 'n lys van items: boodskappe (roles user, assistant, system, developer) met input_text, input_image en output_text dele, en function_call en function_call_output items vir gereedskap. input_image Neem 'n image_url link of data URL, nie 'n lêer id nie. reasoning en web_search_call items word verwyder; item_reference Hy is verwerp. |
instructions | String | nie | Instruksies vir die stelsel. |
max_output_tokens | Integraal | nie | Die meeste tokens om te skryf. |
temperaturetop_p | Die nommer | nie | Sampling beheer, waar die model neem hulle. |
toolstool_choiceparallel_tool_calls | array, string of voorwerp, booleaan | nie | In die vorm van die reaksie ({"type": "function", "name": …, "parameters": …}a) die web_search of web_search_preview Die gereedskap word Web soek wanneer dit help. Ander ingeboude gereedskap word verwerp. |
reasoning | Die voorwerp | nie | {"effort": "minimal" | "low" | "medium" | "high"}. xhigh en max betekenis high; none Draai dit af. |
text.formatresponse_format | Die voorwerp | nie | gestruktureerde uitvoer, as 'n JSON-skema of json_object. |
metadata | Die voorwerp | nie | Teruggekeer onveranderd in die reaksie. By maximaal 16 string waardes, sleutels tot 64 karakters en waardes tot 512. |
stream | Booleaan | nie | Stream gebeurtenisse soos hieronder beskryf. |
store | Booleaan | nie | Niets word gestoor nie, en die antwoord sê altyd "store": false. |
previous_response_idconversationbackground | String, Object en Booleaan | nie | Nie ondersteun nie: 400 unsupported_parameterAntwoorde word nie opgeslagen nie, so stuur die hele gesprek in input Elke keer. |
Reaksies
{
"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 }
}
'N Werktuigverzoek verskyn in output As 'n function_call Die item met
call_id, name en argumentsStuur die resultaat terug as a
function_call_output Artikel met dieselfde call_idReasoning, wanneer die model dit teruggee, is 'n reasoning Die item met reasoning_text Inhoud, die eerste opsomming. status is incomplete Wanneer die antwoord klop
max_output_tokens of die verskaffer geweier het, met
incomplete_details.reason Stel die max_output_tokens of
content_filterDie antwoord weerspieël ook die instellings van die versoek (temperatuur, gereedskap, gereedskapkeuse, ensovoorts) soos OpenAI se doen, en dra die nymbot koste van die voorwerp.
Streamed, elke gebeurtenis is 'n event: Die lyn en a data: Linie met 'n
sequence_numberIn hierdie volgorde: response.created,
response.in_progress, response.output_item.added,
response.content_part.addedEnige aantal van response.output_text.delta,
response.output_text.done, response.content_part.done,
response.output_item.doneEn uiteindelik response.completed met die gebruik en koste. 'n Antwoord kort eindig met response.incomplete in plaas daarvan, en 'n mislukking nadat die stroom begin met response.failedReasoning streams as sy eie item met response.reasoning_text.delta en .doneWerktuigoproepe kom na die boodskap, elkeen as 'n item met response.function_call_arguments.delta
en .done.
| Status | Wanneer |
|---|---|
400 | nie model of input; previous_response_id, conversation, background of 'n item_reference (unsupported_parameter); 'n nie-ondersteunde instrument of inhoudstype. |
402, 403, 404, 429, 502, 503 | Wat oor chat voltooiings. |
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);
Antropiese boodskappe
Anthropic se formaat, vir die Anthropic SDK's en Claude Code. Dit werk met elke model in die katalogus, nie net Claude nie: die versoek word vertaal, deur dieselfde pipeline uitgevoer en terug vertaal.
POST https://nymbot.ai/api/v1/messages — benodig 'n API sleutel, as x-api-key of Authorization: Bearer.
die anthropic-version en anthropic-beta Antropiese model name word saamgestel met die katalogus, so Claude Code en die SDKs werk met die name wat hulle reeds gebruik:
- 'N Naam wat die katalogus ken, soos
claude-sonnet-5ofanthropic/claude-opus-5Dit word gebruik soos dit is. - Die datum van die datum (
-20260514),-latest'n Versie soos die-v1'n Brekkige dag soos[1m]en 'nanthropic/ofanthropic.die voorvoegsel weggeneem word, en punte en dashes in die weergawe word beide maniere probeer (claude-haiku-4-5vindclaude-haiku-4.5). - As dit nog steeds niks ooreenstem nie, word die familie (Opus, Sonnet of Haiku) gebruik, solank die weergawe van die katalogus dieselfde of nuwer is as die een wat gevra is.
- 'N Naam wat niks ooreenstem nie, keer terug
404not_found_error.
| Die veld | Die tipe | vereis | Beskrywing |
|---|---|---|---|
model | String | Ja | 'N katalogus model id, of 'n Antropiese model naam. |
max_tokens | Integraal | Ja | Die meeste tokens om te skryf. |
messages | die array | Ja | user en assistant Stuur, met text, image (Base64 of die URL bron) tool_use en tool_result die blokke. thinking Blokke van vorige beurt word aanvaar en weggegooi. |
system | String of Array | nie | Stelsel prompt, as 'n string of teks blokke. |
temperaturetop_p | Die nommer | nie | Sampling beheer, waar die model neem hulle. top_k Hy word aanvaar en afgeneem. |
stop_sequences | Oor die strings | nie | Tekst wat die antwoord eindig. Maximaal 4 stringe, elk met 'n maksimum van 256 karakters. |
toolstool_choice | Skepper, die voorwerp | nie | gereedskap met name, description en input_schema· a web_search Die server-tool word Web soekAntropic se ander ingeboude gereedskap (bash, teksredakteur, rekenaargebruik) word geweier met unsupported_tool. tool_choice neem auto, any, tool of noneen disable_parallel_tool_use. |
thinking | Die voorwerp | nie | {"type": "enabled", "budget_tokens": 8192}, {"type": "adaptive"} of {"type": "disabled"}Die begroting kies 'n inspanning vlak: onder 2.048 minimum, van 2.048 laag, van 8.192 medium, van 16.384 hoë. output_config.effortOf hoog. |
stream | Booleaan | nie | Stream in die gebeurtenis formaat van Anthropic. |
metadata | Die voorwerp | nie | Aanvaar en ignoreer. |
Reaksies
{
"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 Jy kan ook hou tool_use Blokke en a thinking
Die blok, wat signature Hy is leeg. stop_reason is
end_turn, max_tokens, tool_use of refusalHy werk op dieselfde manier as finish_reason die
Chat voltooiing; stop_sequence Dit is altyd
null, selfs wanneer 'n stop volgorde die antwoord beëindig het. input_tokens slegs vars invoer tel; cached invoer is in die twee cache velde.
nymbot Object en die X-Nymbot-Cost-Sats Die header.
Streamed, die gebeure is Anthropic se: message_start,
content_block_start, ping, content_block_delta
(text_delta, input_json_delta of thinking_delta),
content_block_stop, message_delta met die stop rede, die gebruik en die nymbot die koste van die voorwerp, en message_stop· a ping word ook elke 15 sekondes gestuur terwyl die model werk. gereedskapoproepe kom na die teks, elkeen as 'n
tool_use blok met sy hele invoer in een input_json_delta.
Foute op hierdie eindpunt gebruik die formaat van Anthropic:
{"type": "error", "error": {"type": "not_found_error", "message": "…"}}'N Korte balans is 402 billing_error'N Overtollige verskaffer
503 overloaded_error'N mislukking nadat die stroom begin het, word as 'n error die gebeurtenis.
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);
Teken die tokens
'N Schatting van hoeveel input tokens 'n boodskappeverzoek sal gebruik, sodat 'n kliënt kan kyk voordat dit stuur.
POST https://nymbot.ai/api/v1/messages/count_tokens — benodig 'n API sleutel. gratis
Die liggaam is dieselfde as die boodskappesonder max_tokens; die modelnaam moet oplos. Die telling is 'n raming: die karakters van die stelsel prompt, boodskappe, gereedskap oproepe en gereedskap definisies verdeel deur vier, plus 1,600 vir elke prentjie. Dit is nie die verskaffer se eie tokenizer nie, so die werklike telling kan verskil. 'N sleutel wat sy cap bereik het, kan dit nog steeds gebruik.
Reaksies
{ "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);
Lysteer modelle
Elke model en generator wat die API aanvaar, met wat dit kos. Die lys word gelees uit dieselfde lewendige katalogus as die app se pick, so dit is altyd wat die bediener sal hardloop.
GET https://nymbot.ai/api/v1/models – Geen sleutel nodig nie. Verberg vir vyf minute.
GET /api/v1/models/{id} Terugkeer 1 ingang.
| Die veld | Die tipe | vereis | Beskrywing |
|---|---|---|---|
type | Die vraag (query) | nie | chat die vervalsing, image, video, audio, embedding of allSommige kan aangedui word, soos image,video. |
Pryse is wat jy betaal, met die vergoeding en marge reeds in, in dollars en in sats by die huidige Bitcoin prys. balance Dit sê watter balans die model spandeer.
nymbot_key is die model se kort naam in die app. created is altyd 0, aangesien die katalogus nie registreer wanneer 'n model bygevoeg is nie. per_request in plaas daarvan.
nymbot/auto is altyd eerste, geprijs as variablemet 'n
routes 'N lys wat die tariewe van elke standaardroete gee.Dit lys visie en rede, maar nie gereedskap nie.
GET /api/v1/models/{id} aanvaar dieselfde name en alias's as 'n versoek, en retourneer die inskrywing vir die model wat hulle oplos.
Reaksies
{
"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"
}
]
}
Die ander tipes:
- Die beeld Inkomste het
capabilities(accepts_image_url,requires_image_url,edit(en 'n prysper_generation. - Video’s Inkomste het
max_duration_secondsenresolutionsEn 'n prysper_secondvir elke resolusie. - Die audio Inkomste het
audio_typespeechoftranscriptionDie prysper_1k_charsofper_minute. - Integrasie Inkomste het
dimensions,context_length,max_inputsen 'n prys per miljoen input tokens.
Die markpryse "estimated": true is die app se raming vir 'n generator waarvan die prys nie gepubliseer word nie. type Terugkeer 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);