本站点文档内容均翻译自code.visualstudio.com,仅供个人学习,如有差异请以官网为准。

使用工具与代理

工具通过专门的功能扩展Visual Studio Code中的代理,以完成特定任务,例如搜索代码、运行命令、获取网页内容或调用API。VS Code支持三种类型的工具:内置工具、模型上下文协议 (MCP) 工具和扩展工具。

本文描述了 VS Code 中可用的不同类型的工具,如何在聊天提示中使用它们,以及如何管理工具调用和批准。

工具类型

VS Code 支持三种类型的工具,您可以在聊天中使用:

内置工具

VS Code 提供了一套全面的内置工具,这些工具在聊天中自动可用。这些工具涵盖了常见的开发任务,并且针对在您的工作区中工作进行了优化。

内置工具无需安装或配置,您一开始使用聊天功能就可以使用。

有关内置工具及其描述的完整列表,请参阅聊天工具参考

MCP 工具

模型上下文协议 (MCP) 是一个开放标准,通过统一的接口使 AI 模型能够使用外部工具和服务。MCP 服务器提供可以在 VS Code 中添加的工具,以扩展聊天的额外功能。

在聊天中使用MCP工具之前,您需要安装和配置MCP服务器。MCP服务器可以本地运行在您的机器上,也可以远程托管。MCP Apps

了解更多关于在 VS Code 中配置 MCP 服务器的信息.

重要

您的组织可能已经禁用了 VS Code 中的 MCP 服务器使用,或者限制了您可以使用的 MCP 服务器。请联系您的管理员以获取更多信息。

扩展工具

VS Code 扩展可以贡献与编辑器深度集成的工具。扩展工具使用语言模型工具 API 提供特定功能,同时访问 VS Code 扩展的全部 API 范围。

当您安装提供扩展工具的扩展时,扩展工具会自动可用。用户在安装扩展本身之外不需要单独安装或配置。

对于希望创建扩展工具的开发人员,请参阅语言模型工具API指南

启用聊天工具

在聊天中使用工具之前,您需要在聊天视图中启用它们。您可以通过使用工具选择器来逐个请求启用或禁用工具。安装 MCP 服务器扩展来添加更多工具,这些扩展贡献了工具。

小贴士

仅选择与您的提示相关的工具以提高结果。

要访问工具选择器:

  1. 打开聊天视图并选择Agent从代理选择器中。

  2. 选择聊天输入字段中的配置工具按钮。

    截图显示聊天视图,突出显示聊天输入中的配置工具按钮。

  3. 选择或取消选择工具以控制当前请求可用哪些工具。

    使用搜索框过滤工具列表。

当您自定义聊天时,提示文件自定义代理,您可以指定给定提示或模式可用哪些工具。了解更多关于工具列表优先级的信息。

在你的提示中使用工具

当使用智能体时,智能体会根据您的提示和请求上下文自动从启用的工具中确定使用哪些工具。智能体自主选择和调用相关工具以完成任务。

您还可以通过输入明确引用您的提示中的工具#接着是工具名称。这在您希望确保使用特定工具时非常有用。输入#在聊天输入字段中查看可用工具的列表,包括内置工具、已安装服务器的MCP工具、扩展工具和工具集。

显式工具引用示例:

  • 总结 #fetch https://code.visualstudio.com/updates 的内容
  • 如何在 Next.js 中进行路由? #githubRepo vercel/next.js
  • 修复 #problems 中的问题
  • 解释认证流程 #codebase

一些工具直接在提示中接受参数。例如,#获取需要一个URL和#github库需要一个仓库名称。

小贴士

默认情况下,工具调用详细信息在聊天对话中是折叠的。您可以通过选择聊天中的工具摘要行来展开它们,或者通过更改默认行为来调整。

chat.agent.thinking.collapsedTools
  • 在 VS Code 中打开
  • 在 VS Code Insiders 中打开
设置(实验性)。

工具批准

某些工具在运行之前需要您的批准。这是为了安全起见,因为工具可以执行修改文件、更改您的环境或通过恶意工具输出尝试提示注入攻击的操作。

当一个工具需要批准时,会出现一个确认对话框显示工具的详细信息。在批准工具之前,请仔细审核信息。您可以批准工具用于单次使用、当前会话、当前工作区或所有未来的调用。

