Springe zum Inhalt
Zurück zu Nymbot

Wissensdatenbank Entwickler

Chat, Antworten und Nachrichten

Drei Möglichkeiten, ein Modell etwas zu fragen, in den drei Formaten sprechen die Kunden bereits, alle laufen auf den gleichen Modellen und werden auf die gleiche Weise berechnet.

Chat Vollendungen

Das OpenAI-Chat-Format und das, das fast jedes Tool unterstützt.Senden Sie die Konversation so weit und erhalten Sie die nächste Nachricht zurück.

POST https://nymbot.ai/api/v1/chat/completions Sie benötigen einen API-Schlüssel

nur model Und messages Ein Sampling-Parameter, den das gewählte Modell nicht nimmt, wird ohne Fehler fallen gelassen, so dass ein Anforderungskörper über Modelle hinweg funktioniert. supported_parametersWas abgelehnt wird, ist etwas, was das Modell überhaupt nicht tun kann: Bilder für ein Modell, das nicht sehen kann, Werkzeuge für ein Modell, das sie nicht anrufen kann.

FeldTyperforderlichBeschreibung
modelStringJanymbot/auto (oder auto) für Nymbots Routing auf der Standardbilanz oder eine Katalogmodell-ID wie anthropic/claude-sonnet-5 auf dem Pro-Balance. Die kurzen Namen und Alias der App werden ebenfalls akzeptiert. genügt.
messagesArrayJaDas Gespräch, die Rollen system, developer (behandelt wird als System) user, assistant Und toolInhalt ist eine Zeile oder eine Liste von text Und image_url Teile; Bilder nur in Benutzernachrichten. input_audio Teile der Dateien werden abgelehnt.
streamBooleanNeinSenden Sie die Antwort so, wie sie geschrieben ist. siehe Streaming.
stream_optionsObjektNein{"include_usage": true} fügt ein letztes Stück mit Token-Zahlen und der Kosten hinzu.
max_tokens
max_completion_tokens
integrierenNeinDie meisten Token zu schreiben. Abgesenkt auf das Maximum des Modells, wenn höher. stellt auch fest, wie viel aus Ihrem Saldo gehalten wird, so dass eine kleinere Anzahl weniger Kredit benötigt, um zu beginnen.
temperature
top_p
AnzahlNeinKontrolle der Sampling: temperature von 0 bis 2, top_p von 0 bis 1.
stopString oder ArrayNeinText, der die Antwort beendet: eine Zeichenfolge oder maximal 4 Zeichenfolgen, jeweils maximal 256 Zeichen. nymbot/auto.
seedintegrierenNeinFür wiederholbare Probenahme, wo das Modell es unterstützt.
presence_penalty
frequency_penalty
AnzahlNeinWiederholungskontrollen, jeweils von -2 bis 2.
response_formatObjektNein{"type": "json_object"} oder {"type": "json_schema", "json_schema": {…}}, wo das Modell es unterstützt. Nicht von nymbot/auto.
tools
tool_choice
parallel_tool_calls
Array, String oder Objekt, BooleanNeinFunktion Calling. siehe Tool Anrufe. a web_search Tool dreht sich um WEB SucheBei maximal 128 Tools und 512 KB Definitionen, eingebettet auf maximal 64 Ebenen tief; mehr ist ein 400.
reasoning_effort
reasoning
String, ObjektNein"minimal", "low", "medium" oder "high"oder {"effort": "high"}. "none" oder {"enabled": false} Schalten Sie es ab. siehe Begründung.
pluginsArrayNein[{"id": "web", "max_results": 5}] Suche immer zuerst im Internet. bis zu 10 Ergebnisse.
nintegrierenNein1. Alles andere kehrt zurück 400.
logit_bias
user
metadata
Objekt, String und ObjektNeinAkzeptiert und nicht gesendet. logit_bias Karten mit maximal 300 Token-IDs auf Zahlen von -100 bis 100; user ist maximal 256 Zeichen; metadata hält maximal 16 Zeichenfolgewerte, Schlüssel bis zu 64 Zeichen und Werte bis zu 512.

