Přejít na obsah
Zpět na Nymbot

Znalostní základna Vývojáři

Chat, odpovědi a zprávy

Tři způsoby, jak se zeptat modelu něco, ve třech formátech klienti již mluví, všichni běží na stejných modelech a účtují stejným způsobem.

Chatové dokončení

Formát chatu OpenAI, a ten, který podporuje téměř každý nástroj. Odeslat konverzaci tak daleko a získat další zprávu zpět.

POST https://nymbot.ai/api/v1/chat/completions Potřebujete API klíč.

Pouze model a messages Vzorkovací parametr, který vybraný model nepřijímá, se bez chyby ztrácí, takže jeden požadavek funguje přes modely. supported_parametersTo, co je spíše odmítnuto než upuštěno, je něco, co model vůbec nemůže udělat: obrázky pro model, který nemůže vidět, nástroje pro model, který je nemůže zavolat.

poleTypPožadovánoPopisek
modelStringovéAnonymbot/auto (nebo auto) pro směrování Nymbotu na standardní bilanci nebo ID modelu katalogu, jako je anthropic/claude-sonnet-5 na Pro zůstatku. Krátké názvy a aliasy aplikace jsou také akceptovány. Stačí.
messagesArrayAnoRozhovor - Role system, developer (používá se jako systém) user, assistant a toolObsah je řetězec nebo seznam text a image_url části; obrázky pouze v uživatelských zprávách. input_audio Soubory jsou odmítnuty.
streambooleanůneOdpověď posílejte tak, jak je napsána. Streamování.
stream_optionsObjektyne{"include_usage": true} přidává konečný kus s počty tokenů a náklady.
max_tokens
max_completion_tokens
integerneNejvíce tokenů, které je třeba napsat. Snížená na maximum modelu, pokud je vyšší. Také určuje, kolik je drženo z vašeho zůstatku, takže menší počet potřebuje méně kreditu, aby mohl začít.
temperature
top_p
ČísloneVzorkové kontroly : temperature od 0 do 2, top_p od 0 do 1.
stopString nebo arrayneText, který končí odpovědí: řetěz nebo nejvýše 4 řetězce, každý nejvýše 256 znaků. nymbot/auto.
seedintegernePro opakované odběr vzorků, kde je model podporuje.
presence_penalty
frequency_penalty
ČísloneOpakované kontroly, každé od -2 do 2.
response_formatObjektyne{"type": "json_object"} nebo {"type": "json_schema", "json_schema": {…}}, kde model podporuje.Nepoužívá se nymbot/auto.
tools
tool_choice
parallel_tool_calls
Array, String nebo Object, BooleanneFunkce volání. viz Nástroj volání• A web_search Nástroj se otáčí Webové vyhledáváníNejvíce 128 nástrojů a 512 KB definic, vložených na nejvýše 64 úrovních hloubky; více je 400.
reasoning_effort
reasoning
String, předmětne"minimal", "low", "medium" nebo "high"nebo {"effort": "high"}. "none" nebo {"enabled": false} Otevřete ji.cz Rozumění.
pluginsArrayne[{"id": "web", "max_results": 5}] vždy hledá nejprve na webu.Až 10 výsledků.
nintegerne1) Všechno ostatní se vrací 400.
logit_bias
user
metadata
String, String a objektnePřijaté a neposlané. logit_bias mapy s maximálně 300 identifikátory tokenů na čísla od -100 do 100; user Maximálně 256 znaků. metadata obsahuje maximálně 16 hodnot řetězce, klíče až 64 znaků a hodnoty až 512.

Odpověď je obyčejná chat.completionS náklady na usage.cost (v dolarech) a v nymbot předmětů . model je vyřešený model id, takže krátký název se vrací jako úplný. message.reasoning_contentoddělené od odpovědi.

Odpověď

