Wiesselt op den Inhalt
Zurück zu Nymbot

Wëssensbasis Entwéckler

Chat, Antworten a Messagen

D'Dreie Weeër fir e Modell iets ze fragen, an de dräi Formater Clienten schon sprechen, all op déi selwecht Modeller lafen an déi selwecht Form.

Chat completéiert

D'OpenAI Chat-Format, an dat, wat fast all Tool ënnerstëtzt. Send de Gespréich bis elo an kréien déi nächst Message zréck.

POST https://nymbot.ai/api/v1/chat/completions Dir braucht eng API Schlüssel.

Nur déi model an messages Eng Sampling Parameter, déi de gewählte Modell net nimmt, gëtt ouni Fehler gefall, sou datt e Verlangen Kierper iwwer Modeller funktionnéiert. supported_parametersWat refuséiert ass anstatt gefall ass alles, wat de Modell net kann: Fotoen fir e Modell, deen net kann gesinn, Tools fir e Modell, deen net kann ze ruffen.

FënnefTypVläichtBeschreiwung
modelStrengJonymbot/auto oder auto) fir de Routing vum Nymbot op der Standardbalance, oder eng Katalogmodell id wéi anthropic/claude-sonnet-5 Op der Pro Balance. D'Kurznamen an d'Aliases vun der App sinn och akzeptiert. Gespäichert.
messagesEt assJoGespréich - Rollen system, developer (Déi gëtt als System behandelt) user, assistant an toolInhalt ass eng String oder eng Lëscht vun text an image_url Parts; Bilder nëmmen an den Benotzer Messagen. input_audio D'Datei vum Dossier gëtt refuséiert.
streamBoulëtterNieftDir kënnt d'Respons wéi et geschriwwen ass. Streaming gëtt.
stream_optionsObjetenNieft{"include_usage": true} Et féiert eng endgülteg Stéck mat Token Zuel an d'Käschte.
max_tokens
max_completion_tokens
IntegratiounNieftD'Majoritéit vun de Token ze schreiwen. Reduzéiert op d'Majoritéit vum Modell, wann et méi héich ass. Stellt och fest, wéi vill aus Ärem Saldo gehalten gëtt, sou datt eng kleinere Zuel manner Kredit braucht fir ze starten.
temperature
top_p
D’NumérNieftKontrollen vum Sampling: temperature Vun 0 bis 2, top_p Vun 0 bis 1.
stopString oder ArrayNieftText, deen d'Response endet: eng String oder maximal 4 Strings, all maximal 256 Zeichen. nymbot/auto.
seedIntegratiounNieftFir repetabel Sampling, wou de Modell dat ënnerstëtzt.
presence_penalty
frequency_penalty
D’NumérNieftWiederholungskontrollen, all vun -2 bis 2.
response_formatObjetenNieft{"type": "json_object"} oder {"type": "json_schema", "json_schema": {…}}, wou de Modell ënnerstëtzt. net benotzt vun nymbot/auto.
tools
tool_choice
parallel_tool_calls
Array, String oder Objet, booleanNieftD’Funktioun ass: Se Et gëtt Calls... a web_search De Tool gëtt WebsucheOp maximal 128 Tools a 512 KB vun Definitionen, zu maximal 64 Niveaus dee; méi ass e 400.
reasoning_effort
reasoning
Et ass en Objet.Nieft"minimal", "low", "medium" oder "high"oder {"effort": "high"}. "none" oder {"enabled": false} Et gëtt net.See Argumentatioun.
pluginsEt assNieft[{"id": "web", "max_results": 5}] Allgemeng sucht d'Websäit éischt. bis zu 10 Resultater.
nIntegratiounNieftEt ass alles anescht, alles anescht kommt. 400.
logit_bias
user
metadata
Objet, Strength an ObjetNieftVläicht gëtt et net geschéckt. logit_bias Mappen bei maximal 300 Token IDs zu Zueln vun -100 bis 100; user Et ass maximal 256 Charaktere; metadata Hutt bis zu 16 String Werte, Schlëssel bis zu 64 Zeichen an Werte bis zu 512.

