尝试以扩展 VS Code 中的代理模式!

在 VS Code 中使用代理模式

借助 Visual Studio Code 中的聊天代理模式,你可以使用自然语言指定高级任务,让 AI 自主地推断请求、规划所需工作,并将更改应用到你的代码库。代理模式结合了代码编辑和工具调用来完成你指定的任务。在处理你的请求时,它会监控编辑和工具的结果,并迭代以解决出现的任何问题。

先决条件

为何使用代理模式?

代理模式经过优化,可在项目中跨多个文件进行自主编辑。它对于不仅需要代码编辑,还需要调用工具和终端命令的复杂任务特别有用。你可以使用代理模式来

  • 重构代码库的一部分,例如“重构应用程序以使用 Redis 缓存”。
  • 规划和实现新功能,例如“使用 OAuth 添加登录表单到应用程序中以进行身份验证”。
  • 将代码库迁移到新框架,例如“将应用程序从 React 迁移到 Vue.js”。
  • 为复杂任务生成实现计划,例如“使用 Swift 前端和 Node.js 后端创建膳食规划 Web 应用程序”。
  • 定义高级要求,例如“添加社交媒体分享功能”。

当你的编码任务定义不够明确,且可能还需要运行终端命令和工具时,代理模式尤其有用。代理模式自主确定相关上下文和任务来完成请求。它还可以多次迭代以解决中间问题,例如语法错误或测试失败。

在 VS Code 中启用代理模式

注意

代理模式从 VS Code 1.99 版本开始可用。

要在 VS Code 中启用代理模式,请启用 chat.agent.enabled 设置。

集中管理代理模式

若要通过设备管理在组织内部集中启用或禁用代理模式,请查阅企业文档中的集中管理 VS Code 设置

你可以集中管理以下与代理模式相关的设置

使用代理模式

在代理模式下,AI 自主运行并确定你的提示的相关上下文。

按照以下步骤开始使用

  1. 打开聊天视图(⌃⌘I (Windows、Linux Ctrl+Alt+I)),然后从聊天模式选择器中选择代理

    Screenshot showing the Chat view, highlighting agent mode selected.

    直接在 VS Code 稳定版内测版 中打开代理模式。

  2. 在聊天输入字段中输入你的编辑提示,然后选择发送Enter)以提交。

    你可以指定高级要求,无需指定要处理哪些文件。在代理模式下,AI 会自主确定相关上下文和要编辑的文件。

    尝试以下示例提示以开始使用

    • 使用 React 和 Node.js 创建一个膳食规划 Web 应用程序
    • 添加社交媒体分享功能
    • 将当前身份验证替换为 OAuth
  3. 代理模式可能会调用多个工具来完成不同的任务。你也可以选择工具图标来配置哪些工具可用于响应你的请求。

    Screenshot showing the Copilot Edits view, highlighting the Tools icon in the chat input.

    提示

    你也可以在提示中通过键入 # 后跟工具名称来直接引用工具。你可以在所有聊天模式(询问、编辑和代理模式)中执行此操作。

  4. 确认工具调用和终端命令。

    在运行终端命令或非内置工具之前,Copilot 会请求确认以继续。这是因为工具可能会在你的机器上本地运行,并执行修改文件或数据的操作。

    使用继续按钮下拉选项可自动确认当前会话、工作区或所有未来调用中使用的特定工具。了解如何管理工具批准并批准所有工具调用

    MCP Tool Confirmation

    如果你的项目在 tasks.json 中配置了任务,代理模式会尝试运行相应的任务。例如,如果你定义了构建任务,代理模式会在运行应用程序之前运行构建任务。使用 github.copilot.chat.agent.runTasks 设置来启用或禁用运行工作区任务。

  5. 你也可以在运行工具之前验证和编辑工具的输入参数。

    选择工具名称旁边的箭头以查看其详细信息和输入参数。你可以在运行工具之前编辑输入参数。

    MCP Tool Input Parameters

  6. Copilot 会检测代码编辑和终端命令中的问题,并会迭代并执行其他操作来解决这些问题。

    启用 github.copilot.chat.agent.autoFix 设置可自动诊断并修复生成的代码更改中的问题。此设置默认启用。

    例如,代理模式可能会因代码编辑而运行单元测试。如果测试失败,它会使用测试结果来解决问题。

    Copilot Edits 代理模式会多次迭代以解决问题。 chat.agent.maxRequests 设置控制 Copilot Edits 在代理模式下可以发出的最大请求数量。

  7. 当 Copilot 处理你的请求时,你会注意到 Copilot 会直接在编辑器中流式传输建议的代码编辑。

    聊天视图中以粗体显示已编辑的文件列表。编辑器覆盖控件可让你在建议的编辑之间导航。

  8. 审阅建议的编辑,并接受或放弃建议的编辑

  9. 继续迭代代码更改,以优化编辑或实现附加功能。

代理模式工具

代理模式使用工具在处理用户请求时完成专用任务。此类任务的示例包括列出目录中的文件、编辑工作区中的文件、运行终端命令、获取终端输出等。

