子代理
Claude Code 子代理的内置类型、自定义 agents、作用域、frontmatter、权限、模型、MCP、Hooks、上下文隔离和 fork。
Subagent 是 Claude Code 里的专用子代理。它适合处理会产生大量搜索结果、日志、文件内容或中间推理的支线任务:子代理在自己的上下文窗口里工作,最后只把摘要或结果交回主会话。
把子代理理解成“可配置的临时同事”:它有自己的系统提示、工具范围、权限模式、模型选择和上下文,但仍属于当前 Claude Code 会话。
#适合做什么
| 场景 | 为什么适合子代理 |
|---|---|
| 大范围代码探索 | 大量 Grep/Read 输出不会塞进主会话 |
| 专项审查 | 用固定 prompt 和只读工具保证审查口径 |
| 并行研究 | 多个方向独立查,主会话汇总结果 |
| 高风险工具收敛 | 用 tools、disallowedTools、permissionMode 限制能力 |
| 成本控制 | 给探索型子代理指定更便宜的模型别名 |
如果任务需要你持续来回确认、每一步都依赖主会话历史,通常放在主会话更自然。如果只是复用提示词或工作流,但想继续使用主会话上下文,优先考虑 Skills。
#内置子代理
Claude Code 会在合适时自动使用内置子代理。它们继承主会话权限,但有各自的工具限制。
| 子代理 | 工具和模型 | 典型用途 |
|---|---|---|
Explore | 只读工具;继承主会话模型,Claude API 上会封顶到 Opus | 搜索、理解代码库、快速定位文件 |
Plan | 只读工具;继承主会话模型 | plan mode 下先研究再给计划 |
general-purpose | 通常可用全部工具;继承主会话模型 | 复杂多步骤任务、需要探索也需要修改 |
statusline-setup | Sonnet | 配置 /statusline 时使用 |
claude-code-guide | Haiku | 回答 Claude Code 功能问题 |
Explore 和 Plan 为了速度和成本,不会加载 CLAUDE.md 和父会话 git status。其他内置子代理和自定义子代理会加载这些上下文。
如果你有必须让 Explore 或 Plan 知道的规则,例如“不要读 vendor 目录”,需要在本次委托提示里明确写出来,不要只依赖 CLAUDE.md。
限制内置子代理的常见方式:
| 需求 | 做法 |
|---|---|
| 禁用某个内置子代理 | 在 permissions deny 里加 Agent(Explore) |
| 禁止所有子代理委托 | deny Agent 工具 |
只禁用 Explore / Plan | 设置 CLAUDE_CODE_DISABLE_EXPLORE_PLAN_AGENTS=1 |
| 非交互或 SDK 里移除全部内置类型 | 设置 CLAUDE_AGENT_SDK_DISABLE_BUILTIN_AGENTS=1 |
#创建一个自定义子代理
自定义子代理是一个 Markdown 文件:上方 YAML frontmatter 写配置,正文写系统提示。
选择作用域
项目专用放 .claude/agents/,个人全局放 ~/.claude/agents/。
写 agent 文件
---
name: code-reviewer
description: 代码审查专家。写完或修改代码后主动使用,检查质量、安全性和可维护性。
tools: Read, Grep, Glob, Bash
model: sonnet
---
你是资深代码审查员。被调用时先查看相关改动,只做审查和建议,不要编辑文件。
按严重程度输出:必须修复、建议修复、可选优化。每条都给出文件位置、原因和修复方向。显式调用
Use the code-reviewer subagent to review my recent changes也可以在输入框里用 @ 选择 agent,例如 @"code-reviewer (agent)" 看一下认证模块改动。
Claude Code 会监听 ~/.claude/agents/ 和 .claude/agents/ 的变更。新建或编辑文件后,通常几秒内生效。两个情况需要重启:会话启动时目标 agents 目录还不存在,或启动时用了 --disable-slash-commands。
官方 v2.1.198 起,/agents 不再打开旧的交互式创建向导。现在更推荐让 Claude 生成 agent 文件,或直接编辑 .claude/agents/ / ~/.claude/agents/。
#作用域和优先级
同名子代理同时存在时,Claude Code 按优先级选择一个定义。
| 位置 | 作用域 | 优先级 |
|---|---|---|
| Managed settings | 组织级 | 最高 |
--agents CLI JSON | 当前会话 | 2 |
.claude/agents/ | 当前项目 | 3 |
~/.claude/agents/ | 个人所有项目 | 4 |
插件 agents/ | 启用插件的项目 | 最低 |
补充规则:
.claude/agents/会从当前工作目录向上扫描;嵌套目录里同名时,离当前目录最近的定义优先。.claude/agents/和~/.claude/agents/会递归扫描,但 agent 身份只由 frontmatter 的name决定,不是文件名或子目录。- 同一作用域内不要重复
name;/doctor可报告部分重复定义问题。 - 插件 agent 的子目录会进入作用域名,例如
my-plugin:review:security。 - 插件 agent 出于安全原因会忽略
hooks、mcpServers、permissionMode。
临时会话也可以用 --agents 传 JSON:
claude --agents '{
"safe-reviewer": {
"description": "只读代码审查。修改代码后使用。",
"prompt": "你是只读代码审查员,输出问题和建议,不要改文件。",
"tools": ["Read", "Grep", "Glob"],
"model": "sonnet"
}
}'#Frontmatter 字段
只有 name 和 description 必填。正文是子代理的系统提示。
| 字段 | 作用 |
|---|---|
name | 唯一标识,建议小写字母和连字符;Hook 里会作为 agent_type |
description | 告诉 Claude 什么时候应该委托给它;写得越具体越容易自动触发 |
tools | 工具 allowlist;省略时继承主会话可用工具 |
disallowedTools | 从继承或指定工具里移除某些工具 |
model | inherit、sonnet、opus、haiku、fable 或完整模型 ID;默认 inherit |
permissionMode | default、acceptEdits、auto、dontAsk、bypassPermissions、plan |
maxTurns | 限制 agentic turn 数量 |
skills | 启动时预加载 Skill 全文 |
mcpServers | 只给该子代理连接或引用 MCP server |
hooks | 只在该子代理生命周期内运行的 hooks |
memory | 持久记忆作用域:user、project、local |
background | 设为 true 时总是后台运行 |
effort | 覆盖当前会话 effort,可用值取决于模型 |
isolation | 设为 worktree 时在临时 git worktree 里运行 |
color | 面板和 transcript 中的显示颜色 |
initialPrompt | 当该 agent 作为主会话 agent 启动时自动提交的第一条 prompt |
bypassPermissions 会跳过大部分权限提示,风险很高。子代理仍会受明确 ask 规则、根目录/家目录删除保护等限制,但不要把它当成常规默认值。
#模型选择
子代理模型按这个顺序解析:
CLAUDE_CODE_SUBAGENT_MODEL- 本次调用传入的模型参数
- agent frontmatter 的
model - 主会话模型
model 省略时等同于 inherit。如果组织或 provider 的模型 allowlist 不允许某个值,Claude Code 会跳过该值并回退到继承模型。
接入 Passion8 时,模型别名和完整模型 ID 最终要以 Passion8 控制台可用模型及网关映射为准。子代理不会单独配置 Base URL,仍使用当前 Claude Code 会话的接入配置。
#工具和 MCP 限制
tools 是 allowlist,disallowedTools 是 denylist。两者同时出现时,先移除 denylist,再从剩余工具里解析 allowlist。
---
name: safe-researcher
description: 只读研究代理,用于探索代码和日志。
tools: Read, Grep, Glob, Bash
------
name: local-only
description: 继承所有工具,但禁止 GitHub MCP。
disallowedTools: mcp__github
---MCP 工具可以用精确工具名,也可以用 server 级模式:
| 写法 | 含义 |
|---|---|
mcp__github | 匹配 GitHub server 的全部工具 |
mcp__github__* | 同上,显式通配 |
mcp__* | 匹配所有 MCP 工具,常用于 deny |
某些依赖主 UI 或会话状态的工具不会给子代理使用,即使写进 tools 也无效,例如 AskUserQuestion、EnterPlanMode、ScheduleWakeup、WaitForMcpServers。
#子代理专属 MCP
把 MCP server 写进 mcpServers 可以只让这个子代理看到它,避免主会话上下文塞满工具描述。
---
name: browser-tester
description: 用真实浏览器验证页面。
mcpServers:
- playwright:
type: stdio
command: npx
args: ["-y", "@playwright/mcp@latest"]
- github
---内联 MCP 在子代理启动时连接、结束时断开。字符串引用则复用主会话已经配置的同名 server。企业 MCP 策略、--strict-mcp-config、--bare 等限制仍会生效。
#权限和 Hooks
子代理继承主会话权限上下文,也可以用 permissionMode 覆盖。例外是主会话已处于 bypassPermissions、acceptEdits 或 auto 时,父级模式优先。
| 模式 | 行为 |
|---|---|
default | 标准权限检查和提示 |
acceptEdits | 自动接受工作目录内编辑和常见文件命令 |
auto | 用后台分类器判断命令和受保护目录写入 |
dontAsk | 自动拒绝需要询问的权限请求 |
bypassPermissions | 跳过大部分权限提示 |
plan | 只读计划模式 |
子代理 frontmatter 里可以写只对它生效的 hooks:
---
name: db-reader
description: 只执行只读数据库查询。
tools: Bash
hooks:
PreToolUse:
- matcher: "Bash"
hooks:
- type: command
command: "./scripts/validate-readonly-query.sh"
---项目级 settings.json 也能监听子代理生命周期:
{
"hooks": {
"SubagentStart": [
{
"matcher": "db-reader",
"hooks": [{ "type": "command", "command": "./scripts/setup-db.sh" }]
}
],
"SubagentStop": [
{
"hooks": [{ "type": "command", "command": "./scripts/cleanup-db.sh" }]
}
]
}
}#调用方式
| 方式 | 用法 | 适合 |
|---|---|---|
| 自动委托 | 在 description 写清楚触发条件 | 日常无需指定 |
| 自然语言 | Use the code-reviewer subagent... | 偶尔指定 |
@ mention | @"code-reviewer (agent)" ... | 必须用某个 agent |
--agent | claude --agent code-reviewer | 整个会话都以该 agent 身份运行 |
| settings | { "agent": "code-reviewer" } | 项目默认 agent |
--agents | 启动时传 JSON | 临时实验或自动化 |
--agent 会让主会话本身使用该 agent 的系统提示、工具限制和模型。它不是“启动一个子任务”,而是替换当前会话的默认行为。
#前台、后台和恢复
官方 v2.1.198 起,子代理默认偏向后台运行;当 Claude 需要结果才能继续时会放到前台。
| 模式 | 行为 |
|---|---|
| 前台子代理 | 主会话等待它完成;权限提示即时转给你 |
| 后台子代理 | 你可以继续工作;需要权限时会在主会话弹出并标明是谁在请求 |
你可以明确要求“后台运行”或“前台运行”,也可以用 Ctrl+B 把运行中的任务转到后台。设置 CLAUDE_CODE_DISABLE_BACKGROUND_TASKS=1 可禁用后台任务能力。
每次调用通常会创建新的子代理实例。要继续旧实例,直接让 Claude resume 它。可恢复的子代理保留完整历史、工具结果和推理上下文。Explore 和 Plan 是一次性内置代理,不会返回可恢复 agent ID;需要继续上下文时用 general-purpose 或自定义 agent。
子代理 transcript 独立保存于主会话之外。主会话 compact 不会清掉它们;清理周期由 cleanupPeriodDays 控制,默认 30 天。
#上下文边界
非 fork 子代理启动时是新的独立上下文,不会看到主会话的完整聊天历史、已经读过的文件或已经调用过的 Skills。它通常会收到:
- 自己的系统提示和 Claude Code 附加的基础环境信息
- Claude 写给它的任务说明
CLAUDE.md和 memory 层级,但Explore/Plan例外- 会话开始时的 git status,但
Explore/Plan例外 skills字段预加载的 Skill 全文
需要完整继承主会话上下文时,用 fork。
#Fork 当前会话
/fork 会创建一种特殊子代理:它继承当前会话完整上下文、系统提示、工具、模型和历史,但它的工具调用仍留在子代理 transcript 里,最终只把结果回传。
/fork draft tests for the parser changes so farFork 适合“同一上下文下试一个并行方向”,例如让它草拟测试、比较实现方案或继续调查一个分支。它和命名子代理的区别:
| 对比 | Fork | 命名子代理 |
|---|---|---|
| 上下文 | 继承完整主会话 | 新上下文,只拿到任务说明 |
| 系统提示和工具 | 与主会话一致 | 来自 agent 定义 |
| 模型 | 与主会话一致 | 来自 model 字段或继承 |
| Prompt cache | 可复用主会话前缀 | 单独缓存 |
CLAUDE_CODE_FORK_SUBAGENT=1 可显式启用 fork 模式,设为 0 可禁用。Fork 不能再 spawn 另一个 fork。
#最佳实践
| 做法 | 原因 |
|---|---|
| 让每个 agent 专注一类任务 | description 更容易匹配,输出也更稳定 |
| 审查型 agent 默认只读 | 避免“审查”过程中顺手修改 |
| 项目 agent 提交到版本库 | 团队共享同一套审查和实现规则 |
| 长日志、测试、搜索交给子代理 | 主会话上下文更干净 |
| 高风险能力用 hooks 再兜底 | tools 只能限制工具,hook 能检查具体命令 |
| 要并行修改时配合 worktree | 避免多个 agent 改同一工作区互相覆盖 |
#官方参考
Support / 支持
Need help? / 需要帮助?
接入、计费与模型异常可邮件联系;服务可用性以状态页为准。
For setup, billing, or model issues, email us. Check the status page for uptime.
也可使用右下角微信 / QQ 客服 · WeChat / QQ support is available at the bottom right

