子代理是处理特定类型任务的专业 AI 助手。每个子代理都在其自己的上下文窗口中运行,拥有自定义的系统提示词、特定的工具访问权限和独立的权限设置。当 Claude 遇到符合子代理描述的任务时,它会委派给该子代理,子代理将独立工作并返回结果。
如果您需要多个代理并行工作并相互通信,请参阅代理团队。子代理在单个会话内工作;代理团队则跨多个会话协调。
子代理可以帮助您:
- 保持上下文清晰:将探索和实施工作留在主会话之外
- 强制执行约束:通过限制子代理可使用的工具来确保合规
- 重用配置:通过用户级子代理在不同项目中共享配置
- 专业化行为:针对特定领域使用专注的系统提示词
- 控制成本:将任务路由到速度更快、成本更低的模型(如 Haiku)
Claude 使用每个子代理的描述来决定何时委派任务。创建子代理时,请编写清晰的描述,以便 Claude 知道何时使用它。 Claude Code 包含几个内置子代理,如 Explore(探索)、Plan(计划)和 general-purpose(通用)。您也可以创建自定义子代理来处理特定任务。本页涵盖了内置子代理、如何创建自己的子代理、完整配置选项、使用子代理的模式以及子代理示例。内置子代理
Claude Code 包含内置子代理,Claude 会在适当的时候自动使用它们。每个子代理继承父会话的权限,并具有额外的工具限制。
Explore(探索)
Plan(计划)
General-purpose(通用)
其他
一个快速、只读的代理,针对代码库搜索和分析进行了优化。
- 模型:Haiku(速度快、延迟低)
- 工具:只读工具(拒绝访问写入和编辑工具)
- 用途:文件发现、代码搜索、代码库探索
当 Claude 需要搜索或理解代码库而不进行更改时,会委派给 Explore。这使得探索结果不会占用您的主会话上下文。调用 Explore 时,Claude 会指定彻底程度:quick(快速)用于目标查找,medium(中等)用于平衡探索,或 very thorough(非常彻底)用于全面分析。 一种研究型代理,在计划模式 (plan mode)下使用,用于在提交计划前收集上下文。
- 模型:继承自主会话
- 工具:只读工具(拒绝访问写入和编辑工具)
- 用途:用于规划的代码库研究
当您处于计划模式且 Claude 需要了解代码库时,它会委派研究任务给 Plan 子代理。这防止了无限嵌套(子代理不能生成其他子代理),同时又能收集必要的上下文。 一个能够处理复杂、多步骤任务的代理,这些任务既需要探索也需要采取行动。
- 模型:继承自主会话
- 工具:所有工具
- 用途:复杂研究、多步骤操作、代码修改
当任务既涉及探索又涉及修改、需要复杂推理来解释结果,或包含多个依赖步骤时,Claude 会委派给通用代理。 Claude Code 包含其他用于特定任务的辅助代理。它们通常是自动调用的,因此您无需直接使用它们。| 代理 | 模型 | Claude 使用场景 |
|---|
| Bash | 继承 | 在独立上下文中运行终端命令 |
| statusline-setup | Sonnet | 当您运行 /statusline 配置状态栏时 |
| Claude Code Guide | Haiku | 当您询问有关 Claude Code 功能的问题时 |
除了这些内置子代理,您还可以通过自定义提示词、工具限制、权限模式、钩子和技能来创建自己的子代理。以下各节将展示如何开始并自定义子代理。
快速入门:创建您的第一个子代理
子代理在带有 YAML frontmatter 的 Markdown 文件中定义。您可以手动创建它们,或使用 /agents 命令。 此演练将指导您使用 /agents 命令创建用户级子代理。该子代理负责审查代码并提出改进建议。选择位置
选择 Create new agent(创建新代理),然后选择 Personal(个人)。这会将子代理保存到 ~/.claude/agents/,从而使其在您的所有项目中可用。
使用 Claude 生成
选择 Generate with Claude(使用 Claude 生成)。在提示时,描述该子代理。A code improvement agent that scans files and suggests improvements
for readability, performance, and best practices. It should explain
each issue, show the current code, and provide an improved version.
Claude 会为您生成标识符、描述和系统提示词。 选择工具
对于只读审查员,取消选择所有内容,仅保留 Read-only tools(只读工具)。如果保留所有工具,子代理将继承主会话的所有工具。
选择模型
选择子代理使用的模型。对于此示例代理,选择 Sonnet,它在分析代码模式时平衡了能力与速度。
选择颜色
选择子代理的背景颜色。这有助于您在 UI 中识别哪个子代理正在运行。
配置内存
选择 User scope(用户作用域),为子代理提供一个持久内存目录,路径为 ~/.claude/agent-memory/。子代理使用它来积累跨会话的见解,如代码库模式和反复出现的问题。如果您不希望子代理持久化学习成果,请选择 None。 保存并尝试
审查配置摘要。按 s 或 Enter 保存,或按 e 保存并在编辑器中打开文件。子代理可立即使用。尝试一下。Use the code-improver agent to suggest improvements in this project
Claude 委派给您的新子代理,它会扫描代码库并返回改进建议。
现在您拥有了一个可以在机器上任何项目中使用的子代理,用于分析代码库并提出建议。 您也可以手动创建 Markdown 格式的子代理文件、通过 CLI 标志定义它们,或通过插件分发它们。以下各节涵盖了所有配置选项。
使用 /agents 命令
/agents 命令提供了一个用于管理子代理的交互式界面。运行 /agents 可以:
- 查看所有可用子代理(内置、用户、项目和插件)
- 通过引导式设置或 Claude 生成创建新子代理
- 编辑现有子代理的配置和工具访问权限
- 删除自定义子代理
- 查看在存在重复时哪些子代理处于活动状态
这是创建和管理子代理的推荐方式。对于手动创建或自动化,您也可以直接添加子代理文件。 要从命令行列出所有已配置的子代理而不启动交互式会话,请运行 claude agents。这将显示按来源分组的代理,并指明哪些被更高优先级的定义覆盖。选择子代理作用域
子代理是带有 YAML frontmatter 的 Markdown 文件。根据作用域存储在不同位置。当多个子代理同名时,高优先级位置生效。
| 位置 | 作用域 | 优先级 | 如何创建 |
|---|
--agents CLI 标志 | 当前会话 | 1(最高) | 启动 Claude Code 时传入 JSON |
.claude/agents/ | 当前项目 | 2 | 交互式或手动 |
~/.claude/agents/ | 您的所有项目 | 3 | 交互式或手动 |
插件的 agents/ 目录 | 插件启用位置 | 4(最低) | 通过插件安装 |
项目子代理 (.claude/agents/) 非常适合特定于代码库的子代理。将其纳入版本控制,以便您的团队能够协作使用和改进它们。 用户子代理 (~/.claude/agents/) 是适用于您所有项目的个人子代理。 CLI 定义的子代理 在启动 Claude Code 时以 JSON 形式传入。它们仅在该会话期间存在且不会保存到磁盘,非常适合快速测试或自动化脚本。您可以在一个 --agents 调用中定义多个子代理:claude --agents '{
"code-reviewer": {
"description": "Expert code reviewer. Use proactively after code changes.",
"prompt": "You are a senior code reviewer. Focus on code quality, security, and best practices.",
"tools": ["Read", "Grep", "Glob", "Bash"],
"model": "sonnet"
},
"debugger": {
"description": "Debugging specialist for errors and test failures.",
"prompt": "You are an expert debugger. Analyze errors, identify root causes, and provide fixes."
}
}'
--agents 标志接受与基于文件的子代理具有相同 frontmatter 字段的 JSON:description、prompt、tools、disallowedTools、model、permissionMode、mcpServers、hooks、maxTurns、skills、memory、effort、background 和 isolation。使用 prompt 作为系统提示词,等同于基于文件的子代理中的 markdown 正文。 插件子代理 来自您安装的插件。它们与您的自定义子代理一起出现在 /agents 中。有关创建插件子代理的详细信息,请参阅插件组件参考。出于安全考虑,插件子代理不支持 hooks、mcpServers 或 permissionMode frontmatter 字段。从插件加载代理时,这些字段会被忽略。如果需要它们,请将代理文件复制到 .claude/agents/ 或 ~/.claude/agents/ 中。您也可以在 settings.json 或 settings.local.json 中添加规则到 permissions.allow,但这些规则适用于整个会话,而不仅仅是插件子代理。
编写子代理文件
子代理文件使用 YAML frontmatter 进行配置,后跟 Markdown 格式的系统提示词。
子代理在会话启动时加载。如果您通过手动添加文件来创建子代理,请重启会话或使用 /agents 立即加载它。
---
name: code-reviewer
description: Reviews code for quality and best practices
tools: Read, Glob, Grep
model: sonnet
---
You are a code reviewer. When invoked, analyze the code and provide
specific, actionable feedback on quality, security, and best practices.
frontmatter 定义了子代理的元数据和配置。正文则作为引导子代理行为的系统提示词。子代理仅接收此系统提示词(加上基本环境详情如工作目录),而不接收完整的 Claude Code 系统提示词。
支持的 frontmatter 字段
YAML frontmatter 中可以使用以下字段。只有 name 和 description 是必需的。
| 字段 | 必需 | 描述 |
|---|
name | 有 | 使用小写字母和连字符的唯一标识符 |
description | 有 | Claude 何时应委派给此子代理 |
tools | 没有 | 子代理可使用的工具。如果省略,则继承所有工具 |
disallowedTools | 没有 | 要拒绝的工具,从继承或指定的列表中移除 |
model | 没有 | 要使用的模型:sonnet、opus、haiku,完整模型 ID(例如 claude-opus-4-6),或 inherit。默认为 inherit |
permissionMode | 没有 | 权限模式:default、acceptEdits、dontAsk、bypassPermissions 或 plan |
maxTurns | 没有 | 子代理停止前的最大代理轮次 |
skills | 没有 | 在启动时加载到子代理上下文中的技能。注入的是完整的技能内容,而不仅仅是使其可被调用。子代理不会从父会话继承技能 |
mcpServers | 没有 | 此子代理可用的 MCP 服务器。每个条目要么是引用已配置服务器的服务器名称(例如 "slack"),要么是以服务器名称为键、完整 MCP 服务器配置为值的内联定义 |
hooks | 没有 | 针对此子代理的生命周期钩子 |
memory | 没有 | 持久内存作用域:user、project 或 local。启用跨会话学习 |
background | 没有 | 设置为 true 以始终作为后台任务运行此子代理。默认:false |
effort | 没有 | 此子代理处于活动状态时的努力程度。覆盖会话努力程度。默认:继承自会话。选项:low, medium, high, max (仅 Opus 4.6) |
isolation | 没有 | 设置为 worktree 以在临时 git worktree 中运行子代理,为其提供存储库的隔离副本。如果子代理未进行任何更改,worktree 会自动清理 |
选择模型
model 字段控制子代理使用的 AI 模型
- 模型别名:使用可用的别名之一:
sonnet、opus 或 haiku
- 完整模型 ID:使用完整的模型 ID,例如
claude-opus-4-6 或 claude-sonnet-4-6。接受与 --model 标志相同的值
- inherit:使用与主会话相同的模型
- 省略:如果未指定,则默认为
inherit(使用与主会话相同的模型)
控制子代理能力
您可以通过工具访问、权限模式和条件规则来控制子代理的操作。
子代理可以使用 Claude Code 的任何内部工具。默认情况下,子代理从主会话继承所有工具,包括 MCP 工具。 要限制工具,请使用 tools 字段(允许列表)或 disallowedTools 字段(拒绝列表)。此示例使用 tools 仅允许 Read、Grep、Glob 和 Bash。子代理不能编辑文件、写入文件或使用任何 MCP 工具:---
name: safe-researcher
description: Research agent with restricted capabilities
tools: Read, Grep, Glob, Bash
---
此示例使用 disallowedTools 继承主会话的所有工具,除了 Write 和 Edit。子代理保留 Bash、MCP 工具和所有其他内容
---
name: no-writes
description: Inherits every tool except file writes
disallowedTools: Write, Edit
---
如果两者都设置,则先应用 disallowedTools,然后根据剩余部分解析 tools。同时列出的工具会被移除。
限制可生成的子代理
当代理作为主线程通过 claude --agent 运行时,它可以利用 Agent 工具生成子代理。要限制它可以生成的子代理类型,请在 tools 字段中使用 Agent(agent_type) 语法。
在 2.1.63 版本中,Task 工具重命名为 Agent。设置和代理定义中现有的 Task(...) 引用仍可作为别名使用。
---
name: coordinator
description: Coordinates work across specialized agents
tools: Agent(worker, researcher), Read, Bash
---
这是一个允许列表:仅允许生成 worker 和 researcher 子代理。如果代理尝试生成任何其他类型,请求将失败,且代理在其提示词中只能看到允许的类型。要阻止特定代理同时允许所有其他代理,请改用 permissions.deny。 要允许生成任何子代理而不受限制,请使用不带括号的 Agent:
如果 Agent 从 tools 列表中完全省略,则该代理不能生成任何子代理。此限制仅适用于作为主线程通过 claude --agent 运行的代理。子代理不能生成其他子代理,因此 Agent(agent_type) 在子代理定义中无效。
为子代理限定 MCP 服务器
使用 mcpServers 字段为子代理提供对主会话中不可用的 MCP 服务器的访问权限。在此处定义的内联服务器在子代理启动时连接,在完成后断开。字符串引用则共享父会话的连接。 列表中的每个条目要么是内联服务器定义,要么是引用您会话中已配置的 MCP 服务器的字符串:---
name: browser-tester
description: Tests features in a real browser using Playwright
mcpServers:
# Inline definition: scoped to this subagent only
- playwright:
type: stdio
command: npx
args: ["-y", "@playwright/mcp@latest"]
# Reference by name: reuses an already-configured server
- github
---
Use the Playwright tools to navigate, screenshot, and interact with pages.
内联定义使用与 .mcp.json 服务器条目 (stdio, http, sse, ws) 相同的架构,并以服务器名称作为键。 为了完全使 MCP 服务器远离主会话,避免其工具描述占用那里的上下文,请在此处内联定义它,而不是在 .mcp.json 中。子代理获得这些工具,而父会话则没有。权限模式
permissionMode 字段控制子代理如何处理权限提示。子代理继承父会话的权限上下文,但可以覆盖该模式。
| 模式 | 行为 |
|---|
default | 带有提示的标准权限检查 |
acceptEdits | 自动接受文件编辑 |
dontAsk | 自动拒绝权限提示(显式允许的工具仍可工作) |
bypassPermissions | 跳过权限提示 |
plan | 计划模式(只读探索) |
请谨慎使用 bypassPermissions。它会跳过权限提示,允许子代理执行操作而无需批准。对 .git, .claude, .vscode 和 .idea 目录的写入仍需确认,.claude/commands, .claude/agents 和 .claude/skills 除外。详情请参阅权限模式。
如果父会话使用了 bypassPermissions,这将优先且不可被覆盖。
预加载技能到子代理
使用 skills 字段在启动时将技能内容注入子代理上下文。这为子代理提供了领域知识,而无需它在执行期间发现和加载技能。
---
name: api-developer
description: Implement API endpoints following team conventions
skills:
- api-conventions
- error-handling-patterns
---
Implement API endpoints. Follow the conventions and patterns from the preloaded skills.
每个技能的完整内容都被注入到子代理的上下文中,而不仅仅是可供调用。子代理不会从父会话继承技能;您必须显式列出它们。
这是在子代理中运行技能的反向操作。在子代理的 skills 字段中,子代理控制系统提示词并加载技能内容。在技能中设置 context: fork 时,技能内容被注入到您指定的代理中。两者使用相同的底层系统。
启用持久化内存
memory 字段为子代理提供一个在会话间持久存在的目录。子代理使用此目录随着时间积累知识,例如代码库模式、调试见解和架构决策。
---
name: code-reviewer
description: Reviews code for quality and best practices
memory: user
---
You are a code reviewer. As you review code, update your agent memory with
patterns, conventions, and recurring issues you discover.
根据内存应用的广泛程度选择作用域
| 作用域 | 位置 | 适用场景 |
|---|
user | ~/.claude/agent-memory/<name-of-agent>/ | 子代理应记住跨所有项目的学习内容 |
project | .claude/agent-memory/<name-of-agent>/ | 子代理的知识是特定于项目的,并可通过版本控制共享 |
local | .claude/agent-memory-local/<name-of-agent>/ | 子代理的知识是特定于项目的,但不应纳入版本控制 |
启用内存后:
- 子代理的系统提示词包含读取和写入内存目录的说明。
- 子代理的系统提示词还包含内存目录中
MEMORY.md 的前 200 行,并附带说明:如果 MEMORY.md 超过 200 行,则对其进行整理。
- Read、Write 和 Edit 工具会自动启用,以便子代理可以管理其内存文件。
持久内存提示:
-
project 是推荐的默认作用域。它使子代理的知识可通过版本控制共享。当子代理的知识在多个项目中广泛适用时使用 user,或者当知识不应被纳入版本控制时使用 local。
-
在开始工作前要求子代理咨询其内存:“审查此 PR,并检查您的内存中是否有以前见过的模式。”
-
任务完成后要求子代理更新其内存:“现在您完成了,请将学到的内容保存到您的内存中。” 随着时间推移,这会构建一个使子代理更有效的知识库。
-
将内存指令直接包含在子代理的 markdown 文件中,以便它主动维护自己的知识库。
Update your agent memory as you discover codepaths, patterns, library
locations, and key architectural decisions. This builds up institutional
knowledge across conversations. Write concise notes about what you found
and where.
使用钩子实现条件规则
对于更动态的工具使用控制,使用 PreToolUse 钩子在操作执行前进行验证。当您需要允许工具的某些操作同时阻止其他操作时,这非常有用。 此示例创建了一个仅允许只读数据库查询的子代理。PreToolUse 钩子在每个 Bash 命令执行前运行 command 中指定的脚本:---
name: db-reader
description: Execute read-only database queries
tools: Bash
hooks:
PreToolUse:
- matcher: "Bash"
hooks:
- type: command
command: "./scripts/validate-readonly-query.sh"
---
Claude Code 通过 stdin 以 JSON 格式传递钩子输入给钩子命令。验证脚本读取此 JSON,提取 Bash 命令,并以代码 2 退出以阻止写入操作。
#!/bin/bash
# ./scripts/validate-readonly-query.sh
INPUT=$(cat)
COMMAND=$(echo "$INPUT" | jq -r '.tool_input.command // empty')
# Block SQL write operations (case-insensitive)
if echo "$COMMAND" | grep -iE '\b(INSERT|UPDATE|DELETE|DROP|CREATE|ALTER|TRUNCATE)\b' > /dev/null; then
echo "Blocked: Only SELECT queries are allowed" >&2
exit 2
fi
exit 0
参阅 钩子输入 以获取完整输入架构,参阅 退出代码 了解退出代码如何影响行为。
禁用特定子代理
您可以防止 Claude 使用特定的子代理,方法是将它们添加到您的设置中的 deny 数组。使用 Agent(subagent-name) 格式,其中 subagent-name 匹配子代理的名称字段。
{
"permissions": {
"deny": ["Agent(Explore)", "Agent(my-custom-agent)"]
}
}
这适用于内置和自定义子代理。您也可以使用 --disallowedTools CLI 标志。
claude --disallowedTools "Agent(Explore)"
有关权限规则的更多详情,请参阅 权限文档。
为子代理定义钩子
子代理可以定义在子代理生命周期内运行的钩子。有两种配置钩子的方法:
- 在子代理的 frontmatter 中:定义仅在该子代理活动时运行的钩子
- 在
settings.json 中:定义当子代理启动或停止时在主会话中运行的钩子
子代理 frontmatter 中的钩子
直接在子代理的 markdown 文件中定义钩子。这些钩子仅在该特定子代理活动时运行,并在其完成时清理。 支持所有 钩子事件。子代理最常见的事件是:| 事件 | 匹配器输入 | 触发时间 |
|---|
PreToolUse | 工具名称 | 子代理使用工具前 |
PostToolUse | 工具名称 | 子代理使用工具后 |
Stop | (无) | 子代理完成时(运行时转换为 SubagentStop) |
此示例使用 PreToolUse 钩子验证 Bash 命令,并使用 PostToolUse 在文件编辑后运行 linter。
---
name: code-reviewer
description: Review code changes with automatic linting
hooks:
PreToolUse:
- matcher: "Bash"
hooks:
- type: command
command: "./scripts/validate-command.sh $TOOL_INPUT"
PostToolUse:
- matcher: "Edit|Write"
hooks:
- type: command
command: "./scripts/run-linter.sh"
---
frontmatter 中的 Stop 钩子会自动转换为 SubagentStop 事件。
针对子代理事件的项目级钩子
在 settings.json 中配置钩子,以响应主会话中的子代理生命周期事件。
| 事件 | 匹配器输入 | 触发时间 |
|---|
SubagentStart | 代理类型名称 | 子代理开始执行时 |
SubagentStop | 代理类型名称 | 子代理完成时 |
两个事件都支持通过名称针对特定代理类型的匹配器。此示例仅在 db-agent 子代理启动时运行设置脚本,并在任何子代理停止时运行清理脚本。
{
"hooks": {
"SubagentStart": [
{
"matcher": "db-agent",
"hooks": [
{ "type": "command", "command": "./scripts/setup-db-connection.sh" }
]
}
],
"SubagentStop": [
{
"hooks": [
{ "type": "command", "command": "./scripts/cleanup-db-connection.sh" }
]
}
]
}
}
有关完整的钩子配置格式,请参阅 Hooks(钩子)。
使用子代理
理解自动委派
Claude 会根据请求中的任务描述、子代理配置中的 description 字段以及当前上下文自动委派任务。为了鼓励主动委派,请在您的子代理描述字段中包含“主动使用”之类的短语。
显式调用子代理
当自动委派不够时,您可以自行请求使用子代理。以下三种模式可实现从一次性建议到会话级默认的升级:
- 自然语言:在提示词中命名子代理;Claude 决定是否委派
- @-mention:保证子代理为单个任务运行
- 会话级:整个会话使用该子代理的系统提示词、工具限制和模型,通过
--agent 标志或 agent 设置
对于自然语言,没有特殊语法。命名子代理,Claude 通常就会委派。
Use the test-runner subagent to fix failing tests
Have the code-reviewer subagent look at my recent changes
@-mention 子代理。 输入 @ 并从提示列表中选择子代理,就像 @-mention 文件一样。这可确保运行特定的子代理,而不是将选择权留给 Claude。
@"code-reviewer (agent)" look at the auth changes
您的完整消息仍会发送给 Claude,Claude 会根据您的要求编写子代理的任务提示词。@-mention 控制 Claude 调用哪个子代理,而不是它接收什么提示词。 已启用的插件提供的子代理会以 <plugin-name>:<agent-name> 的形式出现在提示列表中。您也可以在不使用选择器的情况下手动输入:对于本地子代理使用 @agent-<name>,或对于插件子代理使用 @agent-<plugin-name>:<agent-name>。 将整个会话作为子代理运行。 传入 --agent <name> 以启动一个会话,主线程本身将采用该子代理的系统提示词、工具限制和模型:claude --agent code-reviewer
子代理的系统提示词会完全替换默认的 Claude Code 系统提示词,方式与 --system-prompt 相同。CLAUDE.md 文件和项目内存仍通过正常的消息流加载。启动标题中会出现代理名称 @<name>,以便您确认它处于活动状态。 这适用于内置和自定义子代理,并且在您恢复会话时选择将保持不变。 对于插件提供的子代理,传入作用域名称:claude --agent <plugin-name>:<agent-name>。 要使其成为项目中每个会话的默认设置,请在 .claude/settings.json 中设置 agent:{
"agent": "code-reviewer"
}
如果两者同时存在,CLI 标志会覆盖该设置。
在前台或后台运行子代理
子代理可以在前台(阻塞)或后台(并发)运行。
- 前台子代理:在完成前阻塞主会话。权限提示和澄清问题(如
AskUserQuestion)会传递给您。
- 后台子代理:在您继续工作时并发运行。启动前,Claude Code 会提示子代理所需的任何工具权限,确保其提前获得必要的批准。一旦运行,子代理将继承这些权限,并自动拒绝任何未预先批准的操作。如果后台子代理需要询问澄清问题,该工具调用将失败,但子代理会继续运行。
如果后台子代理因缺少权限而失败,您可以启动一个新的前台子代理执行相同任务,通过交互式提示进行重试。 Claude 会根据任务决定是在前台还是后台运行子代理。您也可以:
- 要求 Claude “在后台运行此任务”
- 按 Ctrl+B 将运行中的任务置于后台
要禁用所有后台任务功能,请将 CLAUDE_CODE_DISABLE_BACKGROUND_TASKS 环境变量设置为 1。参见环境变量。
常见模式
隔离高频操作
子代理最有效的用途之一是隔离产生大量输出的操作。运行测试、获取文档或处理日志文件会消耗大量上下文。通过将这些任务委派给子代理,冗长的输出保留在子代理的上下文中,只有相关的摘要返回到您的主会话。
Use a subagent to run the test suite and report only the failing tests with their error messages
并行运行研究
对于独立调查,生成多个子代理以同时工作。
Research the authentication, database, and API modules in parallel using separate subagents
每个子代理独立探索其领域,然后 Claude 合成这些发现。当研究路径不相互依赖时,这种方式效果最好。
当子代理完成时,其结果将返回到您的主会话。运行大量每个都返回详细结果的子代理会消耗大量上下文。
对于需要持续并行性或超出上下文窗口的任务,代理团队为每个工作者提供其独立的上下文。
链式调用子代理
对于多步骤工作流,要求 Claude 依次使用子代理。每个子代理完成任务后将结果返回给 Claude,Claude 再将相关上下文传递给下一个子代理。
Use the code-reviewer subagent to find performance issues, then use the optimizer subagent to fix them
在子代理和主会话间选择
在以下情况使用 主会话:
- 任务需要频繁的往返交互或迭代优化
- 多个阶段共享大量上下文(规划 → 实施 → 测试)
- 您正在进行快速、有针对性的更改
- 延迟很重要。子代理需要重新开始并可能需要时间来收集上下文
在以下情况使用 子代理:
- 任务产生您不需要在主上下文中查看的冗长输出
- 您想要强制执行特定的工具限制或权限
- 工作是自包含的并且可以返回摘要
当您想要在主会话上下文中运行而不是在隔离的子代理上下文中运行可重用的提示词或工作流时,请考虑使用 技能。 对于关于会话中现有内容的问题,使用 /btw 而不是子代理。它可以看到您的完整上下文但没有工具访问权限,且回答会被丢弃而不是添加到历史记录中。子代理不能生成其他子代理。如果您的工作流需要嵌套委派,请使用 技能 或从主会话中 链式调用子代理。
管理子代理上下文
恢复子代理
每个子代理调用都会创建一个具有全新上下文的新实例。要继续现有子代理的工作而不是重新开始,请要求 Claude 恢复它。 恢复的子代理保留其完整的会话历史,包括所有先前的工具调用、结果和推理。子代理会在停止的地方继续,而不是重新开始。 当子代理完成时,Claude 会收到其代理 ID。Claude 使用 SendMessage 工具并将代理的 ID 作为 to 字段来恢复它。要恢复子代理,要求 Claude 继续之前的工作:Use the code-reviewer subagent to review the authentication module
[Agent completes]
Continue that code review and now analyze the authorization logic
[Claude resumes the subagent with full context from previous conversation]
如果已停止的子代理收到 SendMessage,它会在后台自动恢复,而无需新的 Agent 调用。 如果您想明确引用该代理,也可以向 Claude 询问代理 ID,或在 ~/.claude/projects/{project}/{sessionId}/subagents/ 的脚本文件中查找 ID。每个脚本都存储为 agent-{agentId}.jsonl。 子代理脚本独立于主会话持续存在:
- 主会话压缩:当主会话压缩时,子代理脚本不受影响。它们存储在单独的文件中。
- 会话持久性:子代理脚本在其会话内持续存在。您可以通过恢复同一会话,在重启 Claude Code 后 恢复子代理。
- 自动清理:脚本根据
cleanupPeriodDays 设置进行清理(默认:30 天)。
自动压缩
子代理使用与主会话相同的逻辑支持自动压缩。默认情况下,自动压缩在大约 95% 容量时触发。要更早触发压缩,将 CLAUDE_AUTOCOMPACT_PCT_OVERRIDE 设置为较低百分比(例如 50)。详情请参阅环境变量。 压缩事件记录在子代理脚本文件中:{
"type": "system",
"subtype": "compact_boundary",
"compactMetadata": {
"trigger": "auto",
"preTokens": 167189
}
}
preTokens 值显示了压缩发生前使用了多少 token。
子代理示例
这些示例演示了构建子代理的有效模式。将它们作为起点,或使用 Claude 生成自定义版本。
最佳实践
- 设计专注的子代理: 每个子代理应擅长一个特定任务
- 编写详细的描述: Claude 使用描述来决定何时委派
- 限制工具访问: 仅授予必要的权限以确保安全和专注
- 纳入版本控制: 与您的团队共享项目子代理
代码审查员
只读子代理,审查代码而不修改它。此示例展示了如何设计一个具有有限工具访问权限(无 Edit 或 Write)且带有详细提示词(指定查找内容及输出格式)的专注子代理。
---
name: code-reviewer
description: Expert code review specialist. Proactively reviews code for quality, security, and maintainability. Use immediately after writing or modifying code.
tools: Read, Grep, Glob, Bash
model: inherit
---
You are a senior code reviewer ensuring high standards of code quality and security.
When invoked:
1. Run git diff to see recent changes
2. Focus on modified files
3. Begin review immediately
Review checklist:
- Code is clear and readable
- Functions and variables are well-named
- No duplicated code
- Proper error handling
- No exposed secrets or API keys
- Input validation implemented
- Good test coverage
- Performance considerations addressed
Provide feedback organized by priority:
- Critical issues (must fix)
- Warnings (should fix)
- Suggestions (consider improving)
Include specific examples of how to fix issues.
调试器
既能分析又能修复问题的子代理。与代码审查员不同,此子代理包含 Edit,因为修复错误需要修改代码。提示词提供了从诊断到验证的明确工作流。
---
name: debugger
description: Debugging specialist for errors, test failures, and unexpected behavior. Use proactively when encountering any issues.
tools: Read, Edit, Bash, Grep, Glob
---
You are an expert debugger specializing in root cause analysis.
When invoked:
1. Capture error message and stack trace
2. Identify reproduction steps
3. Isolate the failure location
4. Implement minimal fix
5. Verify solution works
Debugging process:
- Analyze error messages and logs
- Check recent code changes
- Form and test hypotheses
- Add strategic debug logging
- Inspect variable states
For each issue, provide:
- Root cause explanation
- Evidence supporting the diagnosis
- Specific code fix
- Testing approach
- Prevention recommendations
Focus on fixing the underlying issue, not the symptoms.
数据科学家
用于数据分析工作的领域特定子代理。此示例展示了如何为典型编码任务之外的特定工作流创建子代理。它显式设置 model: sonnet 以获得更强大的分析能力。
---
name: data-scientist
description: Data analysis expert for SQL queries, BigQuery operations, and data insights. Use proactively for data analysis tasks and queries.
tools: Bash, Read, Write
model: sonnet
---
You are a data scientist specializing in SQL and BigQuery analysis.
When invoked:
1. Understand the data analysis requirement
2. Write efficient SQL queries
3. Use BigQuery command line tools (bq) when appropriate
4. Analyze and summarize results
5. Present findings clearly
Key practices:
- Write optimized SQL queries with proper filters
- Use appropriate aggregations and joins
- Include comments explaining complex logic
- Format results for readability
- Provide data-driven recommendations
For each analysis:
- Explain the query approach
- Document any assumptions
- Highlight key findings
- Suggest next steps based on data
Always ensure queries are efficient and cost-effective.
数据库查询验证器
允许 Bash 访问但验证命令以仅允许只读 SQL 查询的子代理。此示例展示了在需要比 tools 字段提供的更精细控制时,如何使用 PreToolUse 钩子进行条件验证。
---
name: db-reader
description: Execute read-only database queries. Use when analyzing data or generating reports.
tools: Bash
hooks:
PreToolUse:
- matcher: "Bash"
hooks:
- type: command
command: "./scripts/validate-readonly-query.sh"
---
You are a database analyst with read-only access. Execute SELECT queries to answer questions about the data.
When asked to analyze data:
1. Identify which tables contain the relevant data
2. Write efficient SELECT queries with appropriate filters
3. Present results clearly with context
You cannot modify data. If asked to INSERT, UPDATE, DELETE, or modify schema, explain that you only have read access.
Claude Code 通过 stdin 以 JSON 格式传递钩子输入给钩子命令。验证脚本读取此 JSON,提取正在执行的命令,并将其与 SQL 写入操作列表进行核对。如果检测到写入操作,脚本以代码 2 退出以阻止执行,并通过 stderr 向 Claude 返回错误消息。 在您的项目中任何位置创建验证脚本。路径必须与您的钩子配置中的 command 字段匹配:#!/bin/bash
# Blocks SQL write operations, allows SELECT queries
# Read JSON input from stdin
INPUT=$(cat)
# Extract the command field from tool_input using jq
COMMAND=$(echo "$INPUT" | jq -r '.tool_input.command // empty')
if [ -z "$COMMAND" ]; then
exit 0
fi
# Block write operations (case-insensitive)
if echo "$COMMAND" | grep -iE '\b(INSERT|UPDATE|DELETE|DROP|CREATE|ALTER|TRUNCATE|REPLACE|MERGE)\b' > /dev/null; then
echo "Blocked: Write operations not allowed. Use SELECT queries only." >&2
exit 2
fi
exit 0
使脚本可执行
chmod +x ./scripts/validate-readonly-query.sh
该钩子接收 stdin 中的 JSON,Bash 命令位于 tool_input.command 中。退出代码 2 阻止该操作并将错误消息反馈给 Claude。关于退出代码的详细信息请参阅 Hooks,关于完整输入架构请参阅 Hook input。
后续步骤
现在您已了解子代理,请探索以下相关功能: