Skip to main content

前言

在使用GitHub Copilot进行日常开发时,我们面临着不同类型的任务:需求规划、代码实现、代码审查、重构优化等。不同的任务往往需要AI扮演不同的角色,使用不同的工具集,遵循不同的工作方式。例如,规划阶段需要AI只读代码进行分析,而实现阶段则需要完整的编辑能力;代码审查需要关注安全和质量,而重构需要关注架构和性能。

传统的做法是在每次切换任务时手动调整工具和指令,这不仅繁琐,还容易遗漏关键配置。Copilot Custom Agents(自定义代理)正是为了解决这一问题而设计的功能,它允许你为不同的开发角色和任务预先配置专属的AI代理,并通过简单的切换快速进入相应的工作模式。

本文将深入介绍Copilot Custom Agents的功能特性、配置方法、工作流设计和最佳实践,帮助你构建高效的AI辅助开发工作流。

Copilot Custom Agents是什么

Copilot Custom AgentsVS CodeGitHub Copilot的自定义代理功能,它允许开发者创建具有特定角色定位、工具集和行为指令的专属AI代理。每个自定义代理就像一个针对特定任务优化的AI助手,可以快速切换使用。

核心特点

  • 角色定制:为不同的开发角色(如规划师、实现者、审查者)创建专属代理
  • 工具隔离:每个代理可以配置专属的工具集,避免不必要的工具干扰
  • 行为定义:通过指令定义代理的工作方式和响应风格
  • 快速切换:通过代理下拉菜单一键切换不同的工作模式
  • 工作流编排:使用Handoffs功能在代理之间创建引导式工作流
  • 团队共享:代理定义文件可以提交到代码仓库,团队成员共享使用
  • 跨项目复用:可以在用户配置文件中定义全局代理,跨工作区使用

与内置代理的区别

GitHub Copilot提供了几个内置代理(如@workspace@terminal等),它们提供通用的功能配置。而Custom Agents允许你根据具体的开发场景和团队需求创建更专业化的代理配置,实现更精准的任务定制。

关键概念

概念说明
Agent文件定义自定义代理的.agent.md文件
Tools(工具)代理可用的工具集,如文件搜索、代码编辑、终端执行等
Instructions(指令)定义代理如何工作的具体指导原则
Handoffs(交接)代理之间的流程切换机制
Workspace Agent工作区级别的代理,存储在项目的.github/agents目录
User Agent用户级别的代理,存储在用户配置文件目录
Organization Agent组织级别的代理,由GitHub组织统一管理

解决什么问题

Copilot Custom Agents主要解决以下几类问题:

任务模式切换困难

不同的开发任务需要不同的工作模式,传统方式需要手动调整配置。

场景示例

  • 规划阶段需要只读工具避免意外修改代码
  • 实现阶段需要完整的文件编辑能力
  • 审查阶段需要专注于质量和安全分析
  • 重构阶段需要代码搜索和结构分析工具

工具使用混乱

当所有工具都可用时,AI可能选择不合适的工具,影响效率和结果质量。

场景示例

  • 规划时不应该编辑代码,但AI可能尝试修改文件
  • 快速原型开发时不需要完整的测试工具
  • 代码审查时不需要执行终端命令

重复配置工作

每次开始新任务都需要重新说明要求和约束,效率低下。

场景示例

  • 每次做代码审查都要提醒AI关注安全问题
  • 每次规划都要说明生成实施计划的格式
  • 每次实现都要强调遵循项目规范

工作流不连贯

在不同任务阶段之间切换时缺乏流畅的衔接,需要手动复制上下文。

场景示例

  • 规划完成后需要手动切换到实现模式
  • 实现完成后需要手动准备代码审查上下文
  • 测试失败后需要手动准备修复提示

团队协作不一致

团队成员使用不同的工作方式和配置,导致输出质量不一致。

场景示例

  • 不同成员使用不同的规划流程
  • 代码审查关注点不统一
  • 实施方法和标准各异

核心功能

代理定义与配置

代理文件结构

自定义代理使用.agent.md文件定义,采用Markdown格式,包含YAML格式的前置元数据(frontmatter)和Markdown格式的指令内容:

---
description: 生成功能实现计划
name: 规划代理
tools: ['fetch', 'githubRepo', 'search', 'usages']
model: Claude Sonnet 4.5
handoffs:
- label: 开始实现
agent: 实现代理
prompt: 现在开始实现上述计划。
send: false
---

