第 29 章

Code 中的 Subagent

用 AGENTS.md 文件定义自定义子代理,让 Deep Agents Code 委派专门任务

从"SDK 编码"到"声明式配置"的轻量之路

为什么需要它

你已经知道子代理好用——但在 Code 模式下怎么定义它们?

SDK 方式的局限

  • 必须写 JavaScript/TypeScript 代码来定义子代理
  • 每次修改提示词都要改代码、重新部署
  • 团队中非开发人员无法参与调优提示词
  • 配置和逻辑混在一起,难以单独审查

AGENTS.md 的解法

  • 用 Markdown 文件声明式定义子代理
  • 修改提示词只需编辑文本文件,无需动代码
  • 团队中任何人都能审阅和调整提示词
  • YAML frontmatter + Markdown 正文,结构清晰
核心价值:AGENTS.md 让子代理的定义从"写代码"变成"写文档"。你只需要一个 Markdown 文件就能声明子代理的名称、描述、模型和系统提示词——Deep Agents Code 自动加载并注册。

文件位置

子代理的定义文件放在哪里?项目级和用户级两条路径

每个子代理位于自己的文件夹中,包含一个 AGENTS.md 文件:

# 项目级——随项目代码一起版本管理
.deepagents/agents/{subagent-name}/AGENTS.md

# 用户级——个人专属子代理,跨项目可用
~/.deepagents/{agent}/agents/{subagent-name}/AGENTS.md

项目级(推荐)

  • 放在 .deepagents/agents/ 下
  • 随项目提交到 Git,团队共享
  • 适合与项目业务强相关的子代理
  • 优先级高于用户级同名子代理

用户级

  • 放在 ~/.deepagents/{agent}/agents/ 下
  • 个人专属,不随项目走
  • 适合个人偏好类子代理
  • 被同名项目级子代理覆盖
优先级规则:项目级 subagent 会覆盖同名的用户级 subagent。如果你在项目中定义了一个名为 researcher 的子代理,它会取代你用户目录下同名的那个。
图:项目级与用户级子代理文件优先级

文件格式

YAML frontmatter 声明元数据,Markdown 正文作为系统提示词

一个完整的 AGENTS.md 文件由两部分组成:

---
name: researcher                                    # 子代理的唯一标识符
description: Research topics on the web before writing content  # 主代理据此决定何时委派
model: anthropic:claude-haiku-4-5-20251001          # 可选:指定小模型以降低成本
---

You are a research assistant with access to web search.

## Your Process
1. Search for relevant information
2. Summarize findings clearly

Frontmatter(必填)

  • name — 子代理的唯一标识符
  • description — 功能描述,主代理据此决定何时委派
  • model — 可选,覆盖主代理模型

Markdown 正文

  • 正文成为子代理的 system_prompt
  • 支持完整的 Markdown 格式
  • 可包含工作流程、输出格式等指令
与 SDK SubAgent 字段对应:name 和 description 对应字典规范中的必填字段;Markdown 正文对应 system_prompt;model 在 AGENTS.md frontmatter 中暴露(沿用 SDK 的可选字段)。

模型覆盖

用 model 字段为子代理指定不同的模型——省成本、提速度

model 是 AGENTS.md 特有的可选字段,使用 provider:model-name 格式:

---
name: general-purpose                                       # 与内置子代理同名,覆盖它
description: General-purpose agent for research and multi-step tasks
model: anthropic:claude-haiku-4-5-20251001                  # 使用 Haiku 降低成本
---

You are a general-purpose assistant.
Complete the task efficiently and return a concise summary.

不设 model(继承主代理)

  • 子代理使用与主代理相同的模型
  • 适合需要强大推理能力的任务
  • 成本与主代理调用一致

设置 model(覆盖主代理)

  • 子代理使用指定的小模型
  • 适合简单、重复性的委派任务
  • 大幅降低 token 成本
高性价比策略:主代理用强模型做高层协调,简单委派任务路由到便宜的小模型。一行 model 配置就能实现成本和性能的最佳平衡。

覆盖内置代理

用 AGENTS.md 替换默认的 general-purpose 子代理——零代码实现

Deep Agents Code 内置了一个 general-purpose 子代理。你可以通过定义同名子代理来覆盖它:

---
name: general-purpose                                       # 与内置子代理同名,实现覆盖
description: General-purpose agent for research and multi-step tasks
model: anthropic:claude-haiku-4-5-20251001                  # 指定便宜的小模型
---

You are a general-purpose assistant.
Complete the task efficiently and return a concise summary.

覆盖效果

  • 所有原本路由到内置 general-purpose 的任务自动转向你的版本
  • 使用指定的小模型执行,降低成本
  • 自定义提示词让输出更符合项目需求

典型场景

  • 主代理用 Claude Opus 做规划
  • 委派给 general-purpose 时走 Haiku
  • 日常任务成本降低 80%+
  • 关键决策仍由强模型把关
如何生效:将文件放在 .deepagents/agents/general-purpose/AGENTS.md,Deep Agents Code 启动时自动加载并替换内置版本。

当前限制

AGENTS.md 能做什么、不能做什么——了解边界才能用好它

AGENTS.md 支持的字段

  • name — 子代理名称(必填)
  • description — 功能描述(必填)
  • model — 模型覆盖(可选)
  • Markdown 正文 — 系统提示词

暂不支持的字段

  • tools — 工具配置
  • middleware — 中间件
  • interrupt_on — 中断配置
  • skills — 技能加载
  • response_format — 结构化输出

