Base di cunniscenza Sviluppatori
Chat, Risposte è Messaggi
Trè modi per dumandà qualcosa à un mudellu, in i trè furmati chì i clienti parlanu digià, tutti impiegati nantu à i stessi mudelli è fatturati in u stessu modu.
Questa pagina hè tradutta in macchina per comodità. L'uriginale in inglese hè a versione chì si applica.
Completazioni di Chat
U formatu di chat di OpenAI, è quellu chì quasi ogni strumentu supporta. Mandate a cunversazione finu à quì è ricevete u prossimu missaghju tornatu.
POST https://nymbot.ai/api/v1/chat/completions — hà bisognu di una chìave API.
Solamente model è messages sò rìquisi. Un paràmetru di campionamentu chì u mudellu chjuntu ùn pigghia ùn hè buttatu via senza un errore, dunque un solu corpu di dumanda funziona trà i mudelli. A lista di i mudelli dà u di ogni mudellu supported_parametersQuiddu si rifiuta invece di buttà hè tuttu ciò chì u mudellu ùn pò micca fà assolutamente micca: imaghjini per un mudellu chì ùn pò vede micca, strumenti per un mudellu chì ùn pò chiamà micca.
| Campu | Tipu | Necessariu | Descrizzione |
|---|---|---|---|
model | string | Iè | nymbot/auto (o auto) per u rutamentu di Nymbot supra u bilanciu standardu, o un ID di mudellu di catalogu cum'è anthropic/claude-sonnet-5 in u bilanciu Pro. I nomi curti è i nòmini di l'app sò accettati ancu. Pudedanu finisce cù una a suffissu. |
messages | array | Iè | A cunversazione. I ròli system, developer (trattatu cum'è sistema), user, assistant è toolU cuntenutu hè una stringa o una lista di text è image_url parti ; sula immagini in i missaghji di l'utilizatori. input_audio è e parti di u file sò rifiutate. |
stream | bulianu | No | Mandate a risposta cum'è scritta. Vedi streaming. |
stream_options | oggettu | No | {"include_usage": true} aghjunge un pezzu finale cù u conteggiu di i token è u prezzu. |
max_tokensmax_completion_tokens | integru | No | U massimu di token da scrive. Riduttu à u massimu di u mudellu s'ellu hè più altu. Imposta ancu quanta parte hè ritagliata da u vostru saldu, dunque un numeru più piccolu richiede menu creditu per cumincià. |
temperaturetop_p | numeru | No | Controlli di campionamentu: temperature da 0 à 2, top_p da 0 à 1. |
stop | string o array | No | Testu chì ferma a risposta: una stringa o al più 4 stringhe, ognuna al più di 256 caratteri. Micca usatu da nymbot/auto. |
seed | integru | No | Per u campionament ripetevelu, induve u mudellu u supporta. |
presence_penaltyfrequency_penalty | numeru | No | Controlli di ripettiuna, ognunu da -2 à 2. |
response_format | oggettu | No | {"type": "json_object"} o {"type": "json_schema", "json_schema": {…}}, indu u mudellu u sustena. Micca usatu da nymbot/auto. |
toolstool_choiceparallel_tool_calls | array, string o oggettu, bolean | No | Chjamata di funzione. Vede chjamate di strumentu. A web_search l'utensile s'accende ricerca webAl più 128 strumenti è 512 KB di definizioni, nidificate al più à 64 livelli di profondità; di più hè un 400. |
reasoning_effortreasoning | stringhju, oggettu | No | "minimal", "low", "medium" o "high", o {"effort": "high"}. "none" o {"enabled": false} u spegne. Vedi ragunamentu. |
plugins | array | No | [{"id": "web", "max_results": 5}] sempre cerca u web prima. Finà à 10 risultati. |
n | integru | No | Solu 1. Qualcosa altru returns 400. |
logit_biasusermetadata | oggettu, stringa, oggettu | No | Accettatu è micca mandatu avanti. logit_bias mappa u più di 300 id di token à i numeri da -100 à 100; user hè al più 256 caratteri; metadata tene al più 16 valure di stringa, ciaves finu à 64 caratteri è valure finu à 512. |
A risposta hè una ordinaria chat.completion, cù u prezzu in usage.cost
(in dollari) è in u nymbot oggettu. model hè l'ID di u mudellu risoltu,
quindi un nome curtu torna cum'è u pienu. S'ellu hà ragunatu prima di risponde, u so
ragnumentu hè in message.reasoning_content, separatu da a risposta.
Risposta
{
"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 si calcola da ciò chì hè tornatu, sicchì i furnitori u riferiscinu
diversamente: tool_calls quandu u mudellu hà dumandatu i strumenti, length quandu
a risposta hà utilizatu ogni token permessu (o u mudellu hà spèsu tutti i tokens per u ragionamentu è ùn hà micca scrittu
nisuna risposta), content_filter quandu u furnitore hà rifiutatu, è stop
altriamente. usage.completion_tokens_details.reasoning_tokens hè sempre 0: nascostu
i token di ragionamentu sò cuntati, è fatturati, in completion_tokens.
| Statutu | Quandu |
|---|---|
400 | No model o messages (missing_required_parameter); una parte di audio o di file, o di imaghjini per un mudellu chì ùn pò micca vede l' (unsupported_content); più di 20 ritrattu (too_many_images); un paràmetru di campionamentu di u tipu sbagliatu o fora di l'intervallu (invalid_value); un ligame di imaghjina chì ùn hè micca públicu (invalid_image_url); attrezzi nantu à un mudellu chì ùn pò micca chjamà i unsupported_tool); n eccettu 1; a :thinking sufissu nantu à un mudellu chì ùn pò micca ragionà (model_not_found); o u furnitore hà rifiutatu a dumanda (upstream_rejected). |
402 | U saldu chì u mudellu spende ùn pò micca cunvè righjunà u bloccu. |
403 | U casu più peghjore ùn si adatta à a capuzina di a chiave (key_limit_reached). Inferiù max_tokens o aumentà u capu. |
404 | Nessun mudellu cù u nome di quella (model_not_found). |
429 | U limite di velocità di a chiave, o quella di u furnitore (upstream_rate_limited). |
502, 503 | U fornitore hà fallitu (upstream_error) o hè sovraccarghjatu (upstream_overloaded, cù Retry-AfterNada ùn hè fatturatu à meno chì u furnituri ùn hà micca fatturatu per u tentativu. |
I codici di statutu chì ogni endpoint cumparticipa sò elencati sottu à errori.
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
Cun "stream": true a risposta arriva cum'è eventi mandati da u serviziu mentra u mudellu u scrive. Ogni eventu hè un chat.completion.chunk estu data: linea, è u
scorrimentu finisce cù data: [DONE]U ragionamentu arriva in
delta.reasoning_content, a risposta in delta.content.
Trasmette in streaming qualsiasi cosa chì pò piglià più di versu 100 sicondi, cum'è una risposta longa, una grande
max_tokens o un mudellu di raziunamentu. Una dumanda chì ùn hè micca trasmessa in streaming ùn manda micca nantu à nente finchì a risposta ùn hè micca completa, è a rete trà voi è Nymbot pò chiudè una cunnessione inattiva
dopu circa 100 secondi; u mudellu finisce comunque è ciò chì hà scrittu hè fatturatu, ma a risposta
si perde. Un stream manda segnali di mantenimentu, cusì resta apertu per tuttu u tempu chì u mudellu scrive.
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]
- Linee chì cumincian cù
:sì hè i cumenti keep-alive, mandati ogni 15 secondi mentra u mudellu pensa. I clienti SSE li saltanu. - Chjamate per
"stream_options": {"include_usage": true}per piglià u últimu pezzu sopra, cu un vuotuchoices, u conte di i token, u prezzu è unymbotoggettu. - A carica si assetta dopu à a fine di u stream. S'ellu chiudite a cunnessione prima, u mudellu ùn hè micca fermatu: Nymbot legge u restu di u stream di u furnitore, per至 un massimu di 25 sicondi, per prendere u conteggiu di i so token, è vi pagate ciò chì u furnitore riferisce. Senza quellu conteggiu, a carica hè stimate da u vostru input è da ciò chì hè statu scrittu, più tutta a permessa di output per un mudellu chì ragiona.
- Un errore prima di u primu pezzu, cum'è
401o402, torna cum'è un JSON ordinariu cù u so codice di statutu, micca cum'è un stream. Un errore dopu chì u stream hè cuminciatu arriva cum'è l'ultimudata: {"error": {…}}eventu, è u stream finisce senza[DONE]. - I dumande cù i strumenti, è i mudelli nantu à u trasportu di Risposte di OpenAI, ùn sò micca in streaming da u fornitore. Ellu rispondi comunque cù un stream validu, mandatu una volta chì a risposta hè cumpletata.
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);
}
Appelli di strumentalità
Descrive e funzioni in tools è u mudellu pò dumandà chì una sia chjamata invece di
rispondè. Vucate a funzione, aghjettate u so risultatu cum'è un tool messaghju cù u medemu
tool_call_id, è mandate a cunversazione torna. Nymbot ùn ferma mai i vostri funziunari;
ellu passate a dumanda di u mudellu torna à voi.
tool_choice prend "auto", "none",
"required" o {"type": "function", "function": {"name": "…"}}A lista di i mudelli indica quali mudelli pon chjamà azzioni (capabilities.tools). I ferri sò
rigettati cù 400 unsupported_tool estu nymbot/auto è nantu à
i pochi mudelli di u catalughe chì funzionanu nantu à u trasportu di Responsi di OpenAI, à quale Nymbot ùn pò micca passà strumenti.
Cun "stream": true, una dumanda cù i ferramentali s'esegue in un pezzu è poi hè mandata cum'è una
sequenza normale di pezzi: u ròle, un pezzu chì porta ogni chjamata di ferramentale cù u so indice, id, nome è
argumenti, è u pezzu di finitura. I clienti chì läghjanu e chjamate di ferramentali in streaming u maneggianu cum'è d'ordinariu.
Risposta, in parti
"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);
Immagini in una dumanda
Modelli cù capabilities.vision pò legge e immagini. Aggiunge un image_url
parte à un messaghju di un utilizatore, cù oghje un publicu https:// legame o a
data:image/…;base64, URL. Jus à 20 imaghj per dumanda. I disegni SVG sò
ricusati, è u stessa casu hè per un ligame di più di 4.096 caratteri o unu cù un nome d'utilizatore o una password in it
(400 invalid_image_url). Un opzionale detail è
auto, low o high.
Cun nymbot/auto, una dumanda cù una imaghjina hè rutata versu un mudellu standard chì pò vede. Un mudellu di cataloghju senza capabilities.vision rifiuta e ritratti cù
400 unsupported_contentI ritrattu ponu esse solu in i messaggi di l'utilizatore. Un ligame deve punta à un ospite pulbicu; Nymbot passa u ritrattu à u furnitore di u mudellu è ùn u conserva micca.
Una imaghjina hè fatturata cum'è i token d'input chì u furnitore conta per essa, cum'è u restu di a ricaltata.
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);
Ragunamentu
Modelli cù capabilities.reasoning pònu pensà prima di risponde. Chiedite più o menu
di isso cù reasoning_effort ("minimal", "low",
"medium" o "high") o u "reasoning": {"effort": "high"}, o
aghjunghje :thinking à u nome di u mudellu, chì significa un grande sforzu. Su un mudellu senza
raziunamentu a configurazione hè ignorata. Cu nymbot/auto, :thinking mandà a
richiesta à u percorsu di ragionamentu standard.
Su i mudelli d'Anthropic l'impetu diventa un budgette di pensamentu di circa 1.000, 2.000, 8.000 o 16.000
token, mai più di max_tokens permette. U pensamentu hè lasciatu fora quandu
tool_choice impone un strumentu, è quandu a dumanda continua un ciclu di strumentu (lu so ultimu
messaghju hè un risultatu di strumentu), perchè Anthropic hà bisognu di u pensamentu firmatu precedente per riprendelu.
A stessa cosa si applica nantu à i terminali di Responses è di Messages.
U ragionamentu torna in message.reasoning_content, o
delta.reasoning_content quandu streamingate, mai mischiatu in a risposta. U ragionamentu hè
l'output è hè fatturatu cum'è tale, indrentu completion_tokensAlcuni pruvuditori ùn rinnumeru micca u testu di u ragionamentu, è si paga comunque.
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);
Suffissi di mudellu
Un suffissu nantu à u nome di u mudellu cambia u modu in que u dumanda hè gestitu, senza un altru campu. E funzionanu sia cù id di u tuttu chì cù i nomi curti, cum'è in anthropic/claude-sonnet-5:online.
| Sufissu | Effettu |
|---|---|
:online | Cherca prima nantu à u web, cum'è plugins: [{"id": "web"}]. Vede ricerca web. |
:thinking | Sforzu di ragionamentu altu; on nymbot/auto, a ruta di u ragionamentu. Su un mudellu chì ùn pò micca ragionà, 400 model_not_found cu “nenti endpoint truvatu”. |
:nitro, :floor, :exacto, :extended | Accettatu è ignoratu. Ogni mudellu di cataloghju hà una ruta, dunque ùn ci hè micca una più veloce, più economica o più lunga da sceglie; i suffissi sò permessi per ch'e nomi di mudelli copiati da altri servizii funzionanu ancu ellas. |
Qualchì altrua suffissu hè ignoratu. U nome interu hè pruvatu prima, dunque un mudellu u cui l'id cuntene veramente una
duota funziona ancu; s'ellu fallisce, i suffissi sò rimossi da a fine unu per unu finu à chè un mudellu
corrisponde. Un nome di mudellu pò avè al più 200 caratteri è al più 4 suffissi; unu più longu hè rifiutatu cù 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);
Ricerca web
Qualche mudellu di chat pò risponde da u web in vivu. Nymbot cerca l'ultima missaghju di l'utilizatore (i so primi 2.000 caratteri), legge e pagine più assai è le dà à u mudellu cù a dumanda, marcate cum'è cuntenutu externu da u quale u mudellu ùn deve micca piglià istruzzioni. Ci sò dui modu:
- Sempre cercà:
"plugins": [{"id": "web", "max_results": 5}], o u:onlinesuffissu nantu à u mudellu. - Cercate quandu hè utile:
"tools": [{"type": "web_search", "parameters": {"max_results": 5}}], ancu più accettatu cum'èweb_search_previewoopenrouter:web_search. Nymbot cherche solu quandu a dumanda pare chì hà bisognu di infurmazioni attuale, u stessu testu chì l'app usa.
max_results hè 5 per difdefizazione è al più 10. E fonti tornanu in
nymbot.web_search.sources, ciascun cù un title, snippet è
url, è cum'è url_citation annotazioni nantu à u messaggiu.
Ogni ricerca chì si esegge costa $0.008, cunvertitu in sats, in più di i token, è hè parte di u hold. I pagine chì hà lettu sò ancu token d'input, dunque una risposta da u web costa più di a stissa dumanda fatta senza ricerca, qualchì volta diverse volte di più.
Risposta, in parti
"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);
API di risposte
U formatu novu di OpenAI, utilizatu da u SDK di l'Agenti di OpenAI è da Codex. Funzionamentu nantu à i stessi mudelli, fatturazione è caratteristiche chì u Chat Completions.
POST https://nymbot.ai/api/v1/responses — hà bisognu di una chìave API.
| Campu | Tipu | Necessariu | Descrizzione |
|---|---|---|---|
model | string | Iè | Quant à Completazioni di Chat, suffissi inclusi. |
input | string o array | Iè | Una stringa, o una lista di elementi: messaggi (ruoli user, assistant, system, developer) cù input_text, input_image è output_text parti, è function_call è function_call_output articuli per l'attrezzi. input_image prend un image_url link o URL di dati, micca un ID di filu. reasoning è web_search_call articuli sò saltati; item_reference è rifiutatu. |
instructions | string | No | Istruzioni di u sistema. |
max_output_tokens | integru | No | I più token da scrive. |
temperaturetop_p | numeru | No | Controlli di campionamentu, indu u mudellu li piglia. |
toolstool_choiceparallel_tool_calls | array, string o oggettu, bolean | No | Ferramenti di funzione, in a forma di Risposte ({"type": "function", "name": …, "parameters": …}). A web_search o web_search_preview l'utensile s'accende ricerca web quandu aiuta. Altri strumenti integrati sò rifiutati. |
reasoning | oggettu | No | {"effort": "minimal" | "low" | "medium" | "high"}. xhigh è max significà high; none u spegne. |
text.formatresponse_format | oggettu | No | Output strutturatu, cum'è un schema JSON o json_object. |
metadata | oggettu | No | Rendutu senza cambiamenti in a risposta. Un massimu di 16 valuri di stringa, ciaves finu à 64 caratteri è valuri finu à 512. |
stream | bulianu | No | Trasmetti i l'eventi cum'è descrittu sottu. |
store | bulianu | No | Ignuratu. Niente ùn hè salvatu, è a risposta dice sempre "store": false. |
previous_response_idconversationbackground | stringu, oggettu, booleanu | No | Non supportatu: 400 unsupported_parameter. E risposte ùn sò micca salvate, perciò mandate tutta a cunversazione in input ogni volta. |
Risposta
{
"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 }
}
Una dumanda di strumentu apparaghja in output cum un function_call articulu cù
call_id, name è arguments; mandate u risultatu in damu un a
function_call_output articulu cù u stessu call_id. U ragionamentu, quand u
mudellu u torna, hè un reasoning articulu cù reasoning_text contènu,
listatu prima. status è incomplete quandu a risposta hè hitta
max_output_tokens o u pruvidore hà rifiutatu, cù
incomplete_details.reason impostatu à max_output_tokens o
content_filter. A risposta ripete ancu i paràmetri di a dumanda (temperatura,
strumenti, scelta di u strumentu è cusà, par esempio) cum'ellu fà OpenAI, è porta u nymbot prezzu
oggettu.
Trasmettu, ogni eventi hè un event: line è a data: linea cù una
sequence_number, in stu ordine: response.created,
response.in_progress, response.output_item.added,
response.content_part.added, qualsiasi numeru di response.output_text.delta,
response.output_text.done, response.content_part.done,
response.output_item.done, è infine response.completed cu u
usu è u celu. Una risposta corta finisce cù response.incomplete invece, è un
fallimentu dopu à ciò chì u stream hè cuminciatu cù response.failed. U ragionamentu si sprigghja cum'è
un aghjuttu propriu cù response.reasoning_text.delta è .done. I chiami di l'strumenti
venenu dopu u messaghju, ognunu cum'è un elementu cù response.function_call_arguments.delta
è .done.
| Statutu | Quandu |
|---|---|
400 | No model o input; previous_response_id, conversation, background o an item_reference (unsupported_parameter); un strumentu micca supportatu o un tipu di cuntenutu. |
402, 403, 404, 429, 502, 503 | Quant à e Chat Completions. |
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);
Messaggi di Anthropic
U formatu di Anthropic, per i SDK di Anthropic è Claude Code. Funziona cù ogni mudellu in u catalugu, ùn solu Claude: a dumanda hè tradotta, executata trà u medesimu pipeline, è tradotta torna.
POST https://nymbot.ai/api/v1/messages — hà bisognu di una chìave API, cum'è x-api-key o Authorization: Bearer.
U anthropic-version è anthropic-beta i capiscali sò accettati è
ignorati. I nomi di i mudelli Anthropic sò cuntattati cù u catalughe, cusì Claude Code è i SDK funzionanu
cum'è i nomi chì ùn usanu digià:
- Un nome chì u catalogu conosce, cum'è
claude-sonnet-5oanthropic/claude-opus-5, hè usatu com'è. - Sinon una data (
-20260514),-latest, una tacca di versione cum'è-v1, una tagghia trà parentesi cum'è[1m]è unanthropic/oanthropic.i prefixi sò rimossi, è i punti è i tratti in a versione sò pruvati in dui modi (claude-haiku-4-5trovaclaude-haiku-4.5). - Sì ughju ùn corrisponde à nente, a famiglia (Opus, Sonnet o Haiku) hè utilizata, tantu chì a versione di u cataloghju hè a stessa o più recente di quella chjamata.
- Un nome chì ùn corrisponde à nenti torna
404not_found_error.
| Campu | Tipu | Necessariu | Descrizzione |
|---|---|---|---|
model | string | Iè | Un ID di mudellu di catalughe, o un nome di mudellu Anthropic. |
max_tokens | integru | Iè | I più token da scrive. |
messages | array | Iè | user è assistant turni, cu text, image (fonte base64 o URL), tool_use è tool_result blocchi. thinking i blocchi di i turni precedenti sò accettati è scartati. |
system | string o array | No | Prompt di u sistema, cum'è una stringa o blocchi di testu. |
temperaturetop_p | numeru | No | Controlli di campionamentu, indu u mudellu li piglia. top_k hè accettatu è buttatu fora. |
stop_sequences | arrayu di stringhe | No | Testu chì ferma a risposta. Al più 4 stringhe, ognuna al più 256 caratteri. |
toolstool_choice | array, oggettu | No | Utensili cù name, description è input_schema. A web_search l'òutil di u servitore s'accende ricerca web; L'altri strumenti integrati d'Anthropic (bash, editor di testu, utilizazione di u computer) sò rifiutati cù unsupported_tool. tool_choice prend auto, any, tool o none, è disable_parallel_tool_use. |
thinking | oggettu | No | {"type": "enabled", "budget_tokens": 8192}, {"type": "adaptive"} o {"type": "disabled"}. U budget sceglie un livellu di sforzu: sottu à 2.048 minimu, da 2.048 bassu, da 8.192 mediu, da 16.384 altu. L'adattivu usa output_config.effort, o altu. |
stream | bulianu | No | Streaming in u formatu di l'eventu di Anthropic. |
metadata | oggettu | No | Accettatu è ignoratu. |
Risposta
{
"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 pò ancu mantene tool_use blocchi è un thinking
bloccu, di quessu signature hè vacante. stop_reason è
end_turn, max_tokens, tool_use o refusal,
funziunaise di u stessu modu chì finish_reason estu
Completazioni di Chat; stop_sequence hè sempre
null, ancu quandu una sequentia di fermazione avia finitu a rispusta. input_tokens conteggi
input frescu solu; l'input in cache hè in i dui campi di cache. U coste hè in u
nymbot l'oggettu è u X-Nymbot-Cost-Sats intestezzu.
Trasmessi, l'èventi sò di Anthropic: message_start,
content_block_start, ping, content_block_delta
(text_delta, input_json_delta o thinking_delta),
content_block_stop, message_delta cum a ragione di fermata, l'usu è
u nymbot oggettu di costu, è message_stop. A ping hè anchi
mandatu ogni 15 secondi mentra u mudellu hè in travagliu. I chiamati di l'ozzi arrivanu dopu u testu, ognunu cum'è un
tool_use bloccu cù tuttu u so input in unu input_json_delta.
L'errori nantu à questu endpoint usanu u formatu di Anthropic:
{"type": "error", "error": {"type": "not_found_error", "message": "…"}}Un bilanciu breve hè 402 billing_error, un fornitore sovraccarghjatu
503 overloaded_errorUn fallimentu dopu chì u stream hè iniziatu hè mandatu
cum'è un error eventu.
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);
Contà i token
Una stima di quanti token d'input una richiesta di Messages useria, per chè un client possa verificà prima di mandà. Hè gratuitu, ma hà comunque bisognu di una chìave.
POST https://nymbot.ai/api/v1/messages/count_tokens — serve una chìave API. Gratis.
U corpu hè u stessu chì per Messaggi, senza max_tokens; u nome di u mudellu deve risolve. U conteggiu hè una stima: i caratteri di u prompt di u sistema, i messaggi, i chiami di l'utensili è e definizioni di l'utensili divisi per quattru, più 1.600 per ogni imaghjina. Hè u tokenizer propiu di u furnitore, cusì u conteggiu reale pò differisce. Una chìave chì hà raggiuntu u so limite pò ancu esse utilizata.
Risposta
{ "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 di i modelli
Ogni mudellu è generatore chì l'API accetta, cù u so prezzu. A lista hè letta da u stessu cataloghù vivu di u selezionatore di l'app, per u quale hè sempre ciò chì u servitore eseguirà.
GET https://nymbot.ai/api/v1/models — nisuna chìave micca necessaria. In cache per cinque minuti.
GET /api/v1/models/{id} ritorna una voce.
| Campu | Tipu | Necessariu | Descrizzione |
|---|---|---|---|
type | stringa (ricerca) | No | chat (u per default), image, video, audio, embedding o all. Parechii ponnu esse dati, cum image,video. |
I prezzi sò ciò chì paghe, cù a tariffa è u margine già inclusi, in dollari è in sats à u
prezzu attuale di u Bitcoin. balance dice quale saldu u mudellu spende.
nymbot_key hè u nome curtu di u mudellu in l'app. created hè sempre 0, sicchì u catalugu ùn registra micca quannu un mudellu hè statu aghjuntu. Un mudellu senza tariffe di token publicate hè prissatu per_request invece.
nymbot/auto hè sempre u primu, prisatu cum'è variable, cù un
routes lista chì dà i prezzi di ogni ruta standard. Elista a visione è u ragionamentu, ma
micca i strumenti.
GET /api/v1/models/{id} accetta i stessi nomi è alias cum una richiesta, è restituisce
l'entrata per u mudellu à quìlu chì elli risolvinu.
Risposta
{
"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"
}
]
}
L'altri tipi:
- Immagine hanno entries
capabilities(accepts_image_url,requires_image_url,edit) è un prezzuper_generation. - Vidéo hanno entries
max_duration_secondsèresolutions, è un prezzuper_secondper ogni risoluzzione. - Audio hanno entries
audio_typespeechotranscription, prissatuper_1k_charsoper_minute. - Imbedduzione hanno entries
dimensions,context_length,max_inputsè un prezzu per milione di token d'input.
Prezzi indicati "estimated": true suntu a stima di l'app per un generatore u cui u prezzu
ù hè publicatu. Un incognitu type ritorni 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);