sidebar_position: 5
title: "Adding Providers"
description: "How to add a new inference provider to Hermes Agent — auth, runtime resolution, CLI flows, adapters, tests, and docs"
lang: ru
Добавление провайдеров
Hermes уже может общаться с любой конечной точкой, совместимой с OpenAI, через собственный путь провайдера. Не добавляйте встроенного поставщика, если вам не нужен первоклассный UX для этого сервиса:
аутентификация или обновление токена для конкретного поставщика
тщательно подобранный каталог моделей
настройка / записи меню hermes model
псевдонимы провайдера для синтаксиса provider:model
форма API, отличная от OpenAI, для которой требуется адаптер
Если поставщик является просто «еще одним базовым URL-адресом и ключом API, совместимым с OpenAI», может быть достаточно именованного пользовательского поставщика.
Ментальная модель
Встроенный провайдер должен работать на нескольких уровнях:
hermes_cli/auth.py решает, как будут найдены учетные данные.
hermes_cli/runtime_provider.py превращает это в данные времени выполнения:
provider
api_mode
base_url
api_key
source
run_agent.py использует api_mode, чтобы решить, как формируются и отправляются запросы.
hermes_cli/models.py и hermes_cli/main.py позволяют отображать поставщика в CLI. (hermes_cli/setup.py делегирует main.py автоматически — никаких изменений здесь не требуется.)
agent/auxiliary_client.py и agent/model_metadata.py поддерживают работу побочных задач и бюджета токенов.
Важная абстракция — api_mode.
Большинство провайдеров используют chat_completions.
Кодекс использует codex_responses.
Антропный использует anthropic_messages.
Новый протокол, отличный от OpenAI, обычно означает добавление нового адаптера и новой ветки api_mode.
Сначала выберите путь реализации
Путь A — OpenAI-совместимый поставщик
Используйте это, когда провайдер принимает стандартные запросы в стиле чата.
Типичная работа:
добавить метаданные аутентификации
добавить каталог моделей/псевдонимы
добавить разрешение времени выполнения
добавить проводку меню CLI
добавить настройки по умолчанию для aux-модели
добавлять тесты и пользовательскую документацию
Обычно вам не нужен новый адаптер или новый api_mode.
Путь Б — Родной провайдер
Используйте это, когда провайдер не ведет себя как завершение чата OpenAI.
Примеры в дереве сегодня:
codex_responses
anthropic_messages
Этот путь включает в себя все, начиная с пути А, плюс:
адаптер провайдера в agent/
run_agent.py ветки для построения запросов, отправки, извлечения данных об использовании, обработки прерываний и нормализации ответов.
тесты адаптеров
Контрольный список файлов
Требуется для каждого встроенного поставщика
hermes_cli/auth.py
hermes_cli/models.py
hermes_cli/runtime_provider.py
hermes_cli/main.py
agent/auxiliary_client.py
agent/model_metadata.py
тесты
Документы для пользователей под website/docs/.
:::совет
hermes_cli/setup.pyне требует изменений. Мастер настройки делегирует выбор поставщика/модели select_provider_and_model() в main.py — любой добавленный туда поставщик автоматически становится доступным в hermes setup.
Дополнительно для собственных/не-OpenAI провайдеров
agent/<provider>_adapter.py
run_agent.py
pyproject.toml, если требуется SDK поставщика
Шаг 1. Выберите один канонический идентификатор провайдера
Выберите один идентификатор провайдера и используйте его везде.
Примеры из репо:
openai-codex
kimi-coding
minimax-cn
Тот же идентификатор должен появиться в:
PROVIDER_REGISTRY в hermes_cli/auth.py
_PROVIDER_LABELS в hermes_cli/models.py
_PROVIDER_ALIASES как в hermes_cli/auth.py, так и в hermes_cli/models.py
Выбор CLI --provider в hermes_cli/main.py
ветки настройки/выбора модели
значения по умолчанию для вспомогательной модели
тесты
Если идентификаторы в этих файлах различаются, провайдер будет чувствовать себя неуверенно: аутентификация может работать, в то время как /model, настройка или разрешение во время выполнения молча пропускают ее.
Шаг 2. Добавьте метаданные аутентификации в hermes_cli/auth.py
Для поставщиков ключей API добавьте запись ProviderConfig в PROVIDER_REGISTRY с помощью:
id
name
auth_type="api_key"
inference_base_url
api_key_env_vars
опционально base_url_env_var
Также добавьте псевдонимы к _PROVIDER_ALIASES.
Используйте существующих поставщиков в качестве шаблонов:
простой путь API-ключа: Z.AI, MiniMax
Путь API-ключа с обнаружением конечной точки: Кими, Z.AI
собственное разрешение токена: антропное
Путь OAuth/auth-store: Nous, OpenAI Codex
Вопросы, на которые можно ответить здесь:
Какие переменные среды должен проверять Гермес и в каком порядке приоритета?
– Требуется ли провайдеру переопределение базового URL-адреса?
Требуется ли проверка конечной точки или обновление токена?
Что должна сказать ошибка аутентификации, если учетные данные отсутствуют?
Если провайдеру нужно нечто большее, чем «поиск ключа API», добавьте специальный преобразователь учетных данных вместо того, чтобы помещать логику в несвязанные ветки.
Шаг 3: Добавьте каталог моделей и псевдонимы в hermes_cli/models.py
Обновите каталог поставщиков, чтобы поставщик работал в меню и в синтаксисе provider:model.
Типичные правки:
_PROVIDER_MODELS
_PROVIDER_LABELS
_PROVIDER_ALIASES
порядок отображения провайдера внутри list_available_providers()
provider_model_ids(), если провайдер поддерживает живую выборку /models.
Если поставщик предоставляет список действующих моделей, сначала отдайте предпочтение этому и сохраните _PROVIDER_MODELS в качестве статического запасного варианта.
Этот файл также обеспечивает работу таких входных данных:
anthropic:claude-sonnet-4-6
kimi:model-name
Если здесь отсутствуют псевдонимы, провайдер может пройти проверку подлинности правильно, но синтаксический анализ /model все равно не удастся.
Шаг 4. Разрешение данных времени выполнения в hermes_cli/runtime_provider.py
resolve_runtime_provider() — это общий путь, используемый CLI, шлюзом, cron, ACP и вспомогательными клиентами.
Добавьте ветку, которая возвращает dict как минимум:
{"provider":"your-provider","api_mode":"chat_completions",# or your native mode"base_url":"https://...","api_key":"...","source":"env|portal|auth-store|explicit","requested_provider":requested_provider,}
Если поставщик совместим с OpenAI, api_mode обычно должен оставаться chat_completions.
Будьте осторожны с приоритетом ключей API. Hermes уже содержит логику, позволяющую избежать утечки ключа OpenRouter на несвязанные конечные точки. Новый провайдер должен одинаково четко указывать, какой ключ к какому базовому URL-адресу относится.
Шаг 5: Подключите CLI к hermes_cli/main.py
Поставщика невозможно обнаружить, пока он не появится в интерактивном потоке hermes model.
Обновите их в hermes_cli/main.py:
provider_labels дикт
список providers в select_provider_and_model()
отправка провайдера (if selected_provider == ...)
--provider выбор аргументов
варианты входа/выхода, если провайдер поддерживает эти потоки
функцию _model_flow_<provider>() или повторно используйте _model_flow_api_key_provider(), если она подходит
:::совет
hermes_cli/setup.py не нуждается в изменениях — он вызывает select_provider_and_model() из main.py, поэтому ваш новый провайдер автоматически появляется как в hermes model, так и в hermes setup.
Шаг 6. Обеспечьте работу дополнительных вызовов
Здесь имеют значение два файла:
agent/auxiliary_client.py
Добавьте дешевую/быструю вспомогательную модель по умолчанию в _API_KEY_PROVIDER_AUX_MODELS, если это прямой поставщик ключей API.
К вспомогательным задачам относятся такие вещи, как:
обобщение видения
обобщение веб-извлечения
сводки по сжатию контекста
сводки поиска сеансов
сбрасывается память
Если у провайдера нет разумного дополнительного значения по умолчанию, побочные задачи могут некорректно откатиться или неожиданно использовать дорогостоящую основную модель.
agent/model_metadata.py
Добавьте длину контекста для моделей поставщика, чтобы бюджетирование токенов, пороги сжатия и ограничения оставались в разумных пределах.
Шаг 7: Если провайдер родной, добавьте адаптер и поддержку run_agent.py
Если поставщик не является простым завершением чата, изолируйте логику, специфичную для поставщика, в agent/<provider>_adapter.py.
Сосредоточьтесь run_agent.py на оркестровке. Он должен вызывать помощники адаптера, а не вручную создавать полезные данные поставщика, встроенные по всему файлу.
Родному провайдеру обычно нужна работа в этих местах:
Новый файл адаптера
Типичные обязанности:
построить SDK/HTTP-клиент
разрешить жетоны
конвертировать диалоговые сообщения в стиле OpenAI в формат запроса провайдера
конвертировать схемы инструментов при необходимости
нормализовать ответы провайдера обратно в соответствии с ожиданиями run_agent.py
извлечение данных об использовании и причинах завершения
run_agent.py
Найдите api_mode и проверьте каждую точку переключения. Как минимум проверьте:
Активация резервной модели позволяет без проблем переключиться на нового провайдера.
пути генерации сводки и очистки памяти все еще работают
Также найдите run_agent.py для self.client.. Любой путь кода, предполагающий наличие стандартного клиента OpenAI, может сломаться, если собственный поставщик использует другой клиентский объект или self.client = None.
Кэширование подсказок и поля запроса, зависящие от поставщика
Быстрое кэширование и настройки, зависящие от поставщика, легко регрессировать.
Примеры уже есть в дереве:
Anthropic имеет собственный путь кэширования подсказок.
OpenRouter получает поля маршрутизации провайдера
не каждый провайдер должен получать все опции на стороне запроса
Когда вы добавляете собственного поставщика, дважды проверьте, что Hermes отправляет только те поля, которые действительно понимает поставщик.
Шаг 8: Тесты
Как минимум потрогать тесты, охраняющие проводку провайдера.
Общие места:
tests/test_runtime_provider_resolution.py
tests/test_cli_provider_resolution.py
tests/test_cli_model_command.py
tests/test_setup_model_selection.py
tests/test_provider_parity.py
tests/test_run_agent.py
tests/test_<provider>_adapter.py для родного провайдера
В примерах только для документации точный набор файлов может отличаться. Суть в том, чтобы охватить:
разрешение авторизации
Меню CLI/выбор провайдера
разрешение поставщика времени выполнения
путь выполнения агента
провайдер: разбор модели
любое преобразование сообщений, специфичное для адаптера
Для собственных поставщиков также проверьте хотя бы один вызов инструмента, а не просто текстовый ответ.
Шаг 10. Обновите документы для пользователей
Если поставщик должен поставляться как первоклассный вариант, обновите также пользовательскую документацию:
website/docs/getting-started/quickstart.md
website/docs/user-guide/configuration.md
website/docs/reference/environment-variables.md
Разработчик может идеально подключить провайдера, но при этом пользователи не смогут обнаружить необходимые переменные окружения или процесс настройки.
Контрольный список поставщиков, совместимых с OpenAI
Используйте это, если провайдер предлагает стандартные дополнения в чате.
[ ] ProviderConfig добавлено в hermes_cli/auth.py
[ ] псевдонимы добавлены в hermes_cli/auth.py и hermes_cli/models.py
[ ] каталог моделей добавлен в hermes_cli/models.py
[ ] добавлена ветвь времени выполнения в hermes_cli/runtime_provider.py
[ ] Добавлена проводка CLI в hermes_cli/main.py (setup.py наследуется автоматически)
[ ] вспомогательная модель добавлена в agent/auxiliary_client.py
[ ] длины контекста добавлены в agent/model_metadata.py
[ ] обновлены тесты времени выполнения/CLI
[ ] обновлены пользовательские документы
Контрольный список собственного поставщика
Используйте это, когда провайдеру нужен новый путь протокола.
[ ] все в контрольном списке совместимости с OpenAI
[ ] адаптер добавлен в agent/<provider>_adapter.py
[ ] новый api_mode поддерживается в run_agent.py
[ ] путь прерывания/перестроения работает
[ ] работы по извлечению причин использования и завершения
[ ] запасной путь работает
[ ] добавлены тесты адаптера
[ ] испытание живым дымом пройдено
Распространенные ошибки
1. Добавляем провайдера для аутентификации, но не для разбора модели
Это обеспечивает правильное разрешение учетных данных, в то время как входные данные /model и provider:model не работают.
2. Забываем, что config["model"] может быть строкой или диктом
Большая часть кода выбора поставщика должна нормализовать обе формы.
3. Предполагается, что требуется встроенный поставщик
Если сервис просто совместим с OpenAI, индивидуальный поставщик уже может решить проблему пользователя с меньшими затратами на обслуживание.
4. Забываем вспомогательные пути
Основной путь чата может работать, когда суммирование, очистка памяти или помощники по зрению не работают, поскольку дополнительная маршрутизация никогда не обновлялась.
5. Ветки родного провайдера скрываются в run_agent.py
Найдите api_mode и self.client.. Не думайте, что очевидный путь запроса — единственный.
6. Отправка ручек, предназначенных только для OpenRouter, другим провайдерам
Такие поля, как маршрутизация поставщика, принадлежат только поставщикам, которые их поддерживают.
7. Обновление hermes model, но не hermes setup
Оба потока должны знать о провайдере.
Хорошие цели поиска при реализации
Если вы ищете все места, к которым прикасается провайдер, найдите эти символы: