Документация NomadRoute API
Версия 1.0 · База: https://route.nomadhost.xyz/v1
Быстрый старт
NomadRoute говорит на протоколе OpenAI: достаточно указать другой base_url и ключ NomadRoute.
Python (openai)
pip install openai
import os
from openai import OpenAI
client = OpenAI(
base_url="https://route.nomadhost.xyz/v1",
api_key="nr-live-ВАШ_КЛЮЧ",
)
response = client.chat.completions.create(
model="auto",
messages=[{"role": "user", "content": "Привет! Расскажи о себе в двух словах."}],
)
print(response.choices[0].message.content)
print(response.nomadroute.request_id, response.nomadroute.cost_usd)
JavaScript (openai-node)
npm install openai
import OpenAI from "openai";
const client = new OpenAI({
baseURL: "https://route.nomadhost.xyz/v1",
apiKey: process.env.NOMADROUTE_API_KEY,
});
const response = await client.chat.completions.create({
model: "auto",
messages: [{ role: "user", content: "Привет!" }],
});
console.log(response.choices[0].message.content);
cURL
curl https://route.nomadhost.xyz/v1/chat/completions \
-H "Authorization: Bearer nr-live-ВАШ_КЛЮЧ" \
-H "Content-Type: application/json" \
-d '{
"model": "auto",
"messages": [{"role": "user", "content": "Привет!"}]
}'
Base URL и API-ключ
Ключ создаётся в личном кабинете и показывается один раз. Передавайте его в заголовке:
Authorization: Bearer nr-live-...
Модели
Список моделей с ценами и возможностями: GET /v1/models и страница «Модели и цены».
curl https://route.nomadhost.xyz/v1/models \
-H "Authorization: Bearer nr-live-ВАШ_КЛЮЧ"
Цены указаны за 1 000 000 токенов в USD. Если для модели задана скидка, она применяется автоматически ко всем типам токенов (вход, выход, кешированные).
Автоматическая маршрутизация
Поле model управляет выбором модели:
| Значение | Режим | Описание |
|---|---|---|
"auto" | Auto | Оптимальный баланс цены, качества и скорости (режим по умолчанию) |
"budget" | Budget | Максимально экономичный вариант в рамках разумного качества |
"quality" | Quality | Приоритет качества с учётом бюджета и доступности |
"fast" | Fast | Приоритет минимальной задержки |
<model_id> | Manual | Конкретная модель из GET /v1/models |
Режим выбирается отдельно для каждого API-запроса значением поля model; настройки в кабинете не влияют на маршрутизацию.
nomadroute.attempts) и в истории кабинета.
Chat Completions
POST /v1/chat/completions — совместим с OpenAI Chat Completions API.
| Параметр | Тип | Описание |
|---|---|---|
model | string | Обязателен: ID модели из GET /v1/models или один из режимов auto, budget, quality, fast |
messages | array | Сообщения (роли system/user/assistant/tool; контент — текст или части с изображениями) |
stream | boolean | Потоковая генерация (SSE) |
stream_options | object | {"include_usage": true} — финальный чанк с использованными токенами |
temperature | number | 0–2 (если поддерживается моделью) |
top_p | number | 0–1 |
top_k | integer | Если поддерживается моделью |
max_tokens / max_completion_tokens | integer | Лимит выходных токенов |
stop | string|array | Стоп-последовательности |
tools, tool_choice, parallel_tool_calls | — | Вызов инструментов (для моделей с поддержкой) |
response_format | object | {"type": "json_object"} / json_schema |
reasoning_effort | string | none/minimal/low/medium/high/xhigh/max |
seed, n, user | — | Стандартные параметры OpenAI |
unsupported_parameter (400) —
запрос не выполняется частично. Набор параметров зависит от выбранной модели
(например, temperature недоступен на части моделей).
Ответ
{
"id": "chatcmpl-...",
"object": "chat.completion",
"created": 1730000000,
"model": "claude-sonnet-5",
"choices": [
{"index": 0, "message": {"role": "assistant", "content": "..."}, "finish_reason": "stop"}
],
"usage": {
"prompt_tokens": 128,
"completion_tokens": 64,
"total_tokens": 192,
"prompt_tokens_details": {"cached_tokens": 0}
},
"nomadroute": {
"request_id": "req_...",
"model": "claude-sonnet-5",
"mode": "auto",
"attempts": 1,
"cost_usd": 0.0009,
"provider_cost_usd": 0.0009,
"discount_usd": 0.0
}
}
Идентификатор запроса также возвращается в заголовке x-request-id — указывайте его в обращении в поддержку.
Потоковая генерация
stream = client.chat.completions.create(
model="auto",
messages=[{"role": "user", "content": "Напиши короткое стихотворение"}],
stream=True,
stream_options={"include_usage": True},
)
for chunk in stream:
if chunk.choices:
print(chunk.choices[0].delta.content or "", end="")
if chunk.usage:
print("\\nтокены:", chunk.usage.prompt_tokens, chunk.usage.completion_tokens)
Перед data: [DONE] приходит финальный чанк с usage и объектом nomadroute (стоимость запроса).
Инструменты
response = client.chat.completions.create(
model="auto",
messages=[{"role": "user", "content": "Какая погода в Москве?"}],
tools=[{
"type": "function",
"function": {
"name": "get_weather",
"description": "Погода в городе",
"parameters": {
"type": "object",
"properties": {"city": {"type": "string"}},
"required": ["city"],
},
},
}],
)
# response.choices[0].message.tool_calls
Ошибки
Формат ошибок совместим с OpenAI:
{"error": {"message": "...", "type": "invalid_request_error", "param": null, "code": "invalid_request"}}
| HTTP | code | Значение |
|---|---|---|
| 400 | invalid_request / invalid_json | Некорректный запрос или JSON |
| 400 | invalid_parameter / unsupported_parameter | Параметр не поддержан выбранной моделью (param указывает поле) |
| 400 | unsupported_capability | Модель не поддерживает нужную возможность (tools, vision, stream) |
| 400 | refusal | Модель отклонила запрос поPolicy Grounds содержанию |
| 401 | invalid_api_key | Неверный, отозванный или истёкший ключ |
| 402 | insufficient_balance | Недостаточно средств на балансе |
| 402 | budget_exceeded | Исчерпан бюджет API-ключа |
| 404 | model_not_found | Модель не найдена или отключена |
| 409 | idempotency_conflict | Idempotency-Key уже использован с другим телом |
| 413 | payload_too_large | Тело запроса слишком большое |
| 429 | rate_limit_exceeded | Превышен лимит тарифа (заголовок Retry-After) |
| 499 | request_cancelled | Клиент отключился до завершения |
| 502/503 | provider_error / provider_unavailable | Ошибка или недоступность провайдера (fallback исчерпан) |
| 504 | gateway_timeout | Провайдер не ответил за отведённое время |
Биллинг
- Оплата — по фактическому использованию токенов после выполнения запроса.
- Учитываются отдельно: входные, выходные и кешированные входные токены.
- Стоимость считается по тарифам NomadRoute (они могут отличаться от цен провайдеров) с учётом скидки модели.
- Перед дорогим запросом проверяется предполагаемая стоимость: при недостатке баланса возвращается 402.
- Баланс не может стать отрицательным — списание атомарно и условно.
- Отменённые и ошибочные запросы не тарифицируются; история операций — в кабинете.
- Повторный запрос с тем же
Idempotency-Keyи тем же телом возвращает сохранённый результат без повторного списания.
curl https://route.nomadhost.xyz/v1/chat/completions \
-H "Authorization: Bearer nr-live-..." \
-H "Idempotency-Key: unique-request-id-123" \
-H "Content-Type: application/json" \
-d '{"model": "auto", "messages": [{"role": "user", "content": "..."}]}'
Лимиты
- Ограничения частоты задаются тарифом: запросов в минуту/день, токенов в минуту/день, параллельных запросов.
- Максимальный размер тела запроса — 1 МБ.
- До 200 сообщений и 64 инструментов в запросе.
- Каждый API-ключ может иметь собственный лимит бюджета; при его исчерпании ключ автоматически отзывается.
Обратная связь
curl https://route.nomadhost.xyz/v1/feedback \
-H "Authorization: Bearer nr-live-..." \
-H "Content-Type: application/json" \
-d '{"request_id": "req_...", "rating": 1, "comment": "Отличный ответ"}'
# rating: 1 — полезно, -1 — нет (одна оценка на запрос, можно изменить)
Вопросы: [email protected]