Hermes 101|13|Delegation
Delegation 让父 Agent 把独立子任务交给隔离上下文里的子 Agent,只拿回最终摘要而不是全部中间过程。
复杂任务不一定适合由一个 Agent 在一个上下文里从头做到尾。研究、代码审查、资料比对、并行排错、候选方案评估,都天然可以拆成多个相互独立的子任务。Hermes 的 Delegation 就是为这种场景设计的。
Delegation 不是让模型“想象有几个助手”,而是真正派生子 Agent。

读完本文,你应该能回答
- Delegation 和普通函数调用、后台任务有什么不同?
- 为什么子 Agent 必须有隔离上下文和工具收窄?
- Batch 并行适合哪些任务,不适合哪些任务?
- mini-agent-harness 如何实现父子 Agent 的输入输出契约?
本篇在系列中的位置
前面几篇让 Agent 能长期运行、跨平台运行、按时间运行,本篇让它能并行分工。最后一篇 Provider Runtime 会回到模型调用本身,解释多 provider、多协议、多凭证如何被统一。
贯穿案例
贯穿这个系列,可以一直带着同一个任务来读:用户说“帮我修复这个 repo 里的 failing tests”。不同章节会回答同一个任务在运行时的不同问题:入口怎样进入、上下文怎样准备、模型怎样决定下一步、工具怎样执行、状态怎样保存、失败后怎样恢复。
定义
Delegation 是父 Agent 通过 delegate_task 派生一个或多个子 Agent,让它们在隔离上下文和受限工具集中完成任务,并只把最终摘要返回给父 Agent。子 Agent 不继承父对话历史。父 Agent 必须把目标、背景、路径、约束、输出语言和验收标准写进 goal/context。
这点非常关键。Delegation 的成功不取决于“开了几个线程”,而取决于父 Agent 是否把任务边界交代清楚。
隔离上下文
Hermes 的子 Agent 有自己的 conversation、task id、工具集和迭代预算。它的中间工具调用、推理过程、文件探索不会全部塞回父上下文。父 Agent 只拿到结构化结果:status、summary、错误、耗时、工具轨迹、token/cost 摘要等。
这能显著降低父上下文污染。否则三个子任务各自读几十个文件,父 Agent 的上下文会立刻失控。
同步而非后台
delegate_task 是同步工具。父 Agent 调用它之后,会等待子 Agent 完成。它不是 durable background job;如果父 turn 被中断,子 Agent 也会被取消。
需要长期运行或无人值守的任务,应该用 Cron 或后台进程,而不是 Delegation。

Delegation 拓扑
Delegation 的价值不是“多开几个模型”,而是把上下文隔离和并行边界说清楚。
| 拓扑 | 适合任务 | 不适合任务 |
|---|---|---|
| 单个 leaf 子 Agent | 调研一个独立模块、检查一个 bug 假设 | 需要和用户多轮确认的任务 |
| Batch leaf 子 Agent | 并行审读多个文件、多个方案、多个资料源 | 子任务之间强依赖的任务 |
| Orchestrator 子 Agent | 大任务内部还能继续拆分 | 需要严格控制成本和时延的短任务 |
| Cron / background process | 需要脱离当前 turn 长时间运行 | 父 Agent 需要立即整合结果的任务 |
在 failing tests 场景里,父 Agent 可以让三个 leaf 分别看测试日志、最近 diff、相关模块。父 Agent 不需要拿回所有中间输出,只需要每个子 Agent 的结论、证据和建议下一步。
Batch 并行
Delegation 支持 batch。多个子任务会并行运行,但有最大并发限制。默认子 Agent 是 leaf,不能继续派生;只有显式设置 orchestrator,并且深度配置允许时,子 Agent 才能再派生下一层。
这种限制不是保守,而是防止任务树失控。Agent 递归派生如果没有边界,很容易变成成本和副作用不可控的系统。
工具收窄
子 Agent 的工具集应该比父 Agent 更窄。研究子任务不需要写文件,文件审查子任务不需要发消息,代码排错子任务不应该默认拥有发布权限。
Hermes 因此会限制子 Agent 的危险工具。默认 leaf 子 Agent 不能调用 delegate_task、clarify、memory、send_message、execute_code 等工具。
可迁移伪实现:Delegation
下面的伪代码是机制抽象,不对应 Hermes 的真实 API 或文件结构。最小版本可以只实现单层派生和 batch:
type DelegateInput = {
goal?: string
context?: string
tasks?: Array<{ goal: string; context?: string; toolsets?: string[] }>
}
async function delegateTask(input: DelegateInput, parent: Agent) {
const tasks = input.tasks ?? [{ goal: input.goal!, context: input.context }]
const children = tasks.map((task, index) => new Agent({
systemPrompt: buildChildPrompt(task),
tools: filterTools(parent.tools, task.toolsets),
model: parent.model,
maxIterations: 50,
taskId: `${parent.taskId}.${index}`
}))
const results = await runParallel(children, { maxWorkers: 3 })
return results.sort((a, b) => a.taskIndex - b.taskIndex)
}
必须保留的不是线程池,而是四个语义:fresh context、toolset narrowing、final summary only、parent interrupt propagation。
小结
Delegation 让 Agent 从单线程思维变成任务树思维。它的价值不是“更多 Agent 更聪明”,而是把复杂任务拆成可隔离、可并行、可汇总、可验证的工作单元。父 Agent 仍然负责判断、整合和验证;子 Agent 负责在明确边界内完成局部探索。
参考资料
- Hermes Agent Documentation: https://hermes-agent.nousresearch.com/docs
- Hermes Agent GitHub: https://github.com/NousResearch/hermes-agent