Перейти к содержимому
Вернуться в Nymbot

База знаний Разработчики

Чат, ответы и сообщения

Три способа спросить модель что-то, в трех форматах клиенты уже говорят, все работают на одних и тех же моделях и оплачиваются одинаково.

Чат Завершение

Формат чата OpenAI, и тот, который поддерживает почти каждый инструмент. Отправить разговор до сих пор и получить следующее сообщение обратно.

POST https://nymbot.ai/api/v1/chat/completions Нужен ключ API.

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

ПолеТипТребуетсяОписание
modelСтрингДаnymbot/auto (или auto) для маршрутизации Nymbot по стандартному балансу или идентификатор модели каталога, такой как anthropic/claude-sonnet-5 на балансе Pro. Краткие названия и псевдонимы приложения также принимаются. Достаточно.
messagesArrayДаРазговор - Роли system, developer (применяется в качестве системы) user, assistant и toolСодержание — это строка или список text и image_url части; изображения только в сообщениях пользователя. input_audio и части файлов отказываются.
streamБоулианНетОтветьте так, как написано. см. streaming.
stream_optionsОбъектНет{"include_usage": true} добавляет последнюю порцию с счетчиками токенов и стоимостью.
max_tokens
max_completion_tokens
integerНетБольшинство токенов, чтобы написать. Снижен до максимума модели, если она выше. Также устанавливает, сколько удерживается из вашего баланса, так что меньшее число нуждается в меньшем кредите, чтобы начать.
temperature
top_p
НомерНетОбразец контроля: temperature от 0 до 2, top_p от 0 до 1.
stopstring или arrayНетТекст, который заканчивает ответ: строка или не более 4 строк, каждый из которых не более 256 символов. nymbot/auto.
seedintegerНетДля повторного отбора проб, где модель его поддерживает.
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} Отключите его. см. рассуждения.
pluginsArrayНет[{"id": "web", "max_results": 5}] всегда ищет веб-сайт первым. до 10 результатов.
nintegerНетТолько 1.Всё остальное возвращается 400.
logit_bias
user
metadata
Объект, Структура, ОбъектНетПриняты и не отправлены. logit_bias карты с максимальным количеством 300 токенов к числам от -100 до 100; user Максимально 256 символов. metadata содержит до 16 значений строк, ключей до 64 символов и значений до 512.

Ответ – это обычный chat.completionВ то время как стоимость в usage.cost (в долларах) и в nymbot Объект . model является разрешенной моделью id, так что короткое имя возвращается как полное. message.reasoning_contentотдельно от ответа.

Ответить

{
  "id": "chatcmpl-5f1c0a9e27d84b3c",
  "object": "chat.completion",
  "created": 1790726400,
  "model": "anthropic/claude-sonnet-5",
  "choices": [
    {
      "index": 0,
      "message": {
        "role": "assistant",
        "content": "A Lightning invoice is a one-time payment request..."
      },
      "logprobs": null,
      "finish_reason": "stop"
    }
  ],
  "usage": {
    "prompt_tokens": 1240,
    "completion_tokens": 380,
    "total_tokens": 1620,
    "prompt_tokens_details": { "cached_tokens": 0 },
    "completion_tokens_details": { "reasoning_tokens": 0 },
    "cost": 0.01895
  },
  "nymbot": {
    "balance": "pro",
    "charged_credits": 0.162,
    "charged_sats": 16.2,
    "balance_credits": 412.425,
    "balance_sats": 41242.5
  }
}

finish_reason исходит из того, что вернулось, поскольку провайдеры сообщают об этом по-разному: tool_calls Когда модель просит инструменты, length когда ответ использовал каждый допустимый токен (или модель потратила их все на рассуждение и не написала никакого ответа), content_filter Если поставщик отказывается, и stop В противном случае usage.completion_tokens_details.reasoning_tokens всегда 0: скрытые токены рассуждения считаются и взимаются в completion_tokens.

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

Коды состояния каждой конечной акции перечислены в Ошибки.

cURL

curl https://nymbot.ai/api/v1/chat/completions \
  -H "Authorization: Bearer $NYMBOT_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "anthropic/claude-sonnet-5",
    "messages": [
      {"role": "system", "content": "Answer in one short paragraph."},
      {"role": "user", "content": "What is a Lightning invoice?"}
    ],
    "max_tokens": 400
  }'

Python

import os
from openai import OpenAI

client = OpenAI(base_url="https://nymbot.ai/api/v1", api_key=os.environ["NYMBOT_API_KEY"])

