Agent 系统¶
本文你会学到:
- 🤖 Agent 是什么,和 Skill、自定义指令有什么区别
- 📦 内置 Agent 及其适用场景
- 🎭 如何创建和使用自定义 Agent
- 💼 实战示例:安全审查 Agent、测试助手 Agent
打个比方:如果 Copilot 默认状态是一个全栈工程师,那 Agent 就是让他戴上专业帽子——戴上安全审查帽子时,他会用安全专家的视角看代码;戴上测试助手帽子时,他会专注于测试策略。
❓ 为什么需要 Agent?¶
默认的 Copilot 是"通用型选手",什么都能做但未必做得最精。当你的任务需要特定领域的深度专业视角时——比如安全审计、性能优化、数据库设计——激活对应的 Agent 能获得更精准、更专业的输出。
📦 内置 Agent¶
Copilot CLI 自带以下内置 Agent,无需配置即可使用。主 Agent 会根据你的 prompt 和当前上下文自动选择合适的内置 Agent 作为子代理执行任务。
功能总览¶
| Agent | 功能 | 适用场景 |
|---|---|---|
explore |
快速代码搜索和分析 | 理解代码库结构、查找文件、回答代码问题 |
task |
执行命令并报告结果 | 运行测试、构建项目、安装依赖 |
code-review |
高信噪比的代码审查 | 发现真正重要的问题:Bug、安全漏洞、逻辑错误 |
general-purpose |
完整能力的通用 Agent | 复杂多步骤任务 |
init |
项目初始化 | 分析项目并生成指令文件 |
configure-copilot |
MCP/Agent/Skill 配置助手(1.0.4 新增) | 交互式管理 MCP 服务器、Agents 和 Skills |
critic |
互补模型审查(1.0.18 新增,实验性) | 执行计划和复杂实现时自动审查,提前捕获错误 |
详细特性¶
| Agent | 用途 | 特殊行为 |
|---|---|---|
| Research | 深度研究分析,提供详尽的技术调研报告 | 使用硬编码模型(不可通过 /model 切换),只能通过 /research 斜杠命令触发,主 Agent 不会自动调用 |
| Task | 执行开发命令并汇报结果 | 成功时只返回简报摘要,保持主上下文整洁;失败时返回完整输出便于排查 |
| Explore | 快速代码库分析 | 只读操作,使用代码智能工具(代码导航、grep、glob),拥有 GitHub MCP server 的只读访问权限,可与其他子代理并行运行 |
| General-purpose | 复杂多步骤任务 | 功能最全的通用 Agent,拥有与主 Agent 几乎相同的能力,可在独立上下文中运行,适合需要单独上下文窗口或并行执行的任务 |
| Code-review | 代码审查 | 极高信噪比——只报告真正重要的问题(Bug、安全漏洞、竞态条件、内存泄漏、逻辑错误),不评论代码风格和格式,不修改任何文件 |
| Init | 项目初始化 | 分析项目结构并生成 CLAUDE.md / copilot-instructions.md 指令文件 |
| Configure-copilot | 辅助配置管理 | 1.0.4 新增,交互式引导完成 MCP 服务器、Agent 和 Skill 的配置 |
| Critic | 批评性审查 | 1.0.18 实验性功能,使用与主模型不同的互补 LLM 来审查代码,在执行复杂实现时自动激活 |
Critic Agent
Critic Agent 在你执行复杂实现时自动激活,使用一个互补模型(与主模型不同的 LLM)来审查代码——就像请了一位"第二意见"专家。目前为 Claude 模型的实验性功能(1.0.18 新增)。
/research 深度研究改进(1.0.40)
/research 命令现在使用编排器/子 Agent 模型——主 Agent 负责规划和协调,多个子 Agent 并行执行不同方面的研究,最后汇总成更全面、可靠的深度研究报告。相当于从"一个人查资料"升级为"一个小团队分工调研再汇总"。
Research Agent 的模型限制
Research Agent 使用硬编码模型而非当前会话选择的模型,因此无法通过 /model 命令切换其使用的 LLM。这是刻意设计——确保研究质量的一致性。
🎮 使用 Agent¶
Copilot 提供四种方式调用自定义 Agent,灵活度从低到高:
在提示词中直接提及¶
在 prompt 中使用 @CUSTOM-AGENT-NAME 语法直接引用 Agent,类似在群聊中 @某人:
Copilot 会识别 @ 引用并激活对应的自定义 Agent。
触发词推断¶
不显式提及 Agent 名称,Copilot 根据 Agent 的 description 字段自动匹配最合适的 Agent。比如你的 Agent 描述中包含"安全审查"关键词,当你说"帮我做一次安全检查"时,Copilot 会自动推断应该使用该 Agent:
也可以在 Agent 描述中定义触发词(trigger word),让匹配更精准:
命令行标志编程式调用¶
通过 --agent 参数在启动时指定 Agent,适合脚本化或 CI/CD 场景:
其中 security-auditor 是 Agent profile 文件名去掉 .agent.md 后的部分,通常与 frontmatter 中的 name 字段一致。
斜杠命令交互式选择¶
在交互模式中输入 /agent,从可用 Agent 列表中选择:
Note
内置 Agent(explore、task、general-purpose、code-review)不会出现在 /agent 的列表中。它们由主 Agent 自动调度,不需要手动选择。
优先级规则¶
当多个层级存在同名自定义 Agent 时,Copilot 按以下优先级加载:
graph LR
A["system-level<br/>用户级 ~/.copilot/agents/"] -->|最高优先级| B[生效的 Agent]
C["repository-level<br/>项目级 .github/agents/"] -->|次优先级| B
D["organization-level<br/>组织级 .github-private/agents/"] -->|最低优先级| B
| 层级 | 存放位置 | 作用范围 | 优先级 |
|---|---|---|---|
| 用户级(system-level) | ~/.copilot/agents/ |
当前用户的所有项目 | 最高 |
| 项目级(repository-level) | .github/agents/ |
当前仓库 | 中 |
| 组织级(organization-level) | .github-private/agents/ |
组织/企业下所有项目 | 最低 |
文件名 vs frontmatter name
自定义 Agent 的**文件名**(如 security-reviewer.agent.md)和 frontmatter 中的 **name 字段**可以不同。文件名是 Agent 的标识符(--agent 参数使用文件名),而 name 字段是显示名称。建议保持两者一致以避免混淆。恢复会话时,Copilot CLI 会正确识别两者的映射关系(1.0.19 修复)。
交互式选择¶
命令行指定¶
在会话中使用¶
向后台 Agent 发送消息¶
使用 write_agent 工具可以向后台运行的 Agent 发送跟进消息(1.0.5 新增),无需等待它完成:
子 Agent 会获得基于名称的可读 ID(如 math-helper-0)而非随机字符串(1.0.6 新增),方便在 /tasks 视图中识别。空闲子 Agent 在 /tasks 视图中 2 分钟后自动隐藏(1.0.8 改进)。
🔄 子代理行为¶
子代理(subagent)是主 Agent 为了完成特定子任务而临时启动的独立 Agent 实例。理解子代理的运行机制有助于更好地规划复杂任务。
独立上下文窗口¶
每个子代理拥有自己的上下文窗口,与主 Agent 的上下文相互隔离。这意味着:
- 子代理中填充的详细信息(搜索结果、文件内容等)不会占用主 Agent 的上下文空间
- 主 Agent 可以专注于高层规划和协调,将具体执行工作下放给子代理
- 尤其在大型任务中,这种隔离能有效避免上下文窗口溢出
打个比方:主 Agent 是项目经理,子代理是团队成员——每个人有自己的笔记本(上下文),做完工作后只把结论汇报给项目经理,而不是把所有草稿都塞到经理桌上。
并发与深度限制¶
子代理可以并行运行,但受到以下限制以防止失控(1.0.22 新增):
| 限制类型 | 说明 |
|---|---|
| 并发限制 | 同时运行的子代理数量有上限,防止资源耗尽 |
| 深度限制 | 子代理不能再生成子代理的子代理(禁止无限递归),确保调用链有界 |
| 只读代理可并行 | 像 Explore 这样只读的子代理可以安全地与其他子代理并行运行,因为它不会修改任何文件 |
会话标识¶
Shell 命令和 MCP server 运行时会自动接收 COPILOT_AGENT_SESSION_ID 环境变量(1.0.29 新增),其中包含当前 Agent 会话的唯一标识:
当你需要在外部脚本中追踪是哪个 Agent 会话触发了操作时(如日志关联、审计追踪),这个变量非常有用。
时间线折叠¶
子代理的运行过程在时间线中以可折叠的方式展示(1.0.35 改进):
- 子代理的思考过程(thinking)默认隐藏,减少视觉噪音
- 你可以展开查看详细的推理过程
- 只关注实际的工具调用和最终结果,让交互体验更清爽
ACP 客户端支持¶
ACP 客户端(如 VS Code 中的 Copilot 扩展)现在可通过 agent 配置选项列出和切换自定义 Agent(1.0.40 新增),让你在非终端环境中也能方便地使用项目定义的专业角色。
🎭 自定义 Agent¶
通过 .agent.md 文件定义自定义 Agent,让 Copilot 扮演特定领域专家。
文件格式¶
Frontmatter 字段¶
| 字段 | 必需 | 说明 |
|---|---|---|
name |
✅ | Agent 标识符,使用小写字母加连字符 |
description |
✅ | 简述 Agent 用途和激活时机 |
tools |
❌ | Agent 可使用的工具列表 |
skills |
❌ | 启动时预加载到 Agent 上下文中的 Skill 列表(1.0.22 新增) |
命名约定¶
- 使用
小写字母加连字符:security-reviewer,不用SecurityReviewer - 名称应自描述功能:
pytest-helper而非test-agent
📂 Agent 存放位置¶
提交到 Git,团队共享。
Copilot CLI 不加载 ~/.claude/ 目录(1.0.36)
从 1.0.36 起,~/.claude/ 目录中的自定义 Agents、Skills 和 Commands 不再被 Copilot CLI 加载——它们是 Claude Code 专属目录。Copilot CLI 的个人级扩展应放在 ~/.copilot/ 目录下。此前版本会错误加载 ~/.claude/ 中的内容,可能导致意外行为。
通过 GitHub 组织设置共享 Agent,所有组织成员自动获得。
文件名与显示名称
自定义 Agent 的文件名(如 security-reviewer.agent.md)和 frontmatter 中的 name 字段可以不同。恢复会话时,Copilot CLI 会正确识别两者的映射关系(1.0.19 修复)。建议保持文件名和 name 字段一致,避免混淆。
💼 实战示例¶
创建测试助手 Agent¶
使用自定义 Agent¶
⚖️ Agent vs Skill vs 指令¶
三者容易混淆,用一张表理清:
一句话区分
指令:背景知识(项目规范)——始终生效Skill:操作手册(怎么生成测试)——相关任务时自动触发Agent:专业角色(安全专家)——需要时手动切换
| 维度 | Agent | Skill | Custom Instructions |
|---|---|---|---|
激活方式 |
手动:/agent 或 --agent |
自动:根据 prompt 匹配 description |
始终生效 |
定义文件 |
.agent.md |
SKILL.md + 资源文件夹 |
.instructions.md / AGENTS.md |
适用场景 |
专业角色审查/分析 | 特定任务的工作流(如测试生成) | 全局规范和偏好 |
能否生成代码 |
✅ | ✅ | 间接影响(引导 Copilot 行为) |
团队共享 |
✅(提交 .github/agents/) |
✅(提交 .github/skills/) |
✅(提交 .github/) |
选择建议
每次都需要的规则→ Custom Instructions特定任务自动触发→ Skill需要手动切换专家视角→ Agent