База знаний Разработчики
Чат, ответы и сообщения
Три способа спросить модель что-то, в трех форматах клиенты уже говорят, все работают на одних и тех же моделях и оплачиваются одинаково.
Эта страница для удобства переведена автоматически. Применяется английский оригинал.
Чат Завершение
Формат чата OpenAI, и тот, который поддерживает почти каждый инструмент. Отправить разговор до сих пор и получить следующее сообщение обратно.
POST https://nymbot.ai/api/v1/chat/completions Нужен ключ API.
только model и messages Параметр отбора проб, который выбранная модель не принимает, опускается без ошибки, так что тело одного запроса работает по моделям. supported_parametersТо, что отвергается, а не бросается, - это то, что модель не может сделать вообще: фотографии для модели, которая не может видеть, инструменты для модели, которая не может их вызвать.
| Поле | Тип | Требуется | Описание |
|---|---|---|---|
model | Стринг | Да | nymbot/auto (или auto) для маршрутизации Nymbot по стандартному балансу или идентификатор модели каталога, такой как anthropic/claude-sonnet-5 на балансе Pro. Краткие названия и псевдонимы приложения также принимаются. Достаточно. |
messages | Array | Да | Разговор - Роли system, developer (применяется в качестве системы) user, assistant и toolСодержание — это строка или список text и image_url части; изображения только в сообщениях пользователя. input_audio и части файлов отказываются. |
stream | Боулиан | Нет | Ответьте так, как написано. см. streaming. |
stream_options | Объект | Нет | {"include_usage": true} добавляет последнюю порцию с счетчиками токенов и стоимостью. |
max_tokensmax_completion_tokens | integer | Нет | Большинство токенов, чтобы написать. Снижен до максимума модели, если она выше. Также устанавливает, сколько удерживается из вашего баланса, так что меньшее число нуждается в меньшем кредите, чтобы начать. |
temperaturetop_p | Номер | Нет | Образец контроля: temperature от 0 до 2, top_p от 0 до 1. |
stop | string или array | Нет | Текст, который заканчивает ответ: строка или не более 4 строк, каждый из которых не более 256 символов. nymbot/auto. |
seed | integer | Нет | Для повторного отбора проб, где модель его поддерживает. |
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 | Array | Нет | [{"id": "web", "max_results": 5}] всегда ищет веб-сайт первым. до 10 результатов. |
n | integer | Нет | Только 1.Всё остальное возвращается 400. |
logit_biasusermetadata | Объект, Структура, Объект | Нет | Приняты и не отправлены. 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 секунд; модель все еще заканчивается и то, что она написала, заряжается, но ответ потерян.
потока
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, 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 которой действительно содержит колону, все еще работает; в противном случае суффиксы снимаются с конца один за другим, пока модель не совпадает. 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);
Ответ огня
Новейший формат 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 | integer | Нет | Наибольшее количество токенов для написания. |
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 Установить 2 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);
Антропогенные послания
Он работает с каждой моделью в каталоге, не только 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 | integer | Да | Наибольшее количество токенов для написания. |
messages | Array | Да | 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 → Header
Транслируемые, события являются 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} Возвращается 1 вход.
| Поле | Тип | Требуется | Описание |
|---|---|---|---|
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);