§09 子代理:一个 Agent 指挥一队 Agent

去年做一个研究报告生成器,单个 Agent 跑半小时还串台。拆成"研究员 + 写手"两个专员并行,十分钟出稿。这章讲这种"一个人带一队人"的打法。

09.1 类比级联:总监、经理、员工

单个 Agent 是一个人干活。子代理让一个人带一队人。

主 Agent 是技术总监。它不自己写代码,只把任务派下去。 子代理是专员。每个只会一件事,但做得精。

我管这叫"一个人带出一支队伍"。复杂任务拆给不同专员并行做,速度直接起飞。

09.2 三种定义方式

方式 写法 标叔的结论
代码定义 agents={...} SDK 应用首选
文件定义 .claude/agents/*.md 团队协作好维护
内置通用 不用定义 临时探索用

代码定义最常用。每个子代理有 descriptionprompttoolsmodel

09.3 一个真实的多代理例子

文档里的研究系统,我精简给你看:

from claude_agent_sdk import AgentDefinition

agents = {
    "researcher": AgentDefinition(
        description="需要搜集资料时用。用搜索找信息,写进文件。",
        tools=["WebSearch", "Write"],   # 只给搜索和写,最小权限
        prompt="你是研究专员,负责上网找资料。",
        model="haiku",                   # 便宜的模型干脏活
    ),
    "report-writer": AgentDefinition(
        description="资料齐了,用来写正式报告。不搜网。",
        tools=["Skill", "Write", "Read"],
        prompt="你是报告写手,把笔记整理成 PDF。",
        model="haiku",
    ),
}

主 Agent 的 allowed_tools 只放 ["Task"]。它自己不动手,全派给子代理。

标叔的经验:子代理的 description 决定它被不被调用。

文档里反复强调:主 Agent 看 description 决定"这事该派谁"。我把描述写成"什么时候用",匹配准多了。写"研究专员"这种名字,它经常瞎派。

09.4 上下文隔离是精髓

每个子代理跑在独立的全新对话里。它读了 100 个文件,主 Agent 只收到一句总结。上下文不爆炸。

注意:工具名从 Task 改成了 Agent

文档提了:Claude Code v2.1.63 之后,子代理工具叫 Agent。但老 SDK 还发 Task。检测时两个都判断,才兼容各版本。

子代理会带了。最后一步,把它送上生产环境。