Déi Reaktioun ass normal chat.completionBei de Kosten an der usage.cost (an Dollar) an an der nymbot Objet gëtt. model Et ass de Resolute Modell id, also e kurze Numm kënnt als den vollsten. message.reasoning_contentEt ass separat vun der Antwort.

Reaktioun

{
  "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 Et gëtt aus dem, wat zurückginn ass, well Provider et anders melden: tool_calls Wann de Modell fir Tools bitt, length Wann d'Response all de Token benotzt huet (oder de Modell huet all d'Revolutioun gemaach an keng Antwort geschriwwen), content_filter Wann de Betreiber refuséiert, a stop An dann net. usage.completion_tokens_details.reasoning_tokens Et ass ëmmer 0: versteckte Argumenter Token sinn zählen, an charged, an completion_tokens.

Status vumWann
400Nieft model oder messages (missing_required_parameter); e Audio- oder File-Teil, oder Bildern fir e Modell, deen se net gesinn kann (unsupported_content); méi wéi 20 Bilder (too_many_images); e Samplingparameter vum falschen Typ oder aus dem Range (invalid_value); eng Foto Link déi net öffentlech ass (invalid_image_url); Tools op engem Modell déi se net nennen kann (unsupported_tool); n Et ass méi wéi 1; a :thinking D'Situatioun vun engem Modell, dat kann net sinn (model_not_foundEt gëtt kee Gott awer Allah an de Muhammad ass de Messenger vum Allah.upstream_rejected).
402De Saldo, deen de Modell spënnt, kann de Halt net decken.
403Déi schlechtst Fall passt net de Schlëssel (key_limit_reachedDéi niedrigsten max_tokens Oder opzedeelen an d’Kap.
404Et gëtt keng Modell vum Numm (model_not_found).
429Firwat ee steet, a wéi eng Visioun ee fir Lëtzebuerg hätt.upstream_rate_limited).
502, 503Et gëtt keng sou Adress (upstream_errorOder hätt Dir éischter [gëtt ënnerbrach]upstream_overloadedMä mat Retry-AfterEt gëtt keng Gebühr gemaach, wann de Provider fir de Versuch gebucht huet.

D'Statuscodes fir all Endpoint Aktien sinn op der Liste Fehler.

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 gëtt

mat "stream": true D'Response gëtt als Server-Send-Events geschéckt, während d'Modell et schreift. chat.completion.chunk Et ass data: D'Linie, an de Strom endet mat data: [DONE]De Verstand ass an delta.reasoning_contentDéi éischt Antwort an delta.content.

Streamen alles, wat méi wéi ongeféier 100 Sekonnen dauert, wéi eng laang Antwort, eng grouss max_tokens oder e Begrëffsmodell. eng Forderung, déi net gestreamt gëtt, sendet net alles bis d'Response komplett ass, an d'Netzwerk tëscht Dir a Nymbot kann eng idyllesch Verbindung nach ongeféier 100 Sekonnen schloen; d'Modell endet och an wat et geschriwwen huet ass geladen, awer d'Response ass verluer.

Streck

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]
  • Linie beginn mat : D'Kommentarer ginn all 15 Sekonnen geschéckt, während d'Modell denkt.
  • Vläicht "stream_options": {"include_usage": true} fir de leschte Stéck haut ze kréien, mat engem leeren choicesD'Käschte, d'Käschte a de nymbot Objet gëtt.
  • Si schloen d'Verbindung fréier, ass de Modell net gestoppt: Nymbot liest den Rest vum Provider Strom, fir bis zu 25 Sekonnen, fir seng Token Zuel ze kréien, an Dir bezuelt wat de Provider berichtet.
  • Eng Fehler virun dem éischte Chunk, wéi 401 oder 402, kënnt als normal JSON mat sengem Statuscode, net als Stream. data: {"error": {…}} Et ass eng Zäit, an de Stream endet ouni [DONE].
  • Requests mat Tools, an Modeller op OpenAI's Responses Transport, fléien net vum Provider.

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);
}

Et gëtt Calls

D'Funktioune vun der tools an de Modell kann eis fir eng ze kréien anstatt ze beantworten. Dir lafen d'Funktioun, e Resultat als tool Message vum selwechten tool_call_idNymbot huet nie Är Funktiounen ausgeführt; et gëtt d'Bedreiwung vum Modell op Iech geschéckt.

