Saltà à u cuntenutu
Torna à Nymbot

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.

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.

CampuTipuNecessariuDescrizzione
modelstringIè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.
messagesarrayIè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.
streambulianuNoMandate a risposta cum'è scritta. Vedi streaming.
stream_optionsoggettuNo{"include_usage": true} aghjunge un pezzu finale cù u conteggiu di i token è u prezzu.
max_tokens
max_completion_tokens
integruNoU 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à.
temperature
top_p
numeruNoControlli di campionamentu: temperature da 0 à 2, top_p da 0 à 1.
stopstring o arrayNoTestu chì ferma a risposta: una stringa o al più 4 stringhe, ognuna al più di 256 caratteri. Micca usatu da nymbot/auto.
seedintegruNoPer u campionament ripetevelu, induve u mudellu u supporta.
presence_penalty
frequency_penalty
numeruNoControlli di ripettiuna, ognunu da -2 à 2.
response_formatoggettuNo{"type": "json_object"} o {"type": "json_schema", "json_schema": {…}}, indu u mudellu u sustena. Micca usatu da nymbot/auto.
tools
tool_choice
parallel_tool_calls
array, string o oggettu, boleanNoChjamata 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_effort
reasoning
stringhju, oggettuNo"minimal", "low", "medium" o "high", o {"effort": "high"}. "none" o {"enabled": false} u spegne. Vedi ragunamentu.
pluginsarrayNo[{"id": "web", "max_results": 5}] sempre cerca u web prima. Finà à 10 risultati.
nintegruNoSolu 1. Qualcosa altru returns 400.
logit_bias
user
metadata
oggettu, stringa, oggettuNoAccettatu è 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.

StatutuQuandu
400No 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).
402U saldu chì u mudellu spende ùn pò micca cunvè righjunà u bloccu.
403U casu più peghjore ùn si adatta à a capuzina di a chiave (key_limit_reached). Inferiù max_tokens o aumentà u capu.
404Nessun mudellu cù u nome di quella (model_not_found).
429U limite di velocità di a chiave, o quella di u furnitore (upstream_rate_limited).
502, 503U 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 vuotu choices, u conte di i token, u prezzu è u nymbot oggettu.
  • 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'è 401 o 402, 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'ultimu data: {"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.

SufissuEffettu
:onlineCherca prima nantu à u web, cum'è plugins: [{"id": "web"}]. Vede ricerca web.
:thinkingSforzu 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, :extendedAccettatu è 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);

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 :online suffissu nantu à u mudellu.
  • Cercate quandu hè utile: "tools": [{"type": "web_search", "parameters": {"max_results": 5}}], ancu più accettatu cum'è web_search_preview o openrouter: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.

CampuTipuNecessariuDescrizzione
modelstringIèQuant à Completazioni di Chat, suffissi inclusi.
inputstring o arrayIè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.
instructionsstringNoIstruzioni di u sistema.
max_output_tokensintegruNoI più token da scrive.
temperature
top_p
numeruNoControlli di campionamentu, indu u mudellu li piglia.
tools
tool_choice
parallel_tool_calls
array, string o oggettu, boleanNoFerramenti 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.
reasoningoggettuNo{"effort": "minimal" | "low" | "medium" | "high"}. xhigh è max significà high; none u spegne.
text.format
response_format
oggettuNoOutput strutturatu, cum'è un schema JSON o json_object.
metadataoggettuNoRendutu senza cambiamenti in a risposta. Un massimu di 16 valuri di stringa, ciaves finu à 64 caratteri è valuri finu à 512.
streambulianuNoTrasmetti i l'eventi cum'è descrittu sottu.
storebulianuNoIgnuratu. Niente ùn hè salvatu, è a risposta dice sempre "store": false.
previous_response_id
conversation
background
stringu, oggettu, booleanuNoNon 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.

StatutuQuandu
400No 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, 503Quant à 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-5 o anthropic/claude-opus-5, hè usatu com'è.
  • Sinon una data (-20260514), -latest, una tacca di versione cum'è -v1, una tagghia trà parentesi cum'è [1m] è un anthropic/ o anthropic. i prefixi sò rimossi, è i punti è i tratti in a versione sò pruvati in dui modi (claude-haiku-4-5 trova claude-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 404 not_found_error.
CampuTipuNecessariuDescrizzione
modelstringIèUn ID di mudellu di catalughe, o un nome di mudellu Anthropic.
max_tokensintegruIèI più token da scrive.
messagesarrayIè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.
systemstring o arrayNoPrompt di u sistema, cum'è una stringa o blocchi di testu.
temperature
top_p
numeruNoControlli di campionamentu, indu u mudellu li piglia. top_k hè accettatu è buttatu fora.
stop_sequencesarrayu di stringheNoTestu chì ferma a risposta. Al più 4 stringhe, ognuna al più 256 caratteri.
tools
tool_choice
array, oggettuNoUtensili 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.
thinkingoggettuNo{"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.
streambulianuNoStreaming in u formatu di l'eventu di Anthropic.
metadataoggettuNoAccettatu è 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.

CampuTipuNecessariuDescrizzione
typestringa (ricerca)Nochat (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 prezzu per_generation.
  • Vidéo hanno entries max_duration_seconds è resolutions, è un prezzu per_second per ogni risoluzzione.
  • Audio hanno entries audio_type speech o transcription, prissatu per_1k_chars o per_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);