# 规划指令
你处于规划模式。你的任务是生成实现计划...

前置元数据字段

字段说明必填
description代理的简要描述,显示在聊天输入框的占位符文本中
name代理名称,未指定时使用文件名
argument-hint输入提示文本,引导用户如何与代理交互
tools代理可用的工具列表,可包含内置工具、工具集、MCP工具或扩展提供的工具
model使用的AI模型,未指定时使用当前选择的模型
infer是否允许作为子代理使用,默认为true
target目标环境,可选值:vscodegithub-copilot
mcp-serversMCP服务器配置列表(用于GitHub Copilot
handoffs定义代理之间的交接流程

工具配置

工具可以是:

工具类型说明示例
内置工具Copilot内置的基础工具search(搜索)、fetch(获取网页)、usages(代码引用)
工具集预定义的工具组合read-only(只读工具集)
MCP工具Model Context Protocol服务器提供的工具使用<server-name>/*格式包含整个MCP服务器的工具
扩展工具VS Code扩展提供的工具扩展注册的自定义工具

工具配置示例:

# 只使用只读工具
tools: ['read-only']

# 使用特定工具
tools: ['search', 'fetch', 'githubRepo', 'usages']

# 包含MCP服务器的所有工具
tools: ['myserver/*', 'search']

# 不配置tools则使用默认工具

Handoffs工作流

Handoffs(交接)是Custom Agents的核心特性之一,它允许你创建引导式的顺序工作流,在代理之间流畅过渡。

Handoffs的价值

  • 流程引导:为复杂工作流提供清晰的步骤指引
  • 上下文传递:自动携带相关上下文到下一个代理
  • 提示预填充:预先准备好下一步的提示词
  • 人工审核:每一步完成后允许开发者审核和批准

Handoffs配置

handoffs:
- label: 开始实现 # 按钮显示文本
agent: 实现代理 # 目标代理标识
prompt: 现在开始实现上述计划。 # 发送到目标代理的提示
send: false # 是否自动提交提示,默认false

Handoffs使用场景

  • 规划 → 实现:规划阶段生成实施方案,然后交接到实现代理开始编码
  • 实现 → 审查:实现完成后,切换到代码审查代理检查质量和安全
  • 编写失败测试 → 实现代码:先生成失败的测试用例便于审查,再交接实现代码使测试通过
  • 问题分析 → 方案设计 → 代码实现:多阶段工作流的顺序执行

工具优先级

当同时存在多个工具配置来源时,VS Code按以下优先级确定最终可用的工具列表:

  1. Prompt文件中指定的工具(最高优先级)
  2. Prompt文件引用的Custom Agent的工具
  3. 选中的Agent的默认工具(最低优先级)

这种优先级机制允许你在不同层次灵活控制工具的可用性。

代理作用域

Workspace级别

  • 存储位置:.github/agents/目录
  • 作用范围:仅在当前工作区可用
  • 适用场景:项目特定的工作流和角色
  • 团队共享:可以提交到Git仓库供团队使用

User级别

  • 存储位置:用户配置文件目录
  • 作用范围:所有工作区共享
  • 适用场景:个人习惯和通用工作流
  • 个人使用:不会影响团队其他成员

Organization级别(实验性)

  • 配置方式:在GitHub组织层面定义
  • 作用范围:组织内所有成员
  • 启用方式:设置github.copilot.chat.customAgents.showOrganizationAndEnterpriseAgentstrue
  • 适用场景:企业级规范和流程统一

使用方法

创建自定义代理

通过命令创建

步骤一:打开代理配置

从代理下拉菜单选择Configure Custom Agents,或在命令面板(⇧⌘P)运行Chat: New Custom Agent命令。

步骤二:选择位置

选择代理文件的存储位置:

  • Workspace:创建在.github/agents目录,仅当前项目使用
  • User profile:创建在用户配置文件目录,跨项目使用

步骤三:命名代理

输入代理文件名,这将作为代理在下拉菜单中的默认名称。

步骤四:编写配置

在新创建的.agent.md文件中:

  • 填写前置元数据配置代理的名称、描述、工具等
  • 在文件正文中编写代理的具体工作指令

手动创建

你也可以直接在合适的位置创建.agent.md文件:

# Workspace级别
mkdir -p .github/agents
touch .github/agents/planner.agent.md

# User级别(macOS/Linux)
mkdir -p ~/.config/Code/User/agents
touch ~/.config/Code/User/agents/planner.agent.md

使用自定义代理

切换代理

VS Code的聊天视图中:

  1. 点击代理下拉菜单
  2. 选择你创建的自定义代理
  3. 输入提示开始对话

切换代理后,该代理的指令和工具配置会自动应用到后续的对话中。

使用Handoffs

当代理配置了handoffs时:

  1. 完成当前代理的任务后,聊天响应下方会显示handoff按钮
  2. 点击按钮切换到目标代理
  3. 如果send: false,提示会预填充但不自动发送,你可以审核和修改
  4. 如果send: true,提示会自动发送到目标代理

管理自定义代理

编辑代理

从代理下拉菜单选择Configure Custom Agents,然后从列表中选择要修改的代理,直接编辑.agent.md文件。

显示/隐藏代理

如果有多个自定义代理,可以控制哪些显示在下拉菜单中:

  1. 从代理下拉菜单选择Configure Custom Agents
  2. 将鼠标悬停在代理上
  3. 点击眼睛图标切换显示/隐藏状态

删除代理

完全删除自定义代理:

  • 方式一:直接删除对应的.agent.md文件
  • 方式二:从Configure Custom Agents列表中,悬停在代理上点击垃圾桶图标

查看代理来源

要确定代理的来源:

  1. 从代理下拉菜单选择Configure Custom Agents
  2. 将鼠标悬停在代理上
  3. 工具提示中会显示来源位置(内置、用户、工作区、组织或扩展)

迁移旧的Chat Modes

Custom Agents之前称为Custom Chat Modes,使用.chatmode.md文件。VS Code仍然识别这些旧文件,并提供快速修复操作来重命名和移动它们到新的.github/agents目录,扩展名改为.agent.md

应用场景

规划代理(Planning Agent)

场景描述:需要为新功能或重构任务生成详细的实施计划,不涉及代码修改。

配置示例

---
name: 规划代理
description: 为新功能或重构任务生成实施计划
tools: ['fetch', 'githubRepo', 'search', 'usages', 'read-only']
model: Claude Sonnet 4.5
handoffs:
- label: 实施计划
agent: 实现代理
prompt: 实施上述计划。
send: false
---

# 规划指令
你处于规划模式。生成详细的实施计划,不进行任何代码编辑。

计划应包括:
- **概述**:功能或重构任务的简要描述
- **需求**:功能性和非功能性需求列表
- **实施步骤**:详细的分步实施指南
- **测试策略**:验证实施所需的测试
- **风险和考虑因素**:潜在问题及缓解策略

使用流程

  1. 切换到Planner代理
  2. 输入功能需求或重构目标
  3. 审查生成的实施计划
  4. 点击实施计划按钮切换到实现代理

实现代理(Implementation Agent)

场景描述:根据规划或需求实施具体的代码改动。

配置示例

---
name: 实现代理
description: 根据计划实施功能
tools: ['search', 'usages', 'edit', 'create', 'delete']
handoffs:
- label: 审查代码
agent: 代码审查代理
prompt: 审查我刚刚做的代码改动。
send: false
---

# 实现指令
你处于实现模式。你的任务是实现计划的功能或修复。

指导原则:
- 遵循现有的代码风格和项目约定
- 编写干净、可读、可维护的代码
- 为复杂逻辑添加适当的注释
- 如需要,更新相关文档
- 实现后运行测试以确保正确性

使用流程

  1. 从规划代理通过handoff切换,或直接切换到实现代理
  2. 输入实施要求或继承的计划上下文
  3. 审查和确认代码改动
  4. 点击审查代码按钮进入代码审查流程

代码审查代理(Code Review Agent)

场景描述:审查代码改动,关注代码质量、安全性、性能等方面。

配置示例

---
name: 代码审查代理
description: 审查代码改动的质量和安全性
tools: ['search', 'usages', 'githubRepo', 'read-only']
---

# 代码审查指令
你处于代码审查模式。分析代码改动并提供反馈。

审查清单:
- **代码质量**:可读性、可维护性、遵循最佳实践
- **安全性**:潜在漏洞、输入验证、数据保护
- **性能**:效率、资源使用、可扩展性问题
- **测试**:测试覆盖率、边界情况、错误处理
- **文档**:注释、API文档、README更新

提供建设性的反馈和具体的改进建议。

使用流程

  1. 从实现代理通过handoff切换
  2. AI自动分析最近的代码改动
  3. 获得详细的审查反馈和改进建议
  4. 根据反馈进行必要的修改

重构代理(Refactoring Agent)

场景描述:优化现有代码结构,提升代码质量而不改变功能。

配置示例

---
name: 重构代理
description: 重构现有代码以提升结构和可维护性
tools: ['search', 'usages', 'edit', 'githubRepo']
---

# 重构指令
你处于重构模式。在不改变功能的前提下改进代码结构。

重点关注:
- **提取方法**:将大型函数拆分为更小、更专注的函数
- **消除重复**:识别并消除重复代码
- **改进命名**:为变量和函数使用清晰、描述性的名称
- **简化逻辑**:降低复杂度,移除不必要的条件判断
- **更新模式**:应用现代语言特性和最佳实践

始终保持现有功能,并确保重构后测试通过。

测试代理(Test-First Agent)

场景描述:先编写失败的测试用例,然后实现代码使测试通过。

配置示例

---
name: 测试代理
description: 先编写失败的测试,然后实现代码使其通过
tools: ['search', 'create', 'edit']
handoffs:
- label: 实现代码
agent: 测试代理
prompt: 实现代码使上述测试通过。
send: false
---

# 测试优先开发指令
你处于测试优先模式。在实现前编写全面的失败测试。

流程:
1. 理解功能需求
2. 编写定义预期行为的测试用例
3. 确保测试失败(因为尚未实现)
4. 通过交接准备实现阶段

测试指南:
- 覆盖正常路径和边界情况
- 测试错误处理和验证
- 使用描述性的测试名称
- 保持测试专注且独立

文档编写代理(Documentation Agent)

场景描述:为代码、API或项目编写高质量的文档。

配置示例

---
name: 文档编写代理
description: 生成和更新项目文档
tools: ['search', 'githubRepo', 'fetch', 'edit', 'create']
---

# 文档编写指令
你处于文档模式。创建清晰、全面的文档。

文档类型:
- **API文档**:函数签名、参数、返回值、示例
- **代码注释**:复杂逻辑的行内说明
- **README文件**:项目概述、设置说明、使用示例
- **架构文档**:系统设计、组件交互、数据流
- **用户指南**:分步教程和操作指南

使用清晰的语言,提供示例,并保持文档与代码改动同步更新。

安全审查代理(Security Audit Agent)

场景描述:专门审查代码的安全问题和漏洞。

配置示例

---
description: 审计代码的安全漏洞和最佳实践
name: 安全代理
tools: ['search', 'usages', 'githubRepo', 'read-only']
---

# 安全审计指令
你处于安全审计模式。识别并报告安全漏洞。

安全清单:
- **输入验证**:检查SQL注入、XSS、命令注入
- **身份认证**:验证正确的认证和授权
- **数据保护**:确保敏感数据加密和保护
- **依赖安全**:检查存在漏洞的依赖项
- **API安全**:审查API端点的安全缺陷
- **错误处理**:确保错误不泄露敏感信息

提供严重程度评级和修复建议。

最佳实践

合理设计工作流

原则

  • 将复杂任务分解为多个阶段,每个阶段对应一个代理
  • 使用handoffs串联各个阶段,形成流畅的工作流
  • 在关键决策点保留人工审核环节(send: false

示例工作流

需求分析 → 规划设计 → 编写测试 → 代码实现 → 代码审查 → 文档更新

精准配置工具集

原则

  • 只为代理配置必要的工具,避免工具泛滥
  • 规划类代理使用只读工具,避免意外修改
  • 实现类代理使用编辑工具,但可以限制范围

工具选择建议

代理类型推荐工具避免工具
规划代理searchfetchgithubRepousages编辑类工具
实现代理searcheditcreatedelete终端执行(除非必要)
审查代理searchusagesgithubRepo编辑类工具
文档代理searcheditcreatefetch代码编译工具

编写清晰的指令

原则

  • 使用清晰的结构化指令,明确代理的职责
  • 提供具体的检查清单和操作指南
  • 包含反例说明,明确什么不应该做

指令模板

# [代理名称] 指令

## 角色
你处于[角色名]模式。你的主要任务是[主要任务]。

## 目标
- [目标1]
- [目标2]
- [目标3]

## 指导原则
- [指导原则1]
- [指导原则2]
- [指导原则3]

## 禁止事项
- [禁止事项1]
- [禁止事项2]

## 输出格式
[期望的输出格式说明]

保持代理专注

原则

  • 每个代理专注于单一职责
  • 避免创建"万能代理"
  • 通过handoffs组合多个专注的代理

反模式

# ❌ 不好的例子:一个代理做所有事情
---
name: 超级代理
tools: ['*'] # 所有工具
---
你可以做所有事情:规划、实现、审查、测试、文档...

推荐模式

# ✅ 好的例子:职责单一的代理
---
name: 规划代理
tools: ['read-only']
---
你专注于生成详细的实施计划。

利用模型选择

原则

  • 为不同代理选择合适的模型
  • 复杂任务使用更强大的模型
  • 简单任务可以使用快速模型

模型选择建议

任务复杂度推荐模型适用代理
高复杂度Claude Sonnet 4.5架构设计、复杂重构、安全审计
中等复杂度默认模型功能实现、代码审查
低复杂度快速模型简单编辑、格式化、文档更新

版本控制与团队共享

原则

  • 将工作区级别的代理提交到Git仓库
  • README中说明代理的用途和使用方法
  • 定期审查和更新代理配置

目录结构建议

.github/
└── agents/
├── planner.agent.md
├── implementer.agent.md
├── reviewer.agent.md
└── README.md # 说明各代理的用途

渐进式采用

原则

  • 从最常用的场景开始创建代理
  • 在实践中逐步完善代理配置
  • 收集团队反馈持续优化

采用路径

  1. 第一阶段:创建规划代理和实现代理,建立基础工作流
  2. 第二阶段:添加代码审查代理,提升代码质量
  3. 第三阶段:根据团队需求添加专项代理(如测试、文档、安全等)
  4. 第四阶段:优化handoffs,建立完整的端到端工作流

性能优化

原则

  • 避免在代理指令中包含过多冗余内容
  • 合理使用工具筛选,减少不必要的工具调用
  • 对于组织级代理,定期清理不再使用的配置

优化检查清单

  • 指令是否简洁明确?
  • 工具配置是否最小化?
  • handoffs是否必要且高效?
  • 代理命名是否清晰易识别?

监控与迭代

原则

  • 定期审查代理的使用情况
  • 收集团队成员的使用反馈
  • 根据实际效果调整代理配置

反馈收集维度

  • 代理是否有效提升了工作效率?
  • 工具配置是否合理?
  • 指令是否清晰易懂?
  • handoffs流程是否流畅?
  • 是否需要新的代理类型?

安全与权限

原则

  • 谨慎配置具有写权限的工具
  • 敏感操作的代理应限制使用范围
  • 审查组织级代理的权限配置

安全建议

  • 规划和审查类代理优先使用只读工具
  • 避免在代理中硬编码敏感信息
  • 定期审计代理的工具使用情况

常见问题

Custom Agents和Chat Modes有什么区别?

Custom AgentsCustom Chat Modes的新名称,功能相同但术语更准确地反映了它们的用途。VS Code仍然识别旧的.chatmode.md文件,并提供快速修复操作将它们迁移到新格式。

如何知道一个代理来自哪里?

在代理下拉菜单中选择Configure Custom Agents,然后将鼠标悬停在代理上,工具提示会显示来源:内置、用户配置文件、工作区、组织或扩展。

可以同时使用多个代理吗?

不可以,每次只能激活一个代理。但你可以通过handoffs在代理之间快速切换,并且可以在Prompt文件中引用特定的代理。

如果指定的工具不可用会怎样?

如果配置的工具在使用时不可用,它会被忽略,代理使用其他可用的工具。建议配置前确认工具的可用性。

组织级代理如何启用?

需要将设置github.copilot.chat.customAgents.showOrganizationAndEnterpriseAgents设置为true,然后VS Code会自动发现你有权访问的组织级代理。

可以在代理中引用MCP服务器吗?

可以,在tools配置中使用<server-name>/*格式可以包含整个MCP服务器的所有工具,或者单独指定MCP工具名称。

Handoffs的prompt可以包含变量吗?

当前handoffsprompt是静态文本,但它会继承当前对话的上下文,所以可以通过上下文传递动态信息。

如何调试自定义代理?

  • 检查代理文件的YAML语法是否正确
  • 验证配置的工具名称是否存在
  • 测试代理的指令是否按预期工作
  • 查看VS Code的输出面板获取错误信息

可以为代理配置快捷键吗?

目前VS Code不直接支持为代理配置快捷键,但你可以使用键盘导航:使用Tab键在代理下拉菜单中切换,使用Enter选择。

代理会影响性能吗?

代理本身不会显著影响性能。性能主要取决于所使用的工具和模型。合理配置工具集可以提升响应速度。

参考资料

官方文档

社区资源

扩展阅读