tool_choice Et gëtt "auto", "none", "required" oder {"type": "function", "function": {"name": "…"}}D'Modellliste markéiert déi Modeller kënnen Tools nennen (capabilities.toolsDe Tool gëtt verweigert. 400 unsupported_tool Déi nymbot/auto an op de puer Katalogmodeller, déi op OpenAI's Responses Transport lafen, déi Nymbot net Tools passéieren kann.

mat "stream": true, eng Recherche mat Tools lafen an engem Stéck an gëtt dann als normale Chunk-Sequenz geschéckt: d'Rolle, e Chunk, deen all Tool Call mat sengem Index, ID, Numm an Argumenten, an de Finish Chunk huet.

Reaktioun, déi zum Teil

"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 an der Recherche

Modeller mat capabilities.vision Dir kënnt d'Fotos liesen. image_url Deel zu engem Benotzer Message, mat engem Publikum https:// Link oder a data:image/…;base64, URL. Bis zu 20 Bilde fir eng Recherche. SVG Bilde sinn verluer, a sou ass en Link iwwer 4096 Zeichen oder ee mat engem Benotzername oder Passwort an deem (400 invalid_image_urlEt ass optional detail Déi auto, low oder high.

mat nymbot/auto, eng Recherche mat engem Bild an et ass zu engem Standardmodell, dat kann gesinn. capabilities.vision Mir refuséieren d'Fotos 400 unsupported_contentD'Bild kann nëmmen an de Benutzer Messagen sinn. E Link muss op e öffentlechen Host weisen; Nymbot verëffentlecht d'Bild op den Provider vum Modell a behält se net.

Eng Bild gëtt als d'Eintrag Token, déi de Provider fir et zählt, wéi de Rest vun der Recherche belastet.

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);

Argumentatioun

