Gean nei de ynhâld
Komme nei Nymbot.

Kennisbasis De ûntwikkelers

Chat, antwurden en berichten

Der binne trije manieren om in model wat te fragen, yn de trije formaten kliïnten al praat, alle rjochtsje op itselde modellen en fakturearre de selde manier.

Chat kompletten

De OpenAI chat-formaat, en dy't hast alle tools stypje. Sende de konversaasje hjoed en krije de folgjende berjocht werom.

POST https://nymbot.ai/api/v1/chat/completions Der is gjin fire key nedich.

Allegearre model en messages In samplingparameter dat it keazen model net nimt wurdt droppen sûnder in fout, dus ien fraachorganisme wurket oer modellen. supported_parametersWat wurdt ferstoar ynsteld, is alles wat it model net kin dwaan: foto's foar in model dy't net sjogge, gereedschappen foar in model dy't se net kinne rjochtsje.

De fjildDe typeNeffensBeskriuwing
modelStrjitteJanymbot/auto (Of auto) foar Nymbot's routing op de standertbalans, of in katalogusmodel id lykas anthropic/claude-sonnet-5 Op 'e Pro-balans. De app's korte namen en alias's binne ek akseptearre. Ynfloed.
messagesYn arrayJaDe konversaasje, rollen system, developer (Beheard as in systeem) user, assistant en toolContent is in string of in list fan text en image_url part; foto's allinich yn brûkersboarnen. input_audio De bestannen binne ôfwiisd.
streamBooleanNo ynSkriuw de antwurd yn as it skriuwt. Yn streaming.
stream_optionsIt ObjectNo yn{"include_usage": true} It giet om in finale ferheging fan de kosten en de kosten.
max_tokens
max_completion_tokens
YntegraasjeNo ynDe measte tokens om te skriuwen. Lowered nei it maksimum fan it model as heger. Sette ek hoeveel wurdt hâlden út jo saldo, dus in kleiner tal nedich minder krediet om te begjinnen.
temperature
top_p
NûmerNo ynKontrôle foar sampling: temperature Yn 0 oant 2, top_p Yn 0 oant 1.
stopString of arrayNo ynTekst dy't de antwurd eindigt: in string of maksimaal 4 strings, elk maksimaal 256 karakters. nymbot/auto.
seedYntegraasjeNo ynFoar herhaalbare sampling, dêr't it model it stypje.
presence_penalty
frequency_penalty
NûmerNo ynKontrollen wurde herhaald, elk fan -2 oant 2.
response_formatIt ObjectNo yn{"type": "json_object"} Of {"type": "json_schema", "json_schema": {…}}It model wurdt net brûkt troch de nymbot/auto.
tools
tool_choice
parallel_tool_calls
array, string of object, booleanNo ynYn de funksje. see Tool foar CallsYn A web_search De tool wurdt Web ûndersykOp maksimaal 128 tools en 512 KB fan definysjes, ynset op maksimaal 64 niveaus djippe; mear is in 400.
reasoning_effort
reasoning
Ynstrumint, ObjectNo yn"minimal", "low", "medium" Of "high"Yn {"effort": "high"}. "none" Of {"enabled": false} It giet om it sjen. Begjin.
pluginsYn arrayNo yn[{"id": "web", "max_results": 5}] Algemien ûndersykje it web earst. oant 10 resultaten.
nYntegraasjeNo ynAllegearre alles komt werom. 400.
logit_bias
user
metadata
Ynstrumint, String en ObjectNo ynIt is ynsteld en net útsteld. logit_bias kaarten op maksimaal 300 token ids nei nummers fan -100 oant 100; user Der binne maksimaal 256 karakters. metadata Hâldt maksimaal 16 string waarden, sleutels maksimaal 64 karakters en waarden maksimaal 512.

