База знань розробників
Чат, відповіді та повідомлення
Три способи запитати моделі щось, в трьох форматах клієнти вже говорять, всі працюють на тих же моделях і обліковуються однаково.
Для зручності цю сторінку перекладено машинним способом. Застосовується англійський оригінал.
Завершення чату
Формат чату 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_tokensmax_completion_tokens | Інтеграція | Ні | Найбільше токенів для написання. Знижений до максимуму моделі, якщо вище. Також визначає, скільки тримається з вашого балансу, так що менша кількість потребує меншого кредиту, щоб почати. |
temperaturetop_p | Номер | Ні | Контроль за зразками: temperature від 0 до 2, top_p від 0 до 1. |
stop | string або array | Ні | Текст, що закінчується відповіддю: рядка або не більше 4 рядків, кожен з яких не більше 256 символів. nymbot/auto. |
seed | Інтеграція | Ні | Для повторного відбору зразків, де модель його підтримує. |
presence_penaltyfrequency_penalty | Номер | Ні | Повторні перевірки, кожен з яких від -2 до 2. |
response_format | Об'єкт | Ні | {"type": "json_object"} або {"type": "json_schema", "json_schema": {…}}, де модель підтримує його. не використовується nymbot/auto. |
toolstool_choiceparallel_tool_calls | матриця, струна або об'єкт, бульйон | Ні | Функція виклику. дивіться Засіб дзвінкаА web_search інструмент перетворюється на WEB ПошукМаксимум 128 інструментів і 512 Кб визначень, втілених на максимум 64 рівнях глибини; більше 400. |
reasoning_effortreasoning | Структура, об'єкт | Ні | "minimal", "low", "medium" або "high"або {"effort": "high"}. "none" або {"enabled": false} Вимкніть її, дивіться РОЗУМАННЯ. |
plugins | Ареї | Ні | [{"id": "web", "max_results": 5}] Пошук в інтернеті: до 10 результатів. |
n | Інтеграція | Ні | 1.Все інше повертається 400. |
logit_biasusermetadata | Об’єкт, 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);
WEB Пошук
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 | Стринг | так | Як для Завершення чатуДодаткові суфікси включені. |
input | string або 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 | Інтеграція | Ні | Найбільше слів для написання. |
temperaturetop_p | Номер | Ні | Пробний контроль, де модель бере їх. |
toolstool_choiceparallel_tool_calls | матриця, струна або об'єкт, бульйон | Ні | Використання функцій у формі відповідей ({"type": "function", "name": …, "parameters": …}) а web_search або web_search_preview інструмент перетворюється на WEB Пошук Інші вбудовані інструменти відмовляються. |
reasoning | Об'єкт | Ні | {"effort": "minimal" | "low" | "medium" | "high"}. xhigh і max означає high; none Вимкніть його |
text.formatresponse_format | Об'єкт | Ні | Структурований вихід, як схема JSON або json_object. |
metadata | Об'єкт | Ні | Повернуто без змін у відповіді: при максимум 16 значеннях рядків, ключі до 64 символів і значення до 512. |
stream | Боуліан | Ні | Поділитися подіями, як описано нижче. |
store | Боуліан | Ні | Нічого не зберігається, і відповідь завжди говорить: "store": false. |
previous_response_idconversationbackground | Структура, об'єкт, бульйон | Ні | Не підтримується : 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), за умови, що версія каталогу є тією ж або більш новою, ніж запропонована.
- Ім'я, яке нічого не відповідає, повертається
404not_found_error.
| Поле | Тип | Необхідні | Опис |
|---|---|---|---|
model | Стринг | так | Каталог ідентифікатора моделі або назва антропогенної моделі. |
max_tokens | Інтеграція | так | Найбільше слів для написання. |
messages | Ареї | так | user і assistant Повернення, з text, image (base64 або джерело URL) tool_use і tool_result Блоки thinking Блоки з попередніх поворотів приймаються і відкидаються. |
system | string або array | Ні | Система запропонована, як рядка або текстові блоки. |
temperaturetop_p | Номер | Ні | Пробний контроль, де модель бере їх. top_k Вона прийнята і відкинута. |
stop_sequences | Серія Strings | Ні | Текст, що закінчується відповіддю. Найбільше 4 рядки, кожен з яких не більше 256 символів. |
toolstool_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_typespeechабо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);