Mixture of Agents

Mixture of Agents 是一个虚拟模型提供商。每个命名的 MoA 预设都作为可选模型出现在 moa 提供商之下。

当你选择一个 MoA 预设时,该预设的聚合器就是实际运行的模型。它是撰写助手回复、发出工具调用的模型。参考模型先运行,为聚合器提供可供使用的分析。

谁为一次 MoA 运行付费

聚合器为整次运行计费:它要跑工具循环的每一步,因此一个预设的几乎全部成本都落在聚合器的提供商上。参考模型每个用户回合只建议一次(使用默认 fanout)。如果你的主模型在订阅制提供商上、而聚合器在别处,这次运行会计到聚合器的提供商,而非你的订阅——hermes moa configure 和 hermes moa list 会在聚合器提供商与 model.provider 不同时打印一行提示;桌面端编辑器、hermes model 和 /model 会把聚合器槽位标记为实际运行、承担计费的模型。

当一个困难任务能从多模型视角中受益、但仍需要 Hermes 正常的 agent 循环(工具调用、后续迭代、中断、记录持久化,以及与其他消息相同的会话上下文)时,使用 MoA。

选择一个 MoA 预设作为你的模型

你可以通过常规模型选择界面选择预设:

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

MoA 预设在每个 Hermes 界面上都可选,因为 MoA 在模型系统中就是一个普通提供商:

  • CLI / 网关 / TUI 的 /model——/model <预设> --provider moa,或 /model --provider moa 使用默认预设。当名称与某个已配置预设精确匹配时,裸写 /model <预设> 也有效。
  • hermes model 和仪表盘模型选择器——会出现一行 Mixture of Agents 提供商,你的预设名作为其模型。
  • 桌面 GUI 应用——模型下拉框中有一个 MoA presets 分区;选择其中一个(MoA: <预设>)即把活动模型切换到该预设。桌面端设置面板也可创建和编辑预设。

因此,已配置的预设会出现在你选择任何其他模型的所有地方。

斜杠命令快捷方式

/moa 是一次性的便捷语法糖。它通过默认 MoA 预设运行单条提示词,然后恢复你之前所在的模型:

/moa 为这个不稳定的测试集群设计并实现一个迁移方案

Hermes 为那一回合临时切到默认 MoA 预设,发送提示词,然后恢复你先前的模型。整个参数就是提示词——/moa 不再把它解释为预设名。

/moa

裸 /moa(无提示词)只打印用法。

要在会话剩余时间内切换到某个 MoA 预设,请从模型选择器中选择——MoA 预设出现在每个模型选择界面的 Mixture of Agents 提供商之下(见上)。/moa 刻意不做模型切换,这样普通提示词绝不会意外改变你的模型。

它在 agent 循环中如何工作

当选择了 moa 提供商时,每次主模型调用 Hermes 都会:

  1. 按名称解析所选预设;
  2. 运行已配置的参考模型,但不带工具 schema(它们只收到对话的 user/assistant 文本——不含 Hermes 系统提示词或工具调用记录——因此参考调用保持廉价,并避免严格提供商的拒绝);
  3. 把参考输出作为私有上下文追加给聚合器;
  4. 用正常的 Hermes 工具 schema 调用已配置的聚合器;
  5. 把聚合器响应视为真正的模型响应;
  6. 若聚合器调用工具,Hermes 正常执行这些工具;
  7. 下一次模型迭代时,同样的 MoA 过程在更新后的对话(含工具结果)上再跑一遍。

由于 MoA 是通过常规模型系统选择的,它自动与 /goal、网关会话、TUI 会话和桌面端聊天组合协作。

配置预设

你可从以下位置配置命名的 MoA 预设:

  • 仪表盘 → Models → Model Settings → Mixture of Agents
  • 桌面应用 → 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
      # 可选:固定采样温度。省略时(默认)不发送 temperature,
      # 每个模型使用其提供商默认值——与单模型 Hermes agent 行为一致。
      # 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 使用提供商自带的输出限制。预设级和按槽位的输出 token 上限设置不再支持。提供商默认值各不相同;省略并不总是意味着模型最大值。需要输出限制的原生协议会从 Hermes 获得一个内部值。

建议节奏与 fanout

默认情况下,建议者每个用户回合运行一次(fanout: user_turn)——它们在回合首条消息上综合出计划级建议,然后运行中的聚合器独自完成工具循环的剩余部分。这是最便宜的节奏:建议者成本不会随一回合内的工具调用次数倍增。两种替代节奏以成本换取建议的新鲜度:

  • fanout: per_iteration——建议者在每次工具迭代时重跑,因此其建议始终跟踪最新工具结果——代价是建议者延迟和花费随一回合内工具调用次数倍增。
  • fanout: every_n:3——中间路线:建议者在每个用户回合的第 1 次迭代运行,之后每 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 年 7 月之前,默认节奏是 per_iteration。现在默认为 user_turn——最便宜、影响最小的节奏——直到分模式基准证明更贵的默认值合理为止。想要逐步建议的预设请显式设回 fanout: per_iteration。