Modeller mat capabilities.reasoning Dir kënnt net méi, wéi Dir wëllt, méi oder méi ze beantworten. reasoning_effort ("minimal", "low", "medium" oder "high"oder "reasoning": {"effort": "high"}Oder addéiert :thinking Den Numm vum Modell, dat heescht héich Effort. Op engem Modell ouni Argumentatioun ass d'Einstellung ignoréiert. nymbot/auto, :thinking Dir kënnt d'Recherche op de Standard Reasoning Route schécken.

Op Anthropic Modeller ass de Effort e Denkbudget vun ongeféier 1.000, 2.000, 8.000 oder 16.000 Token, nie méi wéi max_tokens Denken ass ausgeschloss, wann tool_choice D'Fuerscher ass eng Tool, an wann d'Fuerscher eng Tool-Loop fortgesat huet (d'letzte Message ass e Tool-Resultat), well Anthropic d'fréier signéiert Denken braucht fir se opzemaachen.

De Argument gëtt an message.reasoning_contentoder delta.reasoning_content Beim Streaming, nie an der Reaktioun vermischt. Reasoning ass Output an ass als sou charged, an der completion_tokensE puer Provider retournéieren de Argumentatiounstext überhaupt, an et gëtt nach ëmmer belastet.

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);

Modell Suffixes

Eng Suffix op de Modellnam ändert wéi d'Anfrage behandelt gëtt, ouni eng aner Feld. Si funktionnéieren op voll Ids an Kurznamen ähnlech, wéi an anthropic/claude-sonnet-5:online.

ZuvielEffekt
:onlineD'Websäit gëtt als éischt als plugins: [{"id": "web"}]Déi Websuche.
:thinkingHaut sinn d’Reaktioune; op nymbot/autoOp engem Modell, dat kann net logesch sinn, 400 model_not_found Et ass “no endpoints found”.
:nitro, :floor, :exacto, :extendedAll Katalogmodell huet eng Route, sou datt et net méi séier, billeg oder länger ass ze wählen; d'Suffixen sinn erméiglecht, sou datt Modellnamen, déi aus anere Servicer kopéiert sinn, nach funktionnéieren.

All aner Suffix gëtt ignoréiert. De ganze Numm gëtt éischt probéiert, sou datt e Modell deen d'ID e Kolon huet ëmmer funktionnéiert; an dësem Fall, Suffixen vun der End e puer an eng Zäit weggeholl ginn bis e Modell matgeholl ass. 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);

All Chat-Modell kann aus dem Live-Web reagéieren. Nymbot sucht fir déi lescht Benotzerbericht (déi éischt 2000 Charaktere), liest déi bescht Säiten an liest se dem Modell mat der Fro, markéiert als externer Inhalt deen de Modell soll net Anweisungen kréien.

  • Allgemeng Suen: "plugins": [{"id": "web", "max_results": 5}]Oder a :online Et ass ausreichend am Modell.
  • Suen wann et hëlleft: "tools": [{"type": "web_search", "parameters": {"max_results": 5}}]Et gëtt och als web_search_preview oder openrouter:web_searchNymbot sucht nëmmen wann d'Fro wéi et aktuell Informatiounen braucht, déi selwecht Test déi App benotzt.

max_results Et ass 5 standardiséiert an bei maximal 10. d'Quellen kommen op nymbot.web_search.sourcesEt gëtt all a title, snippet an urlEt ass as url_citation Annotatioun an der Message.

All Fuerschung, déi lafen kostet $ 0,008, konvertéiert zu sats, op der Säit vun de Token, an et ass Deel vun der Halt.

Reaktioun, déi zum Teil

"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);

Reaktioun

OpenAI ass e neierer Format, dat vum OpenAI Agents SDK an vum Codex benotzt gëtt. Et funktionnéiert op déi selwecht Modeller, Rechnung a Funktiounen wéi Chat Completions.

POST https://nymbot.ai/api/v1/responses Dir braucht eng API Schlüssel.

FënnefTypVläichtBeschreiwung
modelStrengJoWéi fir Chat completéiertZu de Suffixes gehéieren.
inputString oder ArrayJoA String, oder eng Lëscht vun Elementer: Messagen (Rollen user, assistant, system, developer(meeschtens mat input_text, input_image an output_text Parten an function_call an function_call_output Material fir Tools. input_image Et gëtt image_url Link oder Daten URL, net e Datei ID. reasoning an web_search_call Objeten sinn gespaant; item_reference Et gëtt refuséiert.
instructionsStrengNieftAnweisungen vum System.
max_output_tokensIntegratiounNieftDéi meescht Token ze schreiben.
temperature
top_p
D’NumérNieftSampling Kontrollen, wou de Modell sie nimmt.
tools
tool_choice
parallel_tool_calls
Array, String oder Objet, booleanNieftD'Funktioun ass an der Form vun den Responses ({"type": "function", "name": …, "parameters": …}D’A web_search oder web_search_preview De Tool gëtt Websuche Wann et hëlleft. aner eingebaut Tools ginn verweigert.
reasoningObjetenNieft{"effort": "minimal" | "low" | "medium" | "high"}. xhigh an max Bedeit high; none Et gëtt ausgeschloss.
text.format
response_format
ObjetenNieftStrukturéiert Ausgab, wéi e JSON Schema oder json_object.
metadataObjetenNieftBei maximal 16 String-Werte, Schlëssel bis zu 64 Zeichen an Werte bis zu 512.
streamBoulëtterNieftStream Events wéi hieronder beschriwwen.
storeBoulëtterNieftNichts ass gespeichert, an d'Reaktioun heescht ëmmer: "store": false.
previous_response_id
conversation
background
String, Objet an BooleanNieftDéi nei Ënnerstëtzung: 400 unsupported_parameterD'Antworten ginn net gespeichert, also schreift de ganze Gespréich an input All Zäit.

Reaktioun

{
  "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 }
}

Et gëtt eng Tool Request an output Wéi a function_call Punkt vum call_id, name an argumentsD'Resultat gëtt als a function_call_output Duerfir gëtt klenggeschriwwen: call_idReasoning, wann de Modell et retournéiert, ass e reasoning Punkt vum reasoning_text De Inhalt gëtt als éischt listéiert. status Déi incomplete Wann d'Response geschitt max_output_tokens Oder hätt Dir éischter [gëtt ënnerbrach] incomplete_details.reason Set déi max_output_tokens oder content_filterD'Response echkt och d'Einstellungen vun der Fro (Temperatur, Tools, Tools Choice, etc.) wéi d'OpenAI ass, an bréngt de nymbot Objeten an Objeten.

All Event ass eng event: Linie a data: Linie mat A sequence_numberAn an dëser Ordnung: response.created, response.in_progress, response.output_item.added, response.content_part.addedEt gëtt keng Anzahl response.output_text.delta, response.output_text.done, response.content_part.done, response.output_item.doneEt ass schließlich response.completed D'Responsabilitéit an d'Responsabilitéit fir d'Responsabilitéit an d'Responsabilitéit fir d'Responsabilitéit response.incomplete anescht, an e Faillissement no de Stream huet ugefaangen mat response.failedD'Reasoning Streams als eegen Element mat response.reasoning_text.delta an .doneTool Calls kommen no der Message, all als Element mat response.function_call_arguments.delta an .done.

Status vumWann
400Nieft model oder input; previous_response_id, conversation, background Oder an item_reference (unsupported_parameter); e onunterstützte Tool oder Inhaltstyp.
402, 403, 404, 429, 502, 503Wann de Chat komplett ass.

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);

Anthropesch Messagen

De Format vum Anthropic, fir d'Anthropic SDKs an de Claude Code. Et funktionnéiert mat all Modeller am Katalog, net nëmmen Claude: d'Anfrage gëtt übersat, duerch déi selwecht Pipeline ausgeführt, an ëmgedréckt.

POST https://nymbot.ai/api/v1/messages - braucht eng API Schlëssel, wéi x-api-key oder Authorization: Bearer.

Déi anthropic-version an anthropic-beta Anthropesch Modellnamen sinn mat dem Katalog matgeholl, also Claude Code an d'SDKs funktionnéieren mat de Nimm, déi se schon benotzt:

  • Et ass e Numm, deen de Katalog kennt, wéi claude-sonnet-5 oder anthropic/claude-opus-5Et gëtt benotzt wéi et ass.
  • Déi éischt Datum (-20260514), -latestEt ass eng Versioun wéi -v1Et ass eng bracketed Tag wéi [1m] Et gëtt anthropic/ oder anthropic. D'Präfix ginn ausgeléist, an d'Dots an d'Dashes an der Versioun sinn op déi zwee Weeër probéiert (claude-haiku-4-5 Et gëtt claude-haiku-4.5).
  • Wann dat nach net matgeholl ass, gëtt d'Familie (Opus, Sonnet oder Haiku) benotzt, solange d'Versioun vum Katalog déi selwecht oder neier ass wéi déi gefordert ass.
  • Den Numm, deen net matgeholl gëtt 404 not_found_error.
FënnefTypVläichtBeschreiwung
modelStrengJoE Katalog Modell Id, oder e Anthropic Modell Numm.
max_tokensIntegratiounJoDéi meescht Token ze schreiben.
messagesEt assJouser an assistant Wëllkomm, mat text, image (Base64 oder URL Source) tool_use an tool_result Et gëtt Blocker. thinking Bléck vun de fréiere Turnen sinn akzeptiert an gefall.
systemString oder ArrayNieftSystem prompt, wéi eng String oder Textblock.
temperature
top_p
D’NumérNieftSampling Kontrollen, wou de Modell sie nimmt. top_k Et gëtt akzeptabel an gefall.
stop_sequencesEt gëtt StringsNieftText, deen d'Response endet. Maximum 4 Strings, maximal 256 Zeichen.
tools
tool_choice
Et ass en Objet.NieftTools fir name, description an input_schema... a web_search De Server Tool gëtt op Websuche; Andere eingebaut Tools vun Anthropic (Bash, Texteditor, Computer benotzt) sinn verweigert unsupported_tool. tool_choice Et gëtt auto, any, tool oder noneEt gëtt disable_parallel_tool_use.
thinkingObjetenNieft{"type": "enabled", "budget_tokens": 8192}, {"type": "adaptive"} oder {"type": "disabled"}De Budget wählt eng Effort Niveau: ënner 2.048 Minimum, vun 2.048 niedrig, vun 8.192 Mëttel, vun 16.384 héich. output_config.effortOder déi héich.
streamBoulëtterNieftStream am Eventformat vun Anthropic.
metadataObjetenNieftVläicht ignoréiert a ignoréiert.

Reaktioun

{
  "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 Et kann och tool_use Bléck a thinking Bléck, déi signature Et ass leer. stop_reason Déi end_turn, max_tokens, tool_use oder refusalEt funktionnéiert op der selwechter Weise wéi finish_reason Déi Chat completéiert; stop_sequence Et gëtt ëmmer nullAlso, wann eng Stop-Sequenz d'Response endéiert huet. input_tokens D'Käschte vun der Schlësselung ass an der Schlësselung vun der Schlësselung an der Schlësselung vun der Schlësselung. nymbot Objeten an déi X-Nymbot-Cost-Sats De Header.

Streamed, déi Events sinn Anthropic's: message_start, content_block_start, ping, content_block_delta (text_delta, input_json_delta oder thinking_delta), content_block_stop, message_delta mat der Stop-Motivatioun, der Gebrauch an der nymbot Objeten a message_stop... a ping Et gëtt och all 15 Sekonnen geschéckt, während de Modell funktionnéiert. tool_use Bléck mat senger ganzer Input an engem input_json_delta.

Fehler op dësem Endpunkt benotzt de Format vun Anthropic: {"type": "error", "error": {"type": "not_found_error", "message": "…"}}D'Balance ass déi 402 billing_errorEt gëtt eng Overload Provider. 503 overloaded_errorEn Faillissement no de Stream huet ugefaangen gëtt als error Et ass Event.

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);

D'Zuel vun den Token

Eng Schätzung vu wéi vill Input-Token eng Messages-Anfrage benotzt, fir en Client ze kontrolléieren, ier se sendt.

POST https://nymbot.ai/api/v1/messages/count_tokens - braucht eng API Schlüssel. gratis.

De Kierper ass déi selwecht wéi de MessagenEt ass max_tokensD'Zuel ass eng Schätzung: d'Charakteren vun der System-Prompt, Messagen, Tool Calls an Tool Definitionen dividéiert vun véier, plus 1,600 fir all Bild. Et ass net de Proprietär Tokenizer, sou datt d'echte Zuel variéieren kann.

Reaktioun

{ "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);

Modeller ze listéieren

All Modell a Generator déi API akzeptiert, mat wat et kostet. D'Lëscht gëtt aus dem selwechten Live-Katalog wéi d'App vum Picker geléiert, also ass et ëmmer wat de Server lafen wäert.

GET https://nymbot.ai/api/v1/models Keen Schlëssel brauch. versteckt fir 5 Minutten.

GET /api/v1/models/{id} Et gëtt 1 Entrée.

FënnefTypVläichtBeschreiwung
typeD’Qualitéit (Question)Nieftchat Duerfir gëtt klenggeschriwwen: image, video, audio, embedding oder allEt kann e puer, wéi image,video.

Präis ass wat Dir bezuelt, mat der Gebühr an der Marge schon an, an Dollaren an an Sats am aktuellen Bitcoin Präis. balance Vläicht ass dat déi Balance, déi de Modell ausgezeechent. nymbot_key ass de Kurzname vum Modell an der App. created Et ass ëmmer 0, well de Katalog net ze registréieren wann e Modell hinzugefouert gouf. per_request amplaz.

nymbot/auto Et ass ëmmer éischt, de Präis ass wéi variableEt ass a routes Et listet Visioun a Argumentatioun, awer net Tools.

GET /api/v1/models/{id} akzeptiert déi selwecht Nimm a Alias als Anfrage, an returnéiert d'Eintrag fir d'Modell déi se decidéieren.

Reaktioun

{
  "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"
    }
  ]
}

Déi aner Typen:

  • Bild an Entrée gëtt capabilities (accepts_image_url, requires_image_url, editEt gëtt en Präis per_generation.
  • Videoen Entrée gëtt max_duration_seconds an resolutionsEt gëtt en Präis per_second An all Resolutioun.
  • Audio ass Entrée gëtt audio_type speech oder transcriptionPräis per_1k_chars oder per_minute.
  • D’Invasioun Entrée gëtt dimensions, context_length, max_inputs Et ass e Präis pro Millioune Token.

Präisser markéiert "estimated": true ass d'Schätzung vun der App fir e Generator wier de Präis net publizéiert ass. type Retournéieren 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);