Provider Routing (Маршрутизация провайдеров)
Сервис автоматически направляет каждый запрос к лучшему доступному провайдеру выбранной модели. По умолчанию запросы балансируются между провайдерами с приоритетом более низкой цены и учётом их доступности.
Поведение маршрутизации настраивается через объект provider в теле запроса. Объект поддерживается текстовыми эндпоинтами: chat/completions, completions, Responses API, Anthropic Messages API и rerank.
Объект provider
Объект provider передаётся в теле запроса и управляет тем, кто и как обрабатывает запрос:
| Поле | Тип | По умолчанию | Описание |
|---|---|---|---|
order |
string[] | — | Список slug'ов провайдеров в порядке приоритета (например, ["anthropic", "openai"]) |
allow_fallbacks |
boolean | true |
Разрешить резервных провайдеров, когда основной недоступен |
require_parameters |
boolean | false |
Направлять запрос только провайдерам, поддерживающим все параметры запроса |
data_collection |
"allow" | "deny" | allow |
Разрешить или запретить провайдеров, которые могут сохранять данные |
zdr |
boolean | — | Маршрутизировать запрос только на ZDR-эндпоинты (Zero Data Retention) |
enforce_distillable_text |
boolean | — | Маршрутизировать запрос только на модели, разрешающие дистилляцию текста |
only |
string[] | — | Список провайдеров, разрешённых для этого запроса |
ignore |
string[] | — | Список провайдеров, которые нужно пропустить |
quantizations |
string[] | — | Фильтр по уровню квантизации (например, ["int4", "int8"]) |
sort |
string | object | — | Сортировка провайдеров по цене, скорости или задержке |
preferred_min_throughput |
number | object | — | Предпочтительная минимальная скорость (токенов/сек) |
preferred_max_latency |
number | object | — | Предпочтительная максимальная задержка (секунд) |
max_price |
object | — | Максимальная цена, которую вы готовы заплатить за запрос |
Все поля необязательны. Поля можно комбинировать — например, задать order вместе с allow_fallbacks: false.
Пример запроса с настройками маршрутизации:
curl https://api.ru-openrouter.ru/v1/chat/completions \
-H "Authorization: Bearer sk_ваш_api_ключ" \
-H "Content-Type: application/json" \
-d '{
"model": "meta-llama/llama-3.3-70b-instruct",
"messages": [{"role": "user", "content": "Привет!"}],
"provider": {
"order": ["deepinfra", "together"],
"allow_fallbacks": true
}
}'
Балансировка нагрузки по умолчанию
Если объект provider не задан (или в нём нет sort и order), запрос балансируется между провайдерами модели по следующей стратегии:
- Исключаются провайдеры, у которых за последние 30 секунд наблюдались значительные сбои.
- Среди стабильных провайдеров выбирается один из самых дешёвых — вероятность выбора взвешивается обратным квадратом цены.
- Остальные провайдеры используются как резервные.
Пример. Провайдер A стоит $1/M токенов, провайдер B — $2/M, провайдер C — $3/M, при этом у провайдера B недавно были сбои. Запрос будет направлен к провайдеру A — он в 9 раз вероятнее выбирается, чем C (вес 1/1² против 1/3²). Если A недоступен, запрос уйдёт к C, затем к B.
При запросе с tools / tool_choice роутер старается направлять запрос провайдерам, поддерживающим вызов инструментов. Если задан max_tokens, выбираются только провайдеры, способные вернуть ответ такой длины.
Если в запросе указан sort или order, балансировка нагрузки отключается — провайдеры перебираются в заданном порядке.
Сортировка провайдеров (sort)
Поле sort отключает балансировку и задаёт явный приоритет:
| Значение | Поведение |
|---|---|
"price" |
Всегда выбирать самого дешёвого провайдера |
"throughput" |
Всегда выбирать провайдера с максимальной скоростью (токенов/сек) |
"latency" |
Всегда выбирать провайдера с минимальной задержкой |
{
"model": "meta-llama/llama-3.3-70b-instruct",
"messages": [{"role": "user", "content": "Привет!"}],
"provider": {
"sort": "throughput"
}
}
Суффиксы :nitro и :floor
Вместо объекта provider можно добавить суффикс к имени модели:
| Суффикс | Эквивалент | Описание |
|---|---|---|
:nitro |
provider.sort = "throughput" |
Максимальная скорость ответа |
:floor |
provider.sort = "price" |
Минимальная цена |
{
"model": "openai/gpt-4o-mini:nitro",
"messages": [{"role": "user", "content": "Быстрый ответ, пожалуйста!"}]
}
Суффикс перекрывает provider.sort, если он задан в запросе явно.
Порядок провайдеров (order)
Поле order задаёт список провайдеров в порядке приоритета. Роутер пробует их по очереди; если ни один не работает — переходит к остальным доступным провайдерам модели (если не запрещены fallback'и).
{
"model": "mistralai/mixtral-8x7b-instruct",
"messages": [{"role": "user", "content": "Привет!"}],
"provider": {
"order": ["together", "deepinfra"]
}
}
Чтобы запретить всех остальных провайдеров, добавьте allow_fallbacks: false:
{
"model": "mistralai/mixtral-8x7b-instruct",
"messages": [{"role": "user", "content": "Привет!"}],
"provider": {
"order": ["together"],
"allow_fallbacks": false
}
}
В этом случае, если together недоступен, запрос завершится ошибкой вместо маршрутизации к другому провайдеру.
Подсказка: список провайдеров, доступных для конкретной модели, можно посмотреть в личном кабинете — на странице Правила провайдеров и на странице статистики запросов.
Таргетинг конкретных эндпоинтов провайдера
Один провайдер может обслуживать модель через несколько эндпоинтов: основной, специализированный «turbo»-вариант или региональные эндпоинты (например, google-vertex/us-east5).
Базовый slug матчит все эндпоинты провайдера, включая варианты и регионы. Чтобы выбрать конкретный эндпоинт — укажите полный slug с суффиксом:
| Slug в запросе | Что матчится |
|---|---|
"google-vertex" |
Все эндпоинты Google Vertex (все регионы) |
"google-vertex/us-east5" |
Только эндпоинт региона us-east5 |
"deepinfra" |
Все эндпоинты DeepInfra (основной + turbo) |
"deepinfra/turbo" |
Только turbo-эндпоинт DeepInfra |
{
"model": "deepseek/deepseek-r1",
"messages": [{"role": "user", "content": "Привет!"}],
"provider": {
"order": ["deepinfra/turbo"],
"allow_fallbacks": false
}
}
Подсказка: чтобы направлять запросы ко всем эндпоинтам провайдера (во всех регионах и вариантах), используйте базовый slug без суффикса.
Отключение резервных провайдеров (allow_fallbacks)
По умолчанию allow_fallbacks = true: при недоступности приоритетного провайдера запрос направляется резервным. Значение false гарантирует, что запрос обслужит только самый приоритетный провайдер — либо вернётся ошибка.
{
"messages": [{"role": "user", "content": "Привет!"}],
"provider": {
"allow_fallbacks": false
}
}
Комбинируется с order: без fallback'ов список order становится исчерпывающим перечнем провайдеров.
Разрешение только выбранных провайдеров (only)
Поле only ограничивает маршрутизацию заданным списком провайдеров:
{
"model": "openai/gpt-4o",
"messages": [{"role": "user", "content": "Привет!"}],
"provider": {
"only": ["azure"]
}
}
Внимание: ограничение списка провайдеров сокращает количество резервных вариантов и снижает устойчивость запроса к сбоям.
Игнорирование провайдеров (ignore)
Поле ignore исключает провайдеров из маршрутизации для запроса:
{
"model": "meta-llama/llama-3.3-70b-instruct",
"messages": [{"role": "user", "content": "Привет!"}],
"provider": {
"ignore": ["deepinfra"]
}
}
Внимание: игнорирование нескольких провайдеров также сокращает резервные варианты.
Slug'и в order и ignore автоматически приводятся к нижнему регистру, пустые значения и дубликаты удаляются — регистр написания не влияет на результат.
Требование поддержки параметров (require_parameters)
По умолчанию (require_parameters: false) провайдер, не поддерживающий какой-то параметр запроса, всё равно может получить запрос и проигнорирует неизвестный параметр. Значение true исключает таких провайдеров из маршрутизации — запрос пойдёт только тем, кто поддерживает все переданные параметры.
{
"messages": [{"role": "user", "content": "Привет!"}],
"response_format": { "type": "json_object" },
"provider": {
"require_parameters": true
}
}
Даже без require_parameters небольшая группа параметров используется как мягкое предпочтение при выборе между провайдерами одной модели: tools, response_format (включая structured outputs) и verbosity. Если часть провайдеров модели поддерживает такой параметр, а часть — нет, запрос направляется только поддерживающим. Если не поддерживает никто, запрос всё равно выполняется, а параметр игнорируется.
Политики обработки данных (data_collection)
Поле data_collection ограничивает маршрутизацию провайдерами в соответствии с их политикой обработки данных:
allow(по умолчанию) — разрешены провайдеры, которые могут сохранять данные неограниченно долго и использовать их для обучения;deny— только провайдеры, которые не собирают пользовательские данные.
{
"messages": [{"role": "user", "content": "Привет!"}],
"provider": {
"data_collection": "deny"
}
}
Zero Data Retention (zdr)
Параметр zdr ограничивает маршрутизацию эндпоинтами с политикой Zero Data Retention (нулевое хранение промптов):
{
"model": "openai/gpt-4o",
"messages": [{"role": "user", "content": "Привет!"}],
"provider": {
"zdr": true
}
}
При zdr: true запрос направляется только на эндпоинты, не сохраняющие промпты. Значение false или отсутствие параметра не влияет на маршрутизацию.
Дистилляция текста (enforce_distillable_text)
Параметр enforce_distillable_text ограничивает маршрутизацию моделями, для которых автор явно разрешил дистилляцию текста:
{
"model": "meta-llama/llama-3.3-70b-instruct",
"messages": [{"role": "user", "content": "Привет!"}],
"provider": {
"enforce_distillable_text": true
}
}
Полезно при создании датасетов для файнтюнинга и дистилляции: запросы будут использовать только модели, допускающие такое использование.
Квантизация (quantizations)
Поле quantizations фильтрует провайдеров по уровню квантизации открытых моделей. По умолчанию запросы балансируются между всеми доступными провайдерами.
Доступные уровни:
| Значение | Описание |
|---|---|
int4 |
Целочисленная (4 бита) |
int8 |
Целочисленная (8 бит) |
fp4 |
Плавающая точка (4 бита), включая mxfp4 и nvfp4 |
mxfp4 |
Microscaling floating point (4 бита) |
nvfp4 |
NVIDIA floating point (4 бита) |
fp6 |
Плавающая точка (6 бит) |
fp8 |
Плавающая точка (8 бит), включая mxfp8 |
mxfp8 |
Microscaling floating point (8 бит) |
fp16 |
Плавающая точка (16 бит) |
bf16 |
Brain floating point (16 бит) |
fp32 |
Плавающая точка (32 бита) |
unknown |
Неизвестно |
{
"model": "meta-llama/llama-3.1-8b-instruct",
"messages": [{"role": "user", "content": "Привет!"}],
"provider": {
"quantizations": ["fp8"]
}
}
Внимание: квантизованные модели могут показывать деградацию качества на отдельных промптах в зависимости от метода квантизации.
Ограничение цены (max_price)
Поле max_price задаёт максимальную цену провайдера, которую вы готовы принять (в USD за миллион токенов):
{
"model": "meta-llama/llama-3.3-70b-instruct",
"messages": [{"role": "user", "content": "Привет!"}],
"provider": {
"max_price": {
"prompt": 1,
"completion": 2
}
}
}
Значение {"prompt": 1, "completion": 2} направит запрос любому провайдеру с ценой ≤ $1/M prompt-токенов и ≤ $2/M completion-токенов.
Дополнительно доступны поля:
request— максимальная цена за запрос (для провайдеров с per-request тарификацией);image— максимальная цена за изображение.
Обычно max_price комбинируют с sort — например: «использовать провайдера с максимальной скоростью, если он не дороже $X/M токенов». Если подходящей цены нет, запрос не выполняется.
Пороговые значения производительности
Поля preferred_min_throughput и preferred_max_latency задают предпочтительные пороги скорости и задержки. Эндпоинты, не попадающие в пороги, не исключаются, а деприоритизируются — перемещаются в конец списка и используются как резерв.
| Поле | Тип | Описание |
|---|---|---|
preferred_min_throughput |
number | object | Минимальная скорость в токенах/сек. Число применяется к p50 |
preferred_max_latency |
number | object | Максимальная задержка в секундах. Число применяется к p50 |
Перцентили
Метрики скорости и задержки каждого провайдера отслеживаются перцентилями по скользящему 5-минутному окну:
| Перцентиль | Значение |
|---|---|
p50 |
Медиана: 50% запросов быстрее/продуктивнее этого значения |
p75 |
75% запросов лучше этого значения |
p90 |
90% запросов лучше этого значения |
p99 |
99% запросов лучше этого значения |
Высокие перцентили (p90, p99) отражают worst-case производительность, низкие (p50) — типичную. При указании нескольких перцентилей должны выполняться все указанные пороги.
Когда использовать:
- Real-time приложения — пороги p90/p99 по задержке для стабильного времени отклика;
- Batch-обработка — пороги p50 по скорости, когда важнее средняя производительность;
- SLA — несколько перцентилей для контроля разных уровней производительности;
- Оптимизация стоимости — комбинация с
sort: "price": самый дешёвый провайдер, удовлетворяющий требованиям к скорости.
{
"model": "deepseek/deepseek-v3.2",
"messages": [{"role": "user", "content": "Привет!"}],
"provider": {
"preferred_max_latency": {
"p50": 1,
"p90": 3,
"p99": 5
},
"preferred_min_throughput": {
"p50": 100,
"p90": 50
}
}
}
Важно: пороги предпочтительны, а не гарантированы. Запрос никогда не блокируется из-за preferred_min_throughput / preferred_max_latency — в отличие от max_price, который может остановить запрос, если подходящей цены нет.
Настройки правил провайдеров в личном кабинете
Помимо per-request настроек, в личном кабинете доступна страница «Правила» (/provider-preferences), где можно задать для каждой модели:
- Порядок провайдеров — предпочтительная последовательность; роутер в первую очередь пробует их в указанном порядке;
- Игнорируемые провайдеры — провайдеры, которые никогда не будут использоваться для этой модели.
Правила применяются автоматически к запросам генерации текста (chat/completions, Responses API, Anthropic Messages API), если в запросе не заданы provider.order / provider.ignore явно. Значения из запроса всегда имеют приоритет над правилами из кабинета; остальные поля provider (например, sort и allow_fallbacks) правилами из кабинета не затрагиваются.
Быстрое добавление правил: на странице статистики нажмите на имя провайдера в истории запросов — в тултипе появятся кнопки «В приоритет» и «Игнорировать».
Sticky Routing
Для максимизации попаданий в кэш провайдера используется sticky routing — последующие запросы одной сессии направляются к тому же провайдер-эндпоинту, сохраняя кэш «тёплым».
Передайте session_id в теле запроса (до 256 символов), чтобы связать запросы одной сессии:
{
"model": "anthropic/claude-sonnet-4",
"messages": [{"role": "user", "content": "Привет!"}],
"session_id": "my-agent-session-abc123"
}
При включённом переключателе «Кэширование промптов» в личном кабинете session_id генерируется автоматически.
Надёжность маршрутизации
Прокси добавляет уровень отказоустойчивости поверх маршрутизации провайдеров:
- Автоматические повторы. Временные ошибки (таймаут, HTTP 5xx, rate limit, недоступность провайдера) автоматически повторяются в пределах настроенного количества попыток.
- Переключение каналов. Если основной канал недоступен (ошибки авторизации или исчерпание попыток), запрос автоматически направляется через резервный канал.
- Детекция некорректных ответов. Ответы, в которых провайдер потребил токены, но не вернул контент, распознаются и запрос повторяется — клиент не получает «пустую» генерацию.
- Тарификация по факту. Списание выполняется по фактическому
usageиз ответа провайдера, а не по резервированию.
Если все доступные каналы обработки исчерпаны, возвращается ошибка с понятным описанием. ID генерации возвращается в заголовке X-Generation-Id и доступен в логах использования /v1/generation.
Заголовки атрибуции
Заголовки атрибуции пробрасываются провайдеру и позволяют вашему приложению отображаться в статистике:
| Заголовок | Описание |
|---|---|
HTTP-Referer |
URL вашего сайта |
X-Title (или X-OpenRouter-Title) |
Название вашего приложения |
X-OpenRouter-Metadata (или X-OpenRouter-Experimental-Metadata) |
Опциональные метаданные запроса |
Если заголовки не заданы, подставляются значения, настроенные в сервисе.
Провайдер в ответе
Ответ содержит информацию о том, какой провайдер обработал запрос:
{
"id": "gen-abc123",
"model": "meta-llama/llama-3.3-70b-instruct",
"choices": [
{
"message": {
"role": "assistant",
"content": "Привет! Чем могу помочь?"
},
"finish_reason": "stop",
"provider": "DeepInfra"
}
],
"usage": {
"prompt_tokens": 9,
"completion_tokens": 12,
"total_tokens": 21,
"cost": 0.0521
}
}
choices[].provider— имя провайдера, обработавшего запрос (присутствует, если доступен);usage.cost— итоговая стоимость запроса в рублях;- в streaming-режиме поле
providerпередаётся в чанках потока.
Условия использования провайдеров
Запросы обрабатываются сторонними провайдерами моделей. Используя сервис, вы соглашаетесь соблюдать условия обслуживания и политики этих провайдеров. Актуальные условия публикуются на страницах соответствующих провайдеров.