长时 Claude Code 会话很快会变得一团糟。每个 grep、find、ls 都留在上下文里,占据你再也用不上的空间。Subagent 解决这个问题:它们在自己的窗口运行任务,只返回结果,不污染主会话。
什么是 Subagent?
Subagent 是一个专业化助手,运行在独立上下文窗口里,有自己的系统 Prompt、工具和权限。主 Agent 调用它,子 Agent 在隔离环境工作,返回摘要结果。
如何创建一个
用 Markdown 文件加 frontmatter 来定义。Claude Code 自动识别,当描述匹配任务时自动调用。
保存位置决定作用域(同名时高优先级覆盖低优先级):
.claude/agents/— 纳入版本控制,与团队共享~/.claude/agents/— 个人专用,随处可用
没有 Subagent 的问题
没有 Subagent,主 Agent 在单一上下文里干所有事。你让它 review 一个 controller、找一种模式、验证某个东西,它发起 grep、find、ls、glob、cd、更多 grep、再一个 find——每个调用都留在你的上下文里。
30 分钟后,你有 80000 token 的噪音,而它们你永远不会再读。
当 Claude 压缩上下文时,这些信息被扁平化。重要细节在摘要里丢失。
内置 Subagent
Claude Code 为常见场景预装了 Subagent,最常用的两个:
Explore:不污染主 context 的代码库搜索。在自己的窗口发起所有 grep 和 find 调用,只返回相关发现结果。
Plan:调研并生成实施计划。读取文件、理解架构,返回分步骤文档。你的主 context 永远看不到中间读取过程。
50 个工具调用在你的窗口里变成 3 行答案。其余全部丢弃。
Fork:继承父上下文
默认情况下,Subagent 从空白上下文开始。干净是干净了,但如果已经投入 100k token 建立代码库理解,想要子 Agent 继承这些积累时就尴尬了。
Fork 解决了这个问题:子 Agent 在 fork 时刻获得父上下文的精确副本。
export CLAUDE_CODE_FORK_SUBAGENT=1
设置后,每个子 Agent spawn 默认继承完整父上下文。也可以用 /fork 命令按需 fork。
Fork 后:
- 继承 fork 时父的完整对话
- 与父共享 Prompt 缓存前缀(子 Agent 第 2-N 个输入 token 成本约降 10 倍)
- 隔离运行,工具调用不污染父 Agent
- 只返回最终摘要到主对话
context-timeline 钩子
并行运行的主 Agent 和子 Agent 很难从控制台追踪。作者做了一个钩子来解决:context-timeline。
功能:打开 session 那一刻开始,显示时间线,包括主 Agent 的上下文窗口,以及 Subagent 如何在自己的独立 context 里开始工作。
每个运行的子 Agent 实时显示,完成时还显示它返回给主 Agent 的内容。
建议
从一个简单的 Subagent 开始,放在 .claude/agents/ 里。第一个长会话你就会感受到差别。