hermes-agent/website/docs/user-guide/features/mixture-of-agents.md
Teknium c6575df927
feat(moa): expose MoA presets as selectable virtual models (#46081)
* feat(moa): expose MoA presets as selectable virtual models

Reconstructed onto current main (PR #46081's base had diverged with no common
ancestor, marking the PR dirty so CI never dispatched). MoA is now a virtual
provider: each named preset is a selectable model under provider 'moa', and the
preset's aggregator is the acting model that answers and calls tools.

Reference models fan out in parallel via a bounded ThreadPoolExecutor (the same
batch pattern delegate_task uses) — all references dispatched at once, collected
when every one finishes, then handed to the aggregator. Output order is
preserved, failures and the MoA-recursion guard stay isolated per reference.

- Removed the old mixture_of_agents model tool and moa toolset.
- Added moa as a virtual provider in the provider/model inventory.
- /moa is shortcut behavior over model selection (default preset / named preset
  / one-shot prompt).
- Dashboard + Desktop manage named presets; presets appear in model pickers.
- Parallel reference fan-out in agent/moa_loop.py with regression test.

* fix(moa): thread moa_config through _run_agent to _run_agent_inner

The reconstructed gateway MoA wiring declared moa_config on _run_agent (the
profile-scoping wrapper) and used it inside _run_agent_inner, but the wrapper
never forwarded it — _run_agent_inner had no such parameter, so the runtime hit
NameError: name 'moa_config' is not defined on the compression-failure session
sync path. Add moa_config to _run_agent_inner's signature and forward it from
both wrapper call sites (multiplex and non-multiplex). Caught by
tests/gateway/test_compression_failure_session_sync.py on CI shard test(4).

* fix(moa): classify moa as a virtual provider in the catalog

The moa virtual provider has no PROVIDER_REGISTRY/ProviderProfile entry, so
provider_catalog() fell through to the default auth_type="api_key" with no
env vars — tripping two catalog invariants:
  - test_provider_catalog: api_key providers must expose a credential env var
  - test_provider_parity: every hermes-model provider must be desktop-configurable

moa already declares auth_type="virtual" in HERMES_OVERLAYS; consult that
overlay as an auth_type fallback so the catalog reports moa as virtual (no real
credential, no network endpoint). Exempt virtual providers from the desktop
parity union check the same way 'custom' is exempt — derived from the catalog,
not a hardcoded slug, so future virtual providers are covered too.
2026-06-25 13:52:06 -07:00

4.5 KiB

sidebar_position title description
7 Mixture of Agents Create named MoA presets that appear as selectable models under the Mixture of Agents provider

Mixture of Agents

Mixture of Agents is a virtual model provider. Each named MoA preset appears as a selectable model under the moa provider.

When you select a MoA preset, the preset's aggregator is the acting model. It is the model that writes the assistant response and emits tool calls. Reference models run first and provide analysis for the aggregator to use.

Use MoA when a hard task benefits from multiple model perspectives but still needs Hermes' normal agent loop: tool calls, follow-up iterations, interrupts, transcript persistence, and the same session context as any other message.

Select a MoA preset as your model

You can select a preset through the normal model picker surfaces:

/model default --provider moa
/model review --provider moa

The Dashboard, TUI, and Desktop model pickers also show a Mixture of Agents provider row. Its models are your configured preset names.

Slash command shortcut

/moa is convenience sugar over model selection:

/moa

Switches the current session to the default MoA preset.

/moa review

If review exactly matches a preset name, switches the current session to provider moa, model review.

/moa design and implement a migration plan for this flaky test cluster

If the text does not exactly match a preset name, Hermes treats it as a one-shot prompt. It temporarily switches to the default MoA preset for that turn, sends the prompt, then restores the previous model afterward.

Preset matching is exact on purpose. Hermes does not fuzzy-match preset names, so normal prompts cannot accidentally become model switches.

How it works in the agent loop

For each main model call when provider moa is selected, Hermes:

  1. resolves the selected preset by name;
  2. runs the configured reference models without tool schemas (they receive only the conversation's user/assistant text — not the Hermes system prompt or tool-call transcript — so reference calls stay cheap and avoid strict-provider rejections);
  3. appends the reference outputs as private context for the aggregator;
  4. calls the configured aggregator with the normal Hermes tool schema;
  5. treats the aggregator response as the real model response;
  6. if the aggregator calls tools, Hermes executes those tools normally;
  7. on the next model iteration, the same MoA process runs again over the updated conversation, including tool results.

Because MoA is selected through the normal model system, it composes automatically with /goal, gateway sessions, TUI sessions, and Desktop chat.

Configure presets

You can configure named MoA presets from:

  • Dashboard → Models → Model Settings → Mixture of Agents
  • Desktop app → Settings → Model → Mixture of Agents
  • hermes moa configure [name]
  • config.yaml

The config stores explicit provider/model pairs, so you can mix providers and use multiple models from the same provider:

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
      reference_temperature: 0.6
      aggregator_temperature: 0.4
      max_tokens: 4096
      enabled: true

Default preset:

  • reference: openai-codex:gpt-5.5
  • reference: openrouter:deepseek/deepseek-v4-pro
  • aggregator / acting model: openrouter:anthropic/claude-opus-4.8

Terminal preset management

hermes moa list
hermes moa configure              # update the default preset
hermes moa configure review       # create or update a named preset
hermes moa delete review

Notes

  • MoA is no longer listed under hermes tools; there is no moa toolset to enable.
  • Setting enabled: false on a preset disables the reference fan-out for that preset: the aggregator acts alone, exactly as if you selected it as a plain model. This is the per-preset off switch surfaced in the dashboard and desktop settings.
  • A preset's aggregator cannot be another MoA preset. Recursive MoA trees are intentionally blocked.
  • Credential failures on one reference model do not abort the turn. Hermes includes the failure in the reference context and continues with whatever models returned.
  • MoA increases model-call count. A single model iteration can involve multiple reference calls plus the aggregator call.