Mixture of Agents

Mixture of Agents — это виртуальный провайдер модели. Каждый именованный пресет MoA появляется как выбираемая модель у провайдера 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:

  1. находит выбранный пресет по имени;
  2. запускает настроенные референсные модели без схем инструментов (они получают только текст пользователя/ассистента из разговора — без системного промпта Hermes и без транскрипта вызовов инструментов, — так что референсные вызовы остаются дешёвыми и не натыкаются на отказы строгих провайдеров);
  3. добавляет выводы референсных моделей как приватный контекст для агрегатора;
  4. вызывает настроенный агрегатор с обычной схемой инструментов Hermes;
  5. считает ответ агрегатора настоящим ответом модели;
  6. если агрегатор вызывает инструменты, Hermes выполняет их как обычно;
  7. на следующей итерации модели тот же процесс 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) — MoA0.8202
anthropic/claude-opus-4.80.7607
openai/gpt-5.50.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. Запись пропускается, если пресет не разрешается или у его агрегатора нет учётных данных.
перевод и редактура:

обновлено

⌕ ESC