Claude Code

子代理

Claude Code 子代理的内置类型、自定义 agents、作用域、frontmatter、权限、模型、MCP、Hooks、上下文隔离和 fork。

Subagent 是 Claude Code 里的专用子代理。它适合处理会产生大量搜索结果、日志、文件内容或中间推理的支线任务:子代理在自己的上下文窗口里工作,最后只把摘要或结果交回主会话。

把子代理理解成“可配置的临时同事”:它有自己的系统提示、工具范围、权限模式、模型选择和上下文,但仍属于当前 Claude Code 会话。

#适合做什么

场景为什么适合子代理
大范围代码探索大量 Grep/Read 输出不会塞进主会话
专项审查用固定 prompt 和只读工具保证审查口径
并行研究多个方向独立查,主会话汇总结果
高风险工具收敛toolsdisallowedToolspermissionMode 限制能力
成本控制给探索型子代理指定更便宜的模型别名

如果任务需要你持续来回确认、每一步都依赖主会话历史,通常放在主会话更自然。如果只是复用提示词或工作流,但想继续使用主会话上下文,优先考虑 Skills

#内置子代理

Claude Code 会在合适时自动使用内置子代理。它们继承主会话权限,但有各自的工具限制。

子代理工具和模型典型用途
Explore只读工具;继承主会话模型,Claude API 上会封顶到 Opus搜索、理解代码库、快速定位文件
Plan只读工具;继承主会话模型plan mode 下先研究再给计划
general-purpose通常可用全部工具;继承主会话模型复杂多步骤任务、需要探索也需要修改
statusline-setupSonnet配置 /statusline 时使用
claude-code-guideHaiku回答 Claude Code 功能问题

ExplorePlan 为了速度和成本,不会加载 CLAUDE.md 和父会话 git status。其他内置子代理和自定义子代理会加载这些上下文。

如果你有必须让 ExplorePlan 知道的规则,例如“不要读 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 写配置,正文写系统提示。

1

选择作用域

项目专用放 .claude/agents/,个人全局放 ~/.claude/agents/

2

写 agent 文件

.claude/agents/code-reviewer.md
---
name: code-reviewer
description: 代码审查专家。写完或修改代码后主动使用,检查质量、安全性和可维护性。
tools: Read, Grep, Glob, Bash
model: sonnet
---

你是资深代码审查员。被调用时先查看相关改动,只做审查和建议,不要编辑文件。
按严重程度输出:必须修复、建议修复、可选优化。每条都给出文件位置、原因和修复方向。
3

显式调用

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 出于安全原因会忽略 hooksmcpServerspermissionMode

临时会话也可以用 --agents 传 JSON:

claude --agents '{
  "safe-reviewer": {
    "description": "只读代码审查。修改代码后使用。",
    "prompt": "你是只读代码审查员,输出问题和建议,不要改文件。",
    "tools": ["Read", "Grep", "Glob"],
    "model": "sonnet"
  }
}'

#Frontmatter 字段

只有 namedescription 必填。正文是子代理的系统提示。

字段作用
name唯一标识,建议小写字母和连字符;Hook 里会作为 agent_type
description告诉 Claude 什么时候应该委托给它;写得越具体越容易自动触发
tools工具 allowlist;省略时继承主会话可用工具
disallowedTools从继承或指定工具里移除某些工具
modelinheritsonnetopushaikufable 或完整模型 ID;默认 inherit
permissionModedefaultacceptEditsautodontAskbypassPermissionsplan
maxTurns限制 agentic turn 数量
skills启动时预加载 Skill 全文
mcpServers只给该子代理连接或引用 MCP server
hooks只在该子代理生命周期内运行的 hooks
memory持久记忆作用域:userprojectlocal
background设为 true 时总是后台运行
effort覆盖当前会话 effort,可用值取决于模型
isolation设为 worktree 时在临时 git worktree 里运行
color面板和 transcript 中的显示颜色
initialPrompt当该 agent 作为主会话 agent 启动时自动提交的第一条 prompt

bypassPermissions 会跳过大部分权限提示,风险很高。子代理仍会受明确 ask 规则、根目录/家目录删除保护等限制,但不要把它当成常规默认值。

#模型选择

子代理模型按这个顺序解析:

  1. CLAUDE_CODE_SUBAGENT_MODEL
  2. 本次调用传入的模型参数
  3. agent frontmatter 的 model
  4. 主会话模型

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 也无效,例如 AskUserQuestionEnterPlanModeScheduleWakeupWaitForMcpServers

#子代理专属 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 覆盖。例外是主会话已处于 bypassPermissionsacceptEditsauto 时,父级模式优先。

模式行为
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 也能监听子代理生命周期:

.claude/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
--agentclaude --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 它。可恢复的子代理保留完整历史、工具结果和推理上下文。ExplorePlan 是一次性内置代理,不会返回可恢复 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 far

Fork 适合“同一上下文下试一个并行方向”,例如让它草拟测试、比较实现方案或继续调查一个分支。它和命名子代理的区别:

对比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