Перейти до вмісту
Повернутись до 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 Кб визначень, втілених на максимум 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
Об’єкт, String, Об’єктНіПрийнято і не відправлено. logit_bias мапи на максимум 300 ідентифікаторів токенів до чисел від -100 до 100; user Максимум 256 символів; metadata зберігає до 16 значень рядків, ключів до 64 символів і значень до 512.

Відповідь – звичайна chat.completionЗгідно з вартістю в usage.cost (в доларах) і в nymbot Об’єкт model є ідентифікатором вирішеної моделі, тому коротке ім'я повертається як повне. 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 секунд; модель все ще закінчується і те, що вона написала, заряджається, але відповідь втрачена.

потоку

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 Responses не надходять від провайдера, вони все одно відповідають з дійсним потоком, відправленим після того, як відповідь буде завершена.

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, До 20 фотографій на запит. SVG фотографії відмовляються, так само є посилання понад 4 096 символів або один з ім'ям користувача або паролем в ньому (400 invalid_image_url1) Опціональний 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, 2 000, 8 000 або 16 000 токенів, ніколи не більше ніж 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);

Модель suffixes

Суфікс на ім'я моделі змінює, як обробляється запит, без іншого поля. Вони працюють на повні ідентифікатори і короткі імена, як у anthropic/claude-sonnet-5:online.

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

Будь-який інший суфікс ігнорується.Все ім'я спочатку випробовується, тому модель, ID якої дійсно містить колону, все ще працює; у разі відсутності цього, суфікси знімаються з кінця один за одним, поки модель не збігається.Назва моделі може бути не більше 200 символів довжиною з не більше 4 суфіксами; більш довгий відмовляється з 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);

Відповідь API

Новітній формат OpenAI, використовуваний OpenAI Agents SDK і Codex. Він працює на тих самих моделях, розрахунках і функціях, як Chat Completions.

POST https://nymbot.ai/api/v1/responses Для цього потрібен ключ API.

ПолеТипНеобхідніОпис
modelСтрингтакЯк для Завершення чатуДодаткові суфікси включені.
inputstring або arrayтакСтрічка, або список елементів: повідомлення (ролі 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НіСистема запропонована, як рядка або текстові блоки.
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 Хідер

Повідомляється, що події відбуваються в Антарктиді: 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Стрічка (англ. string) для запитуНі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);