sidebar_position: 4 title: "Provider Runtime Resolution" description: "How Hermes resolves providers, credentials, API modes, and auxiliary models at runtime" lang: ru
Разрешение времени выполнения поставщика
У Hermes есть общий преобразователь времени выполнения поставщика, используемый в:
- интерфейс командной строки
- шлюз
- задания cron
- АШП
- вызовы вспомогательных моделей
Первичная реализация:
hermes_cli/runtime_provider.py— разрешение учетных данных,_resolve_custom_runtime()hermes_cli/auth.py— реестр провайдеров,resolve_provider()hermes_cli/model_switch.py— общий конвейер коммутатора/model(CLI + шлюз)agent/auxiliary_client.py— маршрутизация вспомогательной модели
Если вы пытаетесь добавить нового первоклассного поставщика вывода, прочтите Добавление поставщиков рядом с этой страницей.
Приоритет разрешения
На высоком уровне разрешение поставщика использует:
- явный запрос CLI/среды выполнения
config.yamlконфигурация модели/провайдера- переменные среды
- настройки по умолчанию для конкретного поставщика или автоматическое разрешение.
Этот порядок имеет значение, поскольку Hermes рассматривает сохраненный выбор модели/провайдера как источник истины для обычных запусков. Это не позволяет устаревшему экспорту оболочки автоматически переопределять конечную точку, которую пользователь последний раз выбрал в hermes model.
Поставщики
Текущие семейства поставщиков включают:
- AI-шлюз (Версель)
- OpenRouter
- Портал Ноус
- Кодекс OpenAI
- Второй пилот/Второй пилот ACP
- Антропный (родной)
- Гугл/Близнецы
- Алибаба / DashScope
- ДипСик
- З.А.И.
- Кими / Муншот
- МиниМакс
- МиниМакс Китай
- Код килограмма
- Обнимающее лицо
- OpenCode Zen / OpenCode Go
- Пользовательский (
provider: custom) — первоклассный поставщик для любой конечной точки, совместимой с OpenAI. — Именованные пользовательские поставщики (custom_providers, список в config.yaml)
Вывод разрешения во время выполнения
Резолвер времени выполнения возвращает такие данные, как:
providerapi_modebase_urlapi_keysource- метаданные, специфичные для поставщика, такие как информация об истечении срока действия или обновлении.
Почему это важно
Этот преобразователь является основной причиной, по которой Hermes может использовать логику аутентификации и выполнения между:
hermes chat- обработка сообщений шлюза
- задания cron выполняются в новых сеансах
- Сессии редактора ACP
- вспомогательные модельные задачи
AI-шлюз
Установите AI_GATEWAY_API_KEY в ~/.hermes/.env и запустите с --provider ai-gateway. Hermes извлекает доступные модели из конечной точки шлюза /models, фильтруя их по языковым моделям с поддержкой использования инструментов.
OpenRouter, AI Gateway и пользовательские базовые URL-адреса, совместимые с OpenAI
Hermes содержит логику, позволяющую избежать утечки неправильного ключа API в пользовательскую конечную точку при наличии нескольких ключей поставщика (например, OPENROUTER_API_KEY, AI_GATEWAY_API_KEY и OPENAI_API_KEY).
Ключ API каждого поставщика ограничен собственным базовым URL-адресом:
OPENROUTER_API_KEYотправляется только на конечные точкиopenrouter.ai.AI_GATEWAY_API_KEYотправляется только на конечные точкиai-gateway.vercel.sh.OPENAI_API_KEYиспользуется для пользовательских конечных точек и в качестве запасного варианта.
Гермес также различает:
- реальная пользовательская конечная точка, выбранная пользователем — резервный путь OpenRouter, используемый, когда пользовательская конечная точка не настроена.
Это различие особенно важно для:
- серверы локальной модели
- OpenAI-совместимые API, не относящиеся к OpenRouter/не AI Gateway
- переключение провайдера без повторной настройки
- пользовательские конечные точки, сохраненные в конфигурации, которые должны продолжать работать, даже если
OPENAI_BASE_URLне экспортируется в текущую оболочку.
Родной антропный путь
Anthropic больше не просто «через OpenRouter».
Когда разрешение поставщика выбирает anthropic, Hermes использует:
api_mode = anthropic_messages- собственный API антропных сообщений
agent/anthropic_adapter.pyза перевод
Разрешение учетных данных для собственного Anthropic теперь предпочитает обновляемые учетные данные Claude Code скопированным токенам env, если они оба присутствуют. На практике это означает:
- Файлы учетных данных Claude Code считаются предпочтительным источником, если они включают обновляемую аутентификацию.
- ручные значения
ANTHROPIC_TOKEN/CLAUDE_CODE_OAUTH_TOKENпо-прежнему работают как явные переопределения. — Предполетное обновление учетных данных Hermes Anthropic перед вызовами собственного API сообщений. - Гермес по-прежнему повторяет попытку один раз на ошибке 401 после восстановления клиента Anthropic в качестве запасного пути.
Путь к Кодексу OpenAI
Кодекс использует отдельный путь API ответов:
api_mode = codex_responses- выделенное разрешение учетных данных и поддержка хранилища авторизации
Маршрутизация вспомогательной модели
Вспомогательные задачи, такие как:
- видение
- обобщение веб-извлечения
- сводки по сжатию контекста
- обобщение поиска сеанса
- операции центра навыков
- Вспомогательные операции MCP
- сбрасывается память
могут использовать собственную маршрутизацию провайдера/модели, а не основную диалоговую модель.
Когда вспомогательная задача настроена с помощью поставщика main, Hermes решает ее, используя тот же общий путь выполнения, что и обычный чат. На практике это означает:
- пользовательские конечные точки, управляемые env, все еще работают
- пользовательские конечные точки, сохраненные через
hermes model/config.yaml, также работают - вспомогательная маршрутизация может определить разницу между реальной сохраненной пользовательской конечной точкой и резервной версией OpenRouter.
Резервные модели
Hermes поддерживает настроенную пару резервная модель/поставщик, что позволяет выполнять аварийное переключение во время выполнения, когда в основной модели возникают ошибки.
Как это работает внутри
-
Хранилище:
AIAgent.__init__сохраняет словарьfallback_modelи устанавливает_fallback_activated = False. -
Триггерные точки:
_try_activate_fallback()вызывается из трех мест основного цикла повтора вrun_agent.py: - После максимального количества повторных попыток недопустимых ответов API (нет выбора, отсутствует контент)
- При невозможных ошибках клиента (HTTP 401, 403, 404).
-
После максимального количества попыток при временных ошибках (HTTP 429, 500, 502, 503)
-
Последовательность действий (
_try_activate_fallback): - Немедленно возвращает
False, если он уже активирован или не настроен. - Вызывает
resolve_provider_client()отauxiliary_client.pyдля создания нового клиента с правильной аутентификацией. - Определяет
api_mode:codex_responsesдля openai-codex,anthropic_messagesдля антропных,chat_completionsдля всего остального - Обмены на месте:
self.model,self.provider,self.base_url,self.api_mode,self.client,self._client_kwargs - Для антропного запасного варианта: создается собственный Anthropic клиент вместо OpenAI-совместимого.
- Переоценивается кэширование подсказок (включено для моделей Claude на OpenRouter)
- Устанавливает
_fallback_activated = True— предотвращает повторную стрельбу -
Сбрасывает счетчик повторов до 0 и продолжает цикл.
-
Последовательность действий:
- CLI:
cli.pyчитаетCLI_CONFIG["fallback_model"]→ переходит кAIAgent(fallback_model=...) - Шлюз:
gateway/run.py._load_fallback_model()читаетconfig.yaml→ переходит кAIAgent - Проверка: ключи
providerиmodelдолжны быть непустыми, иначе резервный вариант отключен.
Что НЕ поддерживает резервный вариант
- Делегирование субагента (
tools/delegate_tool.py): субагенты наследуют родительского провайдера, но не резервную конфигурацию. - Вспомогательные задачи: используйте собственную цепочку автоматического обнаружения независимых поставщиков (см. выше «Маршрутизация вспомогательной модели»).
Задания Cron поддерживают резервный вариант: run_job() считывает fallback_providers (или устаревший fallback_model) из config.yaml и передает его AIAgent(fallback_model=...), сопоставляя его с шаблоном _load_fallback_model() шлюза. См. Внутренние элементы Cron.
Тестовое покрытие
См. tests/test_fallback_model.py для комплексных тестов, охватывающих всех поддерживаемых поставщиков, однократную семантику и крайние случаи.