我来详细解释一下 Claude Code 的 Agent 系统:
Agent 是什么?
Agent 是 Claude Code 中的专门化子进程,用来自主处理复杂的多步骤任务。可以理解为:
- 我(主对话):负责与你交流、决策、协调
- Agent(子代理):像”专家助手”,接到任务后独立完成,完成后向我汇报
为什么需要子代理?
效率和专业性:
- Explore Agent - 快速搜索代码库,找文件/关键词(我直接搜可能会浪费上下文)
- Plan Agent - 设计实现方案,专注架构思考
- 日报生成助手 - 你的自定义 Agent,专门扫描笔记生成日报
- general-purpose - 处理需要多轮尝试的复杂研究任务
举例:
你问”CFlow 错误处理在哪?”
- ❌ 不高效:我直接用 Grep/Glob 搜索,占用对话上下文
- ✅ 高效:我启动 Explore Agent,它独立搜索,只把结果告诉我
并行研究是什么意思?
并行 = 同时运行多个 Agent
你的请求:研究A功能 + 研究B功能 + 修复C bug
我的操作:
┌─────────────────┐
│ 一条消息中 │
│ 同时启动3个 │ ← 一次性发出
│ Task 调用 │
└─────────────────┘
↓
┌────┴────┐
↓ ↓ ↓
Agent1 Agent2 Agent3 ← 同时工作
↓ ↓ ↓
结果1 结果2 结果3 ← 几乎同时返回
是在同一个对话里完成的! 不是打开新窗口,而是:
- 我在当前对话中调用 Task 工具
- Agent 在后台运行(可能几秒到几分钟)
- Agent 完成后,结果返回给我
- 我基于结果继续与你对话
实际例子
你:"帮我找出所有 TODO 注释,并分析代码结构"
我的工作流:
├─ 发送一条消息,包含2个并行 Task 调用
│ ├─ Task 1: Explore Agent 搜索 TODO 注释
│ └─ Task 2: Explore Agent 分析代码结构
├─ 等待两个 Agent 都完成(它们同时运行)
└─ 整合结果告诉你
全程都在这个对话窗口!
与你自定义 Agent 的关系
你的 .claude/agents/日报生成助手.md 就是一个预定义的专家 Agent:
- 触发:你说”生成今天的日报”
- 我调用它:使用 Task tool 加载这个配置
- 它独立工作:扫描文件、分析内容、生成日报
- 返回结果:我把日报结果展示给你
核心优势:你不用每次都重复说明需求,Agent 记住了所有规则!
有什么具体场景想试试 Agent 吗?
好问题!你的理解完全正确,我来澄清一下:
等待机制 - 你说对了!
正常情况:
你 → 发消息要求任务
我 → 启动 Agent
[你这时候发不了新消息,界面被锁定]
[Agent 工作中...]
Agent → 完成,返回结果
我 → 告诉你结果
[你现在才能发下一条消息]
我之前说的”并行”造成误解了!
真正的意思是:
- ✅ 我可以并行启动多个 Agent(一次发出3个 Task 调用)
- ❌ 但你还是要等它们都完成(界面依然锁定)
真后台运行:
我启动 Agent 时加上 run_in_background: true
→ Agent 在后台慢慢跑
→ 我立刻返回给你,不等它完成
→ 你可以继续发新消息
→ 稍后我用 Read/TaskOutput 查看 Agent 的输出文件但这是特殊用法,不常用。
“子代理”的真实含义
看完智慧库管家的配置,我来解释为什么叫”子代理”:
架构关系:
┌─────────────────────────────┐
│ 主对话(你和我聊天) │ ← 我是 Claude Code 主进程
│ │
│ 我可以启动 → │
│ ├─ Explore Agent │ ← 内置子代理
│ ├─ Plan Agent │ ← 内置子代理
│ ├─ 日报生成助手 │ ← 你自定义的子代理
│ └─ 智慧库管家 │ ← 你自定义的子代理
└─────────────────────────────┘
“子”不是指层级嵌套,而是指:
- 主 = 这个和你对话的我(主控)
- 子 = 被我启动的专门 Agent(执行者)
为什么叫 subagent_type 参数?
因为 Task 工具的设计中,需要指定启动哪种”子类型”的 Agent:
# 伪代码示意
Task(
subagent_type="Explore", # 启动 Explore 子代理
prompt="搜索 CFlow 相关代码"
)
Task(
subagent_type="智慧库管家", # 启动你的自定义子代理
prompt="扫描智慧库"
)你的智慧库管家确实是子代理
从配置看:
name: 智慧库管家
tools:
file-read: true
file-write: true
bash: true
model: claude-sonnet-4-5这是一个自定义的专门 Agent:
- 它有自己的工具权限(只能用 file-read/write/bash)
- 它有专门的职责(管理决策智慧库)
- 它被我(主对话)调用,完成任务后向我汇报
和内置 Agent 的唯一区别:
- 内置 (Explore/Plan):Claude Code 预装的
- 自定义 (智慧库管家/日报生成):你自己写配置文件定义的
但都是”子代理”!
总结
| 概念 | 解释 |
|---|---|
| 主对话 | 你和我直接聊天的这个窗口 |
| 子代理(subagent) | 被我启动的专门 Agent,工作后向我汇报 |
| 内置子代理 | Explore、Plan、general-purpose 等 |
| 自定义子代理 | 你写的智慧库管家、日报生成助手 |
| 并行 | 我同时启动多个 Agent,但你还是要等完成 |
| 后台运行 | run_in_background=true,不常用 |
你的理解完全正确 - 通常情况下确实要等 Agent 完成才能发新消息!
要不要试试运行智慧库管家?我可以帮你扫描一下决策智慧库的现状。
追加:关于并行运行的进一步确认
用户提问:
也就是说,你所谓的并行运行,是我可以让你同时运行多个Agent是吧?
我举个例子,比如我现在运行的Agent A,那么我只能等它处理完我才能发送新消息是吧?
如果我想并行是不是意味着,我同时让AI处理Agent A 、Agent B 、 Agent C
还是在一次对话中,但是这时候,我就没办法发送新消息了,只能等AI处理完我才可以发送新消息,是这个意思不?
完全正确! 你理解得非常准确!
让我用你的例子确认一下:
场景1:运行单个 Agent
你:"运行 Agent A"
我:[启动 Agent A]
[你的界面被锁定,无法发新消息]
[Agent A 工作中... 假设需要 30 秒]
我:"Agent A 完成了,结果是..."
[你现在才能发下一条消息]
场景2:并行运行多个 Agent
你:"同时运行 Agent A、B、C"
我:[一次性启动 Agent A、B、C]
[你的界面还是被锁定,无法发新消息]
[Agent A、B、C 同时工作中...]
[A 需要 30 秒,B 需要 20 秒,C 需要 25 秒]
[总等待时间约 30 秒(取最长的)]
我:"所有 Agent 都完成了
- Agent A 结果:...
- Agent B 结果:...
- Agent C 结果:..."
[你现在才能发下一条消息]
核心区别
| 方式 | 总耗时 | 你能否发消息 |
|---|---|---|
| 依次运行 A → B → C | 30+20+25 = 75秒 | ❌ 等75秒 |
| 并行运行 A ‖ B ‖ C | max(30,20,25) = 30秒 | ❌ 但只等30秒 |
对你来说:无论哪种方式,界面都是锁定的,你都要等!
并行的好处:节省时间(30秒 vs 75秒),但不能让你提前发消息
唯一例外:后台运行
你:"后台运行 Agent A"
我:[启动 Agent A,设置 run_in_background=true]
我:"Agent A 已在后台运行,我先返回了"
[你立刻可以发新消息!]
[Agent A 在后台慢慢跑...]
你:"做点别的事"
我:[处理你的新请求]
[过一会儿]
你:"Agent A 完成了吗?"
我:[用 TaskOutput 查看] "完成了,结果是..."
但这种用法很少见,通常用于非常耗时的任务(几分钟到几十分钟)。
总结你的理解:100% 正确!
并行 = 多个 Agent 同时干活节省时间,但你还是要等它们都完成才能继续聊天。