Przejdź do treści
Wróć do Nymbot

Baza wiedzy deweloperzy

Czat, odpowiedzi i wiadomości

Trzy sposoby, aby zapytać model coś, w trzech formatach klienci już mówią, wszystkie działają na tych samych modelach i rozliczane w ten sam sposób.

Zakończenie czatu

Format czatu OpenAI i ten, który obsługuje niemal każde narzędzie. Wysyłaj rozmowę do tej pory i odbierz następną wiadomość.

POST https://nymbot.ai/api/v1/chat/completions Potrzebny klucz API.

Tylko model I messages Parametr próbkowania, którego wybrany model nie bierze, zostaje usunięty bez błędu, więc jedno ciało żądania działa w różnych modelach. supported_parametersTo, co jest odrzucane zamiast odrzucane, jest czymś, czego model w ogóle nie może zrobić: zdjęcia dla modelu, który nie może widzieć, narzędzia dla modelu, który nie może ich nazwać.

polutypuWymaganeOpis
modelStringówTaknymbot/auto (lub auto) dla routingu Nymbota na standardowym saldzie lub identyfikatora modelu katalogu, takiego jak anthropic/claude-sonnet-5 na bilansie Pro. Przyjmowane są również krótkie nazwy i pseudonimy aplikacji. wystarczy.
messagesarrayTakRozmowa – role system, developer (przetwarzany jako system) user, assistant I toolZawartość jest struną lub listą text I image_url części; obrazy tylko w wiadomościach użytkownika. input_audio Części plików są odrzucane.
streambooleńskiNieWyślij odpowiedź tak, jak jest napisane. zobacz Streamowanie.
stream_optionsObiektyNie{"include_usage": true} dodaje ostatni kawałek z liczbami tokenów i kosztami.
max_tokens
max_completion_tokens
integerNieNajwięcej tokenów do zapisu. Obniżone do maksymalnego poziomu modelu, jeśli jest wyższe. Określa również, ile jest trzymane z salda, więc mniejsza liczba potrzebuje mniej kredytu, aby zacząć.
temperature
top_p
LiczbaNieKontrola próbek : temperature od 0 do 2, top_p od 0 do 1.
stopString lub arrayNieTekst kończący odpowiedź: strunę lub maksymalnie 4 struny, z których każdy ma maksymalnie 256 znaków. nymbot/auto.
seedintegerNieDo powtarzalnego pobierania próbek, gdzie model je obsługuje.
presence_penalty
frequency_penalty
LiczbaNieKontrolki powtarzające się, każda od -2 do 2.
response_formatObiektyNie{"type": "json_object"} lub {"type": "json_schema", "json_schema": {…}}, gdzie model go obsługuje. Nie jest używany przez nymbot/auto.
tools
tool_choice
parallel_tool_calls
array, strunę lub obiekt, booleanNieFunkcja dzwoni. zobacz Narzędzia dzwoniące• A web_search Narzędzie staje się wyszukiwarka WEBMaksymalnie 128 narzędzi i 512 KB definicji, osadzonych na maksymalnie 64 poziomach głębokości; więcej jest 400.
reasoning_effort
reasoning
String, obiektNie"minimal", "low", "medium" lub "high", lub {"effort": "high"}. "none" lub {"enabled": false} Wyłącz go. zobacz Rozważania.
pluginsarrayNie[{"id": "web", "max_results": 5}] zawsze wyszukuje najpierw w Internecie. do 10 wyników.
nintegerNieTylko 1: Wszystko inne powraca 400.
logit_bias
user
metadata
String, String i ObiektNiePrzyjęte i nie wysłane. logit_bias mapy z maksymalnie 300 identyfikatorami tokenów do liczb od -100 do 100; user maksymalnie 256 znaków; metadata może zawierać maksymalnie 16 wartości ciągów, klucze do 64 znaków i wartości do 512.

Odpowiedź jest zwykła chat.completionWraz z kosztami w usage.cost (w dolarach) i w nymbot przedmiotów . model jest rozstrzygnięty model id, więc krótka nazwa powraca jako pełna. message.reasoning_contentoddzielone od odpowiedzi.