Die Antwort ist eine gewöhnliche chat.completionMit den Kosten in usage.cost (in Dollar) und in der nymbot Das Objekt . model ist die gelöste Modell-id, so dass ein kurzer Name als der volle zurückkommt. message.reasoning_contentgetrennt von der Antwort.

Reaktionen

{
  "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 wird aus dem herausgearbeitet, was zurückgekehrt ist, da Anbieter es anders melden: tool_calls Wenn das Modell nach Werkzeugen bittet, length wenn die Antwort alle zulässigen Token verwendet hat (oder das Modell sie alle mit Argumentation verbrachte und keine Antwort schrieb), content_filter wenn der Anbieter abgelehnt hat, und stop Andernfalls aber usage.completion_tokens_details.reasoning_tokens ist immer 0: versteckte Argumentationstoken werden gezählt und in completion_tokens.

StatusWann
400Nein model oder messages (missing_required_parameter); ein Audio- oder Datei-Teil oder Bilder für ein Modell, das sie nicht sehen kann (unsupported_content); mehr als 20 Bilder (too_many_images); ein Stichprobenparameter des falschen Typs oder aus dem Bereich (invalid_value); ein Bildlink, der nicht öffentlich ist (invalid_image_url); Werkzeuge auf einem Modell, das sie nicht nennen kann (unsupported_tool); n Andere als 1; a :thinking ein Modell, das nicht vernünftig ist (model_not_found) oder der Anbieter den Antrag abgelehnt hat (upstream_rejected).
402Das Guthaben, das das Modell ausgibt, kann die Haltung nicht decken.
403Der schlimmste Fall passt nicht zur Schlüsselkappe (key_limit_reached) niedriger max_tokens Oder die Kappe anheben.
404Kein Modell mit diesem Namen (model_not_found).
429Die Rate der Schlüsselbegrenzung, oder die der Anbieter (upstream_rate_limited).
502, 503Der Anbieter hat versagt (upstream_error) oder ist überlastet (upstream_overloaded, mit Retry-AfterNichts wird berechnet, es sei denn, der Anbieter hat für den Versuch berechnet.

Die Statuscodes jeder Endpunkt-Aktie sind unter 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

mit "stream": true Die Antwort kommt als Server-gesandte Ereignisse, während das Modell es schreibt. chat.completion.chunk ist a data: Linie, und der Strom endet mit data: [DONE]Die Vernunft kommt in delta.reasoning_contentDie Antwort in delta.content.

Streamen Sie alles, was länger als etwa 100 Sekunden dauern kann, z. B. eine lange Antwort, eine große max_tokens Eine Anfrage, die nicht gestreamt wird, sendet nichts, bis die Antwort abgeschlossen ist, und das Netzwerk zwischen Ihnen und Nymbot kann nach etwa 100 Sekunden eine leere Verbindung schließen; das Modell endet immer noch und das, was es geschrieben hat, wird geladen, aber die Antwort ist 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]
  • Linien beginnend mit : sind live-Kommentare, die alle 15 Sekunden gesendet werden, während das Modell denkt.
  • Fragen Sie nach "stream_options": {"include_usage": true} um das letzte Stück oben zu bekommen, mit einem leeren choices, der Token zählt, die Kosten und die nymbot Das Objekt .
  • Wenn Sie die Verbindung frühzeitig schließen, wird das Modell nicht gestoppt: Nymbot liest den restlichen Stream des Anbieters, für bis zu 25 Sekunden, um seine Token-Zählung zu erhalten, und Sie zahlen, was der Anbieter berichtet.
  • Ein Fehler vor dem ersten Stück, wie 401 oder 402, kehrt als gewöhnliche JSON mit seinem Statuscode zurück, nicht als Stream. data: {"error": {…}} Ereignis, und der Strom endet ohne [DONE].
  • Anfragen mit Tools und Modellen auf OpenAI's Responses Transport fließen nicht vom Anbieter. Sie antworten immer noch mit einem gültigen Stream, gesendet, sobald die Antwort abgeschlossen ist.

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 Anrufe

Beschreiben Sie Funktionen in tools und das Modell kann anrufen, anstatt zu antworten. Sie führen die Funktion aus, fügen Sie ihr Ergebnis als tool Nachricht mit der gleichen tool_call_idNymbot führt Ihre Funktionen nie aus; es übermittelt die Anfrage des Modells an Sie zurück.

tool_choice nimmt "auto", "none", "required" oder {"type": "function", "function": {"name": "…"}}Die Modellliste markiert, welche Modelle Tools anrufen können (capabilities.toolsDie Werkzeuge werden abgelehnt 400 unsupported_tool ist nymbot/auto und auf den wenigen Katalogmodellen, die auf OpenAI's Responses Transport laufen, an die Nymbot keine Tools weitergeben kann.

mit "stream": true, eine Anfrage mit Tools läuft in einem Stück und wird dann als normale Stück-Sequenz gesendet: die Rolle, ein Stück, das jeden Tool-Anruf mit seinem Index, ID, Namen und Argumenten und dem Finish-Stück trägt.

Die Antwort ist 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);

Bilder in einer Anfrage

Modelle mit capabilities.vision kann Bilder lesen. fügen Sie eine image_url Teil zu einer Benutzernachricht, entweder mit einem Publikum https:// Link oder A data:image/…;base64, URL. Bis zu 20 Bilder pro Anfrage. SVG Bilder werden abgelehnt, und so ist ein Link über 4096 Zeichen oder einer mit einem Benutzernamen oder Passwort darin (400 invalid_image_urlEine optionale detail ist auto, low oder high.

mit nymbot/auto, eine Anfrage mit einem Bild darin wird zu einem Standardmodell umgeleitet, das gesehen werden kann. capabilities.vision Ablehnung von Bildern mit 400 unsupported_contentEin Link muss auf einen öffentlichen Host hinweisen; Nymbot übermittelt das Bild an den Anbieter des Modells und behält es nicht.

Ein Bild wird als die Eingabetoken berechnet, die der Anbieter für es zählt, wie der Rest der Anfrage.

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

Begründung

Modelle mit capabilities.reasoning können denken, bevor sie antworten. fragen Sie mehr oder weniger davon mit reasoning_effort ("minimal", "low", "medium" oder "high") oder "reasoning": {"effort": "high"}oder hinzufügen :thinking dem Modellnamen, was hohe Anstrengung bedeutet. Auf einem Modell ohne Begründung wird die Einstellung ignoriert. nymbot/auto, :thinking sendet die Anfrage an den Standardweg der Argumentation.

Auf Anthropic-Modellen wird die Anstrengung zu einem Denkbudget von etwa 1.000, 2.000, 8.000 oder 16.000 Token, nie mehr als max_tokens Das Denken ist ausgelassen, wenn tool_choice Erzwingt ein Tool, und wenn die Anfrage eine Tool-Schleife fortsetzt (seine letzte Nachricht ist ein Tool-Ergebnis), weil Anthropic das zuvor signierte Denken benötigt, um es wieder aufzunehmen.

Die Vernunft kehrt in message.reasoning_contentoder delta.reasoning_content beim Streamen niemals in die Antwort gemischt.Reasoning ist Ausgabe und wird als solches in completion_tokensEinige Anbieter geben den Begründungstext überhaupt nicht zurück und es wird immer noch in Rechnung gestellt.

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

Modelle ausreichend

Ein Suffix auf dem Modellnamen ändert, wie die Anfrage bearbeitet wird, ohne ein anderes Feld. anthropic/claude-sonnet-5:online.

ausreichendWirkung
:onlineSuchen Sie zuerst im Internet, wie plugins: [{"id": "web"}]Siehe WEB Suche.
:thinkinghohe Verstandesleistung; auf nymbot/autoDer Weg der Vernunft, auf einem Modell, das keine Vernunft kann, 400 model_not_found mit “keine Endpunkte gefunden”.
:nitro, :floor, :exacto, :extendedJedes Katalogmodell hat eine Route, also gibt es keine schnellere, billigere oder längere zu wählen; die Suffixes sind erlaubt, so dass Modellnamen, die von anderen Diensten kopiert werden, immer noch funktionieren.

Jeder andere Suffix wird ignoriert. Der gesamte Name wird zuerst ausprobiert, so dass ein Modell, dessen ID tatsächlich einen Kolon enthält, immer noch funktioniert; andernfalls werden Suffixes von dem Ende eines nach dem anderen entfernt, bis ein Modell übereinstimmt. Ein Modellname kann maximal 200 Zeichen lang sein mit maximal 4 Suffixen; ein längerer wird abgelehnt 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 sucht nach der letzten Benutzernachricht (seinen ersten 2000 Zeichen), liest die besten Seiten und gibt sie dem Modell mit der Frage, markiert als externe Inhalte, von denen das Modell keine Anweisungen nehmen sollte.

  • Immer suchen: "plugins": [{"id": "web", "max_results": 5}]oder a :online suffix auf das Modell.
  • Suchen, wenn es hilft: "tools": [{"type": "web_search", "parameters": {"max_results": 5}}]Auch akzeptiert als web_search_preview oder openrouter:web_searchNymbot sucht nur, wenn die Frage aktuelle Informationen benötigt, dasselbe Test, den die App verwendet.

max_results ist 5 standardmäßig und maximal 10. Die Quellen kommen in nymbot.web_search.sourcesJeder mit einem title, snippet Und urlund als url_citation Anmerkungen an die Nachricht.

Jede Suche, die läuft kostet $ 0,008, umgewandelt in Sats, oben auf den Token, und es ist Teil der Halte.Die Seiten, die es liest, sind Eingabe-Token auch, so eine Antwort aus dem Web kostet mehr als die gleiche Frage gefragt kalt, manchmal mehrmals mehr.

Die Antwort ist 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);