代理模式可以使用以下工具

你可以查看和管理可用于响应请求的工具。在聊天视图中选择工具图标以查看和选择代理模式中可用的工具。

Screenshot showing the Chat view, highlighting the Tools icon in the chat input and showing the tools Quick Pick where you can select which tools are active.

根据工具的结果,代理可能会调用其他工具来完成整体请求。例如,如果代码编辑导致文件出现语法错误,代理可能会探索另一种方法并建议不同的代码更改。

重要

一个聊天请求一次最多可以启用 128 个工具。如果选择了超过 128 个工具,请通过在工具选择器中取消选择一些工具来减少工具的数量。

定义工具集

工具集是你可以在聊天中使用的工具集合。你可以像使用单个工具一样使用工具集。例如,在代理模式下使用工具选择器选择一个工具集,或者在你的提示中通过键入 # 后跟工具集名称来直接引用工具集。

Screenshot showing the tools picker, highlighting user-defined tool sets.

工具集使你能够将相关工具组合在一起,从而更容易在你的聊天提示、提示文件自定义聊天模式中使用它们。当你从 MCP 服务器或扩展安装了许多工具时,这会特别有用。

要创建工具集,请在聊天视图中选择配置聊天按钮,选择工具集,然后选择新建工具集文件。或者,你也可以从命令面板(⇧⌘P (Windows、Linux Ctrl+Shift+P))使用聊天:配置工具集命令。

Screenshot showing the Chat view, and Configure Chat menu, highlighting the Configure Chat button.

工具集文件是一个 .jsonc 文件,存储在你的用户配置文件中,包含代理模式工具列表。工具集具有以下结构

  • <工具集名称>:工具集的名称,它显示在工具选择器中以及在你的提示中引用工具集时。
  • tools:工具集中包含的工具名称列表。这些工具可以是内置工具、MCP 工具或由扩展贡献的工具。
  • description:工具集的简要描述。此描述与工具集名称一起显示在工具选择器中。
  • icon:工具集的图标,可在产品图标参考中找到其值。

以下代码片段显示了一个工具集文件的示例,该文件定义了一个名为 reader 的工具集

{
  "reader": {
    "tools": [
      "changes",
      "codebase",
      "fetch",
      "findTestFiles",
      "githubRepo",
      "problems",
      "usages"
    ],
    "description": "description",
    "icon": "tag"
  }
}

管理工具批准

在代理模式运行工具或终端命令之前,它会请求确认是否运行。这是因为它们可能会执行修改文件或数据或执行破坏性操作。

在聊天视图中,当发生工具或终端命令调用时,使用继续按钮下拉选项可自动确认当前会话、工作区或所有未来调用中使用的特定工具。

MCP Tool Confirmation

你可以通过使用命令面板中的聊天:重置工具确认命令来重置工具确认。

自动批准所有工具和命令(实验性)

如果你想自动批准所有工具和终端命令,你现在可以使用实验性的 chat.tools.autoApprove 设置。这将自动批准所有工具和命令调用,当语言模型希望运行工具时,VS Code 将不再请求确认。

注意

启用此设置后,你将无法取消模型可能采取的破坏性操作。

作为一种增强的边界,你可能只在连接到远程环境时选择设置 chat.tools.autoApprove。你需要将其设置为远程级别的设置,而不是用户级别的设置。请注意,作为你本地机器一部分(如开发容器)或可访问你凭据的远程环境仍会带来不同级别的风险。

自动批准终端命令(实验性)

在代理模式运行终端命令之前,它会请求确认是否运行。启用自动批准后,所有终端命令都会自动获得批准。

如果你想对哪些终端命令自动批准进行更精细的控制,请使用以下设置

  • github.copilot.chat.agent.terminal.allowList:一个命令或正则表达式列表,允许在终端工具中运行命令而无需明确批准。这些匹配命令的开头。可以通过将字符串用 / 字符包裹来提供正则表达式。例如,要允许所有命令,请使用 /.*/

  • github.copilot.chat.agent.terminal.denyList:一个命令或正则表达式列表,它会覆盖允许列表中的匹配项,并强制命令行需要明确批准。这些匹配命令的开头。可以通过将字符串用 / 字符包裹来提供正则表达式。

接受或放弃编辑

Copilot 在聊天视图中已更改文件列表中列出已编辑的文件。具有待处理编辑的文件在资源管理器视图和编辑器选项卡中也有指示器。

Screenshot that shows the Copilot Edits view, highlighting the changed files list and the indicator in the Explorer view and editor tabs.

使用编辑器覆盖控件,你可以通过使用向上 () 和向下 () 控件在建议的编辑之间导航。使用保留撤销按钮来接受或拒绝给定文件的编辑。

Screenshot showing the Editor with proposed changes, highlighting the review controls in the editor overlay controls.

在编辑器或聊天视图中使用保留撤销控件来接受或拒绝单个或所有建议的编辑。

Screenshot showing the Copilot Edits view, highlighting the Accept All and Discard All buttons.

