Mixture of Agents
Mixture of Agents — это виртуальный провайдер модели. Каждый именованный пресет MoA появляется как выбираемая модель у провайдера moa.
Когда вы выбираете пресет MoA, действующей моделью становится агрегатор этого пресета. Именно он пишет ответ ассистента и вызывает инструменты. Референсные модели работают первыми и передают агрегатору свой анализ для дальнейшего использования.
Счёт за весь прогон выставляется агрегатору: он выполняет каждый шаг цикла инструментов, так что почти вся стоимость пресета ложится на провайдера агрегатора. Референсы лишь советуют — по разу на ход пользователя (при fanout по умолчанию). Если основная модель у вас на провайдере с подпиской, а агрегатор живёт в другом месте, прогон оплачивает провайдер агрегатора, а не ваша подписка: hermes moa configure и hermes moa list печатают однострочное уведомление всякий раз, когда провайдер агрегатора отличается от model.provider, а редактор десктопа, hermes model и /model помечают слот агрегатора как действующую, оплачиваемую модель.
Используйте MoA, когда сложная задача выигрывает от нескольких точек зрения разных моделей, но при этом требует обычного цикла агента Hermes: вызовов инструментов, повторных итераций, прерываний, сохранения транскрипта и того же контекста сессии, что и у любого другого сообщения.
Выбор пресета MoA в качестве модели
Пресет можно выбрать через обычные интерфейсы выбора модели:
/model default --provider moa
/model review --provider moa
Пресеты MoA доступны для выбора на любой поверхности Hermes, потому что MoA — обычный провайдер в системе моделей:
- CLI / шлюз / TUI
/model—/model <пресет> --provider moa, либо/model --provider moaдля пресета по умолчанию. Короткая форма/model <пресет>тоже работает, если имя точно совпадает с настроенным пресетом. hermes modelи выбор модели в Dashboard — появляется строка провайдераMixture of Agents, где вашими моделями выступают имена пресетов.- Десктопное приложение — в выпадающем списке моделей появляется раздел
MoA presets; выбор одного из них (MoA: <пресет>) переключает активную модель на этот пресет. Панель настроек десктопа также позволяет создавать и редактировать пресеты.
Таким образом, настроенные пресеты появляются везде, где вы обычно выбираете любую другую модель.
Быстрый вызов через слэш-команду
/moa — это одноразовый удобный ярлык. Он прогоняет один промпт через дефолтный пресет MoA, а затем возвращает ту модель, на которой вы были:
/moa спроектируй и реализуй план миграции для этого нестабильного тестового кластера
Hermes временно переключается на дефолтный пресет MoA на один ход, отправляет промпт, а затем восстанавливает предыдущую модель. Весь аргумент целиком — это промпт: /moa больше не интерпретирует его как имя пресета.
/moa
Голая команда /moa (без промпта) просто выводит справку по использованию.
Чтобы переключиться на пресет MoA на оставшуюся часть сессии, выберите его в интерфейсе выбора модели — пресеты MoA отображаются под провайдером Mixture of Agents на любой поверхности выбора модели (см. выше). /moa намеренно не переключает модель, поэтому обычный промпт никогда случайно не поменяет вашу модель.
Как это работает внутри цикла агента
При каждом основном вызове модели, если выбран провайдер moa, Hermes:
- находит выбранный пресет по имени;
- запускает настроенные референсные модели без схем инструментов (они получают только текст пользователя/ассистента из разговора — без системного промпта Hermes и без транскрипта вызовов инструментов, — так что референсные вызовы остаются дешёвыми и не натыкаются на отказы строгих провайдеров);
- добавляет выводы референсных моделей как приватный контекст для агрегатора;
- вызывает настроенный агрегатор с обычной схемой инструментов Hermes;
- считает ответ агрегатора настоящим ответом модели;
- если агрегатор вызывает инструменты, Hermes выполняет их как обычно;
- на следующей итерации модели тот же процесс MoA запускается заново поверх обновлённого разговора, включая результаты инструментов.
Поскольку MoA выбирается через обычную систему моделей, он автоматически сочетается с /goal, сессиями шлюза, сессиями TUI и чатом в Desktop.
Настройка пресетов
Именованные пресеты MoA можно настраивать из:
- Dashboard → Models → Model Settings → Mixture of Agents
- Приложение Desktop → Settings → Model → Mixture of Agents
hermes moa configure [имя]config.yaml
В конфиге хранятся явные пары провайдер/модель, поэтому можно смешивать провайдеров и использовать несколько моделей от одного и того же провайдера:
moa:
default_preset: default
presets:
default:
reference_models:
- provider: openai-codex
model: gpt-5.5
- provider: openrouter
model: deepseek/deepseek-v4-pro
aggregator:
provider: openrouter
model: anthropic/claude-opus-4.8
# Опционально: зафиксировать температуру сэмплирования. Если не указано
# (поведение по умолчанию), температура НЕ отправляется, и каждая модель
# использует значение по умолчанию своего провайдера — то же поведение,
# что и у обычного одномодельного агента Hermes.
# reference_temperature: 0.6
# aggregator_temperature: 0.4
enabled: true
Пресет по умолчанию:
- референс:
openai-codex:gpt-5.5 - референс:
openrouter:deepseek/deepseek-v4-pro - агрегатор / действующая модель:
openrouter:anthropic/claude-opus-4.8
Вывод советников
MoA пользуется пределами вывода, которые задаёт провайдер. Настройки предела выходных токенов в пресете и по слотам больше не поддерживаются. Значения провайдеров по умолчанию различаются, и отсутствие настройки не всегда означает максимум модели. Нативным протоколам, которым предел вывода обязателен, Hermes подставляет своё внутреннее значение.
Ритм советчиков — fanout
По умолчанию советчики отрабатывают один раз на пользовательский ход (fanout: user_turn): они формируют совет на уровне плана по первому сообщению хода, а дальше действующий агрегатор проходит остаток цикла инструментов один. Это самый дешёвый ритм — стоимость советчиков не умножается на число вызовов инструментов в ходу. Два других ритма меняют деньги на свежесть совета:
fanout: per_iteration— советчики перезапускаются на каждой итерации инструментов, поэтому их советы всегда учитывают самые свежие результаты; расплата — задержка и расход советчиков, умноженные на число вызовов инструментов в ходу.fanout: every_n:3— золотая середина: советчики работают на первой итерации каждого пользовательского хода, а затем каждую 3-ю итерацию инструментов (годится любоеN >= 2). Итерации между ними переиспользуют кэшированные указания последнего запуска, так что агрегатор получает совет на каждом шаге — просто обновляется он раз в N шагов, а не каждый. Счётчик обнуляется на каждом новом сообщении пользователя, поэтому каждый ход начинается со свежего совета. Форма-словарьfanout: {mode: every_n, n: 3}тоже принимается и приводится к строковому виду.
moa:
presets:
fresh:
reference_models:
- provider: openrouter
model: anthropic/claude-opus-4.8
aggregator:
provider: openrouter
model: openai/gpt-5.5
fanout: per_iteration # советчики обновляются на каждой итерации инструментов
Неизвестные или битые значения откатываются к user_turn.
До июля 2026 ритмом по умолчанию был per_iteration. Теперь по умолчанию стоит user_turn — самый дешёвый и наименее навязчивый ритм, — пока бенчмарки по режимам не оправдают более дорогое умолчание. Пресеты, которым нужен совет на каждом шаге, ставят fanout: per_iteration явно.
Фильтр приватности для выводов советчиков
Выводы советчиков умеют затягивать чувствительные данные из разговора — адреса почты, отформатированные телефоны, API-ключи, JWT — в референсные блоки, которые видны в интерфейсе, попадают в сохранённые трассы MoA и в промпт агрегатора. Ключ moa.privacy_filter (по умолчанию выключен) вычищает эти поверхности:
moa:
privacy_filter: display # или: full
display— вычищает только видимые пользователю поверхности: подписанные референсные блоки в интерфейсе и записи, которые пишетsave_traces. Агрегатор при этом получает исходный текст советчиков, так что на качество ответа это не влияет.full— дополнительно вычищает текст советчиков, попадающий в промпт агрегатора (и во вход разовой синтезации/moa).
Формы учётных данных (префиксы API-ключей, JWT, приватные ключи, строки подключения к БД) маскирует центральный редактор секретов Hermes; фильтр MoA добавляет сверху вычищение адресов почты и явно отформатированных телефонов. Шаблоны намеренно осторожны — материал часто похож на код-ревью: голые цепочки цифр, номера строк, метки времени, SHA git и IP-адреса не трогаются вовсе, срабатывают только разделённые форматы телефонов вроде (555) 123-4567 или 555-123-4567.
Уровень рассуждений по слотам
У референсных слотов и слота агрегатора можно задать reasoning_effort. Пригодится, когда одна и та же модель должна вкладываться с разной глубиной или когда агрегатору положено думать усерднее консультативных референсов. Допустимые значения совпадают с обычными настройками рассуждений Hermes: none, minimal, low, medium, high, xhigh, max и ultra.
moa:
presets:
deep_review:
reference_models:
- provider: openai-codex
model: gpt-5.6-sol
reasoning_effort: low
- provider: openai-codex
model: gpt-5.6-sol
reasoning_effort: xhigh
- provider: xai-oauth
model: grok-4.5
aggregator:
provider: openai-codex
model: gpt-5.6-sol
reasoning_effort: high
Не указывайте reasoning_effort, чтобы для слота работало умолчание провайдера или Hermes.
Управление пресетами из терминала
hermes moa list
hermes moa configure # обновить пресет по умолчанию
hermes moa configure review # создать или обновить именованный пресет
hermes moa delete review
hermes moa list помечает агрегатор как действующую модель, на которую ложится почти вся стоимость, а референсы перечисляет как советующие по разу на ход пользователя (по умолчанию). Когда провайдер агрегатора отличается от вашего основного model.provider, и list, и configure добавляют:
Aggregator is on nous; the whole tool loop will be billed there, not to openai-codex.
Бенчмарки
На HermesBench двухмодельный пресет MoA — claude-opus-4.8 в роли агрегатора над референсом gpt-5.5 — обгоняет каждую из моделей по отдельности:
| Модель | Оценка HermesBench |
|---|---|
| Агрегатор Opus (opus-4.8 + референс gpt-5.5) — MoA | 0.8202 |
anthropic/claude-opus-4.8 | 0.7607 |
openai/gpt-5.5 | 0.7412 |
Конфигурация MoA превосходит свой самый сильный компонент (opus-4.8) примерно на 6 пунктов, что подтверждает: добавление второй точки зрения повышает качество на сложных задачах, а не просто усредняет результаты двух моделей.
Кэширование промпта
MoA спроектирован так, чтобы кэш промпта основного разговора никогда не сбрасывался. Выбор пресета MoA — это обычный выбор модели: он не меняет прошлый контекст, не подменяет наборы инструментов и не перестраивает системный промпт посреди разговора. История разговора, системный промпт и схема инструментов остаются побайтово стабильными, поэтому закэшированный префикс, на который опирается любая другая модель, сохраняется в точности так же, как для обычной модели. Переключение на пресет MoA или обратно стоит ровно столько же инвалидации кэша, сколько любое другое переключение через /model — не больше.
Оба типа внутренних вызовов кэшируются нормально:
-
Референсные модели получают урезанное, детерминированное представление разговора (системный промпт и транскрипт инструментов вырезаны — см. цикл выше). Поскольку это представление — стабильная функция от стабильной истории, префикс промпта референсной модели повторяется от итерации к итерации и кэшируется как обычно. Референсные вызовы — короткие, консультативные, без инструментов.
-
Агрегатор — это действующая модель. Выводы референсных моделей добавляются отдельным завершающим пользовательским сообщением с приватной подсказкой — в ваше сообщение они никогда не подмешиваются. Поскольку этот блок находится в хвосте — ниже всего стабильного префикса (системный промпт + ваше сообщение + предыдущая история инструментов), — он не инвалидирует ни один закэшированный префикс: каждый запрос в цикле инструментов — побайтово идентичное продолжение предыдущего за вычетом его блока подсказки, так что агрегатор получает попадание в кэш по всему, что выше вставки, и только свежедобавленный хвост оказывается новым. Именно так ведёт себя любой обычный ход, где каждое новое сообщение пользователя — тоже некэшированные хвостовые токены. Агрегаторы на Anthropic Messages, Bedrock Converse или нативном протоколе Gemini сливают два соседних пользовательских хода в одно сообщение, но отдельными блоками содержимого: блок вашего сообщения побайтово совпадает с тем, что воспроизводят последующие итерации, а блок подсказки идёт за ним, так что закэшированный префикс по-прежнему проходит через ваше сообщение.
На OpenAI-совместимом протоколе на первой итерации хода запрос заканчивается на
user(your message), user(guidance). Некоторые шаблоны чата, требующие строгого чередования user/assistant (Jinja-шаблоны llama.cpp и vLLM, часть маршрутов OpenRouter), отклоняют такое с ошибкой 400 вродеConversation roles must alternate. Hermes справляется сам: повторяет этот один запрос, слив два соседних пользовательских сообщения, запоминает такое назначение агрегатора (эндпоинт + модель) до конца сессии, чтобы на следующих ходах сливать сразу, а все остальные назначения оставляет на раздельной форме, стабильной для кэша. Слияние применяется только там, где назначение этого потребовало: слияние везде вернуло бы расхождение префиксов, описанное выше.
Таким образом MoA не жертвует кэшированием промпта ни для одного из типов вызовов. Его единственная реальная цена — дополнительные референсные вызовы (по разу на ход пользователя при fanout по умолчанию): вы платите за несколько точек зрения моделей, а не за сломанные кэши. Долгоживущий префикс разговора, общий с остальным Hermes, остаётся полностью нетронутым.
Заметки
- MoA больше не отображается в
hermes tools; отдельного набора инструментовmoaдля включения не существует. - Установка
enabled: falseдля пресета отключает разветвление на референсные модели для этого пресета: агрегатор действует один, в точности как если бы вы выбрали его как обычную модель. Это переключатель «выкл» для конкретного пресета, доступный в настройках dashboard и десктопа. - Агрегатор пресета не может быть другим пресетом MoA. Рекурсивные деревья MoA намеренно заблокированы.
- Сбой учётных данных у одной референсной модели не прерывает ход. Hermes включает информацию о сбое в референсный контекст и продолжает работу с теми моделями, которые вернули результат.
- MoA увеличивает число вызовов модели. Одна итерация модели может включать несколько референсных вызовов плюс вызов агрегатора.
- Пресет может быть записью резерва (
fallback_providers: [{provider: moa, model: <preset>}]). Когда основной провайдер падает, Hermes активирует сам пресет — референсы и агрегатор, с виртуальным эндпоинтомmoa://local— так же, как это делает/model <preset> --provider moa. Запись пропускается, если пресет не разрешается или у его агрегатора нет учётных данных.