Antwort Feuer

Das neuere Format von OpenAI, das vom OpenAI Agents SDK und von Codex verwendet wird. Es läuft auf den gleichen Modellen, Abrechnung und Funktionen wie Chat Completions.

POST https://nymbot.ai/api/v1/responses Sie benötigen einen API-Schlüssel

FeldTyperforderlichBeschreibung
modelStringJaWie für Chat VollendungenDie Suffixes sind enthalten.
inputString oder ArrayJaEine Zeile oder eine Liste von Elementen: Nachrichten (Rollen) user, assistant, system, developer) mit input_text, input_image Und output_text Teile und function_call Und function_call_output Gegenstände für Tools. input_image nimmt ein image_url Link oder Daten-URL, keine Datei-ID reasoning Und web_search_call Gegenstände werden übersprungen; item_reference ist abgelehnt worden.
instructionsStringNeinAnweisungen des Systems.
max_output_tokensintegrierenNeinDie meisten Token zu schreiben.
temperature
top_p
AnzahlNeinSampling-Kontrollen, wo das Modell sie nimmt.
tools
tool_choice
parallel_tool_calls
Array, String oder Objekt, BooleanNeinFunktionswerkzeuge, in der Form der Antworten ({"type": "function", "name": …, "parameters": …}) a web_search oder web_search_preview Tool dreht sich um WEB Suche Wenn es hilft, werden andere eingebaute Tools abgelehnt.
reasoningObjektNein{"effort": "minimal" | "low" | "medium" | "high"}. xhigh Und max bedeutet high; none Wende es ab.
text.format
response_format
ObjektNeinStrukturierte Ausgabe, wie ein JSON-Schema oder json_object.
metadataObjektNeinBei maximal 16 Zeichenfolgewerten, Schlüssel bis zu 64 Zeichen und Werte bis zu 512.
streamBooleanNeinStream Events wie unten beschrieben.
storeBooleanNeinNichts wird gespeichert, und die Antwort sagt immer: "store": false.
previous_response_id
conversation
background
String, Objekt und BooleanNeinNicht unterstützt werden: 400 unsupported_parameterAntworten werden nicht gespeichert, so senden Sie die gesamte Konversation in input Jedes Mal

