← Back to blog

Hermes Agent MoA Presets Ship as Virtual Models - Configurable Reference Fan-Out Across Providers

hermesnousresearchmoamixture-of-agentsopenroutervercel-ai-gateway
Hermes Agent MoA Presets Ship as Virtual Models - Configurable Reference Fan-Out Across Providers

Nous Research announced on June 26 that Mixture-of-Agents presets in Hermes Agent are now exposed as first-class virtual models. The tweet crossed 4,100 likes, 379 retweets, and 780,000 impressions inside twelve hours. Underneath the announcement is a coordinated set of upstream changes that turned a hidden tool flag into a selectable provider slot across the CLI, TUI, gateway, and dashboard.

The core shift: MoA stops being a tool and becomes a model

Mixture-of-Agents is the 2024 architecture from Together AI that runs a user prompt through several reference LLMs in parallel, then passes every output to an aggregator model. The original paper pushed AlpacaEval 2.0 from 57.5% (GPT-4o) to 65.1% using only open-source references - a 7.6 percentage-point gain at N-fold latency and spend.

Hermes Agent has shipped a mixture_of_agents tool since before v0.15. What changed this week is the surface area. The tool was a hidden tool registry entry with hardcoded references; the June 26 rollout turns MoA into a virtual model provider alongside OpenRouter, Nous, Vercel AI Gateway, and local model catalogs.

PR #46094 (1,903/-757 LOC across 57 files, author: Teknium) is the structural change. It introduces a fusion.presets[] config schema and registers every Fusion preset as a fusion/<slug> model slug. Pickers across hermes model, /model, the dashboard Models tab, and the MoA provider/model slots append the new slugs automatically.

Two paths land in the user surface:

  • One-shot /moa <prompt> runs a single prompt through the default preset and restores the prior model when the turn finishes.
  • Sticky preset selection via /model makes the MoA preset the active model for the session - every subsequent message fans out through the reference pool.

