如果您需要多个代理并行工作并相互通信,请参阅 agent teams 代替。Subagents 在单个会话中工作;agent teams 跨多个会话进行协调。
- 保留上下文,通过将探索和实现保持在主对话之外
- 强制执行约束,通过限制 subagent 可以使用的工具
- 跨项目重用配置,使用用户级 subagents
- 专门化行为,为特定领域使用专注的系统提示
- 控制成本,通过将任务路由到更快、更便宜的模型(如 Haiku)
内置 subagents
Claude Code 包括内置 subagents,Claude 在适当时自动使用。每个都继承父对话的权限,并有额外的工具限制。- Explore
- Plan
- General-purpose
- Other
一个快速的、只读的代理,针对搜索和分析代码库进行了优化。
- Model: Haiku(快速、低延迟)
- Tools: 只读工具(拒绝访问 Write 和 Edit 工具)
- Purpose: 文件发现、代码搜索、代码库探索
快速入门:创建您的第一个 subagent
Subagents 在带有 YAML frontmatter 的 Markdown 文件中定义。您可以 手动创建它们 或使用/agents 命令。
本演练指导您使用 /agents 命令创建用户级 subagent。该 subagent 审查代码并为代码库建议改进。
配置内存
选择 User scope 为 subagent 提供一个 persistent memory directory,位于
~/.claude/agent-memory/。Subagent 使用这个来在对话中积累见解,例如代码库模式和重复出现的问题。如果您不希望 subagent 保留学习,请选择 None。配置 subagents
使用 /agents 命令
/agents 命令提供了一个交互式界面来管理 subagents。运行 /agents 来:
- 查看所有可用的 subagents(内置、用户、项目和 plugin)
- 使用引导式设置或 Claude 生成创建新的 subagents
- 编辑现有 subagent 配置和工具访问
- 删除自定义 subagents
- 查看当存在重复时哪些 subagents 是活跃的
claude agents。这显示按来源分组的代理,并指示哪些被更高优先级的定义覆盖。
选择 subagent 范围
Subagents 是带有 YAML frontmatter 的 Markdown 文件。根据范围将它们存储在不同的位置。当多个 subagents 共享相同的名称时,更高优先级的位置获胜。| Location | Scope | Priority | 如何创建 |
|---|---|---|---|
| 托管设置 | 组织范围 | 1(最高) | 通过 managed settings 部署 |
--agents CLI 标志 | 当前会话 | 2 | 启动 Claude Code 时传递 JSON |
.claude/agents/ | 当前项目 | 3 | 交互式或手动 |
~/.claude/agents/ | 所有您的项目 | 4 | 交互式或手动 |
Plugin 的 agents/ 目录 | 启用 plugin 的位置 | 5(最低) | 与 plugins 一起安装 |
.claude/agents/)非常适合特定于代码库的 subagents。将它们检入版本控制,以便您的团队可以协作使用和改进它们。
项目 subagents 通过从当前工作目录向上遍历来发现。使用 --add-dir 添加的目录 仅授予文件访问权限,不会扫描 subagents。要在项目间共享 subagents,请使用 ~/.claude/agents/ 或 plugin。
用户 subagents(~/.claude/agents/)是在所有项目中可用的个人 subagents。
CLI 定义的 subagents 在启动 Claude Code 时作为 JSON 传递。它们仅存在于该会话中,不会保存到磁盘,使其对快速测试或自动化脚本很有用。您可以在单个 --agents 调用中定义多个 subagents:
--agents 标志接受 JSON,具有与基于文件的 subagents 相同的 frontmatter 字段:description、prompt、tools、disallowedTools、model、permissionMode、mcpServers、hooks、maxTurns、skills、initialPrompt、memory、effort、background、isolation 和 color。对系统提示使用 prompt,等同于基于文件的 subagents 中的 markdown 正文。
托管 subagents 由组织管理员部署。在 managed settings directory 内的 .claude/agents/ 中放置 markdown 文件,使用与项目和用户 subagents 相同的 frontmatter 格式。托管定义优先于具有相同名称的项目和用户 subagents。
Plugin subagents 来自您已安装的 plugins。它们与您的自定义 subagents 一起出现在 /agents 中。有关创建 plugin subagents 的详细信息,请参阅 plugin 组件参考。
出于安全原因,plugin subagents 不支持
hooks、mcpServers 或 permissionMode frontmatter 字段。加载来自 plugin 的代理时,这些字段被忽略。如果您需要它们,请将代理文件复制到 .claude/agents/ 或 ~/.claude/agents/。您也可以在 settings.json 或 settings.local.json 中向 permissions.allow 添加规则,但这些规则适用于整个会话,而不仅仅是 plugin subagent。编写 subagent 文件
Subagent 文件使用 YAML frontmatter 进行配置,然后是 Markdown 中的系统提示:Subagents 在会话启动时加载。如果您通过手动添加文件来创建 subagent,请重启您的会话或使用
/agents 立即加载它。支持的 frontmatter 字段
以下字段可以在 YAML frontmatter 中使用。只有name 和 description 是必需的。
| Field | Required | Description |
|---|---|---|
name | Yes | 使用小写字母和连字符的唯一标识符 |
description | Yes | Claude 何时应该委托给此 subagent |
tools | No | Tools subagent 可以使用。如果省略,继承所有工具 |
disallowedTools | No | 要拒绝的工具,从继承或指定的列表中删除 |
model | No | Model 使用:sonnet、opus、haiku、完整模型 ID(例如,claude-opus-4-6)或 inherit。默认为 inherit |
permissionMode | No | Permission mode:default、acceptEdits、auto、dontAsk、bypassPermissions 或 plan |
maxTurns | No | subagent 停止前的最大代理轮数 |
skills | No | Skills 在启动时加载到 subagent 的上下文中。注入完整的技能内容,而不仅仅是可用于调用。Subagents 不继承来自父对话的技能 |
mcpServers | No | MCP servers 对此 subagent 可用。每个条目要么是引用已配置服务器的服务器名称(例如,"slack"),要么是内联定义,其中服务器名称为键,完整的 MCP server config 为值 |
hooks | No | Lifecycle hooks 限定于此 subagent |
memory | No | Persistent memory scope:user、project 或 local。启用跨会话学习 |
background | No | 设置为 true 以始终将此 subagent 作为 background task 运行。默认:false |
effort | No | 此 subagent 活跃时的努力级别。覆盖会话努力级别。默认:从会话继承。选项:low、medium、high、max(仅 Opus 4.6) |
isolation | No | 设置为 worktree 以在临时 git worktree 中运行 subagent,为其提供存储库的隔离副本。如果 subagent 不进行任何更改,worktree 会自动清理 |
color | No | Subagent 在任务列表和转录中的显示颜色。接受 red、blue、green、yellow、purple、orange、pink 或 cyan |
initialPrompt | No | 当此代理作为主会话代理运行时(通过 --agent 或 agent 设置),自动提交为第一个用户轮次。Commands 和 skills 被处理。前置于任何用户提供的提示 |
选择模型
model 字段控制 subagent 使用的 AI model:
- Model alias: 使用可用的别名之一:
sonnet、opus或haiku - Full model ID: 使用完整的模型 ID,如
claude-opus-4-6或claude-sonnet-4-6。接受与--model标志相同的值 - inherit: 使用与主对话相同的模型
- Omitted: 如果未指定,默认为
inherit(使用与主对话相同的模型)
model 参数。Claude Code 按以下顺序解析 subagent 的模型:
CLAUDE_CODE_SUBAGENT_MODEL环境变量,如果设置- 每次调用的
model参数 - Subagent 定义的
modelfrontmatter - 主对话的模型
控制 subagent 能力
您可以通过工具访问、权限模式和条件规则来控制 subagents 可以做什么。可用工具
Subagents 可以使用 Claude Code 的任何 internal tools。默认情况下,subagents 继承主对话的所有工具,包括 MCP 工具。 要限制工具,使用tools 字段(允许列表)或 disallowedTools 字段(拒绝列表)。此示例使用 tools 来专门允许 Read、Grep、Glob 和 Bash。Subagent 无法编辑文件、写入文件或使用任何 MCP 工具:
disallowedTools 来继承主对话的每个工具,除了 Write 和 Edit。Subagent 保留 Bash、MCP 工具和其他所有内容:
disallowedTools 首先应用,然后 tools 针对剩余的池进行解析。同时列在两者中的工具被删除。
限制可以生成哪些 subagents
当代理作为主线程运行时,使用claude --agent,它可以使用 Agent 工具生成 subagents。要限制它可以生成的 subagent 类型,在 tools 字段中使用 Agent(agent_type) 语法。
在版本 2.1.63 中,Task 工具被重命名为 Agent。设置和代理定义中的现有
Task(...) 引用仍然作为别名工作。worker 和 researcher subagents 可以被生成。如果代理尝试生成任何其他类型,请求失败,代理在其提示中仅看到允许的类型。要在允许所有其他类型的同时阻止特定代理,请改用 permissions.deny。
要允许生成任何 subagent 而不受限制,使用不带括号的 Agent:
Agent 完全从 tools 列表中省略,代理无法生成任何 subagents。此限制仅适用于作为主线程运行的代理,使用 claude --agent。Subagents 无法生成其他 subagents,因此 Agent(agent_type) 在 subagent 定义中无效。
将 MCP 服务器限定于 subagent
使用mcpServers 字段为 subagent 提供对主对话中不可用的 MCP 服务器的访问。此处定义的内联服务器在 subagent 启动时连接,在完成时断开连接。字符串引用共享父会话的连接。
列表中的每个条目要么是内联服务器定义,要么是引用会话中已配置的 MCP 服务器的字符串:
.mcp.json 服务器条目相同的架构(stdio、http、sse、ws),由服务器名称键入。
要将 MCP 服务器保持在主对话之外,并避免其工具描述消耗那里的上下文,请在此处内联定义它,而不是在 .mcp.json 中。Subagent 获得工具;父对话不获得。
权限模式
permissionMode 字段控制 subagent 如何处理权限提示。Subagents 从主对话继承权限上下文,并可以覆盖模式,除非父模式优先,如下所述。
| Mode | Behavior |
|---|---|
default | 标准权限检查,带有提示 |
acceptEdits | 自动接受文件编辑,除了受保护的目录 |
auto | Auto mode:后台分类器审查命令和受保护目录的写入 |
dontAsk | 自动拒绝权限提示(显式允许的工具仍然工作) |
bypassPermissions | 跳过权限提示 |
plan | Plan mode(只读探索) |
bypassPermissions,这优先并且无法被覆盖。如果父级使用 auto mode,subagent 继承 auto mode,其 frontmatter 中的任何 permissionMode 被忽略:分类器使用与父会话相同的块和允许规则评估 subagent 的工具调用。
将技能预加载到 subagents
使用skills 字段在启动时将技能内容注入到 subagent 的上下文中。这为 subagent 提供领域知识,而无需在执行期间发现和加载技能。
这与 在 subagent 中运行技能 相反。使用 subagent 中的
skills,subagent 控制系统提示并加载技能内容。使用技能中的 context: fork,技能内容被注入到您指定的代理中。两者都使用相同的底层系统。启用持久内存
memory 字段为 subagent 提供一个在对话中幸存的持久目录。Subagent 使用此目录随时间积累知识,例如代码库模式、调试见解和架构决策。
| Scope | Location | 使用时机 |
|---|---|---|
user | ~/.claude/agent-memory/<name-of-agent>/ | subagent 应该在所有项目中记住学习 |
project | .claude/agent-memory/<name-of-agent>/ | subagent 的知识是特定于项目的并可通过版本控制共享 |
local | .claude/agent-memory-local/<name-of-agent>/ | subagent 的知识是特定于项目的但不应检入版本控制 |
- Subagent 的系统提示包括读取和写入内存目录的说明。
- Subagent 的系统提示还包括内存目录中
MEMORY.md的前 200 行或 25KB,以先到者为准,以及如果MEMORY.md超过该限制则策划MEMORY.md的说明。 - Read、Write 和 Edit 工具会自动启用,以便 subagent 可以管理其内存文件。
持久内存提示
-
project是推荐的默认范围。它使 subagent 知识可通过版本控制共享。当 subagent 的知识在项目中广泛适用时使用user,或当知识不应检入版本控制时使用local。 - 要求 subagent 在开始工作前查阅其内存:“Review this PR, and check your memory for patterns you’ve seen before.”
- 要求 subagent 在完成任务后更新其内存:“Now that you’re done, save what you learned to your memory.” 随着时间的推移,这会建立一个知识库,使 subagent 更有效。
-
直接在 subagent 的 markdown 文件中包含内存说明,以便它主动维护自己的知识库:
使用 hooks 的条件规则
为了更动态地控制工具使用,使用PreToolUse hooks 在执行前验证操作。当您需要允许工具的某些操作同时阻止其他操作时,这很有用。
此示例创建一个仅允许只读数据库查询的 subagent。PreToolUse hook 在每个 Bash 命令执行前运行 command 中指定的脚本:
禁用特定 subagents
您可以通过将 subagents 添加到您的 settings 中的deny 数组来防止 Claude 使用特定 subagents。使用格式 Agent(subagent-name),其中 subagent-name 与 subagent 的 name 字段匹配。
--disallowedTools CLI 标志:
为 subagents 定义 hooks
Subagents 可以定义在 subagent 的生命周期中运行的 hooks。有两种方式来配置 hooks:- 在 subagent 的 frontmatter 中:定义仅在该 subagent 活跃时运行的 hooks
- 在
settings.json中:定义在 subagents 启动或停止时在主会话中运行的 hooks
Subagent frontmatter 中的 Hooks
直接在 subagent 的 markdown 文件中定义 hooks。这些 hooks 仅在该特定 subagent 活跃时运行,并在完成时清理。 所有 hook events 都被支持。subagents 最常见的事件是:| Event | Matcher input | 何时触发 |
|---|---|---|
PreToolUse | Tool name | 在 subagent 使用工具之前 |
PostToolUse | Tool name | 在 subagent 使用工具之后 |
Stop | (none) | 当 subagent 完成时(在运行时转换为 SubagentStop) |
PreToolUse hook 验证 Bash 命令,并在文件编辑后使用 PostToolUse 运行 linter:
Stop hooks 会自动转换为 SubagentStop 事件。
用于 subagent 事件的项目级 hooks
在settings.json 中配置 hooks,以响应主会话中的 subagent 生命周期事件。
| Event | Matcher input | 何时触发 |
|---|---|---|
SubagentStart | Agent type name | 当 subagent 开始执行时 |
SubagentStop | Agent type name | 当 subagent 完成时 |
db-agent subagent 启动时运行设置脚本,并在任何 subagent 停止时运行清理脚本:
使用 subagents
理解自动委托
Claude 根据您请求中的任务描述、subagent 配置中的description 字段和当前上下文自动委托任务。要鼓励主动委托,在您的 subagent 的 description 字段中包含”use proactively”之类的短语。
显式调用 subagents
当自动委托不够时,您可以自己请求 subagent。三种模式从一次性建议升级到会话范围的默认值:- 自然语言:在提示中命名 subagent;Claude 决定是否委托
- @-mention:保证 subagent 为一个任务运行
- 会话范围:整个会话使用该 subagent 的系统提示、工具限制和模型,通过
--agent标志或agent设置
@ 并从类型提前中选择 subagent,就像您 @-mention 文件一样。这确保特定 subagent 运行,而不是将选择留给 Claude:
<plugin-name>:<agent-name>。命名背景 subagents 当前在会话中运行也出现在类型提前中,在名称旁边显示其状态。您也可以手动输入提及而不使用选择器:@agent-<name> 用于本地 subagents,或 @agent-<plugin-name>:<agent-name> 用于 plugin subagents。
将整个会话作为 subagent 运行。 传递 --agent <name> 以启动一个会话,其中主线程本身采用该 subagent 的系统提示、工具限制和模型:
--system-prompt 一样。CLAUDE.md 文件和项目内存仍然通过正常消息流加载。代理名称在启动标题中显示为 @<name>,以便您可以确认它是活跃的。
这适用于内置和自定义 subagents,当您恢复会话时选择会持续。
对于 plugin 提供的 subagent,传递作用域名称:claude --agent <plugin-name>:<agent-name>。
要使其成为项目中每个会话的默认值,在 .claude/settings.json 中设置 agent:
在前台或后台运行 subagents
Subagents 可以在前台(阻塞)或后台(并发)运行:- 前台 subagents 阻塞主对话直到完成。权限提示和澄清问题(如
AskUserQuestion)会传递给您。 - 后台 subagents 在您继续工作时并发运行。启动前,Claude Code 会提示您 subagent 需要的任何工具权限,确保它具有必要的批准。一旦运行,subagent 继承这些权限并自动拒绝任何未预先批准的内容。如果后台 subagent 需要提出澄清问题,该工具调用失败,但 subagent 继续。
- 要求 Claude “run this in the background”
- 按 Ctrl+B 将运行中的任务放在后台
CLAUDE_CODE_DISABLE_BACKGROUND_TASKS 环境变量设置为 1。请参阅 Environment variables。
常见模式
隔离高容量操作
subagents 最有效的用途之一是隔离产生大量输出的操作。运行测试、获取文档或处理日志文件可能会消耗大量上下文。通过将这些委托给 subagent,详细输出保留在 subagent 的上下文中,而只有相关摘要返回到您的主对话。运行并行研究
对于独立的调查,生成多个 subagents 以同时工作:链接 subagents
对于多步骤工作流,要求 Claude 按顺序使用 subagents。每个 subagent 完成其任务并将结果返回给 Claude,然后将相关上下文传递给下一个 subagent。在 subagents 和主对话之间选择
在以下情况下使用 主对话:- 任务需要频繁的来回或迭代细化
- 多个阶段共享重要上下文(规划 → 实现 → 测试)
- 您正在进行快速、有针对性的更改
- 延迟很重要。Subagents 从头开始,可能需要时间来收集上下文
- 任务产生您不需要在主上下文中的详细输出
- 您想强制执行特定的工具限制或权限
- 工作是自包含的,可以返回摘要
/btw 而不是 subagent。它看到您的完整上下文但没有工具访问,答案被丢弃而不是添加到历史记录。
Subagents 无法生成其他 subagents。如果您的工作流需要嵌套委托,请使用 Skills 或从主对话 链接 subagents。
管理 subagent 上下文
恢复 subagents
每个 subagent 调用都会创建一个具有新鲜上下文的新实例。要继续现有 subagent 的工作而不是重新开始,要求 Claude 恢复它。 恢复的 subagents 保留其完整的对话历史,包括所有以前的工具调用、结果和推理。Subagent 从它停止的地方继续,而不是从头开始。 当 subagent 完成时,Claude 接收其代理 ID。Claude 使用SendMessage 工具,将代理的 ID 作为 to 字段来恢复它。SendMessage 工具仅在通过 CLAUDE_CODE_EXPERIMENTAL_AGENT_TEAMS=1 启用 agent teams 时可用。
要恢复 subagent,要求 Claude 继续之前的工作:
SendMessage,它会在后台自动恢复,无需新的 Agent 调用。
您也可以要求 Claude 提供代理 ID,如果您想明确引用它,或在 ~/.claude/projects/{project}/{sessionId}/subagents/ 的转录文件中找到 ID。每个转录存储为 agent-{agentId}.jsonl。
Subagent 转录独立于主对话持久化:
- 主对话压缩:当主对话压缩时,subagent 转录不受影响。它们存储在单独的文件中。
- 会话持久性:Subagent 转录在其会话中持久化。您可以通过恢复相同的会话在重启 Claude Code 后 恢复 subagent。
- 自动清理:转录根据
cleanupPeriodDays设置(默认:30 天)进行清理。
自动压缩
Subagents 支持使用与主对话相同的逻辑进行自动压缩。默认情况下,自动压缩在大约 95% 容量时触发。要更早触发压缩,请将CLAUDE_AUTOCOMPACT_PCT_OVERRIDE 设置为较低的百分比(例如,50)。有关详细信息,请参阅 environment variables。
压缩事件记录在 subagent 转录文件中:
preTokens 值显示压缩发生前使用了多少令牌。
示例 subagents
这些示例演示了构建 subagents 的有效模式。将它们用作起点,或使用 Claude 生成自定义版本。代码审查者
一个只读 subagent,审查代码而不修改它。此示例展示了如何设计一个专注的 subagent,具有有限的工具访问(无 Edit 或 Write)和详细的提示,指定确切要查找的内容以及如何格式化输出。调试器
一个可以分析和修复问题的 subagent。与代码审查者不同,这个包括 Edit,因为修复错误需要修改代码。提示提供了从诊断到验证的清晰工作流。数据科学家
一个用于数据分析工作的特定领域 subagent。此示例展示了如何为典型编码任务之外的专门工作流创建 subagents。它明确设置model: sonnet 以获得更强大的分析能力。
数据库查询验证器
一个允许 Bash 访问但验证命令以仅允许只读 SQL 查询的 subagent。此示例展示了当您需要比tools 字段提供的更精细的控制时如何使用 PreToolUse hooks。
command 字段匹配:
tool_input.command 中。退出代码 2 阻止操作并将错误消息反馈给 Claude。有关退出代码和 Hook input 的详细信息,请参阅 Hooks 以获取完整的输入架构。
后续步骤
现在您了解了 subagents,探索这些相关功能:- 使用 plugins 分发 subagents 以在团队或项目中共享 subagents
- 以编程方式运行 Claude Code,使用 Agent SDK 进行 CI/CD 和自动化
- 使用 MCP 服务器 为 subagents 提供对外部工具和数据的访问