子代理也要分工:delegate_task 现在能按任务挑模型、挑 Profile

你给 Hermes 派了一批活:8 个子任务,6 个是翻文档、读日志、改格式这种轻活,2 个是啃并发、理架构这种硬活。可你只能给所有子代理定一个模型——定贵的,6 个轻活白烧钱;定便宜的,2 个硬活糊弄你。这个二选一,从 2026 年 10 月 22 日合入的 PR #142563 起不再必答。
以前的规矩:一个 delegation.model 管所有子代理
delegate_task 的模型是在 config.yaml 里全局钉死的:delegation.model、delegation.provider、delegation.base_url。默认策略下 delegate_task 没有“每个任务用什么模型”这个参数,所以一次批量里的每个子代理都跑在同一条路由上。官方文档写得很直白:想要按子任务质量分流,要么这次会话干脆不设 delegation.model,要么把活交给 kanban 板(那边支持 per-task 模型覆盖)。
结果就是大家心照不宣地做妥协:把委派模型定在中档,然后忍着。
现在:delegation.backend 决定“活怎么派”
这次改动的核心一句话:委派变成了一个可插拔的 provider 类别,和 TTS、图像生成、终端后端是同一个套路。delegation.backend 选策略,default 就是上面那套旧行为——官方明确写了,未设置或设为 default 时,delegate_task 的 schema 和每个 hermes-cli 工具定义与改动前逐字节一致。
另外两条策略来自官方插件 advanced-delegation:
model_map:你列几个带标题的模型档位(fast、deep……),每个写一句话描述 + provider + model,模型自己按任务挑一档;profile_routes:每个子任务以某个 Hermes Profile 的身份跑,用它自己的模型、凭据、技能和人格。
delegation:
backend: model_map
backends:
model_map:
options:
- name: fast
description: Cheap and quick; lookups, summaries, simple edits.
provider: openrouter
model: google/gemini-3-flash-preview
- name: deep
description: Slow and careful; hard debugging and design work.
provider: anthropic
model: claude-opus-5
reasoning_effort: high
service_tier: fast # 可选;这条路由没有 fast 档时会在启动阶段被拒
default: fast # 可选:没指定档位的任务走这里
profile_routes: # backend: profile_routes 时读这一段
profiles:
- name: coder
description: Writes and refactors code; runs tests.
注意“档位描述”不是装饰:模型能看到的只有你写的名字和描述,provider、model、key 这些字段它一个字都看不到。所以你写“Cheap and quick; lookups, summaries”就是在教它什么时候该省钱,写“Slow and careful; hard debugging”就是在教它什么时候该花。
每个任务的结果多了 route 回执
一个走后端路由的任务,结果里会带 route:哪个后端、选了哪一档(或哪个 Profile)、子代理实际跑在哪个 provider / model / reasoning effort / speed tier 上;如果中途切到了 fallback provider,还会有 fallback_activated: true。
这条比看起来重要。以前你只能凭“我设了 delegation.model”推断子代理用了什么,现在它自己报账——排查“为什么这批任务突然贵了”时,直接看回执就行。
失败要吵出来,不许悄悄降级
官方这次把“安静降级”这条路彻底堵上了:
- 选中的后端没装、被禁用、或自报不可用时,
delegate_task直接返回工具错误,说明是哪个后端、怎么修(装/启用插件、/delegation default、或hermes config set delegation.backend default),不会悄悄用默认路由把子代理跑起来; - 批量里某个任务路由不了(档位名不存在、参数当前后端不支持、Profile 不存在、路由没有这个
service_tier、reasoning_effort不认识、凭据缺失),只拒这一个:它的结果里status: "error"、写明原因、带route.refused: true,其他任务照跑; - 只有当整批任务全被拒时,这次调用才算工具错误;
- 模型路由没自带
fallback_providers就继承delegation.fallback_providers,在路由上写fallback_providers: []表示这条路由不兜底;Profile 路由则用那个 Profile 自己的兜底链。
顺带一个边界:model_map 或 profile_routes 生效期间,delegation.model 和 delegation.provider 是失效的——路由说了算。别一边配了档位,一边疑惑为什么 delegation.model 没反应。
怎么切、怎么切回来
两条策略和 /delegation 斜杠命令、hermes delegation config(增删改模型路由、挑 Profile)都来自官方插件,先装:
hermes plugins search advanced-delegation
hermes plugins install advanced-delegation
hermes plugins enable advanced-delegation
装好之后,切后端不必改文件:
/delegation model_map # 只切当前会话
/delegation profile_routes --global # 写进 config.yaml,沿用 /model 的约定
/delegation default # 切回默认策略
这里有个容易踩的坑,官方文档专门点出来了:会话内切换只改路由,不改工具清单。delegate_task 的每任务参数(档位名、Profile 名)是缓存提示词的一部分,跟着 config.yaml 走,要到下一次会话才更新。所以在切换之后、新会话之前,模型还可能按老习惯发上一个后端的参数(比如切到 profile_routes 后还发 option: fast)——这种任务会被单独拒绝,并告诉你修法:/delegation <backend> --global 然后 /new(因为 /new 从保存的后端启动),或者 /delegation <saved backend> 切回去。它绝不会拿新后端的默认路由凑合跑。
没装插件、又想把配置复位,用 hermes config set delegation.backend default。
两种策略该挑哪个
model_map:同一套凭据,按难度分钱。轻活给便宜模型,硬活给强模型,适合“批量任务但子任务难度差得远”的场景,比如一次修 10 个 issue、一次跑 20 条调研。profile_routes:子代理直接换身份。每个 Profile 有自己的模型、凭据池、SOUL.md和终端策略。适合“这帮子代理该用另一套权限”的场景,比如让代码任务在受限终端策略下跑。
profile_routes 有句话必须抄下来:列出某个 Profile,等于把这个 Profile 的凭据、凭据池、SOUL.md 和终端策略交给本 Profile 的子代理使用。只列你愿意让 agent 拿去用的那些。
目前的状态
PR #142563 于 2026 年 10 月 22 日合入 main,紧随其后的 #142564 把默认策略本身也移进随包插件,桌面端的委派设置界面(档位选择、模型路由编辑、Profile 路由)由 #143126 补上。最近一次正式发布是 10 月 21 日的 v0.22.4,所以这些能力现在只在 main 上,会随下一个版本到稳定通道。想马上用就从 main 通道更新;写脚本依赖这些字段之前,先确认你的安装已经在包含它们的提交上。
如果你还没用过子代理的实时控制(list/steer/stop),可以先看 子代理实时编排指南;想搞清楚 delegation 这一节的完整字段,hermes config 命令参考比翻源码快。多档位模型切换的另一半故事在 model_overrides 配置指南;装插件的完整流程见 插件目录指南。