PR 50f68552 (June 27) reshaped /moa itself. Before, it did a sticky model switch that silently failed when the cached agent ignored session[model_override] (issue #53444). The TUI now does an in-place agent.switch_model() via _apply_model_switch() and restores the original model after the turn.

The bugfixes tell you what was breaking

The announcement landed on top of a 72-hour burst of MoA-related fixes. Each points at a real failure mode users hit when running MoA in production.

PR Fix LOC
#53554 Aggregator gets its own 32K output budget (was sharing the 4,096 reference budget and truncating). +43/-5
#53523 Gateway `/moa` failed turn left the override in place; every subsequent message fanned out through MoA permanently. +140/-17
#53561 Gateway `/model` picker (Telegram/Discord) hid the MoA provider row because it bypassed CLI inventory. +93/-3
#53556 Hand-edited scalar `reference_models` in preset config crashed every MoA call via unguarded list iteration. +25/-1
#53559 Same restore bug as #53523 covering additional gateway exit paths (raised turns, shutdown). +47/-12
Total (48h) 6 MoA-specific PRs +348/-38

PR #53523 is the worst of the bunch. When a /moa <prompt> one-shot turn raised an exception, the gateway stored the restore data on the per-turn event object, then discarded it. Every subsequent message on that session silently routed through the MoA reference fan-out until the user restarted Hermes. Higher cost, higher latency, no visible warning.

Reference context controls are opt-in, not default

PR #52725 (421/-22 LOC) adds per-preset reference_context settings. The default path stays narrow: stripped user/assistant text only, no system prompt, no files. Operators can opt a preset into sending the full system prompt and selected context files (SOUL.md, AGENTS.md, CLAUDE.md, .cursorrules, .hermes.md, HERMES.md) to the reference models.

Defaults stay privacy-preserving: file names are allowlisted, path traversal is ignored, files.enabled: false is authoritative. The hidden /moa <prompt> payload markers do not trust reference_context - if a preset needs opted-in system or file context, the user must select it as the active model from the picker.

Provider routing and Vercel AI Gateway default

MoA used to call OpenRouter directly through a hardcoded client. PR #28950 replaces that with agent.auxiliary_client.resolve_provider_client(provider, async_mode=True). Precedence: moa.provider config, MOA_PROVIDER env, AI Gateway key, OpenRouter key. When AI_GATEWAY_API_KEY is set, MoA defaults to Vercel AI Gateway instead of OpenRouter - the reasoning passthrough shape MoA uses already matches the gateway's expectation, so the wiring is a client swap.

PR #18407 (713/-177 LOC) is the deeper change. Each reference and the aggregator can point at any registered Hermes provider (OpenRouter, ollama-cloud, custom providers from config.yaml) with per-route temperature, max_tokens, omit_temperature, and extra_body:

moa:
  references:
    - { provider: ollama-cloud, model: kimi-k2.6 }
    - { provider: ollama-cloud, model: glm-5.1 }
    - { provider: ollama-cloud, model: qwen3.5:397b }
  aggregator:
    provider: ollama-cloud
    model: kimi-k2.6
  min_successful_references: 1

The cost ceiling is explicit

PR #39172 moved MoA configuration into ~/.hermes/config.yaml. Its body states the constraint directly: "MoA is ~$1-3/call and off-by-default for cost reasons, and the only customization path today is editing the constants at the top of tools/mixture_of_agents_tool.py."

The config layer exposes reference_models, aggregator_model, reference_temperature, aggregator_temperature, min_successful_references, reasoning_effort, and base_url / api_key for any OpenAI-compatible endpoint. Resolution precedence is call-arg > moa: config > existing hardcoded defaults. With no moa: section, behavior is byte-identical to before.

The lower bound on what works is min_successful_references: 1. A single asyncio.gather failure no longer cancels the others - PR #27391 added the return_exceptions=True flag the original code was missing - so the aggregator proceeds with whatever subset of references returned successfully.

What's new vs the 2024 paper

The original MoA paper used three layers with six open-source references per layer. Hermes' production implementation is closer to two layers: the user prompt fans out to N references, then the aggregator synthesizes the final answer. The token budget split is now explicit: references get 4,096 output tokens, the aggregator gets 32,000.

The 2024 paper's AlpacaEval 2.0 result (65.1% vs GPT-4o 57.5%) is open-source-only. Nous Research's announcement benchmarks against Opus 4.8 and GPT 5.5 with 8% / 11% improvement claims, but the benchmark name, dataset, and methodology are not in the announcement. The comparison is qualitative: Hermes can fan out across multiple frontier models and aggregate, with provider routing and per-preset context controls the original implementation did not have.

[^1]: Nous Research on X. 4,163 likes, 379 retweets, 780,905 impressions. Posted 2026-06-26 20:49 UTC. [^2]: PR #46094 - feat(models): add configurable Fusion presets. +1903/-757 across 57 files. Teknium. [^3]: PR #28950 - feat(moa): make Mixture-of-Agents provider-agnostic, support Vercel AI Gateway. +159/-46. remiconnesson. [^4]: PR #39172 - feat(tools): make Mixture-of-Agents configurable via config.yaml. +583/-71. davidgut1982. [^5]: PR #18407 - feat(moa): config-driven multi-provider routing. +713/-177. jegork. Per-route provider, temperature, max_tokens. [^6]: PR #52725 - feat(moa): add preset reference context controls. +421/-22. WolframRavenwolf. [^7]: PR #53554 - fix(moa): give aggregator a larger output budget. +43/-5. joshportman. Splits reference_max_tokens (4096) from aggregator_max_tokens (32000). [^8]: PR #53523 - fix(gateway): restore MoA one-shot model override on failed turns. +140/-17. srojk34. [^9]: PR #53561 - fix(gateway): show MoA presets in the gateway model picker. +93/-3. teknium1. [^10]: PR #53556 - fix(moa): tolerate non-list reference_models. +25/-1. teknium1. [^11]: PR #50f68552 - feat(moa): make /moa one-shot only. 2026-06-27. Fixes #53444 sticky-switch failure. [^12]: PR #27391 - moa: use return_exceptions=True. +65/-7. YonganZhang. [^13]: Wang et al., 2024. "Mixture-of-Agents Enhances Large Language Model Capabilities." arXiv:2406.04692. Together AI. [^14]: Together AI Blog - Together MoA. 2024-06-11. Reference implementation, 65.1% AlpacaEval 2.0 vs GPT-4o 57.5%.

Termagotchi
_

Ryan Underdown

Autodidact. Rarely listens to advice.

Follow on X @catamarammed or GitHub @underdown