Документация 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.

ПараметрТипОписание
modelstringОбязателен: ID модели из GET /v1/models или один из режимов auto, budget, quality, fast
messagesarrayСообщения (роли system/user/assistant/tool; контент — текст или части с изображениями)
streambooleanПотоковая генерация (SSE)
stream_optionsobject{"include_usage": true} — финальный чанк с использованными токенами
temperaturenumber0–2 (если поддерживается моделью)
top_pnumber0–1
top_kintegerЕсли поддерживается моделью
max_tokens / max_completion_tokensintegerЛимит выходных токенов
stopstring|arrayСтоп-последовательности
tools, tool_choice, parallel_tool_calls—Вызов инструментов (для моделей с поддержкой)
response_formatobject{"type": "json_object"} / json_schema
reasoning_effortstringnone/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"}}
HTTPcodeЗначение
400invalid_request / invalid_jsonНекорректный запрос или JSON
400invalid_parameter / unsupported_parameterПараметр не поддержан выбранной моделью (param указывает поле)
400unsupported_capabilityМодель не поддерживает нужную возможность (tools, vision, stream)
400refusalМодель отклонила запрос поPolicy Grounds содержанию
401invalid_api_keyНеверный, отозванный или истёкший ключ
402insufficient_balanceНедостаточно средств на балансе
402budget_exceededИсчерпан бюджет API-ключа
404model_not_foundМодель не найдена или отключена
409idempotency_conflictIdempotency-Key уже использован с другим телом
413payload_too_largeТело запроса слишком большое
429rate_limit_exceededПревышен лимит тарифа (заголовок Retry-After)
499request_cancelledКлиент отключился до завершения
502/503provider_error / provider_unavailableОшибка или недоступность провайдера (fallback исчерпан)
504gateway_timeoutПровайдер не ответил за отведённое время

Биллинг

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": "..."}]}'

Лимиты

Обратная связь

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]