在 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 Copilot Edits view, highlighting the Tools icon in the chat input.

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

你可以通过配置 chat.extensionTools.enabled 设置来启用或禁用代理工具的使用。请查看企业文档中的集中管理 VS Code 设置,了解如何在组织中集中管理此设置。

定义工具集

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

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

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

要创建工具集,请在命令面板中使用聊天:配置工具集 > 创建新的工具集文件命令。工具集文件是一个 .jsonc 文件,存储在你的用户配置文件中。

工具集具有以下结构

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

以下代码片段显示了工具集文件的示例

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

管理工具审批

当调用工具时,Copilot 会请求确认是否运行该工具。这是因为工具可能在你的机器上本地运行并执行修改文件或数据的操作。

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

MCP Tool Confirmation

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

如果你想自动批准所有工具,现在可以使用实验性 chat.tools.autoApprove 设置。这会自动批准所有工具调用,当语言模型希望运行工具时,VS Code 不会请求确认。请记住,启用此设置后,你将无法取消模型可能采取的潜在破坏性操作。

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

请查看企业文档中的集中管理 VS Code 设置,了解如何在组织中集中管理自动批准工具设置。

接受或放弃编辑

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 时,待处理编辑会恢复,你仍然可以接受或放弃这些编辑。

恢复编辑

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

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

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

你还可以在 Copilot 编辑视图中将鼠标悬停在请求上时使用撤消编辑(删除)控件(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+,)) 配置设置。

常见问题

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

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

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