Reaktionen

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

Eine Tool-Anforderung erscheint in output als a function_call Punkt mit call_id, name Und argumentsSenden Sie das Ergebnis als A zurück function_call_output Artikel mit der gleichen call_idReasoning, wenn das Modell es zurückgibt, ist ein reasoning Punkt mit reasoning_text Inhalt, aufgeführt zuerst status ist incomplete Wenn die Antwort trifft max_output_tokens oder der Anbieter verweigert, mit incomplete_details.reason Setzen Sie max_output_tokens oder content_filterDie Antwort widerspiegelt auch die Einstellungen der Anfrage (Temperatur, Werkzeuge, Werkzeugwahl usw.) wie die von OpenAI, und trägt die nymbot Kosten des Objekts.

Streamed, jedes Ereignis ist ein event: Linie und a data: Linie mit a sequence_numberIn dieser Reihenfolge: response.created, response.in_progress, response.output_item.added, response.content_part.addedJede Anzahl von response.output_text.delta, response.output_text.done, response.content_part.done, response.output_item.doneUnd schließlich response.completed mit der Verwendung und Kosten. Eine Antwort schneidet kurze Enden mit response.incomplete statt, und ein Scheitern, nachdem der Strom begann mit response.failedReasoning Streams als eigenes Objekt mit response.reasoning_text.delta Und .doneTool-Anrufe kommen nach der Nachricht, jede als ein Element mit response.function_call_arguments.delta Und .done.