{
  "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 je zpracována z toho, co se vrátilo, protože poskytovatelé to hlásí jinak: tool_calls Když se zeptáte na nástroje, length když odpověď použila každý token povolený (nebo model strávil všechny uvažování a napsal žádnou odpověď), content_filter když poskytovatel odmítl, a stop Jinak ale usage.completion_tokens_details.reasoning_tokens je vždy 0: skryté tokeny jsou počítány a účtovány v completion_tokens.

statusuKdy
400ne model nebo messages (missing_required_parameter); zvuková nebo souborová část nebo obrázky pro model, který je nemůže vidět (unsupported_content); více než 20 obrázků (too_many_images); vzorkový parametr nesprávného typu nebo mimo rozsah (invalid_value); odkaz na obrázek, který není veřejný (invalid_image_url); nástroje na modelu, který je nemůže nazvat (unsupported_tool); n jiný než 1; a :thinking Některé modely, které nemůžou rozumět (model_not_found(nebo poskytovatel odmítl žádost)upstream_rejected).
402Zůstatek, který model utratí, nemůže pokrýt držení.
403Nejhorší případ není v souladu s klíčovou kapotou (key_limit_reached) nižší max_tokens Nebo zvednout hlavu.
404Žádný model s tímto názvem (model_not_found).
429Výpočet cenového limitu klíče nebo poskytovatele (upstream_rate_limited).
502, 503Poskytovatel neprošel (upstream_error) nebo je přetížen (upstream_overloaded, s Retry-AfterNic není účtováno, pokud poskytovatel neúčtuje za pokus.

Stavové kódy každé koncové akcie jsou uvedeny pod Chyby.

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

Streamování

s "stream": true Odpověď přichází jako událost odeslaná serverem, zatímco model ji píše. chat.completion.chunk Je A data: linie, a proud končí s data: [DONE]Rozum přichází do delta.reasoning_contentOdpověď v delta.content.

Streamujte cokoliv, co může trvat déle než přibližně 100 sekund, například dlouhou odpověď, velkou max_tokens žádost, která není streamována, neposílá nic, dokud není odpověď dokončena, a síť mezi vámi a Nymbotem může uzavřít prázdné spojení po přibližně 100 sekundách; model stále končí a to, co napsal, je načteno, ale odpověď je ztracena.

Streamování

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]
  • Čáry začínající na : Jsou to živé komentáře, zasílané každých 15 sekund, zatímco model přemýšlí.
  • Zeptejte se "stream_options": {"include_usage": true} na poslední kousek nahoře, s prázdným choices, token se počítá, náklady a nymbot předmětů .
  • Poplatek se vyrovná poté, co token končí.Pokud uzavřete připojení brzy, model se nezastaví: Nymbot čte zbytek tokenu poskytovatele, po dobu až 25 sekund, aby získal jeho počítání tokenů, a vy platíte to, co poskytovatel hlásí.Bez toho počítání se poplatek odhaduje z vašeho vstupu a toho, co bylo napsáno, plus celý výstupní příplatek pro model, který důvody.
  • Chyba před prvním kusem, jako je například 401 nebo 402, se vrací jako obyčejný JSON se svým stavovým kódem, nikoliv jako proud. data: {"error": {…}} událost, a proud končí bez [DONE].
  • Požadavky s nástroji a modely na přenosu odpovědí OpenAI nepřicházejí od poskytovatele.Odpovídají stále platným proudem, zaslaným po dokončení odpovědi.

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

Nástroj volání

Popište funkce v tools a model může požádat o volání namísto odpovědi. Spustíte funkci, přidáte její výsledek jako tool Poselství se stejným tool_call_idNymbot nikdy nespustí vaše funkce; předá vám žádost modelu zpět.

tool_choice Vezměte "auto", "none", "required" nebo {"type": "function", "function": {"name": "…"}}Seznam modelů označuje, které modely mohou volat nástroje (capabilities.toolsNástroje jsou odmítnuty 400 unsupported_tool je nymbot/auto a na několika katalógových modelech, které běží na transportu OpenAI Responses, na které Nymbot nemůže předat nástroje.

s "stream": true, žádost s nástroji běží v jednom kusu a je pak odeslána jako normální chunk sekvence: role, jeden chunk nesoucí každý nástroj volání s jeho indexem, id, název a argumenty, a konečný chunk.

Odpověď je částečně

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

Obrázky v žádosti

Modely s capabilities.vision Můžete si přečíst obrázky.Přidat image_url část uživatelské zprávy, a to buď s publikem https:// Link nebo A data:image/…;base64, URL. Až 20 obrázků na žádost. SVG obrázky jsou odmítnuty, a tak je odkaz více než 4 096 znaků nebo jeden s uživatelským jménem nebo heslem v něm (400 invalid_image_url• volitelný detail je auto, low nebo high.

s nymbot/auto, žádost s obrázkem v ní je přesměrována na standardní model, který může vidět. capabilities.vision Odmítněte snímky 400 unsupported_contentObrázky mohou být pouze v uživatelských zprávách. Odkaz musí poukázat na veřejný hostitel; Nymbot předá obrázek poskytovateli modelu a nezachovává jej.

Obrázek je účtován jako vstupní tokeny, které pro něj poskytovatel počítá, stejně jako zbytek žádosti.

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

odůvodnění

Modely s capabilities.reasoning Můžete přemýšlet předtím, než odpoví. požádat o více nebo méně z toho s reasoning_effort ("minimal", "low", "medium" nebo "high") nebo "reasoning": {"effort": "high"}nebo přidat :thinking na název modelu, což znamená vysoké úsilí. Na modelu bez odůvodnění je nastavení ignorováno. nymbot/auto, :thinking Odesílá žádost na standardní trasu odůvodnění.

Na antropických modelech se úsilí stává rozpočtem přibližně 1000, 2 000, 8 000 nebo 16 000 tokenů, nikdy více než max_tokens Přemýšlení je přerušeno, když tool_choice nutí nástroj, a když požadavek pokračuje v kruhu nástrojů (jeho poslední zpráva je výsledkem nástroje), protože Anthropic potřebuje dříve podepsané myšlení, aby ho obnovil.

Rozum se vrací do message.reasoning_contentnebo delta.reasoning_content při streamování, nikdy se nezamíchá do odpovědi. Rozum je výstup a je účtován jako takový, uvnitř completion_tokensNěkteří poskytovatelé nevracejí argumentovací text vůbec a je stále účtován.

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

Modelové suffixy

Sufix na názvu modelu mění způsob, jakým je žádost zpracována, bez jiného pole. Pracují na plných ID a krátkých názvech stejně, jako v anthropic/claude-sonnet-5:online.

StačíÚčinek
:onlineNejprve vyhledá web, jako plugins: [{"id": "web"}]- vidět Webové vyhledávání.
:thinkingVysoká úroveň úsilí; na nymbot/autona model, který nemůže rozumět, 400 model_not_found s “no endpoints found”.
:nitro, :floor, :exacto, :extendedKaždý model katalogu má jednu trasu, takže není rychlejší, levnější nebo delší na výběr; následky jsou povoleny, takže názvy modelů zkopírované z jiných služeb stále fungují.

Jakýkoli jiný přídavek je ignorován. Celé jméno je nejprve vyzkoušeno, takže model, jehož ID skutečně obsahuje kolon, stále funguje; pokud tomu tak není, přídavky jsou odebrány od konce jeden po druhém, dokud se model nezhoduje. 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 hledá poslední uživatelskou zprávu (jejich prvních 2000 znaků), čte nejlepší stránky a dává je modelu s otázkou, označenou jako vnější obsah, z něhož by model neměl brát pokyny.

  • Vždy hledat: "plugins": [{"id": "web", "max_results": 5}]nebo a :online Stačí na model.
  • Hledejte, když to pomáhá: "tools": [{"type": "web_search", "parameters": {"max_results": 5}}]Přijímá se také jako web_search_preview nebo openrouter:web_searchNymbot vyhledává pouze tehdy, když otázka vypadá, že potřebuje aktuální informace, stejný test, který aplikace používá.

max_results je 5 ve výchozím nastavení a maximálně 10. zdroje se vrátí do nymbot.web_search.sourcesKaždý s A title, snippet a urla jako url_citation Poznámky k poselství.

Každé vyhledávání, které běží, stojí $ 0,008, převedené na sats, na vrcholu tokenů a je součástí držení.Stránky, které čte, jsou také vstupní tokeny, takže odpověď z webu stojí více než stejná otázka, která byla položena chladně, někdy několikrát více.

Odpověď je částečně

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

Odpověď oheň

Novější formát OpenAI, používaný OpenAI Agents SDK a Codex. běží na stejných modelech, fakturaci a funkcích jako Chat Completions.

POST https://nymbot.ai/api/v1/responses Potřebujete API klíč.

poleTypPožadovánoPopisek
modelStringovéAnoJako pro Chatové dokončeníSoučástí jsou i suffixy.
inputString nebo arrayAnoŘetěz nebo seznam položek: zprávy (roly user, assistant, system, developer) s input_text, input_image a output_text částí a function_call a function_call_output Předměty pro nástroje. input_image Vezměte si image_url odkaz nebo datovou adresu URL, nikoli ID souboru. reasoning a web_search_call předměty jsou vyřazeny; item_reference Je to odmítnuto.
instructionsStringovénePokyny pro systém.
max_output_tokensintegerneNejvíce tokenů k psaní.
temperature
top_p
ČísloneSampling ovládacích prvků, kde je model bere.
tools
tool_choice
parallel_tool_calls
Array, String nebo Object, BooleanneFunkční nástroje, ve tvaru Odpovědi ({"type": "function", "name": …, "parameters": …}) a web_search nebo web_search_preview Nástroj se otáčí Webové vyhledávání Když to pomáhá, ostatní vestavěné nástroje jsou odmítnuty.
reasoningObjektyne{"effort": "minimal" | "low" | "medium" | "high"}. xhigh a max znamená high; none Otočte se od něj.
text.format
response_format
Objektynestrukturovaný výstup, jako je schéma JSON nebo json_object.
metadataObjektynePři maximálně 16 hodnotách řetězce klíče až 64 znaků a hodnoty až 512.
streambooleanůneStreamování událostí, jak je popsáno níže.
storebooleanůneNic není uloženo, a odpověď vždy říká "store": false.
previous_response_id
conversation
background
String, Objekt, BooleanneNení podporováno : 400 unsupported_parameterOdpovědi nejsou uloženy, takže pošlete celou konverzaci do input A pokaždé

Odpověď

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

Požadavek na nástroj se zobrazí v output Jako A function_call Položka s call_id, name a argumentsOdeslat výsledek zpět jako a function_call_output Položka se stejným call_idRozum, když ho model vrátí, je reasoning Položka s reasoning_text obsah, který je uveden jako první. status je incomplete Když odpověď udeří max_output_tokens nebo poskytovatel odmítl, s incomplete_details.reason Set to max_output_tokens nebo content_filterOdpověď také odráží nastavení požadavku (teplota, nástroje, výběr nástrojů a tak dále), jak to dělá OpenAI, a přenáší nymbot Náklady na objekt.

Hranice, každá událost je event: Linka a A data: Linka s A sequence_numberv tomto pořadí: response.created, response.in_progress, response.output_item.added, response.content_part.addedJakýkoliv počet response.output_text.delta, response.output_text.done, response.content_part.done, response.output_item.doneA konečně response.completed s použitím a náklady. Odpověď na krátké konce s response.incomplete místo toho, a neúspěch poté, co proud začal s response.failedRozumění proudů jakožto vlastního předmětu s response.reasoning_text.delta a .doneNástrojové hovory přicházejí po zprávě, každá jako položka s response.function_call_arguments.delta a .done.

statusuKdy
400ne model nebo input; previous_response_id, conversation, background nebo jednoho item_reference (unsupported_parameter• Nepodporovaný nástroj nebo typ obsahu.
402, 403, 404, 429, 502, 503Co se týče chatování.

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

Antropické poselství

Funguje s každým modelem v katalogu, nejen s Claude: požadavek je přeložen, spuštěn stejným potrubím a přeložen zpět.

POST https://nymbot.ai/api/v1/messages - potřebuje klíč API, jako x-api-key nebo Authorization: Bearer.

Tyto anthropic-version a anthropic-beta Antropické názvy modelů jsou shodovány s katalogem, takže Claude Code a SDK pracují s názvy, které již používají:

  • Jméno, které známe v katalogu, jako claude-sonnet-5 nebo anthropic/claude-opus-5Používá se tak, jak je.
  • V opačném případě datum (-20260514), -latestJedná se o verzi jako -v1Některé brambory, jako je [1m] a jednoho anthropic/ nebo anthropic. Zpětná vazba: Zpětná vazba: Zpětná vazba: Zpětná vazba: Zpětná vazba: Zpětná vazba: Zpětná vazba (claude-haiku-4-5 Najít claude-haiku-4.5).
  • Pokud to stále nevyhovuje, používá se rodina (Opus, Sonnet nebo Haiku), pokud je verze katalogu stejná nebo novější než ta požadovaná.
  • Jméno, které neodpovídá ničemu, se vrátí 404 not_found_error.
poleTypPožadovánoPopisek
modelStringovéAnoID katalogu nebo název antropického modelu.
max_tokensintegerAnoNejvíce tokenů k psaní.
messagesArrayAnouser a assistant Zpětně, s text, image (base64 nebo zdroj URL) tool_use a tool_result a bloků. thinking Bloky z předchozích kol jsou přijímány a vyřazovány.
systemString nebo arrayneSystem prompt, jako řetěz nebo textové bloky.
temperature
top_p
ČísloneSampling ovládacích prvků, kde je model bere. top_k Byla přijata a upuštěna.
stop_sequencesŘada stringůneText, který končí odpovědí. Nejvýše 4 řetězce, každý nejvýše 256 znaků.
tools
tool_choice
Array, objektyneNástroje s name, description a input_schema• A web_search Serverové nástroje se otáčejí Webové vyhledáváníJiné vestavěné nástroje Anthropic (bash, textový editor, použití počítače) jsou odmítnuty unsupported_tool. tool_choice Vezměte auto, any, tool nebo none, a disable_parallel_tool_use.
thinkingObjektyne{"type": "enabled", "budget_tokens": 8192}, {"type": "adaptive"} nebo {"type": "disabled"}Rozpočet vybírá úroveň úsilí: pod 2 048 minimální, z 2 048 nízké, z 8 192 střední, z 16 384 vysoké. output_config.effortA nebo vysoko.
streambooleanůneStream ve formátu událostí Anthropic.
metadataObjektyneAkceptováno a ignorováno.

Odpověď

{
  "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 Může také držet tool_use Blokování a thinking Blok, který signature Je prázdný stop_reason je end_turn, max_tokens, tool_use nebo refusalPracoval stejným způsobem jako finish_reason je Chatové dokončení; stop_sequence Vždy je null, i když stopová sekvence ukončila odpověď. input_tokens počítá pouze čerstvé vstupy; vstupy v mezipaměti se nacházejí ve dvou polích mezipaměti. nymbot Objekt a jeho X-Nymbot-Cost-Sats A header

Akce se odehrává v Anthropic's: message_start, content_block_start, ping, content_block_delta (text_delta, input_json_delta nebo thinking_delta), content_block_stop, message_delta s důvodem zastavení, používání a nymbot náklady na objekt a message_stop• A ping je také odesílán každých 15 sekund, zatímco model pracuje. Nástrojové hovory dorazí po textu, každý jako tool_use blok se svým celým vstupem v jednom input_json_delta.

Chyby na tomto koncovém bodu používají formát Anthropic: {"type": "error", "error": {"type": "not_found_error", "message": "…"}}Krátká rovnováha je 402 billing_errorPřehnaný poskytovatel 503 overloaded_errorNeúspěch po spuštění proudu se odesílá jako error k události.

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

Počítání tokenů

Odhad počtu vstupních tokenů, které by žádost o zprávy použila, takže klient může před odesláním zkontrolovat.

POST https://nymbot.ai/api/v1/messages/count_tokens Potřebujete API klíč zdarma.

Tělo je stejné jako poselstvíbez max_tokens; název modelu musí být vyřešen. počítání je odhad: znaky systémové poptávky, zprávy, volání nástrojů a definice nástrojů rozdělené čtyřmi, plus 1600 pro každý obrázek. Není to vlastní tokenizér poskytovatele, takže skutečný počet se může lišit. klíč, který dosáhl své hranice, ho stále může používat.

Odpověď

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

Seznam modelů

Každý model a generátor API přijímá, s tím, co to stojí. seznam se čte ze stejného živého katalogu jako výběr aplikace, takže je to vždy to, co bude server spouštět.

GET https://nymbot.ai/api/v1/models - žádný klíč potřebný. skryté po dobu pěti minut.

GET /api/v1/models/{id} Vrátí se jeden vstup.

poleTypPožadovánoPopisek
typeStringová otázka (query)nechat (na základě deficitu image, video, audio, embedding nebo allNěkteré mohou být použity, jako image,video.

Ceny jsou to, co platíte, s poplatkem a marží již v dolarech a v sadách při současné ceně Bitcoinu. balance Záleží na tom, jaký model vydělává. nymbot_key je krátký název modelu v aplikaci. created je vždy 0, protože katalog nezaznamenává, kdy byl model přidán. per_request místo toho.

nymbot/auto je vždy první, cena jako variable, s A routes Seznam, který uvádí sazby každé standardní trasy. Seznamuje vizi a uvažování, ale ne nástroje.

GET /api/v1/models/{id} přijímá stejná jména a aliasy jako žádost a vrací záznam pro model, na který se rozhodnou.

Odpověď

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

Ostatní typy :

  • Obrázek Vstupy mají capabilities (accepts_image_url, requires_image_url, edita cenou per_generation.
  • Videa Vstupy mají max_duration_seconds a resolutionsa cenou per_second pro každé usnesení.
  • audiokniha Vstupy mají audio_type speech nebo transcriptionCena je per_1k_chars nebo per_minute.
  • Vkládání Vstupy mají dimensions, context_length, max_inputs Cena za milion vstupních tokenů.

Ceny označené "estimated": true je odhad aplikace pro generátor, jehož cena není zveřejněna. type Návraty 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);