Маршрутизация провайдеров

Если в роли 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 обработают ваш запрос. Если же нужен автоматический переход на совсем другого провайдера в случае отказа основной модели, смотрите раздел Запасные провайдеры.

перевод и редактура:

обновлено

⌕ ESC