工具确认对话框的截图,显示工具详细信息和批准选项。

工具和代理操作可能会导致文件修改。了解如何防止意外编辑工作区中的敏感文件

重要

在批准之前,请仔细审查工具参数,特别是修改文件、运行命令或访问外部服务的工具。请参阅 VS Code 中使用 AI 的安全注意事项

启用或禁用工具自动批准(实验性)

默认情况下,您可以选择自动批准任何工具。为了防止意外批准,您可以禁用特定工具的自动批准功能。

chat.tools.eligibleForAutoApproval
  • 在 VS Code 中打开
  • 在 VS Code Insiders 中打开
ORG 设置。将值设置为 假的始终需要手动批准该工具。

组织还可以使用设备管理策略来强制执行特定工具的手动批准。在企业文档中了解更多信息。

URL 审批

当一个工具尝试访问一个URL,例如获取工具,使用两步批准过程来保护您不受恶意或意外内容的影响。VS Code 在 Chat 视图中显示确认对话框,以供您查看网址详细信息。

  • 预先批准:批准对URL的请求

    这一步确保您信任正在联系的域,并可以防止敏感数据发送到不受信任的站点。

    显示URL详细信息和批准选项的URL批准对话框的截图。

    您可以选择一次性批准或自动批准未来的对该特定URL或域的请求。选择自动批准不会影响需要审查结果。当您选择允许请求到时,您可以选择为该URL或域配置预批准和后批准。

    注意

    预批准遵循“受信任域”功能。如果域在其中列出,您将自动批准向该域发送请求并跳过响应审核步骤。

  • 批准后:批准从URL获取的回复内容

    这一步确保您在将获取的内容添加到聊天或传递给其他工具之前进行审查,从而防止潜在的提示注入攻击。

    例如,您可能会批准从知名网站(如GitHub.com)获取内容的请求。但由于这些内容是用户生成的,其中可能包含有害内容,这些内容可能会操纵模型的行为。

    您可以选择一次性批准或自动批准来自特定 URL 或域的未来响应。

    重要

    批准后的步骤与“受信任域”功能无关,并且始终需要您的审核。这是为了防止在您信任的域上出现不受信任内容的问题的安全措施。

chat.tools.urls.autoApprove
  • 在 VS Code 中打开
  • 在 VS Code Insiders 中打开
设置用于存储您的自动批准URL模式。设置值是一个布尔值,用于启用或禁用请求和响应的自动批准,或者是一个具有批准请求批准回复用于粒度控制的属性。您可以使用确切的URL、通配符模式或通配符。

URL 自动批准示例:

{
"chat.tools.urls.autoApprove": {
    "https://www.example.com": false,
    "https://*.contoso.com/*": true,
    "https://example.com/api/*": {
        "approveRequest": true,
        "approveResponse": false
    }
}

重置工具确认

要清除所有保存的工具批准,请使用命令面板中的聊天:重置工具确认命令(⇧⌘P(Windows, Linux Ctrl+Shift+P)。

编辑工具参数

您可以在工具运行之前查看和编辑输入参数:

  1. 当工具确认对话框出现时,选择工具名称旁边的箭头以展开其详细信息。

  2. 根据需要编辑任何工具输入参数。

  3. 选择允许以修改后的参数运行工具。

终端命令

代理可能会在工作流程中使用终端命令来完成任务。当代理决定运行终端命令时,它使用内置的终端工具在 VS Code 中的集成终端中执行这些命令。

在聊天对话中,代理显示它运行的命令。您可以通过选择显示输出来在聊天中查看命令的输出 (>) 命令旁边。您还可以通过选择 显示终端 在集成终端中查看完整输出。

截图显示终端命令输出在聊天中。

使用实验

chat.tools.terminal输出位置
  • 在 VS Code 中打开
  • 在 VS Code Insiders 中打开
设置以配置终端命令输出的位置:在聊天中内联显示,或在集成终端中显示。

在终端面板中,您可以看到代理在聊天会话中使用的终端列表。您还可以通过终端列表中的聊天图标来区分代理终端。

截图显示集成终端和多个代理终端。

在后台继续终端命令

当代理运行一个长时间运行的终端命令,例如启动开发服务器或以监视模式运行构建时,您可以将命令推到后台。这使代理可以继续执行其他任务,而无需等待命令完成。

当命令正在运行时,继续在后台按钮会出现在聊天对话中的终端命令旁边。选择此按钮可将命令移至后台。命令继续运行,代理可以稍后检查其输出或使用终端执行其他任务。

代理还可以在运行终端命令时指定超时时间。当达到超时时间时,代理会停止等待命令并返回迄今为止收集的输出。使用

chat.tools.terminal.从模型强制设置超时时间
  • 在 VS Code 中打开
  • 在 VS Code Insiders 中打开
设置以控制是否强制执行代理指定的超时值。

自动批准终端命令

您可以使用以下方法配置哪些终端命令会自动批准

chat.tools.terminal.autoApprove
  • 在 VS Code 中打开
  • 在 VS Code Insiders 中打开
设置。您可以指定允许和拒绝的命令:

  • 设置命令为自动批准它们
  • 设置命令为假的始终需要批准
  • 使用正则表达式通过将模式包裹在 输入:/字符

例如:

{
  // 允许 `mkdir` 命令
  "mkdir": true,
  // 允许 `git status` 和以 `git show` 开头的命令
  "/^git (status|show\\b.*)$/": true,

  // 禁用 `del` 命令
  "del": false,
  // 禁用任何包含 "危险" 的命令
  "/危险/": false
}

默认情况下,模式与单独的子命令进行匹配。为了使命令自动批准,所有子命令必须匹配一个条目且不得匹配一个假的条目。

对于高级场景,请使用对象语法与匹配命令行属性以匹配完整的命令行而不是单独的子命令。

相关设置:

  • chat.tools.terminal.enableAutoApprove
    • 在 VS Code 中打开
    • 在 VS Code Insiders 中打开
    组织
    :永久禁用自动批准功能
  • chat.tools.terminal.阻止检测到的文件写入
    • 在 VS Code 中打开
    • 在 VS Code Insiders 中打开
    (实验性):检测文件写入(实验性)
  • chat.tools.terminal.ignoreDefaultAutoApproveRules
    • 在 VS Code 中打开
    • 在 VS Code Insiders 中打开
    (实验性):禁用所有默认规则(允许和阻止),对所有规则完全控制。
警告

自动批准终端命令提供了尽力保护,并假定代理没有恶意行为。启用终端自动批准时,保护自己免受提示注入的侵害非常重要,因为有可能有一些命令会溜掉。以下是检测可能失败的一些示例:

  • VS Code 使用 PowerShell 和 bash tree sitter 语法来提取子命令,因此如果这些语法没有检测到它们,模式将不会被检测到。
  • VS Code 使用 bash 语法,因为没有 zsh 或 fish 语法,所以一些子命令无法被检测到。
  • 文件写入的检测目前很有限,因此可能有可能通过终端对文件进行写入,而使用文件编辑代理工具则无法实现。
  • 通过各种技术如引用连接可以撤销自动批准。例如查找 - 执行通常会被阻止,但是查找 -e"'"ec尽管做着同样的事情,却不是。

如果有可能注入提示,或者您处于高风险环境,请考虑启用终端沙盒或在容器内运行VS Code。

沙盒终端命令(实验性)

终端沙盒限制了代理执行的命令对文件系统和网络的访问。启用沙盒时,终端命令会自动批准,无需用户确认,因为它们在受控环境中运行。

要启用终端沙盒,请设置

chat.tools.terminal.sandbox.enabled
  • 在 VS Code 中打开
  • 在 VS Code Insiders 中打开
设置为输入:.

启用沙盒时:

  • 命令默认具有对当前工作目录的读写访问权限
  • 默认情况下,所有域的网络访问都被阻止
  • 命令在没有标准确认对话框的情况下运行
注意

终端沙盒目前仅在 macOS 和 Linux 上支持。在 Windows 上,沙盒设置没有效果。

配置文件系统访问

使用

chat.tools.terminal.sandbox.linuxFileSystem
  • 在 VS Code 中打开
  • 在 VS Code Insiders 中打开
chat.tools.terminal.sandbox.macFileSystem
  • 在 VS Code 中打开
  • 在 VS Code Insiders 中打开
用于控制文件系统访问的设置:

{
  "chat.tools.terminal.sandbox.macFileSystem": {
    // 允许向工作目录写入
    "allowWrite": ["."],
    // 拒绝向特定子目录写入
    "denyWrite": ["./secrets/"],
    // 拒绝从特定路径读取
    "denyRead": ["/etc/passwd"]
  }
}

拒绝写入拒绝读取规则优先于允许写入规则。

配置网络访问

使用

chat.tools.终端.沙盒.网络
  • 在 VS Code 中打开
  • 在 VS Code Insiders 中打开
设置允许特定域名:

{
  "chat.tools.terminal.sandbox.network": {
    // 允许对特定域进行网络访问
    "允许的域": ["api.github.com", "*.npmjs.org"]
  }
}

默认情况下,启用沙盒时,所有域的网络访问将被阻止。

组工具与工具集

工具集是一组工具,您可以在提示中将其作为一个实体引用。工具集帮助您组织相关的工具,并使它们在聊天提示、提示文件自定义聊天代理中更易于使用。一些内置工具是预定义工具集的一部分,例如#编辑#搜索输入:.

创建工具集

创建工具集:

  1. 运行 Chat: 配置工具集 命令从命令面板并选择 创建新的工具集文件.

    或者,选择配置聊天在聊天视图中 > 工具集 > 创建新的工具集文件.

    截图显示聊天视图和配置聊天菜单,突出显示配置聊天按钮。

  2. 定义你的工具集在.jsonc打开的文件。

    工具集具有以下结构:

    {
      "阅读器": {
        "工具": ["更改", "代码库", "问题", "用法"],
        "描述": "用于阅读和收集上下文的工具",
        "图标": "书本"
      }
    }
    

    工具集属性:

    • 工具工具名称数组(内置工具、MCP工具或扩展工具)
    • 描述: 工具选择器中显示的简要说明
    • 图标:工具集的图标(参见产品图标参考

使用工具集

在提示中通过输入引用工具集#接着是工具集名称:

  • 分析代码库以查找安全问题 #reader
  • “数据库连接字符串在哪里定义的? #搜索”

在工具选择器中,工具集以可折叠的相关工具组的形式提供。您可以选择或取消选择整个工具集,以快速启用或禁用多个相关工具。

常见问题

我如何知道有哪些可用的工具?

类型#在聊天输入字段中查看所有可用工具的列表。您还可以使用聊天中的工具选择器来查看和管理活动工具的列表。

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

聊天请求每次最多可以启用128个工具。如果看到关于每个请求超过128个工具的错误:

  • 在聊天视图中打开工具选择器,并取消选择一些工具或整个MCP服务器,以减少数量。

  • 或者,启用虚拟工具

    github.copilot.chat.virtualTools.threshold
    • 在 VS Code 中打开
    • 在 VS Code Insiders 中打开
    设置自动管理大型工具集。

为什么代理没有使用命令提示符作为终端 shell?

代理使用您为终端配置的默认 shell,除非是 cmd。这是因为shell 集成不支持命令提示符,这意味着代理对终端内部发生的事情有非常有限的可见性。代理无法直接获取命令正在运行或已经完成的信号,而是需要依赖超时和观察终端是否变为空闲来继续操作。这导致了缓慢且不可靠的体验。

您仍然可以配置代理使用命令提示符

chat.tools.终端.终端配置.Windows
  • 在 VS Code 中打开
  • 在 VS Code Insiders 中打开
设置,然而这将导致体验劣于使用PowerShell。

"chat.tools.terminal.terminalProfile.windows": {
  "路径": "C:\\WINDOWS\\System32\\cmd.exe"
}

我可以自动批准所有工具和终端命令吗?

警告

此设置禁用了所有手动批准,包括可能具有破坏性的操作。它移除了重要的安全保护措施,使攻击者更容易破坏机器。仅在您理解其影响后才启用此设置。请参阅安全文档了解更多信息。

为了允许所有工具和终端命令在不提示用户确认的情况下运行,请启用chat.tools.global.autoApprove设置。此设置适用于所有您的工作区!

工具和聊天参与者之间有什么区别?

聊天参与者是专门的助手,使您能够在聊天中提出特定领域的提问。想象一下,聊天参与者就像一个领域的专家,您将聊天请求交给他们,他们会处理其余的事情。

工具作为代理流程的一部分被调用,以贡献和执行特定任务。您可以在一个聊天请求中包含多个工具,但每次只能有一个聊天参与者是活动的。

我可以创建自己的工具吗?

是的。您可以通过两种方式创建工具: