Hermes 101|13|Delegation

Delegation 让父 Agent 把独立子任务交给隔离上下文里的子 Agent,只拿回最终摘要而不是全部中间过程。

Hermes 101|13|Delegation

复杂任务不一定适合由一个 Agent 在一个上下文里从头做到尾。研究、代码审查、资料比对、并行排错、候选方案评估,都天然可以拆成多个相互独立的子任务。Hermes 的 Delegation 就是为这种场景设计的。

Delegation 不是让模型“想象有几个助手”,而是真正派生子 Agent。

父 Agent 与子 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 拓扑

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_taskclarifymemorysend_messageexecute_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 负责在明确边界内完成局部探索。

参考资料