Mixture of Agents
Mixture of Agents 是一个虚拟模型提供商。每个命名的 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 都会:
- 按名称解析所选预设;
- 运行已配置的参考模型,但不带工具 schema(它们只收到对话的 user/assistant 文本——不含 Hermes 系统提示词或工具调用记录——因此参考调用保持廉价,并避免严格提供商的拒绝);
- 把参考输出作为私有上下文追加给聚合器;
- 用正常的 Hermes 工具 schema 调用已配置的聚合器;
- 把聚合器响应视为真正的模型响应;
- 若聚合器调用工具,Hermes 正常执行这些工具;
- 下一次模型迭代时,同样的 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 参考)——MoA | 0.8202 |
anthropic/claude-opus-4.8 | 0.7607 |
openai/gpt-5.5 | 0.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相同。当预设无法解析或其聚合器无凭据时,该条目被跳过。