Treci la conținut
Înapoi la Nymbot

Baza de cunoștințe Dezvoltatorii

Chat, răspunsuri și mesaje

Trei moduri de a cere unui model ceva, în cele trei formate clienții vorbesc deja, toate rulează pe aceleași modele și facturate în același mod.

Chat completări

Formatul de chat OpenAI, și unul pe care aproape fiecare instrument îl acceptă. Trimiteți conversația până acum și primiți următorul mesaj înapoi.

POST https://nymbot.ai/api/v1/chat/completions Aveți nevoie de o cheie de foc.

numai model şi messages Un parametru de eșantionare pe care modelul ales nu îl ia este scos fără o eroare, astfel încât un corp de solicitare funcționează între modele. supported_parametersCeea ce este refuzat mai degrabă decât aruncat este ceva ce modelul nu poate face deloc: imagini pentru un model care nu poate vedea, instrumente pentru un model care nu le poate apela.

câmpuluiTipulnecesarăDescrierea
modelStringulDanymbot/auto (sau auto) pentru rutarea Nymbot pe soldul standard, sau un model de catalog, cum ar fi anthropic/claude-sonnet-5 pe balanța Pro. Numele scurte și aliasurile aplicației sunt, de asemenea, acceptate. Suficientă.
messagesAradăDaConversație, roluri system, developer (Tratat ca fiind un sistem), user, assistant şi toolConținutul este un șir sau o listă de text şi image_url părţi; imagini numai în mesajele utilizatorului. input_audio și părți ale fișierului sunt refuzate.
streambooleanănuTrimiteți răspunsul așa cum este scris. vezi Streamări.
stream_optionsObiectulnu{"include_usage": true} adaugă o bucată finală cu numărătoare de jetoane și costul.
max_tokens
max_completion_tokens
întreguluinuCele mai multe jetoane pentru a scrie. Scăzut la maximul modelului dacă este mai mare. De asemenea, stabilește cât de mult este deținut din soldul dvs., astfel încât un număr mai mic are nevoie de mai puțin credit pentru a începe.
temperature
top_p
NumărnuControlul eșantionării: temperature De la 0 la 2, top_p De la 0 la 1.
stopString sau arraynuTextul care încheie răspunsul: un șir sau cel mult 4 șiruri, fiecare cu cel mult 256 de caractere. nymbot/auto.
seedîntreguluinuPentru eșantionarea repetabilă, în cazul în care modelul o susține.
presence_penalty
frequency_penalty
NumărnuVerificări de repetare, fiecare de la -2 la 2.
response_formatObiectulnu{"type": "json_object"} sau {"type": "json_schema", "json_schema": {…}}, în cazul în care modelul îl acceptă.Nu este utilizat de nymbot/auto.
tools
tool_choice
parallel_tool_calls
array, string sau obiect, booleannuFuncția de apelare. vezi Instrumentele de apela web_search Instrumentul se întoarce Căutare webLa cel mult 128 de instrumente și 512 KB de definiții, încorporate la cel mult 64 de niveluri adânci; mai mult este un 400.
reasoning_effort
reasoning
Stringul, obiectulnu"minimal", "low", "medium" sau "high"sau {"effort": "high"}. "none" sau {"enabled": false} Se întoarce. vezi raţionamentului.
pluginsAradănu[{"id": "web", "max_results": 5}] întotdeauna caută mai întâi pe web. până la 10 rezultate.
nîntreguluinu1. orice altceva se întoarce 400.
logit_bias
user
metadata
Obiect, String și ObiectnuAcceptat şi nu trimis. logit_bias hărți la maximum 300 de ID-uri de token la numere de la -100 la 100; user este de maximum 256 de caractere; metadata păstrează până la 16 valori de șir, chei de până la 64 de caractere și valori de până la 512.

Răspunsul este obişnuit chat.completionCu toate acestea, costul în usage.cost (în dolari) şi în nymbot Obiectul . model este id-ul modelului rezolvat, deci un nume scurt se întoarce ca cel complet. message.reasoning_contentseparată de răspuns.