建议者输出的隐私过滤

建议者输出可能把对话中的敏感数据——邮件、格式化电话号码、API 密钥、JWT——回显到 UI 中显示的参考块、保存的 MoA 追踪和聚合器提示词里。moa.privacy_filter(默认关闭)会对这些界面脱敏:

moa:
  privacy_filter: display   # 或:full
  • display——仅对用户可见界面脱敏:UI 中渲染的带标签参考块和 save_traces 写出的记录。聚合器仍收到原始建议者文本,因此回答质量不受影响。
  • full——额外对注入聚合器提示词(以及一次性 /moa 综合输入)的建议者文本脱敏。

凭据形态(API 密钥前缀、JWT、私钥、数据库连接串)由 Hermes 中央机密脱敏器掩码;MoA 过滤在此之上增加邮件和清晰格式化电话号码的脱敏。模式对代码评审式建议刻意保守:裸数字串、行号、时间戳、git SHA 和 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 都会附加:

聚合器在 nous 上;整个工具循环会计到那里,而非 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 预设是一次普通的模型选择:它不改写过去上下文、不切换工具集、不在对话中途重建系统提示词。你的对话历史、系统提示词和工具 schema 保持字节稳定,因此其他模型依赖的缓存前缀被完整保留,与普通模型完全一致。切到或切离 MoA 预设的缓存失效成本与任何其他 /model 切换相同——仅此而已。

两种内部调用类型都正常缓存:

  • 参考模型收到对话的裁剪后确定性视图(剥离系统提示词和工具记录——见上文循环)。由于该视图是稳定历史的稳定函数,参考模型的提示词前缀跨迭代重复,正常缓存。参考是不带工具的短建议调用。

  • 聚合器是运行模型。参考输出作为其自己的尾部 user 消息(私有指引)追加——绝不合并进你的消息。由于该块位于尾部——在整个稳定前缀(系统提示词 + 你的消息 + 先前工具历史)之下——它不会使任何缓存前缀失效:工具循环中每个请求都是上一个请求的字节级相同扩展(减去其指引块),因此聚合器在注入点以上的全部内容都命中缓存,只有新追加的尾部是新的。这正是每个普通回合的行为方式:每条新用户消息也是未缓存的尾部 token。使用 Anthropic Messages、Bedrock Converse 或原生 Gemini 线路的聚合器会把两个相邻 user 回合合并为一条消息,但作为独立内容块:你消息的块与后续重放时字节一致,指引块紧随其后,因此缓存前缀仍贯穿你的消息。

    在 OpenAI 兼容线路上,一回合的首次迭代以 user(你的消息), user(指引) 结束。少数强制严格 user/assistant 交替的聊天模板(llama.cpp 和 vLLM 的 Jinja 模板、某些 OpenRouter 路由)会以 400 拒绝,如 Conversation roles must alternate。Hermes 自行恢复:它把这一个请求的两条相邻 user 消息合并后重试,在会话剩余时间记住该聚合器目的地(endpoint + 模型),使后续回合预先合并,而其他所有目的地保持拆分的、缓存稳定的形态。合并只在目的地要求处应用,因为到处合并会重新引入前述前缀发散。

因此 MoA 不在任何一种调用类型上牺牲提示词缓存。它唯一的真实成本是额外的参考调用(默认 fanout 下每用户回合一次)——你为多模型视角付费,而非为破损的缓存付费。与 Hermes 其余部分共享的长生命周期对话前缀完全完好。

注意事项

  • MoA 不再列于 hermes tools 下;没有需要启用的 moa 工具集。
  • 在预设上设 enabled: false 会禁用该预设的参考扇出:聚合器单独运行,完全等同于你把它选为普通模型。这是仪表盘和桌面端设置中暴露的按预设关闭开关。
  • 一个预设的聚合器不能是另一个 MoA 预设。递归 MoA 树被有意阻断。
  • 某个参考模型的凭据失败不会中止回合。Hermes 把失败纳入参考上下文,继续用返回了结果的模型运行。
  • MoA 增加模型调用次数。一次模型迭代可能涉及多个参考调用加聚合器调用。
  • 预设可作为回退条目(fallback_providers: [{provider: moa, model: <预设>}])。主模型失败时,Hermes 激活该预设本身——参考和聚合器,以 moa://local 为虚拟 endpoint——与 /model <预设> --provider moa 相同。当预设无法解析或其聚合器无凭据时,该条目被跳过。