StatusWann
400Nein model oder input; previous_response_id, conversation, background oder ein item_reference (unsupported_parameter); ein nicht unterstütztes Tool oder ein Inhaltstyp.
402, 403, 404, 429, 502, 503Was die Chat-Vervollständigung angeht.

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

Anthropische Botschaften

Das Format von Anthropic, für die Anthropic SDKs und Claude Code. Es funktioniert mit jedem Modell im Katalog, nicht nur Claude: Die Anfrage wird übersetzt, durch dieselbe Pipeline ausgeführt und zurück übersetzt.

POST https://nymbot.ai/api/v1/messages Sie benötigen einen API-Schlüssel, wie x-api-key oder Authorization: Bearer.

Die anthropic-version Und anthropic-beta Anthropische Modellnamen werden dem Katalog angepasst, so dass Claude Code und die SDKs mit den Namen arbeiten, die sie bereits verwenden:

  • Ein Name, den der Katalog kennt, wie claude-sonnet-5 oder anthropic/claude-opus-5Es wird verwendet, wie es ist.
  • Ansonsten ist ein Datum (-20260514), -latest, eine Version tag wie -v1Ein bracketed Tag wie [1m] und ein anthropic/ oder anthropic. Die Vorwahl wird abgenommen, und die Punkte und Dashes in der Version werden auf beide Arten ausprobiert (claude-haiku-4-5 findet claude-haiku-4.5).
  • Wenn das noch nicht stimmt, wird die Familie (Opus, Sonnet oder Haiku) verwendet, solange die Version des Katalogs dieselbe oder neuer ist als die angeforderte.
  • Ein Name, der nichts entspricht, kehrt zurück 404 not_found_error.
FeldTyperforderlichBeschreibung
modelStringJaEin Katalog-Modell-ID oder ein Anthropic-Modell-Name.
max_tokensintegrierenJaDie meisten Token zu schreiben.
messagesArrayJauser Und assistant Drehen, mit text, image (base64 oder URL Quelle) tool_use Und tool_result Die Blöcke. thinking Blöcke aus früheren Schritten werden akzeptiert und fallen gelassen.
systemString oder ArrayNeinSystem-Prompt, wie eine Zeile oder Textblöcke.
temperature
top_p
AnzahlNeinSampling-Kontrollen, wo das Modell sie nimmt. top_k akzeptiert und abgeworfen wurde.
stop_sequencesArray von StringsNeinText, der die Antwort beendet. Maximal 4 Zeichenfolgen, jeweils maximal 256 Zeichen.
tools
tool_choice
Array, ObjektNeinTools mit name, description Und input_schema. a web_search Server-Tool wird auf WEB Suche; Andere eingebaute Tools von Anthropic (Bash, Texteditor, Computerbenutzung) werden mit unsupported_tool. tool_choice nimmt auto, any, tool oder noneund disable_parallel_tool_use.
thinkingObjektNein{"type": "enabled", "budget_tokens": 8192}, {"type": "adaptive"} oder {"type": "disabled"}Das Budget wählt ein Anstrengungsniveau: unter 2.048 minimal, von 2.048 niedrig, von 8.192 mittel, von 16.384 hoch. output_config.effortoder hoch sein.
streamBooleanNeinStream im Eventformat von Anthropic.
metadataObjektNeinAkzeptiert und ignoriert.