răspuns

{
  "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 este elaborat din ceea ce a revenit, deoarece furnizorii raportează în mod diferit: tool_calls Când modelul a cerut instrumente, length atunci când răspunsul a folosit fiecare token permis (sau modelul le-a cheltuit pe toate raționamentul și nu a scris nici un răspuns), content_filter În cazul în care furnizorul a refuzat și stop În caz contrar. usage.completion_tokens_details.reasoning_tokens este întotdeauna 0: jetoanele de raționament ascunse sunt numărate și încărcate, în completion_tokens.

StatutulCând
400nu model sau messages (missing_required_parameter); o parte audio sau fișier, sau imagini pentru un model care nu le poate vedea (unsupported_content(mai mult de 20 de fotografii)too_many_images(în cazul în care nu se încadrează în categoria de referință sau nu se încadrează în categoria de referință)invalid_value); un link foto care nu este public (invalid_image_url); instrumente pe un model care nu le poate numi (unsupported_tool); n altul decât 1; a :thinking Un model care nu poate rezulta din raţiune (model_not_found(sau dacă solicitantul a refuzat solicitarea)upstream_rejected).
402Bilanțul pe care modelul îl cheltuiește nu poate acoperi posesia.
403Cel mai rău caz nu se potrivește capului cheii (key_limit_reached) mai jos max_tokens Sau ridicați capul.
404Nu există nici un model cu acest nume (model_not_found).
429limită de rată a cheii, sau a furnizorului (upstream_rate_limited).
502, 503Proprietarul nu a reușit (upstream_error) sau este supraîncărcat (upstream_overloadedCu Retry-AfterNimic nu este perceput, cu excepția cazului în care furnizorul a facturat pentru încercare.

Codurile de stare ale fiecărei acțiuni endpoint sunt listate sub greșeli.

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

Streamingul

cu "stream": true Răspunsul vine ca un eveniment trimis de server în timp ce modelul îl scrie. chat.completion.chunk este a data: linie, iar fluxul se termină cu data: [DONE]Raţiunea vine în delta.reasoning_contentRăspunsul în delta.content.

Stream orice lucru care poate dura mai mult de aproximativ 100 de secunde, cum ar fi un răspuns lung, o max_tokens O cerere care nu este transmisă nu trimite nimic până când răspunsul este complet, iar rețeaua dintre dvs. și Nymbot poate închide o conexiune inactivă după aproximativ 100 de secunde; modelul se termină încă și ceea ce a scris este încărcat, dar răspunsul este pierdut.

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]
  • Liniile începând cu : Comentariile sunt trimise la fiecare 15 secunde în timp ce modelul se gândește.
  • Cereţi pentru "stream_options": {"include_usage": true} pentru a obține ultima bucată de mai sus, cu un gol choices, tokenul numără, costul și nymbot Obiectul .
  • Dacă închideți conexiunea mai devreme, modelul nu este oprit: Nymbot citește restul fluxului furnizorului, timp de până la 25 de secunde, pentru a obține numărul de jetoane, și plătiți ceea ce raportează furnizorul.
  • O greșeală înainte de prima bucată, cum ar fi 401 sau 402, se întoarce ca un JSON obișnuit cu codul său de stare, nu ca un flux. data: {"error": {…}} eveniment, iar fluxul se termină fără [DONE].
  • Solicitările cu instrumente și modelele de pe transportul de răspunsuri OpenAI nu curg de la furnizor. Ei încă răspund cu un flux valid, trimis odată ce răspunsul este complet.

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

Instrumente de apel

Descrierea funcţiilor în tools şi modelul poate cere să fie chemat în loc să răspundă.Executaţi funcţia, adăugaţi rezultatul ca tool Mesajul cu acelaşi tool_call_idNymbot nu rulează niciodată funcțiile tale; transmite cererea modelului înapoi la tine.

tool_choice ia "auto", "none", "required" sau {"type": "function", "function": {"name": "…"}}Lista de modele marchează modelele care pot apela la instrumente (capabilities.toolsInstrumentele sunt refuzate cu 400 unsupported_tool este nymbot/auto și pe puținele modele de catalog care rulează pe transportul OpenAI Responses, la care Nymbot nu poate transmite instrumente.

cu "stream": true, o cerere cu instrumente rulează într-o singură bucată și apoi este trimisă ca o secvență normală: rolul, o bucată care poartă fiecare apel instrument cu indexul, ID-ul, numele și argumentele și bucată de finisare.

Răspunsul, în parte

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

Fotografii în cerere

Modele cu capabilities.vision Puteți citi imagini. adăugați un image_url parte la un mesaj de utilizator, fie cu un public https:// Link sau a data:image/…;base64, URL. Până la 20 de imagini pe cerere. imaginile SVG sunt refuzate, și așa este un link de peste 4.096 de caractere sau unul cu un nume de utilizator sau o parolă în el (400 invalid_image_urlO opțiune detail este auto, low sau high.

cu nymbot/auto, o solicitare cu o imagine în ea este redirecționată către un model standard care poate vedea. capabilities.vision Refuză fotografiile cu 400 unsupported_contentImaginile pot fi doar în mesajele utilizatorului.O legătură trebuie să indice un gazdă public; Nymbot transmite imaginea furnizorului modelului și nu o păstrează.

O imagine este facturată ca token-ul de intrare pe care furnizorul îl numără pentru ea, la fel ca restul solicitării.

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

raţionamentului

Modele cu capabilities.reasoning poate gândi înainte de a răspunde. cere mai mult sau mai puțin din ea cu reasoning_effort ("minimal", "low", "medium" sau "high") sau "reasoning": {"effort": "high"}sau adăugați :thinking la numele modelului, ceea ce înseamnă efort ridicat. Pe un model fără raționament, setarea este ignorată. nymbot/auto, :thinking trimite cererea pe ruta de raționament standard.

Pe modelele antropice, efortul devine un buget de gândire de aproximativ 1.000, 2.000, 8.000 sau 16.000 de jetoane, niciodată mai mult decât max_tokens Gândirea este lăsată deoparte atunci când tool_choice forțează un instrument, iar atunci când cererea continuă o buclă de instrumente (ultimul său mesaj este un rezultat al instrumentului), deoarece Anthropic are nevoie de gândirea semnată anterior pentru a o relua.

Argumentul se întoarce în message.reasoning_contentsau delta.reasoning_content atunci când se transmite, nu se amestecă niciodată în răspuns. raționamentul este ieșirea și este încărcat ca atare, în interiorul completion_tokensUnii furnizori nu returnează textul de raționament deloc și este încă taxat.

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

Modelul Suficient

Un sufix pe numele modelului schimbă modul în care este tratată cererea, fără un alt câmp. Ele funcționează pe ID-uri complete și pe nume scurte, la fel ca în anthropic/claude-sonnet-5:online.

SuficiențăEfectul
:onlineCaută mai întâi pe web, cum ar fi plugins: [{"id": "web"}]Să Căutare web.
:thinkingefort ridicat de raţionament; pe nymbot/auto, calea raţionamentului.Pe un model care nu poate raţiona, 400 model_not_found cu “no endpoints found”.
:nitro, :floor, :exacto, :extendedFiecare model de catalog are un singur traseu, deci nu există unul mai rapid, mai ieftin sau mai lung pentru a alege; sufixele sunt permise astfel încât numele de modele copiate din alte servicii încă funcționează.

Orice alt sufix este ignorat. Întregul nume este încercat mai întâi, astfel încât un model al cărui ID conține într-adevăr un colon încă funcționează; în caz contrar, sufixele sunt luate de la capăt unul la un moment dat până când un model se potrivește. 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 caută ultimul mesaj al utilizatorului (primii 2000 de caractere), citește cele mai bune pagini și le dă modelului cu o întrebare, marcată ca conținut extern de la care modelul nu ar trebui să ia instrucțiuni.

  • Întotdeauna căutări: "plugins": [{"id": "web", "max_results": 5}]sau a :online Suficient pentru model.
  • Caută când ajută: "tools": [{"type": "web_search", "parameters": {"max_results": 5}}]De asemenea, acceptat ca web_search_preview sau openrouter:web_searchNymbot caută numai atunci când întrebarea pare să aibă nevoie de informații actuale, același test pe care îl folosește aplicația.

max_results este 5 în mod implicit și la maximum 10. sursele se întorc în nymbot.web_search.sourcesFiecare cu o title, snippet şi urlşi ca url_citation Notă pe mesaj.

Fiecare căutare care rulează costă $ 0,008, convertită în sats, pe partea de sus a jetoanelor, și face parte din stoc. paginile pe care le citește sunt jetoane de intrare, de asemenea, astfel încât un răspuns de pe web costă mai mult decât aceeași întrebare întrebată rece, uneori de mai multe ori mai mult.

Răspunsul, în parte

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

Răspunsuri API

Formatul mai nou al OpenAI, folosit de OpenAI Agents SDK și de Codex. Acesta rulează pe aceleași modele, facturare și caracteristici ca și Chat Completions.

POST https://nymbot.ai/api/v1/responses Aveți nevoie de o cheie de foc.

câmpuluiTipulnecesarăDescrierea
modelStringulDaCa pentru Chat completăriSuplimentul este inclus.
inputString sau arrayDaUn șir sau o listă de elemente: mesaje (roluri user, assistant, system, developer) cu input_text, input_image şi output_text părţi, şi function_call şi function_call_output articole pentru instrumente. input_image Ia un image_url link sau URL de date, nu un ID de fișier. reasoning şi web_search_call Obiectele sunt șterse; item_reference este refuzat
instructionsStringulnuInstrucțiuni de sistem.
max_output_tokensîntreguluinuCele mai multe cărți de scris.
temperature
top_p
NumărnuControlul de eșantionare, unde modelul le ia.
tools
tool_choice
parallel_tool_calls
array, string sau obiect, booleannuFuncționarea instrumentelor, în forma Răspunsuri ({"type": "function", "name": …, "parameters": …}a) a web_search sau web_search_preview Instrumentul se întoarce Căutare web când ajută.Alte instrumente încorporate sunt refuzate.
reasoningObiectulnu{"effort": "minimal" | "low" | "medium" | "high"}. xhigh şi max înseamnă high; none Se întoarce.
text.format
response_format
ObiectulnuStructurată, ca o schemă JSON sau json_object.
metadataObiectulnuReturnat neschimbat în răspuns. la maximum 16 valori de șir, chei de până la 64 de caractere și valori de până la 512.
streambooleanănuStream evenimente așa cum este descris mai jos.
storebooleanănuNimic nu este stocat, iar răspunsul spune întotdeauna "store": false.
previous_response_id
conversation
background
String, Obiect și BooleannuNu sunt susținute: 400 unsupported_parameterRăspunsurile nu sunt stocate, așa că trimiteți întreaga conversație în input De fiecare dată.

răspuns

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

O cerere de instrument apare în output ca a function_call Articol cu call_id, name şi argumentstrimite rezultatul înapoi ca a function_call_output Articol cu aceeaşi call_idraţionament, atunci când modelul îl returnează, este o reasoning Articol cu reasoning_text Conținutul este listat mai întâi. status este incomplete Când răspunsul a lovit max_output_tokens Furnizorul a refuzat, cu incomplete_details.reason Setați max_output_tokens sau content_filterRăspunsul echivalează, de asemenea, cu setările solicitării (temperatură, instrumente, alegerea instrumentelor și așa mai departe), așa cum face OpenAI, și poartă nymbot costul obiectului.

Fiecare eveniment, fiecare eveniment este un event: Linia şi a data: Linia cu a sequence_numberÎn această ordine: response.created, response.in_progress, response.output_item.added, response.content_part.addedOrice număr de response.output_text.delta, response.output_text.done, response.content_part.done, response.output_item.doneŞi în cele din urmă response.completed cu utilizarea și costul. Un răspuns scurt se termină cu response.incomplete în schimb, și un eșec după ce fluxul a început cu response.failedraţionalizarea fluxurilor ca pe un obiect propriu cu response.reasoning_text.delta şi .doneApelurile la instrumente vin după mesaj, fiecare ca element cu response.function_call_arguments.delta şi .done.

StatutulCând
400nu model sau input; previous_response_id, conversation, background sau un item_reference (unsupported_parameter( ); un instrument sau un tip de conținut care nu este acceptat.
402, 403, 404, 429, 502, 503În ceea ce privește completările chat.

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

Mesajele antropice

Formatul Anthropic, pentru SDK-urile Anthropic și Claude Code. Funcționează cu fiecare model din catalog, nu numai Claude: cererea este tradusă, rulați prin același conductor și traduceți înapoi.

POST https://nymbot.ai/api/v1/messages — necesită o cheie API, ca x-api-key sau Authorization: Bearer.

pe anthropic-version şi anthropic-beta Numele de modele antropice sunt potrivite cu catalogul, astfel încât Claude Code și SDK-urile funcționează cu numele pe care le folosesc deja:

  • Un nume pe care catalogul îl știe, cum ar fi claude-sonnet-5 sau anthropic/claude-opus-5Este folosit așa cum este.
  • În cazul în care o dată (-20260514), -latest, o versiune tag ca -v1Într-o perioadă aglomerată, precum [1m] şi un anthropic/ sau anthropic. Prefixul este eliminat, iar punctele și dashurile din versiune sunt încercate în ambele moduri (claude-haiku-4-5 găseşte claude-haiku-4.5).
  • Dacă acest lucru încă nu se potrivește, se utilizează familia (Opus, Sonnet sau Haiku), atâta timp cât versiunea catalogului este aceeași sau mai nouă decât cea solicitată.
  • Un nume care nu se potrivește cu nimic se întoarce 404 not_found_error.
câmpuluiTipulnecesarăDescrierea
modelStringulDaO identitate de model catalog sau un nume de model antropic.
max_tokensîntreguluiDaCele mai multe cărți de scris.
messagesAradăDauser şi assistant Se întoarce, cu text, image (base64 sau sursa URL) tool_use şi tool_result de blocuri. thinking Blocurile din tururile anterioare sunt acceptate și aruncate.
systemString sau arraynuSistem prompt, ca un șir sau blocuri de text.
temperature
top_p
NumărnuControlul de eșantionare, unde modelul le ia. top_k Este acceptată şi abandonată.
stop_sequencesAria de stringurinuTextul care încheie răspunsul. La maximum 4 șiruri, fiecare cu maximum 256 de caractere.
tools
tool_choice
Obiectul, obiectulnuInstrumente cu name, description şi input_schemaa web_search Server Tool se întoarce Căutare webAlte instrumente încorporate ale Anthropic (bash, editor de text, utilizarea computerului) sunt refuzate cu unsupported_tool. tool_choice ia auto, any, tool sau noneşi disable_parallel_tool_use.
thinkingObiectulnu{"type": "enabled", "budget_tokens": 8192}, {"type": "adaptive"} sau {"type": "disabled"}Bugetul alege un nivel de efort: sub 2.048 minim, de la 2.048 scăzut, de la 8.192 mediu, de la 16.384 ridicat. output_config.effortsau înaltă.
streambooleanănuStream în format eveniment Anthropic.
metadataObiectulnuacceptată şi ignorată.

răspuns

{
  "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 De asemenea, se poate ține tool_use Blocuri şi a thinking Blocul de care signature este gol. stop_reason este end_turn, max_tokens, tool_use sau refusalA lucrat în acelaşi mod ca şi finish_reason este Chat completări; stop_sequence este întotdeauna null, chiar și atunci când o secvență de oprire a terminat răspunsul. input_tokens se numără doar intrările proaspete; intrările în cache se află în cele două câmpuri de cache. nymbot Obiectul şi X-Nymbot-Cost-Sats în header.

Următoarele evenimente au fost difuzate de Anthropic: message_start, content_block_start, ping, content_block_delta (text_delta, input_json_delta sau thinking_delta), content_block_stop, message_delta Din punctul de vedere al utilizării, utilizarea şi nymbot costul obiectului şi message_stopa ping este, de asemenea, trimis la fiecare 15 secunde în timp ce modelul funcționează. Apelurile la instrumente sosesc după text, fiecare ca o tool_use bloc cu întreaga sa intrare într-un singur input_json_delta.

Erori pe acest endpoint folosind formatul Anthropic: {"type": "error", "error": {"type": "not_found_error", "message": "…"}}Un echilibru scurt este 402 billing_errorUn furnizor supraîncărcat 503 overloaded_errorUn eșec după ce fluxul a început este trimis ca un error Evenimentul .

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

Numărătoare de token

O estimare a numărului de jetoane de intrare pe care o solicitare Mesajele le-ar utiliza, astfel încât un client să poată verifica înainte de a trimite.

POST https://nymbot.ai/api/v1/messages/count_tokens Aveți nevoie de o cheie API.

Corpul este acelaşi ca şi MesajeleFără max_tokensNumărul este o estimare: caractere ale promptului sistemului, mesaje, apeluri la instrumente și definiții de instrumente împărțite la patru, plus 1.600 pentru fiecare imagine. Nu este propriul tokenizer al furnizorului, astfel încât numărul real poate diferi.

răspuns

{ "input_tokens": 318 }

cURL

curl https://nymbot.ai/api/v1/messages/count_tokens \
  -H "x-api-key: $NYMBOT_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "claude-sonnet-5",
    "messages": [{"role": "user", "content": "What is a Lightning invoice?"}]
  }'

Python

import os
import anthropic

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

count = client.messages.count_tokens(
    model="claude-sonnet-5",
    messages=[{"role": "user", "content": "What is a Lightning invoice?"}],
)
print(count.input_tokens)

JavaScript

import Anthropic from "@anthropic-ai/sdk";

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

const count = await client.messages.countTokens({
  model: "claude-sonnet-5",
  messages: [{ role: "user", content: "What is a Lightning invoice?" }],
});
console.log(count.input_tokens);

Listă de modele

Lista este citită din același catalog live ca și selectorul aplicației, deci este întotdeauna ceea ce va rula serverul.

GET https://nymbot.ai/api/v1/models — nu este nevoie de cheie. ascuns timp de cinci minute.

GET /api/v1/models/{id} Returnează o intrare.

câmpuluiTipulnecesarăDescrierea
typeÎntrebări (Query)nuchat (în cazul în care defectul este image, video, audio, embedding sau allMulte dintre ele pot fi folosite, ca image,video.

Prețurile sunt ceea ce plătiți, cu taxa și marja deja în, în dolari și în rate la prețul actual Bitcoin. balance Aflați ce echilibru cheltuiește modelul. nymbot_key este numele scurt al modelului din aplicație. created este întotdeauna 0, deoarece catalogul nu înregistrează când a fost adăugat un model. per_request în schimb.

nymbot/auto întotdeauna pe primul loc, prețul fiind variableCu o routes Lista care oferă ratele fiecărui traseu standard. enumeră viziunea și raționamentul, dar nu și instrumentele.

GET /api/v1/models/{id} acceptă aceleași nume și aliasuri ca o cerere și returnează intrarea pentru modelul pe care îl rezolvă.

răspuns

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

Pentru celelalte tipuri:

  • imaginea Intrările au capabilities (accepts_image_url, requires_image_url, edit(și un preț per_generation.
  • VIDEO Intrările au max_duration_seconds şi resolutionsȘi un preț per_second pentru fiecare rezoluţie.
  • Audio Intrările au audio_type speech sau transcriptionPreţurile per_1k_chars sau per_minute.
  • Încorporare Intrările au dimensions, context_length, max_inputs și un preț pe milion de token-uri de intrare.

Prețuri marcate "estimated": true este estimarea aplicației pentru un generator al cărui preț nu este publicat. type întoarce 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);