Маршрутизация провайдеров
Если в роли LLM-провайдера у вас выступает OpenRouter, Hermes Agent умеет управлять маршрутизацией провайдеров — тонко контролировать, какие именно ИИ-провайдеры обрабатывают ваши запросы и в каком порядке к ним обращаться.
OpenRouter раскидывает запросы по множеству провайдеров: Anthropic, Google, AWS Bedrock, Together AI и другим. Маршрутизация провайдеров даёт рычаг под нужную задачу — можно оптимизировать по стоимости, скорости, качеству или жёстко зафиксировать требования к конкретному провайдеру.
Nous Portal решает вопросы маршрутизации централизованно, для каждой модели, и предпочтения от вызывающей стороны не принимает: объект provider в Portal не отправляется вовсе, так что provider_routing там просто игнорируется.
Конфигурация
Добавьте секцию provider_routing в файл ~/.hermes/config.yaml:
provider_routing:
sort: "price" # Как ранжировать провайдеров
only: [] # Белый список: использовать только этих провайдеров
ignore: [] # Чёрный список: никогда не использовать этих провайдеров
order: [] # Явный порядок приоритета провайдеров
require_parameters: false # Только провайдеры, поддерживающие все параметры
data_collection: null # Управление сбором данных ("allow" или "deny")
Маршрутизация провайдеров работает только при использовании OpenRouter. Ни на Nous Portal, ни при прямом подключении к провайдеру (например, напрямую к API Anthropic) она ни на что не влияет.
Опции
sort
Определяет, как OpenRouter ранжирует доступных провайдеров под ваш запрос.
| Значение | Описание |
|---|---|
"price" | Сначала самый дешёвый провайдер |
"throughput" | Сначала наибольшая скорость в токенах в секунду |
"latency" | Сначала наименьшее время до первого токена |
provider_routing:
sort: "price"
only
Белый список слагов провайдеров. Когда он задан, в дело идут только перечисленные провайдеры, все остальные исключаются. Используйте слаг в нижнем регистре — такой, как показывает OpenRouter для каждого провайдера.
provider_routing:
only:
- "anthropic"
- "google"
ignore
Чёрный список имён провайдеров. Эти провайдеры не будут задействованы никогда — даже если предложат самый дешёвый или самый быстрый вариант.
provider_routing:
ignore:
- "together"
- "deepinfra"
order
Явный порядок приоритета. Провайдеры в начале списка предпочтительнее; те, что не указаны, идут в запас.
provider_routing:
order:
- "anthropic"
- "google"
- "amazon-bedrock"
require_parameters
При значении true OpenRouter направит запрос только тем провайдерам, которые поддерживают все параметры из вашего запроса (temperature, top_p, tools и прочие). Так вы избежите тихого отбрасывания параметров.
provider_routing:
require_parameters: true
data_collection
Управляет тем, могут ли провайдеры использовать ваши промпты для обучения. Допустимые значения — "allow" или "deny".
provider_routing:
data_collection: "deny"
Переопределения для отдельных моделей (models)
Каждой модели можно закрепить свой набор провайдеров. Ключи внутри models — это идентификаторы моделей;
каждая запись принимает те же ключи sort / only / ignore / order / require_parameters /
data_collection и перебивает плоское значение только для своей модели. Всё, что для модели не задано,
берётся из плоских значений по умолчанию.
provider_routing:
sort: "price" # действует на все модели
models:
"openai/gpt-6-astra":
only: ["openai"] # эту модель перепродавцам не отдавать
"anthropic/claude-fable-5.1":
only: ["anthropic"]
"moonshotai/kimi-k2.6":
order: ["moonshotai", "together"]
sort: "throughput"
Сопоставление терпимо к написанию — как у agent.reasoning_overrides (claude-fable-5.1 или
claude-fable-5-1, с префиксом openrouter/ и без него). Переопределение следует за той моделью, на
которой агент находится прямо сейчас, поэтому переключения через /model, включение резервной модели,
cron-задачи и делегированные субагенты на другой модели получают собственные привязки. Эти ключи правят
прямо в config.yaml: в идентификаторах моделей есть точки, а hermes config set читает их как
разделители пути.
Практические примеры
Оптимизация под стоимость
Запросы уходят к самому дешёвому из доступных провайдеров. Удобно при больших объёмах и на этапе разработки:
provider_routing:
sort: "price"
Оптимизация под скорость
Приоритет провайдерам с низкой задержкой — для интерактивной работы:
provider_routing:
sort: "latency"
Оптимизация под пропускную способность
Лучший выбор для генерации длинных текстов, где важны токены в секунду:
provider_routing:
sort: "throughput"
Привязка к конкретным провайдерам
Все запросы пойдут через одного провайдера — это даёт предсказуемость и стабильный результат:
provider_routing:
only:
- "anthropic"
Исключение отдельных провайдеров
Уберите тех, кого использовать не хотите (скажем, из соображений приватности данных):
provider_routing:
ignore:
- "together"
- "lepton"
data_collection: "deny"
Предпочтительный порядок с запасными вариантами
Сначала пробуем нужных провайдеров, а если они недоступны — переходим к остальным:
provider_routing:
order:
- "anthropic"
- "google"
require_parameters: true
Как это работает
Настройки маршрутизации передаются в OpenRouter при запросах чата агента и при формировании сводок по достижении лимита итераций — через поле extra_body.provider. (extra_body — это аргумент OpenAI Python SDK; в итоговом JSON-запросе он превращается в объект верхнего уровня provider.) Вспомогательные задачи вроде сжатия и генерации заголовков настраиваются отдельно, в auxiliary.<task>.extra_body.
- Режим CLI — настраивается в
~/.hermes/config.yaml, загружается при старте - Режим шлюза — тот же файл конфигурации, загружается при запуске шлюза
Конфигурация маршрутизации читается из config.yaml и передаётся параметрами при создании AIAgent:
providers_allowed ← из provider_routing.only
providers_ignored ← из provider_routing.ignore
providers_order ← из provider_routing.order
provider_sort ← из provider_routing.sort
provider_require_parameters ← из provider_routing.require_parameters
provider_data_collection ← из provider_routing.data_collection
Опции можно комбинировать. Например, сортировать по цене, но при этом исключить часть провайдеров и потребовать поддержку параметров:
provider_routing:
sort: "price"
ignore: ["together"]
require_parameters: true
data_collection: "deny"Поведение по умолчанию
Если секция provider_routing не задана (вариант по умолчанию), агрегатор применяет собственную логику маршрутизации — обычно она сама балансирует между стоимостью и доступностью.
Маршрутизация провайдеров управляет тем, какие суб-провайдеры за OpenRouter обработают ваш запрос. Если же нужен автоматический переход на совсем другого провайдера в случае отказа основной модели, смотрите раздел Запасные провайдеры.