Odpowiedź

{
  "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 jest opracowany z tego, co wróciło, ponieważ dostawcy informują o tym inaczej: tool_calls Kiedy model prosi o narzędzia, length gdy odpowiedź użyła każdego dopuszczalnego tokena (lub model spędził je wszystkie rozważając i nie napisał żadnej odpowiedzi), content_filter gdy dostawca odmówił, oraz stop W przeciwnym razie usage.completion_tokens_details.reasoning_tokens jest zawsze 0: ukryte tokeny rozważania są liczone i pobierane, w completion_tokens.

StatusKiedy
400Nie model lub messages (missing_required_parameter); część audio lub plik, lub obrazy dla modelu, który nie może je zobaczyć (unsupported_content); więcej niż 20 zdjęć (too_many_images); parametr próbkowy niewłaściwego typu lub poza zasięgiem (invalid_value); link do obrazu, który nie jest publiczny (invalid_image_url); narzędzia na modelu, który nie może ich nazwać (unsupported_tool); n Inne niż 1; a :thinking Szybkość, która nie może być uzasadniona (model_not_found(lub dostawca odmówił złożenia wniosku)upstream_rejected).
402Bilans wydany przez model nie może pokryć posiadania.
403Najgorszy przypadek nie pasuje do kapsuły klucza (key_limit_reached) niżej max_tokens Albo podnieść głowę.
404Nie ma modelu o tej nazwie (model_not_found).
429limit stawki klucza lub dostawcy (upstream_rate_limited).
502, 503Sprzedawca nie spełnia wymogów (upstream_error) lub jest przeciążona (upstream_overloaded, z Retry-AfterNic nie jest pobierane, chyba że dostawca fakturowany za próbę.

Kody stanu każdej akcji końcowej są wymienione poniżej błędy.

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

Streamowanie

z "stream": true Odpowiedź przychodzi jako wydarzenie wysłane przez serwer, podczas gdy model ją pisze. chat.completion.chunk Jest A data: linie, a strumień kończy się data: [DONE]Rozum dociera do delta.reasoning_contentOdpowiedź w delta.content.

Streamuj wszystko, co może trwać dłużej niż około 100 sekund, na przykład długą odpowiedź, dużą max_tokens Wniosek, który nie jest przesyłany strumieniowo, nie wysyła niczego, dopóki odpowiedź nie zostanie zakończona, a sieć między tobą a Nymbotem może zamknąć bezczynne połączenie po około 100 sekundach; model nadal kończy i to, co napisał, jest ładowane, ale odpowiedź jest utracona.

Strumień

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]
  • Linie zaczynające się od : są komentarze na żywo, wysyłane co 15 sekund, podczas gdy model myśli.
  • Zapytaj o "stream_options": {"include_usage": true} aby uzyskać ostatni kawałek powyżej, z pustym choices, token liczy, koszt i nymbot przedmiotów .
  • Jeśli zamkniesz połączenie wcześnie, model nie zostanie zatrzymany: Nymbot odczytuje resztę przepływu dostawcy, przez maksymalnie 25 sekund, aby uzyskać liczbę tokenów, a płacisz to, co podaje dostawca.
  • błąd przed pierwszym odcinkiem, taki jak 401 lub 402, powraca jako zwykły JSON ze swoim kodem stanu, a nie jako strumień. data: {"error": {…}} wydarzenia, a strumień kończy się bez [DONE].
  • Wnioski z narzędziami i modelami w transporcie odpowiedzi OpenAI nie przepływają z dostawcy. nadal odpowiadają z ważnym strumieniem, wysłanym po zakończeniu odpowiedzi.

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

Narzędzia dzwoniące

Opisuje funkcje w tools i model może poprosić o wezwanie, zamiast odpowiadać. uruchamiasz funkcję, dodając jej wynik jako tool Przesłanie z tym samym tool_call_idNymbot nigdy nie uruchamia Twoich funkcji; przekazuje żądanie modelu z powrotem do Ciebie.

tool_choice bierze "auto", "none", "required" lub {"type": "function", "function": {"name": "…"}}Lista modeli wskazuje, które modele mogą nazywać narzędziami (capabilities.toolsNarzędzia są odrzucane 400 unsupported_tool Jest nymbot/auto i na kilku modelach katalogowych, które działają na transporcie OpenAI Responses, do których Nymbot nie może przekazać narzędzi.

z "stream": true, żądanie z narzędziami działa w jednym kawałku i jest następnie wysyłane jako normalna sekwencja fragmentów: rola, jeden kawałek niosący każde połączenie narzędzia z jego indeksem, idem, nazwą i argumentami, a końcowy kawałek.

Odpowiedź, w części

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

Zdjęcia na żądanie

Modele z capabilities.vision Możesz czytać zdjęcia. dodaj image_url części do wiadomości użytkownika, z publicznością https:// Link lub A data:image/…;base64, URL. Do 20 zdjęć na żądanie. zdjęcia SVG są odrzucane, a więc jest to link o ponad 4096 znakach lub jeden z nazwą użytkownika lub hasłem w nim (400 invalid_image_urla) opcjonalnie detail Jest auto, low lub high.

z nymbot/auto, żądanie z obrazem w nim jest przekierowywany do modelu standardowego, który może zobaczyć. capabilities.vision Odmawia zdjęć z 400 unsupported_contentObrazy mogą znajdować się tylko w wiadomościach użytkownika. łącznik musi wskazywać na host publiczny; Nymbot przekazuje obraz dostawcy modelu i nie przechowuje go.

Obraz jest pobierany jako tokeny wejściowe liczone przez dostawcę, podobnie jak reszta żądania.

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

uzasadnienie

Modele z capabilities.reasoning Możesz zastanowić się, zanim odpowiedzą, poproś o więcej lub mniej. reasoning_effort ("minimal", "low", "medium" lub "high") lub "reasoning": {"effort": "high"}lub dodać :thinking do nazwy modelu, co oznacza wysoki wysiłek. Na modelu bez uzasadnienia ustawienie jest ignorowane. nymbot/auto, :thinking Przesyła wniosek do standardowej ścieżki rozważania.

Na modelach antropologicznych wysiłek staje się budżetem myślącym o około 1000, 2 000, 8 000 lub 16 000 tokenów, nigdy więcej niż max_tokens Myślenie zostaje wyłączone, gdy tool_choice narzędzie, a gdy żądanie kontynuuje łańcuch narzędzi (jego ostatnia wiadomość jest wynikiem narzędzia), ponieważ Anthropic potrzebuje wcześniej podpisane myślenie, aby go wznowić.

Rozum wraca do message.reasoning_content, lub delta.reasoning_content podczas strumieniowania, nigdy nie miesza się do odpowiedzi. Rozumowanie jest wyjściem i jest pobierane jako takie, wewnątrz completion_tokensNiektórzy dostawcy nie zwracają w ogóle tekstu uzasadnienia i nadal jest on pobierany.

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

Wzór suffiksów

Sufiks na nazwie modelu zmienia sposób przetwarzania żądania, bez innego pola. Pracują one na pełnych identyfikatorach i krótkich imionach tak samo, jak w anthropic/claude-sonnet-5:online.

wystarczyEfekty
:onlineWyszukaj najpierw w Internecie, jak plugins: [{"id": "web"}]Oto wyszukiwarka WEB.
:thinkingwysiłku logicznego; na nymbot/autona drodze rozumowania, na modelu, który nie może rozumieć, 400 model_not_found z “nie znaleziono punktów końcowych”.
:nitro, :floor, :exacto, :extendedKażdy model katalogu ma jedną trasę, więc nie ma szybszej, tańszej ani dłuższej do wyboru; następstwa są dozwolone, więc nazwy modeli skopiowane z innych usług nadal działają.

Każdy inny dodatek jest ignorowany. Cała nazwa jest najpierw wypróbowana, więc model, którego identyfikator rzeczywiście zawiera kolon, nadal działa; w przeciwnym razie dodatki są usuwane z końcówki jeden po drugim, aż model pasuje. 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 wyszukuje ostatnią wiadomość użytkownika (jego pierwszych 2000 znaków), czyta najlepsze strony i przekazuje je modelowi z pytaniem, oznaczonym jako treści zewnętrzne, z których model nie powinien brać instrukcji.

  • Zawsze szukaj: "plugins": [{"id": "web", "max_results": 5}], lub a :online Wystarczy dodać model.
  • Szukaj kiedy to pomaga: "tools": [{"type": "web_search", "parameters": {"max_results": 5}}]Został również przyjęty jako web_search_preview lub openrouter:web_searchNymbot wyszukuje tylko wtedy, gdy pytanie wydaje się potrzebować aktualnych informacji, ten sam test wykorzystuje aplikacja.

max_results jest 5 domyślnie i maksymalnie 10. Źródła powracają do nymbot.web_search.sourcesKażda z nich z a title, snippet I urli jako url_citation Notatki w wiadomości.

Każde wyszukiwanie, które działa, kosztuje $ 0,008, przekonwertowane na sats, na szczycie tokenów i jest częścią przechowywania.Strony, które czyta, są również tokenami wejściowymi, więc odpowiedź z sieci kosztuje więcej niż to samo pytanie zadawane zimno, czasami kilka razy więcej.

Odpowiedź, w części

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

Odpowiedź API

Nowszy format OpenAI, używany przez OpenAI Agents SDK i przez Codex. działa na tych samych modelach, rozliczeniach i funkcjach jak Chat Completions.

POST https://nymbot.ai/api/v1/responses Potrzebny klucz API.

polutypuWymaganeOpis
modelStringówTakJak dla Zakończenie czatuDodatkowo wliczone są sufiksy.
inputString lub arrayTakStrunę lub listę elementów: wiadomości (role user, assistant, system, developer) z input_text, input_image I output_text części oraz function_call I function_call_output przedmioty do narzędzi. input_image Weźmy jeden image_url link lub adres URL danych, a nie identyfikator pliku. reasoning I web_search_call przedmioty są przechowywane; item_reference Jest odrzucony
instructionsStringówNieInstrukcje systemu .
max_output_tokensintegerNieWiększość książek do napisania.
temperature
top_p
LiczbaNieSampling kontrolerów, gdzie model je bierze.
tools
tool_choice
parallel_tool_calls
array, strunę lub obiekt, booleanNieFunkcje narzędzi, w formie Odpowiedzi ({"type": "function", "name": …, "parameters": …}) a web_search lub web_search_preview Narzędzie staje się wyszukiwarka WEB Inne wbudowane narzędzia są odrzucane.
reasoningObiektyNie{"effort": "minimal" | "low" | "medium" | "high"}. xhigh I max znaczy high; none Odwróć to od siebie.
text.format
response_format
ObiektyNieStrukturowane wyjście, jako schemat JSON lub json_object.
metadataObiektyNiePrzy maksymalnie 16 wartościach, klucze do 64 znaków i wartości do 512.
streambooleńskiNieStream wydarzeń jak opisano poniżej.
storebooleńskiNieNic nie jest przechowywane, a odpowiedź zawsze mówi "store": false.
previous_response_id
conversation
background
String, Obiekt i BooleanNieNie jest wspierany: 400 unsupported_parameterOdpowiedzi nie są przechowywane, więc wyślij całą rozmowę do input Za każdym razem.

Odpowiedź

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

Wymagania narzędzia pojawiają się w output jako a function_call Punkt z call_id, name I argumentsZwróć wynik jako a function_call_output Artykuł z tym samym call_idRozumienie, gdy model go zwraca, jest reasoning Punkt z reasoning_text treści, które są wymienione najpierw. status Jest incomplete Gdy odpowiedź uderzy max_output_tokens Wnioskodawca odmówił, z incomplete_details.reason Postaw na max_output_tokens lub content_filterOdpowiedź odzwierciedla również ustawienia żądania (temperaturę, narzędzia, wybór narzędzia i tak dalej), jak to robi OpenAI, i przynosi nymbot Koszt przedmiotu .

Streaming, każde wydarzenie jest event: Linia i a data: Linia z A sequence_numberW tej kolejności: response.created, response.in_progress, response.output_item.added, response.content_part.addedKażda liczba z response.output_text.delta, response.output_text.done, response.content_part.done, response.output_item.donei wreszcie response.completed z wykorzystaniem i kosztem. Odpowiedź skraca krótkie końce z response.incomplete Zamiast tego, a porażka po rozpoczęciu strumienia z response.failedRozważanie strumieni jako własny przedmiot z response.reasoning_text.delta I .doneWywołania narzędzi pochodzą po wiadomości, każda jako element z response.function_call_arguments.delta I .done.

StatusKiedy
400Nie model lub input; previous_response_id, conversation, background lub an item_reference (unsupported_parameter); nieobsługiwane narzędzie lub typ zawartości.
402, 403, 404, 429, 502, 503Na zakończenie czatu.

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

Antropologiczne przesłania

Format Anthropic, dla Anthropic SDK i Claude Code. Działa z każdym modelem w katalogu, nie tylko Claude: prośba jest tłumaczona, uruchamiana przez ten sam rurociąg i przetłumaczona z powrotem.

POST https://nymbot.ai/api/v1/messages — potrzebny jest klucz API, jako x-api-key lub Authorization: Bearer.

o anthropic-version I anthropic-beta Nazwy modeli antropologicznych są dopasowane do katalogu, więc Claude Code i SDK pracują z nazwami, które już używają:

  • Nazwisko, które zna katalog, takie jak claude-sonnet-5 lub anthropic/claude-opus-5Jest używany tak jak jest.
  • W przypadku daty (-20260514), -latestWersje takie jak -v1Wygląda na to, że jeden z bracketed tagów, jak [1m] i jeden anthropic/ lub anthropic. Wystarczy, że przyjdzie czas, aby wyjaśnić, co się dzieje i co się dzieje, aby wyjaśnić, co się dzieje i co się dzieje (claude-haiku-4-5 Znajdź claude-haiku-4.5).
  • Jeśli to nadal nie pasuje, używa się rodziny (Opus, Sonnet lub Haiku), pod warunkiem że wersja katalogu jest taka sama lub nowsza niż ta żądana.
  • Nazwa, która nie pasuje do niczego, powraca 404 not_found_error.
polutypuWymaganeOpis
modelStringówTakIdentyfikator modelu katalogu lub nazwa modelu antropologicznego.
max_tokensintegerTakWiększość książek do napisania.
messagesarrayTakuser I assistant Zwróćmy uwagę, z text, image (base64 lub źródło URL), tool_use I tool_result i bloków. thinking Bloki z poprzednich tur są akceptowane i rzucane.
systemString lub arrayNieSystem prompt, jako strunę lub bloki tekstu.
temperature
top_p
LiczbaNieSampling kontrolerów, gdzie model je bierze. top_k Jest akceptowana i odrzucana.
stop_sequencesArray StringówNieTekst, który kończy odpowiedź. Maksymalnie 4 struny, każda z maksymalnie 256 znaków.
tools
tool_choice
array, obiektNieNarzędzia z name, description I input_schema• A web_search Serwerowe narzędzie staje się wyszukiwarka WEBInne wbudowane narzędzia Anthropic (bash, edytor tekstu, korzystanie z komputera) są odrzucane unsupported_tool. tool_choice bierze auto, any, tool lub none, oraz disable_parallel_tool_use.
thinkingObiektyNie{"type": "enabled", "budget_tokens": 8192}, {"type": "adaptive"} lub {"type": "disabled"}Budżet wybiera poziom wysiłku: poniżej 2,048 minimum, z 2,048 niskiego, z 8,192 średniego, z 16,384 wysokiego. output_config.effortAlbo na wysokim.
streambooleńskiNieStream w formacie wydarzeń Anthropic.
metadataObiektyNieAkceptowane i ignorowane.

Odpowiedź

{
  "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 Można również trzymać tool_use Bloki i a thinking Blok, którego signature Jest pusta stop_reason Jest end_turn, max_tokens, tool_use lub refusalPracował w taki sam sposób jak finish_reason Jest Zakończenie czatu; stop_sequence Zawsze jest null, nawet gdy sekwencja zatrzymania zakończyła odpowiedź. input_tokens liczy się tylko świeże wpisy; wpisy w pamięci podręcznej znajdują się w dwóch polach pamięci podręcznej. nymbot Obiekt i jego X-Nymbot-Cost-Sats w Headerze

Strumieniowo, wydarzenia są Anthropic's: message_start, content_block_start, ping, content_block_delta (text_delta, input_json_delta lub thinking_delta), content_block_stop, message_delta z przyczyną zatrzymania, użytkowania i nymbot Koszt przedmiotu oraz message_stop• A ping jest również wysyłany co 15 sekund, podczas gdy model jest w pracy. połączenia z narzędziami przychodzą po tekście, każdy jako tool_use blok z całym swoim wejściem w jednym input_json_delta.

Błędy w tym punkcie końcowym używają formatu Anthropic: {"type": "error", "error": {"type": "not_found_error", "message": "…"}}Krótka równowaga jest 402 billing_error- przeładowany dostawca 503 overloaded_errorNiepowodzenie po rozpoczęciu przepływu jest wysyłane jako error Wydarzenia

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

Liczba tokenów

Szacunek liczby tokenów wejściowych, których użyłaby prośba o wiadomości, aby klient mógł sprawdzić, zanim wysła.

POST https://nymbot.ai/api/v1/messages/count_tokens Potrzebny jest klucz API.

Ciało jest takie samo jak WiadomościBez max_tokensLiczba jest szacunkiem: znaki wezwania systemu, wiadomości, połączenia narzędzi i definicje narzędzi dzielone przez cztery, plus 1600 dla każdego obrazu. To nie jest własny tokenizer dostawcy, więc rzeczywista liczba może się różnić.

Odpowiedź

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

Lista modeli

Każdy model i generator API akceptuje, z tym, co kosztuje.Lista jest czytana z tego samego katalogu na żywo, co picker aplikacji, więc zawsze jest to, co serwer będzie działać.

GET https://nymbot.ai/api/v1/models — nie potrzebny klucz. Ukryte przez pięć minut.

GET /api/v1/models/{id} Wróci jeden wpis.

polutypuWymaganeOpis
typeString (wniosek o pomoc)Niechat w przypadku deficytu, image, video, audio, embedding lub allNiektóre z nich mogą być stosowane, jak image,video.

Ceny są tym, co płacisz, z opłatą i marżą już w, w dolarach i w ratach w bieżącej cenie Bitcoin. balance Podpowiadamy, jakie pieniądze wyda model. nymbot_key jest krótka nazwa modelu w aplikacji. created jest zawsze 0, ponieważ katalog nie rejestruje, kiedy model został dodany. per_request Zamiast.

nymbot/auto Zawsze na pierwszym miejscu, w cenie variable, z a routes Lista podająca stawki każdej standardowej trasy.Wykazuje wizję i rozumowanie, ale nie narzędzia.

GET /api/v1/models/{id} akceptuje te same nazwy i pseudonimy jako żądanie i zwraca wpis dla modelu, do którego się zdecydowali.

Odpowiedź

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

Pozostałe typy :

  • Wizerunek Wejścia mają capabilities (accepts_image_url, requires_image_url, edit) i cenę per_generation.
  • wideo Wejścia mają max_duration_seconds I resolutionsi jedną cenę per_second w każdej rezolucji.
  • AUDIO Wejścia mają audio_type speech lub transcriptionCeny per_1k_chars lub per_minute.
  • wbudowywanie Wejścia mają dimensions, context_length, max_inputs Cena za milion wejść.

Ceny oznaczone "estimated": true jest szacunkiem aplikacji dla generatora, którego cena nie jest publikowana. type Powrót 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);