It antwurd is normaal. chat.completionYn de kosten yn usage.cost (in dollars) en yn de nymbot It Object. model is de oploste model id, dus in koarte namme komt werom as de folsleine. message.reasoning_contentDe antwurd is ôfskeid.

Antwurd

{
  "id": "chatcmpl-5f1c0a9e27d84b3c",
  "object": "chat.completion",
  "created": 1790726400,
  "model": "anthropic/claude-sonnet-5",
  "choices": [
    {
      "index": 0,
      "message": {
        "role": "assistant",
        "content": "A Lightning invoice is a one-time payment request..."
      },
      "logprobs": null,
      "finish_reason": "stop"
    }
  ],
  "usage": {
    "prompt_tokens": 1240,
    "completion_tokens": 380,
    "total_tokens": 1620,
    "prompt_tokens_details": { "cached_tokens": 0 },
    "completion_tokens_details": { "reasoning_tokens": 0 },
    "cost": 0.01895
  },
  "nymbot": {
    "balance": "pro",
    "charged_credits": 0.162,
    "charged_sats": 16.2,
    "balance_credits": 412.425,
    "balance_sats": 41242.5
  }
}

finish_reason is útwurke út wat kom werom, sûnt providers rapportearje it ferskillende: tool_calls As de model foar de gereedschappen frege, length as it antwurd alle tokens brûkt (of it model alle redenen spile en gjin antwurd skreaun), content_filter As de provider weigeret, en stop Anders yn. usage.completion_tokens_details.reasoning_tokens is altyd 0: hidden reasoning tokens wurde telde, en laden, yn completion_tokens.

