Ga naar de inhoud
Terug naar Nymbot

Kennisbank Ontwikkelaars

Chat, reacties en berichten

Drie manieren om een model iets te vragen, in de drie formaten die klanten al spreken, allemaal op dezelfde modellen en op dezelfde manier gefactureerd.

Chat voltooien

De OpenAI chat-indeling, en die die bijna elke tool ondersteunt.Stuur het gesprek tot nu toe en ontvang het volgende bericht terug.

POST https://nymbot.ai/api/v1/chat/completions Je hebt een API sleutel nodig.

Alleen model En messages Een bemonsteringsparameter dat het gekozen model niet neemt, wordt zonder een fout gedrukt, dus één verzoek lichaam werkt over modellen. supported_parametersWat wordt geweigerd in plaats van weggelaten is iets wat het model helemaal niet kan doen: foto's voor een model dat niet kan zien, hulpmiddelen voor een model dat ze niet kan bellen.

Het veldtypevereistBeschrijving
modelStringJanymbot/auto (of auto) voor de routing van Nymbot op de standaardbalans, of een catalogusmodel-id zoals anthropic/claude-sonnet-5 op de Pro-balans. De korte namen en alias's van de app worden ook geaccepteerd. Genoeg.
messagesArrayJaHet gesprek, de rollen system, developer (behandeld als een systeem) user, assistant En toolContent is een string of een lijst met text En image_url delen; afbeeldingen alleen in gebruikersberichten. input_audio Andere bestandsdelen worden geweigerd.
streamBooleaannietStuur het antwoord zoals het is geschreven. zie Streamen.
stream_optionsObjectniet{"include_usage": true} voegt een laatste stukje toe met token tellen en de kosten.
max_tokens
max_completion_tokens
integernietDe meeste tokens om te schrijven. Verlaagd tot het maximum van het model als hoger. Ook bepaalt hoeveel wordt gehouden van uw saldo, dus een kleiner aantal heeft minder krediet nodig om te beginnen.
temperature
top_p
AantalnietSampling van controles: temperature van 0 tot 2, top_p van 0 tot 1.
stopString of ArraynietTekst die het antwoord eindigt: een string of maximaal 4 strings, elk maximaal 256 tekens. nymbot/auto.
seedintegernietVoor herhaalde sampling, waar het model het ondersteunt.
presence_penalty
frequency_penalty
AantalnietHerhaling controles, elk van -2 tot 2.
response_formatObjectniet{"type": "json_object"} of {"type": "json_schema", "json_schema": {…}}, waar het model het ondersteunt. Niet gebruikt door nymbot/auto.
tools
tool_choice
parallel_tool_calls
Array, string of object, booleaannietFunctie bellen. zie Tool bellen. a web_search Tool draait op Web zoekenOp maximaal 128 tools en 512 KB van definities, ingebed op maximaal 64 niveaus diep; meer is een 400.
reasoning_effort
reasoning
String, voorwerpniet"minimal", "low", "medium" of "high", of {"effort": "high"}. "none" of {"enabled": false} Zet het uit. zie redeneren.
pluginsArrayniet[{"id": "web", "max_results": 5}] Zoek altijd eerst op het web. Tot 10 resultaten.
nintegernietAlleen 1 - Alles anders keert terug 400.
logit_bias
user
metadata
Object, String en ObjectnietGeaccepteerd en niet verzonden. logit_bias kaarten met maximaal 300 token-id's naar getallen van -100 tot 100; user maximaal 256 tekens; metadata bevat maximaal 16 stringwaarden, sleutels tot 64 tekens en waarden tot 512.

Het antwoord is gewoon chat.completionMet de kosten in usage.cost (in dollars) en in de nymbot het object. model is de opgeloste model id, dus een korte naam komt terug als de volledige. message.reasoning_contentgescheiden van het antwoord.

Reactie