reply = client.chat.completions.create(
    model="anthropic/claude-sonnet-5",
    messages=[
        {"role": "system", "content": "Answer in one short paragraph."},
        {"role": "user", "content": "What is a Lightning invoice?"},
    ],
    max_tokens=400,
)
print(reply.choices[0].message.content)
print(reply.usage.cost)

JavaScript

import OpenAI from "openai";

const client = new OpenAI({ baseURL: "https://nymbot.ai/api/v1", apiKey: process.env.NYMBOT_API_KEY });

const reply = await client.chat.completions.create({
  model: "anthropic/claude-sonnet-5",
  messages: [
    { role: "system", content: "Answer in one short paragraph." },
    { role: "user", content: "What is a Lightning invoice?" },
  ],
  max_tokens: 400,
});
console.log(reply.choices[0].message.content);
console.log(reply.usage.cost);

Стриминг

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

Потоковать все, что может занять больше, чем около 100 секунд, например, длинный ответ, большой ответ. max_tokens запрос, который не транслируется, не отправляет ничего до тех пор, пока ответ не будет завершен, и сеть между вами и Nymbot может закрыть беспорядочное соединение через около 100 секунд; модель все еще заканчивается и то, что она написала, заряжается, но ответ потерян.

потока

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

Nymbot ищет последнее сообщение пользователя (свои первые 2000 символов), читает лучшие страницы и передает их модели с вопросом, отмеченным как внешний контент, от которого модель не должна принимать инструкции.

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

max_results 5 по умолчанию и максимум 10. источники возвращаются в nymbot.web_search.sourcesКаждый с а title, snippet и urlИ как url_citation Аннотации к сообщению.

Каждый поиск, который работает, стоит $ 0,008, преобразованный в sats, на верхней части токенов, и это часть удержания.Страницы, которые он читает, также являются входными токенами, поэтому ответ с интернета стоит больше, чем тот же вопрос, который был поставлен холодным, иногда в несколько раз больше.

Ответ, частично

"nymbot": {
  "balance": "pro",
  "charged_credits": 0.431,
  "charged_sats": 43.1,
  "balance_credits": 411.994,
  "balance_sats": 41199.4,
  "web_search": {
    "sources": [
      { "title": "Lightning Network - Wikipedia", "snippet": "The Lightning Network is a payment protocol...", "url": "https://en.wikipedia.org/wiki/Lightning_Network" }
    ]
  }
}

cURL

curl https://nymbot.ai/api/v1/chat/completions \
  -H "Authorization: Bearer $NYMBOT_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "anthropic/claude-sonnet-5",
    "plugins": [{"id": "web", "max_results": 5}],
    "messages": [{"role": "user", "content": "What changed in the latest Bitcoin Core release?"}]
  }'

Python

import os
from openai import OpenAI

client = OpenAI(base_url="https://nymbot.ai/api/v1", api_key=os.environ["NYMBOT_API_KEY"])

reply = client.chat.completions.create(
    model="anthropic/claude-sonnet-5",
    messages=[{"role": "user", "content": "What changed in the latest Bitcoin Core release?"}],
    extra_body={"plugins": [{"id": "web", "max_results": 5}]},
)
print(reply.choices[0].message.content)
for source in reply.model_extra["nymbot"]["web_search"]["sources"]:
    print(source["url"])

JavaScript

import OpenAI from "openai";

const client = new OpenAI({ baseURL: "https://nymbot.ai/api/v1", apiKey: process.env.NYMBOT_API_KEY });

const reply = await client.chat.completions.create({
  model: "anthropic/claude-sonnet-5",
  plugins: [{ id: "web", max_results: 5 }],
  messages: [{ role: "user", content: "What changed in the latest Bitcoin Core release?" }],
});
console.log(reply.choices[0].message.content);
for (const source of reply.nymbot.web_search.sources) console.log(source.url);

Ответ огня

Новейший формат OpenAI, используемый OpenAI Agents SDK и Codex. Он работает на тех же моделях, счетах и функциях, что и Chat Completions.

POST https://nymbot.ai/api/v1/responses Нужен ключ API.

ПолеТипТребуетсяОписание
modelСтрингДаКак для Чат ЗавершениеВключены и супфиксы.
inputstring или arrayДаСтруктура или список элементов: сообщения (роли 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_tokensintegerНетНаибольшее количество токенов для написания.
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 Установить 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), при условии, что версия каталога такая же или более новая, чем запрошенная.
  • Имя, которое ничего не совпадает, возвращается 404 not_found_error.
ПолеТипТребуетсяОписание
modelСтрингДаИдентификатор модели каталога или имя антропогенной модели.
max_tokensintegerДаНаибольшее количество токенов для написания.
messagesArrayДа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 → 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 вход.

ПолеТипТребуетсяОписание
typeString (требование)Нет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);