Преминете към съдържанието
Обратно към Nymbot

База знания Разработчиците

Чат, отговори и съобщения

Три начина да попитате модел нещо, в трите формата клиентите вече говорят, всички работят по същите модели и се таксуват по същия начин.

Чат завършване

OpenAI чат формат, и този, който почти всеки инструмент поддържа. изпратете разговора дотук и да получите следващото съобщение обратно.

POST https://nymbot.ai/api/v1/chat/completions Нуждаете се от API ключ.

само model и messages Избраният модел не взема параметър за вземане на проби, който се пада без грешка, така че тялото на едно искане работи между моделите. supported_parametersТова, което е отхвърлено, а не изоставено, е нещо, което моделът изобщо не може да направи: снимки за модел, който не може да види, инструменти за модел, който не може да ги назове.

полетоТипНеобходимиОписание на
modelСтрийтдаnymbot/auto (или auto) за маршрутизиране на Nymbot по стандартния баланс, или каталог модел id като anthropic/claude-sonnet-5 на баланса на Pro. Кратките имена и псевдоними на приложението също се приемат. Достатъчно.
messagesАрсеналдаРазговорът - ролите system, developer (разглежда се като система) user, assistant и toolСъдържанието е низ или списък с text и image_url части; изображения само в потребителски съобщения. input_audio Част от файловете са отхвърлени.
streamбулеварднеИзпратете отговора така, както е написан. стрийминг.
stream_optionsОбектътне{"include_usage": true} добавя последната част с токените и разходите.
max_tokens
max_completion_tokens
интегритетнеНай-много токени, за да напишете. Намалено до максимума на модела, ако е по-висок. Също така определя колко се държи от вашия баланс, така че по-малък брой се нуждае от по-малко кредит, за да започне.
temperature
top_p
бройнеКонтрол на извадката: temperature от 0 до 2, top_p от 0 до 1.
stopString или ArrayнеТекст, който завършва отговора: един низ или най-много 4 нива, всеки с най-много 256 знака. nymbot/auto.
seedинтегритетнеЗа повтарящо се вземане на проби, където моделът го поддържа.
presence_penalty
frequency_penalty
бройнеПовтарящи се контроли, всеки от -2 до 2.
response_formatОбектътне{"type": "json_object"} или {"type": "json_schema", "json_schema": {…}}, където моделът го поддържа.Не се използва от nymbot/auto.
tools
tool_choice
parallel_tool_calls
матрица, низ или обект, булевинеФункция на повикване. виж Инструменти за обажданеА web_search Инструментът се превръща WEB ТърсенеНай-много 128 инструмента и 512 KB дефиниции, вградени в най-много 64 нива дълбочина; повече е 400.
reasoning_effort
reasoning
Пъзел, обектне"minimal", "low", "medium" или "high"или {"effort": "high"}. "none" или {"enabled": false} Изключете го. виж още Разумът.
pluginsАрсеналне[{"id": "web", "max_results": 5}] Винаги търси първо в мрежата. до 10 резултата.
nинтегритетне1.Всичко останало се връща 400.
logit_bias
user
metadata
Обект, Структура, ОбектнеПриети и не изпратени. logit_bias Карти с най-много 300 токенови идентификатори до числа от -100 до 100; user съдържа максимум 256 символа; metadata съдържа най-много 16 стойности за струни, ключове до 64 знака и стойности до 512.

Отговорът е обикновено chat.completionС цената на usage.cost (в долари) и в nymbot на обекта. model е разрешеният модел id, така че краткото име се връща като пълно. message.reasoning_contentотделно от отговора.

Отговор