通过 chat.editing.autoAcceptDelay 设置,你可以配置一个延迟,在此延迟之后建议的编辑将自动被接受。将鼠标悬停在编辑器覆盖控件上可以取消自动接受倒计时。

当你关闭 VS Code 时,待处理编辑的状态会被记住。当你重新打开 VS Code 时,待处理的编辑会被恢复,你仍然可以接受或放弃这些编辑。

编辑聊天请求(实验性)

注意

编辑聊天请求的功能从 VS Code 1.102 版本开始可用,目前是一个实验性功能。

你可以在活动聊天会话中编辑之前的聊天请求。如果你想优化提示或纠正错误,这会很有用。当你编辑之前的聊天请求时,会执行以下步骤

  1. 编辑后的请求以及所有后续请求和响应将从对话历史记录中删除。
  2. 这些请求所做的任何编辑都将还原到请求发起之前的状态。
  3. 编辑后的请求将添加到对话历史记录中,并提交给语言模型以获取新的响应。

编辑聊天请求等同于还原请求,然后使用编辑后的提示提交新请求。

Screenshot of the Chat view with a chat request being edited in-place.

有不同的方式来编辑聊天请求,通过 chat.editRequests 设置进行配置

  • inline:在聊天视图中选择请求以使其可原地编辑。使用Escape退出编辑模式。
  • hover:将鼠标悬停在聊天请求上并选择编辑图标(铅笔)以使其可原地编辑。使用Escape退出编辑模式。
  • input:将鼠标悬停在聊天请求上并选择编辑图标(铅笔)以在聊天输入字段中编辑请求。
  • none:禁用聊天视图中聊天请求的编辑。

还原编辑

当你发送请求来修改代码时,你可能希望回滚其中一些更改,例如,因为你想使用另一种实现策略,或者因为 Copilot 在生成编辑时开始走向错误的路径。

你可以使用聊天视图标题栏中的撤销上次编辑控件来还原上次编辑,并返回到发送上次请求之前的状态。在撤销上次编辑后,你可以再次使用聊天视图标题栏中的重做上次编辑控件来重做这些编辑。

Screenshot showing the Copilot Edits view, highlighting the Undo and Redo actions in the view title bar.

你也可以在 Copilot Edits 视图中将鼠标悬停在请求上时,使用撤销编辑(删除)控件(x 图标)来还原从该请求起所做的所有编辑。

Screenshot showing the Copilot Edits view, highlighting the Undo Edits control for a specific request.

中断代理模式请求

要中断正在进行的请求,你可以暂停它或取消它。当你暂停请求时,Copilot 会停止处理该请求并等待你的输入。

当你暂停请求时,你可以选择输入新的提示(这将取消当前请求),或者选择恢复当前请求。

当你取消请求时,Copilot 会中断并结束当前活动请求。你仍然可以审阅并接受或拒绝到那时为止所做的更改。

使用指令获取符合你编码风格的 AI 编辑

为了获得符合你的编码风格、首选框架和其他偏好的 AI 生成的代码编辑,你可以使用指令文件。指令文件使你能够在 Markdown 文件中描述你的编码风格和偏好,AI 会使用这些信息生成符合你要求的代码编辑。

你可以手动将指令文件作为上下文附加到你的聊天提示中,或者你可以配置指令文件自动应用。

以下代码片段显示了一个描述你的编码风格和偏好的指令文件示例

---
applyTo: "**"
---
# Project general coding standards

## Naming Conventions
- Use PascalCase for component names, interfaces, and type aliases
- Use camelCase for variables, functions, and methods
- Prefix private class members with underscore (_)
- Use ALL_CAPS for constants

## Error Handling
- Use try/catch blocks for async operations
- Implement proper error boundaries in React components
- Always log errors with contextual information

了解更多关于使用指令文件的信息。

设置

以下列表包含与代理模式相关的设置。你可以通过设置编辑器(⌘, (Windows、Linux Ctrl+,))配置设置。

常见问题

我为什么要使用代理模式而不是编辑模式?

选择编辑模式和代理模式时,请考虑以下标准

  • 编辑范围:代理模式自主确定相关上下文和要编辑的文件。在编辑模式下,你需要自己指定上下文。
  • 任务复杂度:代理模式更适合需要代码编辑以及工具和终端命令调用的复杂任务。
  • 持续时间:代理模式处理请求涉及多个步骤,因此可能需要更长时间才能获得响应。例如,确定相关上下文和要编辑的文件,确定行动计划等等。
  • 自修复:代理模式会评估生成的编辑结果,并可能多次迭代以解决中间问题。
  • 请求配额:在代理模式下,根据任务的复杂性,一个提示可能会导致对后端发出许多请求。

我收到一个错误,显示“每个请求不能超过 128 个工具。”

一个聊天请求一次最多可以启用 128 个工具。如果选择了超过 128 个工具,请通过在聊天视图的工具选择器中取消选择一些工具来减少工具的数量。

Screenshot showing the Chat view, highlighting the Tools icon in the chat input and showing the tools Quick Pick where you can select which tools are active.