AGENTS.md 方式

  • 适合快速定义子代理
  • 自动继承主代理的工具
  • 无法精细控制工具和中间件
  • 声明式、零代码

SDK 方式

  • 适合完全控制子代理行为
  • 可自定义工具、中间件、技能等
  • 需要编写和部署代码
  • 编程式、全功能
重要提示:异步子代理目前在 Deep Agents Code 中尚不可用。通过 AGENTS.md 定义的自定义子代理会继承主代理的工具——无法通过 frontmatter 限制或扩展工具集。如需完全控制,请直接使用 SDK。

实战演练

从零创建一个项目级子代理——三步搞定

1. 创建目录

在项目中新建子代理文件夹

2. 编写 AGENTS.md

填写 frontmatter 和提示词

3. 启动验证

运行 Code 代理,确认加载

# 第一步:创建子代理目录(目录名即子代理标识)
mkdir -p .deepagents/agents/researcher

# 第二步:创建 AGENTS.md 文件(YAML frontmatter + Markdown 正文)
cat > .deepagents/agents/researcher/AGENTS.md << 'EOF'
---
name: researcher
description: >
  Performs in-depth web research on technical topics.
  Use when you need comprehensive information requiring
  multiple searches and source verification.
model: anthropic:claude-haiku-4-5-20251001
---

You are a meticulous research assistant with access to web search tools.

## Your Workflow
1. Decompose the research question into searchable queries
2. Execute searches systematically
3. Cross-reference findings across sources
4. Synthesize a comprehensive but concise summary

## Output Format
- Executive Summary (2-3 sentences)
- Key Findings (bullet points with sources)
- Confidence Level (high/medium/low)
- Recommended Next Steps

Keep your response under 500 words to maintain context efficiency.
EOF

# 第三步:提交到 Git,让团队成员也能使用该子代理
git add .deepagents/agents/researcher/AGENTS.md
git commit -m "feat: add researcher subagent"
验证方式:启动 Deep Agents Code 后,向主代理提问一个需要调研的问题。如果主代理自动将任务委派给 researcher 子代理,说明配置生效。你也可以检查日志中的 lc_agent_name 元数据来确认。

多代理组合

定义多个子代理,各司其职——完整的项目级配置示例

.deepagents/agents/
├── researcher/
│   └── AGENTS.md       # 深度调研,用便宜模型
├── code-reviewer/
│   └── AGENTS.md       # 代码审查,用强模型
├── translator/
│   └── AGENTS.md       # 文档翻译,用便宜模型
└── general-purpose/
    └── AGENTS.md       # 覆盖内置通用代理
# .deepagents/agents/code-reviewer/AGENTS.md
---
name: code-reviewer                                    # 子代理名称
description: >
  Reviews code changes for bugs, security issues,
  and best practices. Use for PR reviews and code audits.
model: anthropic:claude-opus-4-7                       # 代码审查需要强推理能力,用 Opus
---

You are a senior code reviewer. Focus on:
1. Correctness and edge cases
2. Security vulnerabilities
3. Performance implications
4. Code style and maintainability

Rate each finding as critical/warning/info.
Provide specific fix suggestions.

模型分配策略

  • researcher → Haiku(低成本、多搜索)
  • code-reviewer → Opus(高推理、深分析)
  • translator → Haiku(语言任务、低成本)
  • general-purpose → Haiku(日常委派)

提示词设计要点

  • 明确工作流程步骤
  • 指定输出格式和长度限制
  • 描述要具体到何时使用
  • 控制输出长度以节省上下文
图:多子代理编排与模型分配

常见问题

子代理没加载?没被调用?模型没生效?逐个排查

子代理未被加载

  • 检查文件路径是否正确:.deepagents/agents/{name}/AGENTS.md
  • 确认文件名是 AGENTS.md(不是 agent.md)
  • 确认 frontmatter 格式正确,name 和 description 必填

子代理未被调用

  • description 太模糊,主代理不知何时委派
  • 在主代理提示词中明确指示委派策略
  • 确保描述中包含具体的触发条件

模型覆盖未生效

  • 检查 model 格式:provider:model-name
  • 确认 provider 拼写正确(如 anthropic 而非 Anthropic)
  • 确认模型名称拼写正确且 API 可用

YAML 解析错误

  • 确保 frontmatter 用 --- 正确包裹
  • 多行描述用 > 或 | 折叠
  • 检查是否有特殊字符未转义
调试技巧:在 LangSmith 中查看 lc_agent_name 元数据,确认子代理是否被正确加载和调用。如果元数据中没有出现你定义的子代理名称,说明配置文件未被识别。

本章回顾

AGENTS.md 是 Deep Agents Code 中定义子代理的声明式方案

你学到了什么

  • 用 AGENTS.md 文件声明式定义子代理——零代码
  • 项目级优先于用户级的加载规则
  • model 字段实现高性价比模型分配
  • 覆盖内置 general-purpose 子代理的方法
  • 当前限制:不支持 tools、middleware 等高级配置
  • 需要完全控制时,回退到 SDK 方式

后续章节预告

  • Code Providers:模型提供商的配置和切换
  • Code Configuration:Code 模式的全局配置项
  • Code MCP Tools:集成外部工具到 Code 代理
  • Code Data Locations:所有配置文件的路径规范
核心结论:AGENTS.md 是"够用就好"的哲学体现。对于大多数场景——定义名称、描述、提示词和模型——它已经足够。当你需要精细控制工具、中间件或技能时,再升级到 SDK 方式。两种方式可以共存,按需选择。

延伸阅读

继续本课程

官方文档

相关概念