{
  "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 се работи от това, което се върна, тъй като доставчиците го съобщават по различен начин: tool_calls Когато моделът поиска инструменти, length когато отговорът използва всеки позволен токен (или моделът ги изразходва всички разсъждения и не пише отговор), content_filter когато доставчикът откаже, и stop В противен случай usage.completion_tokens_details.reasoning_tokens винаги е 0: скритите разсъждаващи токени се броят и се таксуват в completion_tokens.

статутКога
400не model или messages (missing_required_parameter); аудио или файлова част, или изображения за модел, който не може да ги види (unsupported_content); повече от 20 снимки (too_many_images); параметър за вземане на проби от грешен тип или извън обхвата (invalid_value); линк към снимка, който не е публичен (invalid_image_url); инструменти на модел, който не може да ги назове (unsupported_tool); n В допълнение към 1; а :thinking Допълнение към модел, който не може да разсъждава (model_not_found(или доставчикът е отхвърлил искането)upstream_rejected).
402Балансът, който моделът изразходва, не може да покрие задържането.
403Най-лошият случай не се вписва в капака на ключа (key_limit_reached• По-ниско max_tokens Или да вдигнете главата.
404Няма модел с това име (model_not_found).
429Стойността на лимита на ключа или на доставчика (upstream_rate_limited).
502, 503Доставчикът е неуспешен (upstream_error) или е претоварено (upstream_overloaded, с Retry-AfterНищо не се таксува, освен ако доставчикът не е таксувал за опита.

Кодовете за състоянието на всяка крайна точка акции са изброени под Грешките.

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

стрийминг

с "stream": true Отговорът идва като събитие, изпратено от сървъра, докато моделът го пише. chat.completion.chunk е а data: линия, и потокът завършва с data: [DONE]Разумът идва в delta.reasoning_contentОтговорът в delta.content.

Излъчвайте всичко, което може да отнеме повече от около 100 секунди, като например дълъг отговор, голяма max_tokens заявка, която не се излъчва, не изпраща нищо, докато отговорът не е завършен, а мрежата между вас и Nymbot може да затвори безпроблемна връзка след около 100 секунди; моделът все още завършва и това, което е написал, се зарежда, но отговорът е загубен. поток изпраща keep-alives, така че остава отворен, докато моделът пише.

Потокът

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]
  • Линии, започващи с : са живи коментари, изпращани на всеки 15 секунди, докато моделът мисли.
  • Попитайте за "stream_options": {"include_usage": true} за да получите последното парче отгоре, с празен choices, токените се броят, цената и nymbot на обекта.
  • Ако затворите връзката рано, моделът не се спира: Nymbot чете останалата част от потока на доставчика, за до 25 секунди, за да получи своя брой токени, и вие плащате това, което доставчикът съобщава.
  • Една грешка преди първата част, като например 401 или 402, се връща като обикновен JSON със своя код за състояние, а не като поток. data: {"error": {…}} събитие, и потокът завършва без [DONE].
  • Заявки с инструменти и модели на OpenAI отговори транспорт, не поток от доставчика. Те все още отговарят с валиден поток, изпратени след като отговорът е завършен.

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

Инструменти за обаждане

Опишете функциите в tools и моделът може да поиска да бъде повикан вместо да отговаря. Изпълнявате функцията, добавяйки нейния резултат като tool Съобщение със същото tool_call_idNymbot никога не изпълнява функциите ви; той предава искането на модела обратно към вас.

tool_choice взема "auto", "none", "required" или {"type": "function", "function": {"name": "…"}}Моделният списък маркира кои модели могат да се наричат инструменти (capabilities.toolsИнструментите се отказват 400 unsupported_tool е nymbot/auto и на малкото каталогови модели, които работят на транспорта на OpenAI Responses, на които Nymbot не може да предава инструменти.

с "stream": true, заявка с инструменти се изпълнява в едно парче и след това се изпраща като нормална частична последователност: ролята, една частица, която носи всеки призив за инструмент с неговия индекс, идентификатор, име и аргументи, и крайната част.

Отговорът, отчасти

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

Снимки в заявка

Модели с capabilities.vision Можете да прочетете снимки.Добавете image_url част към потребителско съобщение, с публиката или https:// Линк или А data:image/…;base64, URL. До 20 изображения на заявка. SVG изображения са отхвърлени, така че линкът е над 4096 символа или един с потребителско име или парола в него (400 invalid_image_url) е опционален detail е auto, low или high.

с nymbot/auto, заявка с картина в нея се маршрутизира към стандартен модел, който може да се види. capabilities.vision Отказвам снимки с 400 unsupported_contentСнимките могат да бъдат само в потребителски съобщения.Връзката трябва да посочи публичен хост; Nymbot предава изображението на доставчика на модела и не го запазва.

Едно изображение се таксува като входните токени, които доставчикът брои за него, както и останалата част от заявката.

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

Разумът

Модели с capabilities.reasoning може да мисли, преди да отговори.Поискайте повече или по-малко от него с reasoning_effort ("minimal", "low", "medium" или "high") или "reasoning": {"effort": "high"}или да добавите :thinking на името на модела, което означава високо усилие. На модел без разсъждение настройката се пренебрегва. nymbot/auto, :thinking Изпраща искането към стандартния маршрут за разсъждение.

На антропологичните модели усилието се превръща в бюджет за мислене от около 1000, 2000 или 8000 токена, никога повече от max_tokens Мисленето е изоставено, когато tool_choice принуждава инструмент, а когато искането продължава инструментна лента (последното му съобщение е резултат от инструмент), защото Anthropic се нуждае от по-рано подписаното мислене, за да го възобнови.

Разумът се връща в message.reasoning_contentили delta.reasoning_content когато стрийминг, никога не се смесват в отговора. Разсъждение е изход и се зарежда като такъв, вътре completion_tokensНякои доставчици изобщо не връщат мотивационния текст и той все още се таксува.

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

Допълнителни модели

Суфиксът на името на модела променя начина, по който се обработва заявката, без друго поле. anthropic/claude-sonnet-5:online.

ДостатъчноЕфект
:onlineТърси в интернет първо, като plugins: [{"id": "web"}]Виж WEB Търсене.
:thinkingВисоко рационално усилие; на nymbot/autoНа модела, който не може да разсъждава, 400 model_not_found с “не са намерени крайни точки”.
:nitro, :floor, :exacto, :extendedВсеки модел на каталога има един маршрут, така че няма по-бърз, по-евтин или по-дълъг, за да изберете един; суфиксите са позволени, така че имената на моделите, копирани от други услуги, все още работят.

Всякакви други суфикси се игнорират. Цялото име се опитва първо, така че модел, чийто идентификатор наистина съдържа колона, все още работи; в противен случай, суфиксите се изваждат от края един по един, докато моделът не съвпадне. 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 търси последното потребителско съобщение (първите 2000 символа), чете най-добрите страници и ги дава на модела с въпрос, маркиран като външно съдържание, от което моделът не трябва да взема инструкции.

  • Винаги търси: "plugins": [{"id": "web", "max_results": 5}]или а :online Достатъчно е за модела.
  • Търси, когато помага: "tools": [{"type": "web_search", "parameters": {"max_results": 5}}]Също така приети като web_search_preview или openrouter:web_searchNymbot търси само когато въпросът изглежда, че се нуждае от текуща информация, същият тест използва приложението.

max_results е 5 по подразбиране и на максимум 10. източниците се връщат в nymbot.web_search.sourcesВсеки с а title, snippet и urlи като url_citation бележки върху съобщението.

Всяко търсене, което работи, струва $ 0,008, преобразувано в sats, на върха на токените, и това е част от задържането. Страниците, които чете, също са входни токени, така че отговорът от интернет струва повече от същия въпрос, зададен студено, понякога няколко пъти повече.

Отговорът, отчасти

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

Отговор на огън

По-новият формат на OpenAI, използван от OpenAI Agents SDK и от Codex. Той работи на същите модели, фактуриране и функции като Chat Completions.

POST https://nymbot.ai/api/v1/responses Нуждаете се от API ключ.

полетоТипНеобходимиОписание на
modelСтрийтдаКато за Чат завършванеВключени са и суфикси.
inputString или Arrayдаstring, или списък с елементи: съобщения (роли user, assistant, system, developer) с input_text, input_image и output_text части и function_call и function_call_output Елементи за инструменти. input_image Вземете една image_url връзка или URL адрес на данните, а не идентификатор на файла. reasoning и web_search_call предметите са премахнати; item_reference е отхвърлено
instructionsСтрийтнеИнструкции за системата.
max_output_tokensинтегритетнеНай-много токени за писане
temperature
top_p
бройнеИзмерване на контролите, където моделът ги взема.
tools
tool_choice
parallel_tool_calls
матрица, низ или обект, булевинеФункционални инструменти, под формата на отговори ({"type": "function", "name": …, "parameters": …}) А web_search или web_search_preview Инструментът се превръща WEB Търсене Когато помага, други вградени инструменти се отказват.
reasoningОбектътне{"effort": "minimal" | "low" | "medium" | "high"}. xhigh и max означава high; none Превърнете го от.
text.format
response_format
ОбектътнеСтруктуриран изход, като JSON схема или json_object.
metadataОбектътнеВръща се непроменено в отговора. при максимум 16 стойности на низ, ключове до 64 знака и стойности до 512.
streamбулеварднеИзтегляне на събития, както е описано по-долу.
storeбулеварднеНищо не се съхранява и отговорът винаги казва: "store": false.
previous_response_id
conversation
background
Структура, обект, булеварднеНе са подкрепени: 400 unsupported_parameterОтговорите не се съхраняват, така че изпратете целия разговор в input Всеки път

Отговор

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

Искане за инструмент се появява в output като а function_call точка с call_id, name и argumentsИзпратете резултата обратно като a function_call_output Етикет със същото call_idРазумът, когато моделът го върне, е reasoning точка с reasoning_text съдържание, изброени първо. status е incomplete Когато отговорът удари max_output_tokens Доставчикът е отказал, с incomplete_details.reason Поставете max_output_tokens или content_filterОтговорът също така отговаря на настройките на заявката (температура, инструменти, избор на инструменти и т.н.), както прави OpenAI, и носи nymbot Цената на обекта.

Стремейд, всяко събитие е event: линия и а data: Линия с а sequence_numberВ този ред: response.created, response.in_progress, response.output_item.added, response.content_part.addedВсеки брой на response.output_text.delta, response.output_text.done, response.content_part.done, response.output_item.doneИ накрая response.completed с използването и разходите. Отговорът се съкращава с кратки response.incomplete Вместо това, и провал, след като потокът започна с response.failedРазсъждавайки потоци като свой собствен елемент с response.reasoning_text.delta и .doneИнструменталните повиквания идват след съобщението, всеки като елемент с response.function_call_arguments.delta и .done.

статутКога
400не model или input; previous_response_id, conversation, background или на item_reference (unsupported_parameter); неподдържан инструмент или тип съдържание.
402, 403, 404, 429, 502, 503По отношение на завършването на чата.

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

Антропогенни послания

Форматът на Anthropic, за Anthropic SDK и Claude Code. Той работи с всеки модел в каталога, не само Claude: заявката се превежда, изпълнява се през един и същ тръбопровод и се превежда обратно.

POST https://nymbot.ai/api/v1/messages — се нуждае от API ключ, както x-api-key или Authorization: Bearer.

на anthropic-version и anthropic-beta Антропогенните имена на моделите са съобразени с каталога, така че Claude Code и SDK работят с имената, които вече използват:

  • Име, което каталогът знае, като например claude-sonnet-5 или anthropic/claude-opus-5Използва се така, както е.
  • В случай, че датата (-20260514), -latestЕдна версия като -v1И така, за един блестящ ден като [1m] и една anthropic/ или anthropic. Префиксът се премахва, а точките и тапите в версията се изпробват и по двата начина (claude-haiku-4-5 Намери claude-haiku-4.5).
  • Ако това все още не съвпада, се използва семейството (Opus, Sonnet или Haiku), стига версията на каталога да е същата или по-нова от поисканата.
  • Името, което не съвпада с нищо, се връща 404 not_found_error.
полетоТипНеобходимиОписание на
modelСтрийтдаИдентификатор на каталогов модел или име на антропологичен модел.
max_tokensинтегритетдаНай-много токени за писане
messagesАрсеналдаuser и assistant Върни се, с text, image (base64 или източник на URL), tool_use и tool_result на блоковете. thinking Блокове от предишни обиколки се приемат и отпадат.
systemString или ArrayнеПомощ на системата, като string или текстови блокове.
temperature
top_p
бройнеИзмерване на контролите, където моделът ги взема. top_k Приети са и отпаднали.
stop_sequencesСъвпадение за StringsнеТекст, който завършва отговора. Най-много 4 струни, всеки с максимум 256 символа.
tools
tool_choice
Археология, обектнеИнструменти с name, description и input_schemaА web_search Серверният инструмент се превръща в WEB ТърсенеДругите вградени инструменти на Anthropic (баш, текстов редактор, използване на компютър) се отказват с unsupported_tool. tool_choice взема auto, any, tool или noneи disable_parallel_tool_use.
thinkingОбектътне{"type": "enabled", "budget_tokens": 8192}, {"type": "adaptive"} или {"type": "disabled"}Бюджетът избира ниво на усилие: под 2 048 минимално, от 2 048 ниско, от 8 192 средно, от 16 384 високо. output_config.effortИли пък високо.
streamбулеварднеИзтегляне във формат на събитие на Anthropic.
metadataОбектътнеПриети и игнорирани.

Отговор

{
  "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 Също така може да задържи tool_use Блокове и А thinking Блокът, който signature Той е празен. stop_reason е end_turn, max_tokens, tool_use или refusalРаботи по същия начин, по който finish_reason е Чат завършване; stop_sequence винаги е null, дори когато спираща се последователност завършва отговора. input_tokens брои само пресни входове; кеширан вход е в двете полета за кеширане. nymbot Обектът и X-Nymbot-Cost-Sats на хедър

Събитията са от Anthropic’s: message_start, content_block_start, ping, content_block_delta (text_delta, input_json_delta или thinking_delta), content_block_stop, message_delta Причината за това е, че използването и nymbot Цената на обекта и message_stopА ping Също така се изпраща на всеки 15 секунди, докато моделът работи. Обажданията на инструментите пристигат след текста, всеки като tool_use Блок с целия си вход в един input_json_delta.

Грешки в тази крайна точка използват формата на Anthropic: {"type": "error", "error": {"type": "not_found_error", "message": "…"}}Краткото равновесие е 402 billing_errorПретоварен доставчик 503 overloaded_errorПровал, след като потокът е започнал, се изпраща като error Събитието .

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

Преброяване на токени

Оценка на броя на входните токени, които искането за съобщения ще използва, така че клиентът да може да проверява преди да изпрати.

POST https://nymbot.ai/api/v1/messages/count_tokens Нуждаете се от ключ за API.

Тялото е същото като СъобщенияБез да max_tokens; името на модела трябва да се реши. броят е оценка: символите на системния бутон, съобщенията, повикванията на инструменти и определенията на инструментите се делят на четири, плюс 1600 за всяко изображение. Това не е собствен токенизатор на доставчика, така че действителното броене може да се различава.

Отговор

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

Списък на моделите

Всеки модел и генератор на API приема, с това, което струва. списъкът се чете от същия директен каталог като пикера на приложението, така че винаги е това, което сървърът ще работи.

GET https://nymbot.ai/api/v1/models — няма нужда от ключ. Скрито за пет минути.

GET /api/v1/models/{id} Връща се един вход.

полетоТипНеобходимиОписание на
typeСтрийт (поискане на търсене)неchat (В случай на неизпълнение на задължението), image, video, audio, embedding или allНякои от тях могат да се използват, като image,video.

Цените са това, което плащате, с таксата и маржа вече в, в долари и в ставки на текущата цена на Bitcoin. balance Показва какъв баланс харчи моделът. nymbot_key е краткото име на модела в приложението. created винаги е 0, тъй като каталогът не записва кога е добавен модел. per_request вместо това.

nymbot/auto винаги е на първо място, ценен като variable, с а routes Списъкът, който дава тарифите на всеки стандартен маршрут.Той изброява визията и разсъжденията, но не и инструментите.

GET /api/v1/models/{id} приема същите имена и псевдоними като заявка и връща входа за модела, за който решават.

Отговор

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

Другите видове:

  • Изображение Входовете са capabilities (accepts_image_url, requires_image_url, editи една цена per_generation.
  • Видеото Входовете са max_duration_seconds и resolutionsи една цена per_second за всяка резолюция.
  • Аудио Входовете са audio_type speech или transcriptionЦената per_1k_chars или per_minute.
  • Вграждане Входовете са dimensions, context_length, max_inputs и цена на един милион входящи токени.

Маркирани цени "estimated": true е прогнозата на приложението за генератор, чиято цена не е публикувана. type Връщане 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);