Status fanAs
400No yn model Of messages (missing_required_parameterIt earste krantsje kaam út yn april Nadere informatie (unsupported_contentOer klasseboek en aktiviteplan, observaasje en registraasje yn 'e basisskoalle by Theun Meestringa(too_many_imagesOer klasseboek en aktiviteiteplan, observaasje en registraasje yn 'e basisskoalle by Theun Meestringa(invalid_valueIt earste krantsje kaam út yn april Nadere informatie (invalid_image_urlIt earste krantsje kaam út yn april Nadere informatie (unsupported_tool); n Yn oare gefallen; a :thinking Oer klasseboek en aktiviteplan, observaasje en registraasje yn 'e basisskoalle by Theun Meestringa(model_not_foundIt eardere eilân Wieringen is gjin part fan de gemeente.upstream_rejected).
402De saldo dy't it model spile, kin de hâlding net dekken.
403Oer klasseboek en aktiviteiteplan, observaasje en registraasje yn 'e basisskoalle by Theun Meestringa(key_limit_reachedYn de leafde max_tokens Of hege de haadstêd.
404It earste krantsje kaam út yn april (model_not_found).
429Oer klasseboek en aktiviteplan, observaasje en registraasje yn 'e basisskoalle by Theun Meestringa(upstream_rate_limited).
502, 503It earste krantsje kaam út yn april (upstream_errorIt earste krantsje kaam út yn april (upstream_overloadedYn Retry-AfterNiks wurdt belutsen as de provider ferbûn foar de poging.

De statuscodes fan elke endpoint aksjes binne listed ûnder De fouten.

cURL

curl https://nymbot.ai/api/v1/chat/completions \
  -H "Authorization: Bearer $NYMBOT_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "anthropic/claude-sonnet-5",
    "messages": [
      {"role": "system", "content": "Answer in one short paragraph."},
      {"role": "user", "content": "What is a Lightning invoice?"}
    ],
    "max_tokens": 400
  }'

Python

import os
from openai import OpenAI

client = OpenAI(base_url="https://nymbot.ai/api/v1", api_key=os.environ["NYMBOT_API_KEY"])

reply = client.chat.completions.create(
    model="anthropic/claude-sonnet-5",
    messages=[
        {"role": "system", "content": "Answer in one short paragraph."},
        {"role": "user", "content": "What is a Lightning invoice?"},
    ],
    max_tokens=400,
)
print(reply.choices[0].message.content)
print(reply.usage.cost)

JavaScript

import OpenAI from "openai";

const client = new OpenAI({ baseURL: "https://nymbot.ai/api/v1", apiKey: process.env.NYMBOT_API_KEY });

const reply = await client.chat.completions.create({
  model: "anthropic/claude-sonnet-5",
  messages: [
    { role: "system", content: "Answer in one short paragraph." },
    { role: "user", content: "What is a Lightning invoice?" },
  ],
  max_tokens: 400,
});
console.log(reply.choices[0].message.content);
console.log(reply.usage.cost);

Strjitte

Yn "stream": true De respons komt as server-sendende eveneminten wylst it model it skriuwt. chat.completion.chunk Yn A data: De line, en de stream endet mei data: [DONE]De redenen komme yn delta.reasoning_contentDe antwurd yn delta.content.

Stream alles dy't mear as oer 100 sekonden kin nedich, lykas in lange antwurd, in grutte max_tokens Of in redeneringsmodel. In fraach dy't net streamen wurdt, sendt niks oant it antwurd is foltôge, en it netwurk tusken jo en Nymbot kin in leauwe ferbûn ferstjoere nei sa'n 100 sekonden; it model is noch foltôge en wat it skreaun is geladen, mar it antwurd is verloren.

Strjitte

data: {"id":"chatcmpl-5f1c0a9e27d84b3c","object":"chat.completion.chunk","created":1790726400,"model":"anthropic/claude-sonnet-5","choices":[{"index":0,"delta":{"role":"assistant","content":""},"finish_reason":null}]}

data: {"id":"chatcmpl-5f1c0a9e27d84b3c","object":"chat.completion.chunk","created":1790726400,"model":"anthropic/claude-sonnet-5","choices":[{"index":0,"delta":{"content":"A Lightning invoice"},"finish_reason":null}]}

: keep-alive

data: {"id":"chatcmpl-5f1c0a9e27d84b3c","object":"chat.completion.chunk","created":1790726400,"model":"anthropic/claude-sonnet-5","choices":[{"index":0,"delta":{},"finish_reason":"stop"}]}

data: {"id":"chatcmpl-5f1c0a9e27d84b3c","object":"chat.completion.chunk","created":1790726400,"model":"anthropic/claude-sonnet-5","choices":[],"usage":{"prompt_tokens":1240,"completion_tokens":380,"total_tokens":1620,"cost":0.01895},"nymbot":{"balance":"pro","charged_credits":0.162,"charged_sats":16.2,"balance_credits":412.425,"balance_sats":41242.5}}

data: [DONE]
  • Lijnen begjinne mei : Der binne alle 15 sekonden kommentaasjes útstjoerd, wylst it model denkt.
  • Skriuw dy yn "stream_options": {"include_usage": true} om de lêste kruk oer te krijen, mei in lege choicesDe kosten, de kosten en de nymbot It Object.
  • De lading fertsjintwurdiget nei de stream endet. As jo de ferheging ferstjoere earst, wurdt it model net stoppe: Nymbot liedt de rest fan 'e provider's stream, foar maksimaal 25 sekonden, om syn token tellen te krijen, en jo betelle wat de provider rapportearret.
  • In fergeliking foar de earste chunk, lykas 401 Of 402, komt werom as ordinêre JSON mei syn statuscode, net as in stream. data: {"error": {…}} De stêd begjint en de stêd begjint [DONE].
  • Requests mei tools, en modellen op OpenAI's Responses ferfier, net streamen út de 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);
}

It Tool Calls

Skriuw dy yn foar funksjes yn tools En it model kin freegje om in te rjochtsjen ynstee fan antwurd. tool In berjocht mei itselde tool_call_idNymbot wurket noch altyd jo funksjes; it ferstjoert de model's fraach werom nei jo.

tool_choice Yn "auto", "none", "required" Of {"type": "function", "function": {"name": "…"}}Oer klasseboek en aktiviteiteplan, observaasje en registraasje yn 'e basisskoalle by Theun Meestringa(capabilities.toolsDe gereedschappen wurde weigerd. 400 unsupported_tool Yn nymbot/auto en op de pear katalogemodellen dy't rjochtsje op OpenAI's Responses-transport, dy't Nymbot kinne net ferwiderje.

Yn "stream": true, in fraach mei tools rûn yn ien stuk en wurdt dan ferstjoerd as in normale chunk sequency: de rol, ien chunk drage elke tool call mei syn indeks, id, namme en arguminten, en de finish chunk.

It antwurd is deels

"choices": [
  {
    "index": 0,
    "message": {
      "role": "assistant",
      "content": null,
      "tool_calls": [
        {
          "id": "call_7d2e",
          "type": "function",
          "function": { "name": "get_invoice_status", "arguments": "{\"invoice_id\":\"a41f\"}" }
        }
      ]
    },
    "finish_reason": "tool_calls"
  }
]

cURL

curl https://nymbot.ai/api/v1/chat/completions \
  -H "Authorization: Bearer $NYMBOT_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "anthropic/claude-sonnet-5",
    "messages": [{"role": "user", "content": "Has invoice a41f been paid?"}],
    "tools": [{
      "type": "function",
      "function": {
        "name": "get_invoice_status",
        "description": "Look up whether an invoice is paid.",
        "parameters": {
          "type": "object",
          "properties": {"invoice_id": {"type": "string"}},
          "required": ["invoice_id"]
        }
      }
    }]
  }'

Python

import json, os
from openai import OpenAI

client = OpenAI(base_url="https://nymbot.ai/api/v1", api_key=os.environ["NYMBOT_API_KEY"])

tools = [{
    "type": "function",
    "function": {
        "name": "get_invoice_status",
        "description": "Look up whether an invoice is paid.",
        "parameters": {
            "type": "object",
            "properties": {"invoice_id": {"type": "string"}},
            "required": ["invoice_id"],
        },
    },
}]
messages = [{"role": "user", "content": "Has invoice a41f been paid?"}]

reply = client.chat.completions.create(model="anthropic/claude-sonnet-5", messages=messages, tools=tools)
call = reply.choices[0].message.tool_calls[0]
args = json.loads(call.function.arguments)

messages.append(reply.choices[0].message)
messages.append({"role": "tool", "tool_call_id": call.id, "content": json.dumps({"paid": True})})

final = client.chat.completions.create(model="anthropic/claude-sonnet-5", messages=messages, tools=tools)
print(final.choices[0].message.content)

JavaScript

import OpenAI from "openai";

const client = new OpenAI({ baseURL: "https://nymbot.ai/api/v1", apiKey: process.env.NYMBOT_API_KEY });

const tools = [{
  type: "function",
  function: {
    name: "get_invoice_status",
    description: "Look up whether an invoice is paid.",
    parameters: {
      type: "object",
      properties: { invoice_id: { type: "string" } },
      required: ["invoice_id"],
    },
  },
}];
const messages = [{ role: "user", content: "Has invoice a41f been paid?" }];

const reply = await client.chat.completions.create({ model: "anthropic/claude-sonnet-5", messages, tools });
const call = reply.choices[0].message.tool_calls[0];
const args = JSON.parse(call.function.arguments);

messages.push(reply.choices[0].message);
messages.push({ role: "tool", tool_call_id: call.id, content: JSON.stringify({ paid: true }) });

const final = await client.chat.completions.create({ model: "anthropic/claude-sonnet-5", messages, tools });
console.log(final.choices[0].message.content);

Foto's yn in aanvraag

Modellen mei capabilities.vision Kinne jo foto's lêze. image_url part oan in brûkersbericht, mei in publyk https:// Link en A data:image/…;base64, Oer klasseboek en aktiviteiteplan, observaasje en registraasje yn 'e basisskoalle by Theun Meestringa(400 invalid_image_urlYn optionele detail Yn auto, low Of high.

Yn nymbot/auto, in fraach mei in ôfbylding yn it wurdt rjochte nei in standert model dat kin sjen. capabilities.vision Skriuw dy yn foar foto's mei 400 unsupported_contentFoto's kinne allinich yn brûkersûndersiken wurde. In link sil nei in iepenbiere hûs rjochtsje; Nymbot ferstjoert it ôfbyld oan de provider fan it model en bewarret it net.

In ôfbylding wurdt belegge as de input tokens de provider telle foar it, lykas de rest fan de fraach.

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

Begjin

Modellen mei capabilities.reasoning Dêrby kinne se yn 'e ûndersyk mear of minder antwurdje. reasoning_effort ("minimal", "low", "medium" Of "high"Yn "reasoning": {"effort": "high"}Of oanfolling :thinking Op in model sûnder redenering is de setup ignored. nymbot/auto, :thinking De útfiering fan de standert rûte.

Op Anthropic modellen wurdt de ynspanning in gedachtebudget fan likernôch 1,000, 2,000, 8,000 of 16,000 tokens, nimmer mear as max_tokens Yn it gefal is de gedachte ôfsteld as tool_choice Yn 'e foarbyld, en doe't de fraach nei in tool loop (sin lêste berjocht is in tool resultaat), omdat Anthropic nedich de eardere signearre gedachte om it te hâlden.

De redenering komt werom yn message.reasoning_contentYn delta.reasoning_content Yn it gefal is der noch in oanspraak, dêr't de oanspraak yn it gefal is. completion_tokensSommige leveransiers keapje de redeneringstekst net yn alle gefallen, en it wurdt noch betelle.

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

Model fan suffixes

In oanfolling op 'e modelnaam feroarje hoe't de fraach wurdt behannele, sûnder in oare fjild. anthropic/claude-sonnet-5:online.

It genôchEffekt
:onlineSykje it web earst, lykas plugins: [{"id": "web"}]Yn Web ûndersyk.
:thinkingHoge redenering ynspannings; op nymbot/autoOp in model dy't gjin reden kin meitsje, 400 model_not_found It earste krantsje kaam út yn “no endpoints found”.
:nitro, :floor, :exacto, :extendedElke katalogusmodel hat ien rûte, dus der is gjin flugger, goedkoper of langer ien om te keapjen; de oanfollings binne gefoel, dus modelnamen dy't kopiearre wurde fan oare tsjinsten noch wurkje.

Elke oare sufleks wurdt negearre. De hiele namme wurdt earst probearre, dus in model dy't syn id echt in kolon befettet, noch wurkje; ynfolling dat, sufleksjes wurde út de end ien op in tiid tafoege oant in model matches. In model namme kin op maksimaal 200 karakters lang wêze mei op maksimaal 4 sufleksjes; in langer ien wurdt ferwiderd mei 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);

Ien chatmodel kin antwurde fan it live web. Nymbot leit foar de lêste brûkersbericht (yn syn earste 2000 karakters), liedt de bêste siden en jout se oan it model mei de fraach, markearre as eksterne ynhâld dat it model gjin ynstruksjes moat nimme fan.

  • Altijd ûndersyk: "plugins": [{"id": "web", "max_results": 5}]Yn A :online Yn it foarbyld.
  • Sjoch doe't it helpt: "tools": [{"type": "web_search", "parameters": {"max_results": 5}}]It wurdt ek akseptearre as web_search_preview Of openrouter:web_searchNymbot ûndersykje allinich doe't de fraach lykwols aktuele ynformaasje nedich hat, itselde test dat de app brûkt.

max_results is 5 by default en op maksimaal 10. De bronnen komme werom yn nymbot.web_search.sourcesElk mei in title, snippet en urlEn as url_citation Noot yn de boodschap.

Elke ûndersyk dy't rûn kostet $ 0,008, konvertearre nei sats, op 'e top fan' e tokens, en it is ûnderdiel fan 'e hâld.

It antwurd is deels

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

Antwurd brûkt

It is it nijere format fan OpenAI, brûkt troch de OpenAI Agents SDK en troch Codex. It rûn op itselde modellen, billing en funksjes as Chat Completions.

POST https://nymbot.ai/api/v1/responses Der is gjin fire key nedich.

De fjildDe typeNeffensBeskriuwing
modelStrjitteJaAs foar Chat komplettenYnklusyf de suffixes.
inputString of arrayJaIn string, of in list fan items: berichten (roles) user, assistant, system, developerYn input_text, input_image en output_text De delen, en function_call en function_call_output It giet om gereedschappen. input_image Hâldt in image_url Link of data URL, net in file id. reasoning en web_search_call De items binne skippe; item_reference Hy is nei.
instructionsStrjitteNo ynYnstruksje foar systeem.
max_output_tokensYntegraasjeNo ynDe meast te skriuwen.
temperature
top_p
NûmerNo ynSampling kontrollen, wêr't it model harren nimt.
tools
tool_choice
parallel_tool_calls
array, string of object, booleanNo ynIt earste krantsje kaam út yn april Nadere informatie ({"type": "function", "name": …, "parameters": …}Yn A web_search Of web_search_preview De tool wurdt Web ûndersyk De oare ynboude tools wurde ferwiderd.
reasoningIt ObjectNo yn{"effort": "minimal" | "low" | "medium" | "high"}. xhigh en max Meitsje high; none Hâld it út.
text.format
response_format
It ObjectNo ynStructured output, as in JSON-skema of json_object.
metadataIt ObjectNo ynOp maksimaal 16 string waarden, sleutels maksimaal 64 karakters en waarden maksimaal 512.
streamBooleanNo ynStream eveneminten as beskreaun hjirûnder.
storeBooleanNo ynNiks is opslaan, en it antwurd is altyd: "store": false.
previous_response_id
conversation
background
String, Object en BooleanNo ynNo ynsteld wurde: 400 unsupported_parameterReactions are not stored, dus send de hiele konversaasje yn input Elke kear.

Antwurd

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

In foarbyld ferkeapet yn output As a function_call It item mei call_id, name en argumentsSende it resultaat werom as a function_call_output It stuit mei itselde call_idAs it model it weromkomt, is it in reasoning It item mei reasoning_text De titel is opnommen earst. status Yn incomplete As it antwurd komt max_output_tokens Of de provider weigerde, mei incomplete_details.reason Sette dy max_output_tokens Of content_filterDe antwurd ek echoet de ynstellings fan 'e fraach (temperatuer, gereedschap, gereedschapskearjen, ensfh) as OpenAI's do, en draait de nymbot It kostet objekten.

Yn elk evenemint is in event: De line en a data: De line mei a sequence_numberYn dizze orde: response.created, response.in_progress, response.output_item.added, response.content_part.addedYn elke oantal response.output_text.delta, response.output_text.done, response.content_part.done, response.output_item.doneYn de finale response.completed Yn 't gefal en yn 't gefal is in antwurd yn 't gefal response.incomplete Yn 't gefal, en in mislukking nei de stream begûn mei response.failedIt giet om it meitsjen fan eigen ûnderwerpen mei response.reasoning_text.delta en .doneTool roepen komme nei it berjocht, elk as in item mei response.function_call_arguments.delta en .done.

Status fanAs
400No yn model Of input; previous_response_id, conversation, background Of in item_reference (unsupported_parameter); in oanpaste tool of content type.
402, 403, 404, 429, 502, 503As foar chat kompletten.

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

Anthropyske berichten

Anthropic's format, foar de Anthropic SDK's en Claude Code. It wurket mei alle modellen yn 'e katalogus, net allinnich Claude: de fraach wurdt vertaald, útfierd troch itselde pipeline, en vertaald werom.

POST https://nymbot.ai/api/v1/messages - in API-sleutel is nedich, as x-api-key Of Authorization: Bearer.

De anthropic-version en anthropic-beta Anthropyske modelnamen wurde oanpast oan de katalogus, dus Claude Code en de SDKs wurkje mei de nammen dy't se al brûke:

  • In namme dy't de katalogus ken, lykas claude-sonnet-5 Of anthropic/claude-opus-5It wurdt brûkt as it is.
  • It earste krantsje kaam út yn april (-20260514), -latestYn in ferzje as -v1Yn 'e foarbyld fan 'e tag as [1m] En in anthropic/ Of anthropic. Oer klasseboek en aktiviteiteplan, observaasje en registraasje yn 'e basisskoalle by Theun Meestringa(claude-haiku-4-5 Finne claude-haiku-4.5).
  • As dat noch niks matches, wurdt de famylje (Opus, Sonnet of Haiku) brûkt, solle de ferzje fan de katalogus itselde of nijere is as de ferzje foar.
  • In namme dy't niks fûn komt werom 404 not_found_error.
De fjildDe typeNeffensBeskriuwing
modelStrjitteJaIn katalogus model id, of in Anthropic model namme.
max_tokensYntegraasjeJaDe meast te skriuwen.
messagesYn arrayJauser en assistant Hjoed, mei text, image (base64 of URL bron) tool_use en tool_result De blokken. thinking Blokken út eardere beurten wurde akseptearre en droegen.
systemString of arrayNo ynSystem prompt, as in string of tekstblokken.
temperature
top_p
NûmerNo ynSampling kontrollen, wêr't it model harren nimt. top_k It wurdt akseptearre en fersoarge.
stop_sequencesYnstrumint StringsNo ynDe tekst dy't de antwurd eindigt, hat maksimaal 4 strings, elk maksimaal 256 karakters.
tools
tool_choice
Ynstrumint, ObjectNo ynYnstrumint mei name, description en input_schemaYn A web_search De server-tool wurdt op Web ûndersykAnthropic's oare ynboude tools (bash, tekst-editor, kompjûter gebrûk) wurde weigere mei unsupported_tool. tool_choice Yn auto, any, tool Of noneYn disable_parallel_tool_use.
thinkingIt ObjectNo yn{"type": "enabled", "budget_tokens": 8192}, {"type": "adaptive"} Of {"type": "disabled"}De budget kiest in ynspanningsnivo: ûnder 2.048 minimum, fan 2.048 low, fan 8.192 medium, fan 16.384 hege. output_config.effortOf in hege.
streamBooleanNo ynStream yn Anthropic's event format.
metadataIt ObjectNo ynIt is akseptearre en negearre.

Antwurd

{
  "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 Hy kin ek hâlde tool_use Blokken en A thinking De blokken, dy't signature Hy is leech. stop_reason Yn end_turn, max_tokens, tool_use Of refusalHy wurket op itselde manier as finish_reason Yn Chat kompletten; stop_sequence It is altyd nullYn 't gefal is de antwurd ferbettere. input_tokens Der binne in soad foarbylden dy't yn 'e ûndersyk binne, dy't yn 'e ûndersyk binne. nymbot It object en de X-Nymbot-Cost-Sats De header.

Streamed, de eveneminten binne Anthropic's: message_start, content_block_start, ping, content_block_delta (text_delta, input_json_delta Of thinking_delta), content_block_stop, message_delta De reden foar it gebrûk en de nymbot De kosten fan it bedriuw, en message_stopYn A ping It systeem wurdt ek alle 15 sekonden ferstjoerd wylst it model wurket. Tool roepen komme nei de tekst, elk as in tool_use Blok mei syn hiele yntrodusearre yn ien input_json_delta.

Feroaringen op dit eindpunt brûke it format fan Anthropic: {"type": "error", "error": {"type": "not_found_error", "message": "…"}}It is in korte balans. 402 billing_errorIn oantal leveransiers 503 overloaded_errorIn mislukking nei it begjin fan 'e stream wurdt ferstjoerd as in error Yn evenemint.

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

Count Tokens

In schatting fan hoeveel input tokens in Messages-ferhâlding brûkt, dus in kliïnt kin kontrolearje foardat it ferstjoert.

POST https://nymbot.ai/api/v1/messages/count_tokens Jo moatte in API key. frije.

It lichem is itselde as foar BeskriuwingYn max_tokensDe telle is in schatting: de karakters fan 'e systeem prompt, berichten, tool calls en tool definysjes dividearre troch fjouwer, plus 1,600 foar elke ôfbylding. It is net de eigen tokenizer fan' e provider, dus de echte telle kin ferskille.

Antwurd

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

List fan modellen

Elke model en generator dy't de API aksepteart, mei wat it kostet. De list wurdt learde út itselde live katalogus as de picker fan 'e app, dus it is altyd wat de server sil rjochtsje.

GET https://nymbot.ai/api/v1/models — no need a key. Skriuw dy yn foar 5 minuten.

GET /api/v1/models/{id} Der is 1 yntrekking.

De fjildDe typeNeffensBeskriuwing
typeYnstruksje foar QueryNo ynchat Yn de ûndersteande image, video, audio, embedding Of allDer binne ferskate foarbylden, lykas image,video.

Prizen binne wat jo betelje, mei de fergoeding en marge al yn, yn dollars en yn sats oan de hjoeddeistige Bitcoin priis. balance Dat betsjut wat it model spile. nymbot_key is de koarte namme fan it model yn de app. created is altyd 0 omdat de katalogus net registrearret doe't in model is bygean. per_request ynstee.

nymbot/auto It is altyd earst, priis as variableYn A routes It list listet visioanen en redenen, mar net tools.

GET /api/v1/models/{id} akseptearret de selde namen en alias's as in fraach, en keart de yntrekking foar it model dy't se oplosse.

Antwurd

{
  "object": "list",
  "data": [
    {
      "id": "anthropic/claude-sonnet-5",
      "object": "model",
      "type": "chat",
      "owned_by": "anthropic",
      "name": "Claude Sonnet 5",
      "created": 0,
      "context_length": 1000000,
      "max_output_tokens": 64000,
      "architecture": { "input_modalities": ["text", "image"], "output_modalities": ["text"] },
      "supported_parameters": ["max_tokens", "temperature", "tools", "tool_choice", "reasoning", "response_format", "stop"],
      "capabilities": { "vision": true, "video": false, "tools": true, "reasoning": true, "web_search": true },
      "balance": "pro",
      "pricing": {
        "type": "per_token",
        "currency": "USD",
        "input_per_1M_tokens": 4.725,
        "output_per_1M_tokens": 23.625,
        "cache_read_per_1M_tokens": 0.4725,
        "sats_input_per_1M_tokens": 4038,
        "sats_output_per_1M_tokens": 20192
      },
      "description": "...",
      "nymbot_key": "claude-sonnet"
    }
  ]
}

De oare soarten:

  • Ynbeelding De yntredings binne capabilities (accepts_image_url, requires_image_url, editEn in priis per_generation.
  • De video De yntredings binne max_duration_seconds en resolutionsEn in priis per_second Yn elke resolúsje.
  • Yn audio De yntredings binne audio_type speech Of transcriptionDe priis per_1k_chars Of per_minute.
  • Ynbrekken De yntredings binne dimensions, context_length, max_inputs En in priis per miljoen input tokens.

Priser markearre "estimated": true is de estimat fan 'e app foar in generator wier priis is net publisearre. type Wêrom 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);