Reaktionen

{
  "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 Kann auch halten tool_use Blöcke und A thinking Block, dessen signature Es ist leer. stop_reason ist end_turn, max_tokens, tool_use oder refusalund arbeitete auf die gleiche Weise wie finish_reason ist Chat Vollendungen; stop_sequence ist immer null, auch wenn eine Stop-Sequenz die Antwort beendete. input_tokens nur frische Eingaben zählen; Cached-Eingaben befinden sich in den beiden Cachefeldern. nymbot Objekt und die X-Nymbot-Cost-Sats Der Header.

Streamed, die Ereignisse sind Anthropic's: message_start, content_block_start, ping, content_block_delta (text_delta, input_json_delta oder thinking_delta), content_block_stop, message_delta mit dem Stop-Reason, der Verwendung und der nymbot Objektkosten und message_stop. a ping wird auch alle 15 Sekunden gesendet, während das Modell arbeitet. Tool-Anrufe kommen nach dem Text, jeder als tool_use Block mit seiner gesamten Eingabe in einem input_json_delta.

Fehler an diesem Endpunkt verwenden das Format von Anthropic: {"type": "error", "error": {"type": "not_found_error", "message": "…"}}Eine kurze Balance ist 402 billing_errorEin überlasteter Anbieter 503 overloaded_errorEin Ausfall, nachdem der Stream gestartet wurde, wird als error Das 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);

Zählen von Token

Eine Schätzung, wie viele Eingabe-Token eine Nachrichtenanfrage verwenden würde, so dass ein Client vor dem Senden überprüfen kann.

POST https://nymbot.ai/api/v1/messages/count_tokens Sie benötigen einen API-Schlüssel.

Der Körper ist der gleiche wie der NachrichtenOhne max_tokens; der Modellname muss gelöst werden. Die Zählung ist eine Schätzung: die Zeichen der Systemanrufe, Nachrichten, Tool-Anrufe und Tool-Definitionen werden durch vier geteilt, plus 1.600 für jedes Bild. Es ist nicht der eigene Tokenizer des Anbieters, so dass die tatsächliche Zählung variieren kann.

Reaktionen

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

Liste der Modelle

Jedes Modell und jeder Generator, den die API akzeptiert, mit dem, was es kostet.Die Liste wird aus dem gleichen Live-Katalog wie der Picker der App gelesen, so dass es immer das ist, was der Server laufen wird.

GET https://nymbot.ai/api/v1/models Kein Schlüssel benötigt. versteckt für fünf Minuten.

GET /api/v1/models/{id} 1 Eingang zurückgeben.

FeldTyperforderlichBeschreibung
typeString für QueryNeinchat (Das ist ein Default) image, video, audio, embedding oder allMehrere können gegeben werden, wie image,video.

Preise sind das, was Sie zahlen, mit der Gebühr und der Marge bereits in, in Dollar und in Sats zum aktuellen Bitcoin-Preis. balance sagt, welche Balance das Modell ausgibt. nymbot_key ist der kurze Name des Modells in der App. created ist immer 0, da der Katalog nicht aufzeichnet, wann ein Modell hinzugefügt wurde. per_request stattdessen.

nymbot/auto Es ist immer zuerst, Preis wie variable, mit einem routes Liste, die die Preise jeder Standardroute angibt. Es listet Vision und Argumentation auf, aber keine Werkzeuge.

GET /api/v1/models/{id} akzeptiert die gleichen Namen und Alias als Anfrage und gibt den Eintrag für das Modell zurück, für das sie sich entscheiden.

Reaktionen

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

Die anderen Typen:

  • Bild Eingänge haben capabilities (accepts_image_url, requires_image_url, edit) und einen Preis per_generation.
  • Das Video Eingänge haben max_duration_seconds Und resolutionsUnd ein Preis per_second Für jede Resolution.
  • Das Audio Eingänge haben audio_type speech oder transcriptionPreise per_1k_chars oder per_minute.
  • Einbettung Eingänge haben dimensions, context_length, max_inputs und einen Preis pro Million Input-Token.

Preise markiert "estimated": true ist die Schätzung der App für einen Generator, dessen Preis nicht veröffentlicht wird. type Rückkehr 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);