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.
Diese Seite wurde der Einfachheit halber maschinell übersetzt. Es gilt das englische Original.
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.
| Feld | Typ | erforderlich | Beschreibung |
|---|---|---|---|
model | String | Ja | nymbot/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. |
messages | Array | Ja | Das 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. |
stream | Boolean | Nein | Senden Sie die Antwort so, wie sie geschrieben ist. siehe Streaming. |
stream_options | Objekt | Nein | {"include_usage": true} fügt ein letztes Stück mit Token-Zahlen und der Kosten hinzu. |
max_tokensmax_completion_tokens | integrieren | Nein | Die 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. |
temperaturetop_p | Anzahl | Nein | Kontrolle der Sampling: temperature von 0 bis 2, top_p von 0 bis 1. |
stop | String oder Array | Nein | Text, der die Antwort beendet: eine Zeichenfolge oder maximal 4 Zeichenfolgen, jeweils maximal 256 Zeichen. nymbot/auto. |
seed | integrieren | Nein | Für wiederholbare Probenahme, wo das Modell es unterstützt. |
presence_penaltyfrequency_penalty | Anzahl | Nein | Wiederholungskontrollen, jeweils von -2 bis 2. |
response_format | Objekt | Nein | {"type": "json_object"} oder {"type": "json_schema", "json_schema": {…}}, wo das Modell es unterstützt. Nicht von nymbot/auto. |
toolstool_choiceparallel_tool_calls | Array, String oder Objekt, Boolean | Nein | Funktion 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_effortreasoning | String, Objekt | Nein | "minimal", "low", "medium" oder "high"oder {"effort": "high"}. "none" oder {"enabled": false} Schalten Sie es ab. siehe Begründung. |
plugins | Array | Nein | [{"id": "web", "max_results": 5}] Suche immer zuerst im Internet. bis zu 10 Ergebnisse. |
n | integrieren | Nein | 1. Alles andere kehrt zurück 400. |
logit_biasusermetadata | Objekt, String und Objekt | Nein | Akzeptiert 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.
| Status | Wann |
|---|---|
400 | Nein 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). |
402 | Das Guthaben, das das Modell ausgibt, kann die Haltung nicht decken. |
403 | Der schlimmste Fall passt nicht zur Schlüsselkappe (key_limit_reached) niedriger max_tokens Oder die Kappe anheben. |
404 | Kein Modell mit diesem Namen (model_not_found). |
429 | Die Rate der Schlüsselbegrenzung, oder die der Anbieter (upstream_rate_limited). |
502, 503 | Der 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 leerenchoices, der Token zählt, die Kosten und dienymbotDas 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
401oder402, 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.
| ausreichend | Wirkung |
|---|---|
:online | Suchen Sie zuerst im Internet, wie plugins: [{"id": "web"}]Siehe WEB Suche. |
:thinking | hohe 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, :extended | Jedes 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);
WEB Suche
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:onlinesuffix auf das Modell. - Suchen, wenn es hilft:
"tools": [{"type": "web_search", "parameters": {"max_results": 5}}]Auch akzeptiert alsweb_search_previewoderopenrouter: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
| Feld | Typ | erforderlich | Beschreibung |
|---|---|---|---|
model | String | Ja | Wie für Chat VollendungenDie Suffixes sind enthalten. |
input | String oder Array | Ja | Eine 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. |
instructions | String | Nein | Anweisungen des Systems. |
max_output_tokens | integrieren | Nein | Die meisten Token zu schreiben. |
temperaturetop_p | Anzahl | Nein | Sampling-Kontrollen, wo das Modell sie nimmt. |
toolstool_choiceparallel_tool_calls | Array, String oder Objekt, Boolean | Nein | Funktionswerkzeuge, 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. |
reasoning | Objekt | Nein | {"effort": "minimal" | "low" | "medium" | "high"}. xhigh Und max bedeutet high; none Wende es ab. |
text.formatresponse_format | Objekt | Nein | Strukturierte Ausgabe, wie ein JSON-Schema oder json_object. |
metadata | Objekt | Nein | Bei maximal 16 Zeichenfolgewerten, Schlüssel bis zu 64 Zeichen und Werte bis zu 512. |
stream | Boolean | Nein | Stream Events wie unten beschrieben. |
store | Boolean | Nein | Nichts wird gespeichert, und die Antwort sagt immer: "store": false. |
previous_response_idconversationbackground | String, Objekt und Boolean | Nein | Nicht 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.
| Status | Wann |
|---|---|
400 | Nein 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, 503 | Was 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-5oderanthropic/claude-opus-5Es wird verwendet, wie es ist. - Ansonsten ist ein Datum (
-20260514),-latest, eine Version tag wie-v1Ein bracketed Tag wie[1m]und einanthropic/oderanthropic.Die Vorwahl wird abgenommen, und die Punkte und Dashes in der Version werden auf beide Arten ausprobiert (claude-haiku-4-5findetclaude-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
404not_found_error.
| Feld | Typ | erforderlich | Beschreibung |
|---|---|---|---|
model | String | Ja | Ein Katalog-Modell-ID oder ein Anthropic-Modell-Name. |
max_tokens | integrieren | Ja | Die meisten Token zu schreiben. |
messages | Array | Ja | user 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. |
system | String oder Array | Nein | System-Prompt, wie eine Zeile oder Textblöcke. |
temperaturetop_p | Anzahl | Nein | Sampling-Kontrollen, wo das Modell sie nimmt. top_k akzeptiert und abgeworfen wurde. |
stop_sequences | Array von Strings | Nein | Text, der die Antwort beendet. Maximal 4 Zeichenfolgen, jeweils maximal 256 Zeichen. |
toolstool_choice | Array, Objekt | Nein | Tools 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. |
thinking | Objekt | Nein | {"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. |
stream | Boolean | Nein | Stream im Eventformat von Anthropic. |
metadata | Objekt | Nein | Akzeptiert 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.
| Feld | Typ | erforderlich | Beschreibung |
|---|---|---|---|
type | String für Query | Nein | chat (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 Preisper_generation. - Das Video Eingänge haben
max_duration_secondsUndresolutionsUnd ein Preisper_secondFür jede Resolution. - Das Audio Eingänge haben
audio_typespeechodertranscriptionPreiseper_1k_charsoderper_minute. - Einbettung Eingänge haben
dimensions,context_length,max_inputsund 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);