{
  "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 opgebouwd uit wat terugkwam, aangezien providers het anders melden: tool_calls Wanneer het model om gereedschappen vraagt, length wanneer het antwoord elke toegestane token gebruikte (of het model ze allemaal doorbracht met redeneren en geen antwoord schreef), content_filter wanneer de leverancier weigert, en stop Anders wel. usage.completion_tokens_details.reasoning_tokens is altijd 0: verborgen redenering tokens worden geteld, en geladen, in completion_tokens.

StatusWanneer
400niet model of messages (missing_required_parameter); een audio- of bestanddeel, of afbeeldingen voor een model dat ze niet kan zien (unsupported_contentmeer dan 20 foto's (too_many_images); een bemonsteringsparameter van het verkeerde type of buiten bereik (invalid_value); een foto-link die niet openbaar is (invalid_image_url); hulpmiddelen op een model dat ze niet kan noemen (unsupported_tool); n anders dan 1; a :thinking een model dat niet kan redeneren (model_not_found); of de leverancier het verzoek heeft geweigerd (upstream_rejected).
402Het saldo dat het model besteedt, kan de holding niet dekken.
403Het slechtste geval past niet bij de hoes van de sleutel (key_limit_reached• lager max_tokens Of het kapje opheffen.
404Geen model met deze naam (model_not_found).
429De tarieflimiet van de sleutel, of de tarieflimiet van de provider (upstream_rate_limited).
502, 503De leverancier mislukt (upstream_error) of is overbelast (upstream_overloaded, met Retry-AfterEr wordt niets in rekening gebracht tenzij de provider heeft gefactureerd voor de poging.

De statuscodes van elke endpoint-aandelen worden vermeld onder 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);

Streamen

met "stream": true het antwoord komt als server verzonden gebeurtenissen terwijl het model het schrijft. chat.completion.chunk is een data: lijn, en de stroom eindigt met data: [DONE]De redenering komt in delta.reasoning_contentHet antwoord in delta.content.

Stream iets dat meer dan ongeveer 100 seconden kan duren, zoals een lang antwoord, een groot max_tokens Een verzoek dat niet wordt gestreamd, stuurt niets totdat het antwoord is voltooid, en het netwerk tussen u en Nymbot kan na ongeveer 100 seconden een lege verbinding sluiten; het model eindigt nog steeds en wat het heeft geschreven wordt geladen, maar het antwoord is verloren.

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]
  • Lijnen die beginnen met : Beoordelingen worden elke 15 seconden verzonden terwijl het model denkt.
  • Vraag voor "stream_options": {"include_usage": true} om het laatste stukje boven te krijgen, met een lege choices, de token telt, de kosten en de nymbot het object.
  • Als u de verbinding vroegtijdig sluit, wordt het model niet gestopt: Nymbot leest de rest van de stream van de provider, gedurende maximaal 25 seconden, om het token getal te krijgen, en u betaalt wat de provider rapporteert.
  • Een fout voor het eerste stuk, zoals 401 of 402, komt terug als gewone JSON met zijn statuscode, niet als een stream. data: {"error": {…}} gebeurtenis, en de stroom eindigt zonder [DONE].
  • Verzoeken met tools, en modellen op OpenAI's Responses transport, stromen niet van de provider. ze beantwoorden nog steeds met een geldige stream, verzonden zodra het antwoord is voltooid.

cURL

curl -N https://nymbot.ai/api/v1/chat/completions \
  -H "Authorization: Bearer $NYMBOT_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "nymbot/auto",
    "stream": true,
    "stream_options": {"include_usage": true},
    "messages": [{"role": "user", "content": "Write a haiku about sats."}]
  }'

Python

import os
from openai import OpenAI

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

stream = client.chat.completions.create(
    model="nymbot/auto",
    stream=True,
    stream_options={"include_usage": True},
    messages=[{"role": "user", "content": "Write a haiku about sats."}],
)
for chunk in stream:
    if chunk.choices:
        print(chunk.choices[0].delta.content or "", end="", flush=True)
    elif chunk.usage:
        print("\ncost:", chunk.usage.cost)

JavaScript

import OpenAI from "openai";

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

const stream = await client.chat.completions.create({
  model: "nymbot/auto",
  stream: true,
  stream_options: { include_usage: true },
  messages: [{ role: "user", content: "Write a haiku about sats." }],
});
for await (const chunk of stream) {
  if (chunk.choices.length) process.stdout.write(chunk.choices[0].delta.content || "");
  else if (chunk.usage) console.log("\ncost:", chunk.usage.cost);
}

Tool bellen

Beschrijf functies in tools en het model kan vragen om iemand te bellen in plaats van te antwoorden.U voert de functie uit en voegt het resultaat toe als een tool Boodschap met hetzelfde tool_call_idNymbot voert nooit uw functies uit; het stuurt het verzoek van het model terug naar u.

tool_choice neemt "auto", "none", "required" of {"type": "function", "function": {"name": "…"}}De modellijst markeert welke modellen gereedschappen kunnen bellen (capabilities.toolsTools worden geweigerd met 400 unsupported_tool zijn nymbot/auto en op de weinige catalogusmodellen die worden uitgevoerd op OpenAI's Responses transport, waar Nymbot geen hulpmiddelen kan doorgeven.

met "stream": true, een verzoek met hulpmiddelen loopt in één stuk en wordt vervolgens verzonden als een normale chunk-sequentie: de rol, een chunk met elke tool-oproep met zijn index, id, naam en argumenten en de finish-chunk.

De reactie, gedeeltelijk

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

cURL

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

Python

import json, os
from openai import OpenAI

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

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

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

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

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

JavaScript

import OpenAI from "openai";

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

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

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

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

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

Foto's in een verzoek

Modellen met capabilities.vision kan afbeeldingen lezen. voeg een image_url deel aan een gebruikersbericht, met een publiek https:// Link of een data:image/…;base64, URL. Tot 20 afbeeldingen per verzoek. SVG-afbeeldingen worden geweigerd, en dus is er een link van meer dan 4.096 tekens of een met een gebruikersnaam of wachtwoord in het (400 invalid_image_urlEen optioneel detail is auto, low of high.

met nymbot/auto, een verzoek met een afbeelding erin wordt geruiteerd naar een standaardmodel dat kan zien. capabilities.vision Afwijzen van foto's met 400 unsupported_contentEen link moet wijzen op een publieke host; Nymbot geeft de afbeelding door aan de provider van het model en bewaart deze niet.

Een afbeelding wordt in rekening gebracht als de input tokens die de provider ervoor telt, net als de rest van de aanvraag.

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

redeneren

Modellen met capabilities.reasoning kan nadenken voordat ze antwoorden. vraag om meer of minder van het met reasoning_effort ("minimal", "low", "medium" of "high") of "reasoning": {"effort": "high"}of toevoegen :thinking naar de modelnaam, wat betekent hoge inspanning. Op een model zonder redenering wordt de instelling genegeerd. nymbot/auto, :thinking stuurt het verzoek naar de standaard redeneringsroute.

Op Anthropic-modellen wordt de inspanning een denkbudget van ongeveer 1.000, 2.000, 8.000 of 16.000 tokens, nooit meer dan max_tokens Het denken is weggelaten wanneer tool_choice dwingt een tool, en wanneer de verzoek een toolloop voortzet (zijn laatste bericht is een toolresultaat), omdat Anthropic het eerder ondertekende denken nodig heeft om het te hervatten.

De redenering komt terug in message.reasoning_content, of delta.reasoning_content bij streaming, nooit gemengd in het antwoord. redenering is output en wordt als zodanig in rekening gebracht, binnen completion_tokensSommige aanbieders retourneren de redeneringstekst helemaal niet en het wordt nog steeds in rekening gebracht.

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

Het model suffixes

Een voorvoegsel op de modelnaam verandert de manier waarop de aanvraag wordt behandeld, zonder een ander veld. anthropic/claude-sonnet-5:online.

GenoegEffect
:onlineZoekt u eerst op het web, zoals plugins: [{"id": "web"}]Zie Web zoeken.
:thinkingHoge redenering inspanning; op nymbot/autoop een model dat geen reden kan geven, 400 model_not_found met “ geen eindpunten gevonden”.
:nitro, :floor, :exacto, :extendedElk catalogusmodel heeft één route, dus er is geen snellere, goedkopere of langere route te kiezen; de volgen zijn toegestaan, zodat modelnamen die zijn gekopieerd van andere diensten nog steeds werken.

De volledige naam wordt eerst geprobeerd, dus een model waarvan de id werkelijk een colon bevat, werkt nog steeds; als dat niet het geval is, worden de suffixes één op een keer van het einde verwijderd totdat een model overeenkomt. 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);

Nymbot zoekt naar het laatste gebruikersbericht (zijn eerste 2.000 tekens), leest de beste pagina's en geeft ze aan het model met de vraag, gemarkeerd als externe inhoud waarvan het model geen instructies mag nemen.

  • Altijd zoeken: "plugins": [{"id": "web", "max_results": 5}], of een :online suffix op het model.
  • Zoek wanneer het helpt: "tools": [{"type": "web_search", "parameters": {"max_results": 5}}]Ook geaccepteerd als web_search_preview of openrouter:web_searchNymbot zoekt alleen wanneer de vraag lijkt te hebben behoefte aan actuele informatie, dezelfde test die de app gebruikt.

max_results is 5 standaard en maximaal 10. de bronnen komen terug in nymbot.web_search.sourcesIeder met een title, snippet En urlEn als url_citation aantekeningen op de boodschap.

Elke zoekopdracht die loopt kost $ 0,008, omgezet in sats, bovenaan de tokens, en het is onderdeel van de hold.De pagina's die het leest zijn input tokens ook, dus een antwoord van het web kost meer dan dezelfde vraag vroeg koud, soms meerdere malen meer.

De reactie, gedeeltelijk

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

Reacties op API

OpenAI's nieuwere formaat, gebruikt door de OpenAI Agents SDK en door Codex. Het draait op dezelfde modellen, facturering en functies als Chat Completions.

POST https://nymbot.ai/api/v1/responses Je hebt een API sleutel nodig.

Het veldtypevereistBeschrijving
modelStringJaals voor Chat voltooienDe suffixes zijn inbegrepen.
inputString of ArrayJaEen string, of een lijst met items: berichten (rollen user, assistant, system, developer) met input_text, input_image En output_text onderdelen, en function_call En function_call_output items voor gereedschappen. input_image Neem een image_url een link of data-URL, geen bestandsid. reasoning En web_search_call items worden gesleept; item_reference wordt geweigerd
instructionsStringnietInstructies van het systeem.
max_output_tokensintegernietDe meeste tokens om te schrijven.
temperature
top_p
AantalnietSampling controles, waar het model ze neemt.
tools
tool_choice
parallel_tool_calls
Array, string of object, booleaannietFunctionele hulpmiddelen, in de vorm van Antwoorden ({"type": "function", "name": …, "parameters": …}) a web_search of web_search_preview Tool draait op Web zoeken Wanneer het helpt, worden andere ingebouwde tools geweigerd.
reasoningObjectniet{"effort": "minimal" | "low" | "medium" | "high"}. xhigh En max betekent high; none Draai het uit.
text.format
response_format
Objectnietgestructureerde output, zoals een JSON-schema of json_object.
metadataObjectnietBij maximaal 16 stringwaarden, sleutels tot 64 tekens en waarden tot 512.
streamBooleaannietStream evenementen zoals hieronder beschreven.
storeBooleaannietNiets wordt opgeslagen, en het antwoord zegt altijd: "store": false.
previous_response_id
conversation
background
String, object en booleaannietNiet ondersteund : 400 unsupported_parameterAntwoorden worden niet opgeslagen, dus stuur het hele gesprek naar input Elke keer

Reactie

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

Een toolverzoek verschijnt in output als a function_call Punt met call_id, name En argumentsStuur het resultaat terug als a function_call_output Punt met hetzelfde call_idReasoning, wanneer het model het retourneert, is een reasoning Punt met reasoning_text Inhoud, eerst opgenomen status is incomplete Wanneer het antwoord slaat max_output_tokens De leverancier weigerde, met incomplete_details.reason Zet twee max_output_tokens of content_filterHet antwoord weerspiegelt ook de instellingen van de aanvraag (temperatuur, gereedschappen, gereedschapskeuze enzovoort) zoals OpenAI doet, en draagt de nymbot kost het object.

Streamed, elk evenement is een event: Lijn en a data: Lijn met a sequence_numberIn deze volgorde: response.created, response.in_progress, response.output_item.added, response.content_part.addedEen ieder aantal van response.output_text.delta, response.output_text.done, response.content_part.done, response.output_item.doneEn ten slotte response.completed met het gebruik en de kosten. een antwoord kort eindigt met response.incomplete plaats, en een mislukking nadat de stroom begon met response.failedReasoning streams als zijn eigen item met response.reasoning_text.delta En .doneTool-oproepen komen na het bericht, elk als een item met response.function_call_arguments.delta En .done.

StatusWanneer
400niet model of input; previous_response_id, conversation, background Of een item_reference (unsupported_parameterEen niet-ondersteunde tool of inhoudstype.
402, 403, 404, 429, 502, 503Wat betreft de chat voltooien.

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

Antropische boodschappen

Het formaat van Anthropic, voor de Anthropic SDK's en Claude Code. Het werkt met elk model in de catalogus, niet alleen Claude: de aanvraag wordt vertaald, door dezelfde pijplijn uitgevoerd en terug vertaald.

POST https://nymbot.ai/api/v1/messages - een API-sleutel nodig heeft, zoals x-api-key of Authorization: Bearer.

De anthropic-version En anthropic-beta Antropische modelnamen worden gekoppeld aan de catalogus, dus Claude Code en de SDK's werken met de namen die ze al gebruiken:

  • Een naam die de catalogus kent, zoals claude-sonnet-5 of anthropic/claude-opus-5Het wordt gebruikt zoals het is.
  • Een andere datum (-20260514), -latestEen versie zoals -v1Een bracketed tag zoals [1m] en een anthropic/ of anthropic. voorvoegsel worden verwijderd, en punten en dashes in de versie worden op beide manieren geprobeerd (claude-haiku-4-5 vinden claude-haiku-4.5).
  • Als dat nog steeds niet overeenkomt, wordt de familie (Opus, Sonnet of Haiku) gebruikt, zolang de versie van de catalogus dezelfde of nieuwere is dan de gevraagde versie.
  • Een naam die niets bij elkaar past, keert terug 404 not_found_error.
Het veldtypevereistBeschrijving
modelStringJaEen catalogus model id, of een Anthropic model naam.
max_tokensintegerJaDe meeste tokens om te schrijven.
messagesArrayJauser En assistant Draaien, met text, image (base64 of URL bron) tool_use En tool_result De blokken. thinking Blokken uit eerdere rondes worden geaccepteerd en weggelaten.
systemString of ArraynietSysteem prompt, als een string of tekstblokken.
temperature
top_p
AantalnietSampling controles, waar het model ze neemt. top_k wordt geaccepteerd en weggelaten.
stop_sequencesArray van StringsnietTekst die het antwoord beëindigt. maximaal 4 strings, elk maximaal 256 tekens.
tools
tool_choice
Array, voorwerpnietTools met name, description En input_schema. a web_search Server Tool draait op Web zoekenAndere ingebouwde hulpmiddelen van Anthropic (bash, teksteditor, computergebruik) worden geweigerd met unsupported_tool. tool_choice neemt auto, any, tool of noneen disable_parallel_tool_use.
thinkingObjectniet{"type": "enabled", "budget_tokens": 8192}, {"type": "adaptive"} of {"type": "disabled"}Het budget kiest een inspanningsniveau: onder 2.048 minimum, van 2.048 laag, van 8.192 medium, van 16.384 hoog. output_config.effortOf wel hoog.
streamBooleaannietStream in het eventformaat van Anthropic.
metadataObjectnietGeaccepteerd en genegeerd.

Reactie

{
  "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 Kan ook vasthouden tool_use Blokken en een thinking Blok, van wie signature Het is leeg. stop_reason is end_turn, max_tokens, tool_use of refusalHij werkte op dezelfde manier als finish_reason zijn Chat voltooien; stop_sequence is altijd null, zelfs als een stopreeks het antwoord beëindigde. input_tokens telt alleen verse invoer; de cache-invoer bevindt zich in de twee cache-velden. nymbot Object en de X-Nymbot-Cost-Sats De header.

Streamed, de evenementen zijn Anthropic's: message_start, content_block_start, ping, content_block_delta (text_delta, input_json_delta of thinking_delta), content_block_stop, message_delta met de stop reden, het gebruik en de nymbot kosten van het object, en message_stop. a ping wordt ook elke 15 seconden verzonden terwijl het model werkt. Tool-oproepen komen na de tekst, elk als een tool_use blok met zijn hele input in één input_json_delta.

Fouten op dit eindpunt gebruiken het formaat van Anthropic: {"type": "error", "error": {"type": "not_found_error", "message": "…"}}Een korte balans is 402 billing_errorEen overbelaste provider 503 overloaded_errorEen storing nadat de stream is gestart, wordt verzonden als een error Het evenement.

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

Token tellen

Een schatting van hoeveel input tokens een Messages-verzoek zou gebruiken, zodat een client kan checken voordat het verzendt.

POST https://nymbot.ai/api/v1/messages/count_tokens Je hebt een API sleutel nodig. gratis.

Het lichaam is hetzelfde als BoodschappenZonder max_tokens; de naam van het model moet worden opgelost. Het tellen is een schatting: de tekens van het systeem prompt, berichten, hulpprogramma's en tooldefinities verdeeld door vier, plus 1600 voor elke afbeelding. Het is niet de eigen tokenizer van de provider, dus het werkelijke aantal kan verschillen.

Reactie

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

Lijst van modellen

Elke model en generator die de API accepteert, met wat het kost. De lijst wordt gelezen uit dezelfde live catalogus als de picker van de app, dus het is altijd wat de server zal draaien.

GET https://nymbot.ai/api/v1/models — geen sleutel nodig. Verborgen voor vijf minuten.

GET /api/v1/models/{id} 1 ingang teruggeven.

Het veldtypevereistBeschrijving
typeDe string (query)nietchat (Het is een defect) image, video, audio, embedding of allSommige kunnen worden gegeven, zoals image,video.

Prijzen zijn wat je betaalt, met de vergoeding en marge al in, in dollars en in sats bij de huidige Bitcoin-prijs. balance Dit geeft aan welke balans het model besteedt. nymbot_key is de korte naam van het model in de app. created is altijd 0, omdat de catalogus niet registreert wanneer een model is toegevoegd. per_request in plaats van.

nymbot/auto is altijd eerst, geprijsd als variable, met een routes Een lijst die de tarieven van elke standaardroute geeft, bevat visie en redenering, maar geen hulpmiddelen.

GET /api/v1/models/{id} accepteert dezelfde namen en alias's als een verzoek, en retourneert de invoer voor het model dat ze besluiten.

Reactie

{
  "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 andere types:

  • afbeelding De ingangen hebben capabilities (accepts_image_url, requires_image_url, edit) en een prijs per_generation.
  • Video’s De ingangen hebben max_duration_seconds En resolutionsEn een prijs per_second Voor elke resolutie.
  • Audio De ingangen hebben audio_type speech of transcriptionPrijzen per_1k_chars of per_minute.
  • ingebouwd De ingangen hebben dimensions, context_length, max_inputs En een prijs per miljoen input tokens.

Prijzen gemarkeerd "estimated": true is de schatting van de app voor een generator waarvan de prijs niet wordt gepubliceerd. type terugkeren 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);