Прошлым летом я за месяц завёл пять аккаунтов у LLM-провайдеров. OpenAI, Anthropic, OpenRouter, Fireworks, Together. К октябрю я уже не помнил, какая кредитка платит за что. К декабрю один из них тихо поменял расценки, а я заметил через три недели — когда пришёл счёт.
Это негламурная правда о жизни поверх LLM в 2026 году: зоопарк провайдеров — постоянное состояние. Новые модели выходят каждую неделю. Цены меняются. Бесплатные тарифы перетасовываются. Модель, которая была state-of-the-art в марте, к маю становится сноской. Если твой agent-фреймворк привязывает тебя к провайдеру при установке — готовься пересобирать всё каждые пару месяцев.
Hermes Agent с первого дня ставит на обратное: провайдер — это значение в конфиге, а не выбор, который архитектура делает за тебя. Три фичи складываются друг на друга, чтобы это по-настоящему работало.
Центральный роутер (v0.2.0)
В основе — единая точка вызова. Ещё при запуске v0.2.0 проект ввёл централизованный роутер провайдеров — одну функцию call_llm() / async_call_llm(), через которую идут все вызовы LLM в агенте. Зрение, суммаризация, сжатие, сохранение траекторий, основной цикл чата — всё проходит через один путь в коде.
Звучит как деталь рефакторинга — пока не попробуешь сменить провайдера в агенте, где этого нет. В большинстве фреймворков LLM вызывается из одиннадцати мест, и каждое читает креды чуть по-своему. Меняешь одно, забываешь другое, ломается так, что не сразу заметишь. Hermes исключил эту проблему, сделав точку вызова единственной.
Цепочка fallback (v0.6.0)
Две недели спустя v0.6.0 добавил следующий слой: упорядоченные цепочки fallback-провайдеров. Ты перечисляешь провайдеров в config.yaml, и когда основной ловит ошибку — 429 rate limit, временный 500, недоступный эндпоинт — Hermes автоматически пробует следующего в цепочке.
Важно: это упорядоченная цепочка, а не round-robin. Ты сам выбираешь приоритет и запасной вариант. Типичная настройка: OpenRouter как дешёвый основной, прямой Anthropic как надёжный бэкап, бесплатный тариф Nous Portal как последний рубеж. Если у верхнего в цепочке плохой день — ты этого не замечаешь. Заодно v0.6.0 исправил неочевидный баг: раньше при переключении через hermes model значение api_mode хардкодилось в chat_completions, теперь оно очищается при смене, и Anthropic-совместимые эндпоинты перестают загадочно возвращать 404.
Пулы креденшалов (v0.7.0)
Релиз, посвящённый устойчивости, добавил третий слой: пулы ключей внутри одного провайдера. Ключевое осознание: «мой основной провайдер» и «конкретный API-ключ у этого провайдера» — разные вещи. У тебя может быть три ключа Anthropic — личный, командный и запасной на другом аккаунте — и ты хочешь, чтобы Hermes всегда брал наименее нагруженный.
Настраиваешь через мастер установки или блок credential_pool, и Hermes по умолчанию берёт ключ по стратегии least_used. Если ключ возвращает 401, пул автоматически ротирует на следующий и ставит мёртвый на паузу. Реализация потокобезопасная — можно одновременно запускать CLI, Telegram-шлюз и cron-задачу на одном пуле, и они не будут друг другу мешать. v0.7.0 также гарантирует, что состояние пула переживает fallback-переключения: 429 на основном провайдере не стирает информацию пула о том, какие ключи уже устали.
Зачем три слоя
Каждая из этих фич решает узкую задачу. Вместе они ощущаются мощно, потому что складываются без пересечений:
- •Роутер позволяет менять какой провайдер в одном месте.
- •Цепочка fallback позволяет обрабатывать отказы на уровне провайдера без перезапуска.
- •Пул ключей позволяет обрабатывать отказы и нагрузку на уровне ключа внутри одного провайдера.
А из CLI hermes model позволяет перенастроить любой из этих слоёв, не правя файлы руками. Итоговый эффект: когда появляется новая модель — кто бы её ни выпустил, как бы она ни называлась, какой бы ни была цена — стоимость перехода: «изменить одну строку конфига». Не «пересобрать моего ассистента». Для проекта, которому предстоит пережить не одно поколение моделей, это, наверное, единственное архитектурное решение, которое по-настоящему важно.