现已发布!阅读关于 11 月新增功能和修复的内容。

语言模型工具 API

语言模型工具使您能够通过特定于领域的 istory 来扩展大型语言模型 (LLM) 的功能。为了处理用户的聊天提示,VS Code 中的代理可以自动调用这些工具来在对话中执行专门的任务。

通过在您的 VS Code 扩展中贡献一个语言模型工具,您可以扩展代理式编码工作流,同时还提供与编辑器的深度集成。扩展工具是 VS Code 中可用的三种工具类型之一,另外还有内置工具和 MCP 工具

在本扩展指南中,您将学习如何使用语言模型工具 API 创建语言模型工具,以及如何在聊天扩展中实现工具调用。

您还可以通过贡献MCP 服务器来扩展具有专用工具的聊天体验。有关不同选项以及如何决定使用哪种方法的详细信息,请参阅AI 扩展性概述

提示

有关作为最终用户使用工具的信息,请参阅在聊天中使用工具

LLM 中的工具调用是什么?

语言模型工具是可以在语言模型请求中调用的函数。例如,您可能有一个从数据库检索信息、执行某些计算或调用在线 API 的函数。当您在 VS Code 扩展中贡献一个工具时,代理模式可以根据对话的上下文调用该工具。

LLM 实际上永远不会执行工具本身,而是生成用于调用您的工具的参数。清楚地描述工具的目的、功能和输入参数非常重要,以便可以在正确的上下文中调用该工具。

下图显示了 VS Code 中代理模式下的工具调用流程。有关涉及的具体步骤,请参阅工具调用流程

Diagram that shows the Copilot tool-calling flow

在此处阅读有关函数调用的更多信息,请参阅 OpenAI 文档。

为什么要为您的扩展实现语言模型工具?

在您的扩展中实现语言模型工具有几个好处

在以下场景下,您可能需要考虑使用MCP 服务器实现语言模型工具

  • 您已经有一个 MCP 服务器实现,并且也想在 VS Code 中使用它。
  • 您希望在不同的开发环境和平台之间重用同一个工具。
  • 您的工具作为一项服务托管在远程。
  • 您不需要访问 VS Code API。

了解有关工具类型之间的区别的更多信息。

创建语言模型工具

实现语言模型工具包括两个主要部分

  1. 在扩展的package.json文件中定义工具的配置。
  2. 使用语言模型 API 参考在扩展代码中实现工具。

您可以从基本示例项目开始。

1. package.json中的静态配置

在扩展中定义语言模型工具的第一步是在扩展的package.json文件中定义它。此配置包括工具名称、描述、输入架构和其他元数据。

  1. 在扩展的package.json文件的contributes.languageModelTools部分添加您工具的条目。

  2. 为工具指定一个唯一的名称

    属性 描述
    name 用于在扩展实现代码中引用工具的工具的唯一名称。将名称格式化为{verb}_{noun}。请参阅命名指南
    displayName 用户友好的工具名称,用于在 UI 中显示。
  3. 如果该工具可以与代理一起使用,或者可以使用#在聊天提示中引用,请添加以下属性

    用户可以在聊天视图中启用或禁用该工具,方式与模型上下文协议 (MCP) 工具类似。

    属性 描述
    canBeReferencedInPrompt 如果该工具可以与代理一起使用或在聊天中引用,则将其设置为true
    toolReferenceName 用户通过#在聊天提示中引用该工具的名称。
    icon 将在 UI 中显示的工具图标。
    userDescription 用户友好的工具描述,用于在 UI 中显示。
  4. modelDescription中添加详细描述。LLM 使用此信息来确定应在何种上下文中使用您的工具

    • 该工具具体做什么?
    • 它返回什么类型的信息?
    • 何时应使用它,何时不应使用?
    • 描述工具的重要限制或约束。
  5. 如果工具需要输入参数,请添加inputSchema属性来描述工具的输入参数。

    此 JSON schema 描述了一个对象,其中包含工具作为输入接收的属性以及它们是否必需。文件路径应为绝对路径。

    描述每个参数的作用以及它与工具功能的联系。

  6. 添加一个when子句来控制工具的可用时间。

    languageModelTools贡献点允许您通过使用when 子句来限制工具在代理模式下何时可用或何时可以在提示中引用。例如,一个获取调试调用堆栈信息的工具,应该只在用户调试时可用。

    "contributes": {
        "languageModelTools": [
            {
                "name": "chat-tools-sample_tabCount",
                ...
                "when": "debugState == 'running'"
            }
        ]
    }
    
示例工具定义

以下示例显示了如何定义一个计算选项卡组中活动选项卡数量的工具。

"contributes": {
    "languageModelTools": [
        {
            "name": "chat-tools-sample_tabCount",
            "tags": [
                "editors",
                "chat-tools-sample"
            ],
            "toolReferenceName": "tabCount",
            "displayName": "Tab Count",
            "modelDescription": "The number of active tabs in a tab group in VS Code.",
            "userDescription": "Count the number of active tabs in a tab group.",
            "canBeReferencedInPrompt": true,
            "icon": "$(files)",
            "inputSchema": {
                "type": "object",
                "properties": {
                    "tabGroup": {
                        "type": "number",
                        "description": "The index of the tab group to check. This is optional- if not specified, the active tab group will be checked.",
                        "default": 0
                    }
                }
            }
        }
    ]
}

2. 工具实现

使用语言模型 API实现语言模型工具。这包括以下步骤

  1. 在扩展激活时,使用vscode.lm.registerTool注册工具。

    提供您在package.jsonname属性指定的工具名称。

    如果您希望该工具仅供您的扩展使用,请跳过工具注册步骤。

    export function registerChatTools(context: vscode.ExtensionContext) {
      context.subscriptions.push(
        vscode.lm.registerTool('chat-tools-sample_tabCount', new TabCountTool())
      );
    }
    
  2. 创建一个实现vscode.LanguageModelTool<>接口的类。

  3. prepareInvocation方法中添加工具确认消息。

    始终会显示一个通用的确认对话框,用于扩展中的工具,但工具可以自定义确认消息。为用户提供足够的信息以了解工具正在做什么。消息可以是包含代码块的MarkdownString

    以下示例显示了如何为选项卡计数工具提供确认消息。

    async prepareInvocation(
        options: vscode.LanguageModelToolInvocationPrepareOptions<ITabCountParameters>,
        _token: vscode.CancellationToken
    ) {
        const confirmationMessages = {
            title: 'Count the number of open tabs',
            message: new vscode.MarkdownString(
                `Count the number of open tabs?` +
                (options.input.tabGroup !== undefined
                    ? ` in tab group ${options.input.tabGroup}`
                    : '')
            ),
        };
    
        return {
            invocationMessage: 'Counting the number of tabs',
            confirmationMessages,
        };
    }
    

    如果prepareInvocation返回undefined,则会显示通用的确认消息。请注意,用户还可以选择“始终允许”某个工具。

  4. 定义一个描述工具输入参数的接口。

    该接口在vscode.LanguageModelTool类的invoke方法中使用。输入参数将根据您在package.jsoninputSchema中定义的 JSON schema 进行验证。

    以下示例显示了选项卡计数工具的接口。

    export interface ITabCountParameters {
      tabGroup?: number;
    }
    
  5. 实现invoke方法。当在处理聊天提示时调用语言模型工具时,将调用此方法。

    invoke方法在options参数中接收工具输入参数。这些参数将根据package.jsoninputSchema中定义的 JSON schema 进行验证。

    发生错误时,请抛出一条对 LLM 有意义的错误消息。或者,提供有关 LLM 接下来应该做什么的说明,例如使用不同的参数重试,或执行不同的操作。

    以下示例显示了选项卡计数工具的实现。工具的结果是vscode.LanguageModelToolResult类型的实例。

    async invoke(
        options: vscode.LanguageModelToolInvocationOptions<ITabCountParameters>,
        _token: vscode.CancellationToken
    ) {
        const params = options.input;
        if (typeof params.tabGroup === 'number') {
            const group = vscode.window.tabGroups.all[Math.max(params.tabGroup - 1, 0)];
            const nth =
                params.tabGroup === 1
                    ? '1st'
                    : params.tabGroup === 2
                        ? '2nd'
                        : params.tabGroup === 3
                            ? '3rd'
                            : `${params.tabGroup}th`;
            return new vscode.LanguageModelToolResult([new vscode.LanguageModelTextPart(`There are ${group.tabs.length} tabs open in the ${nth} tab group.`)]);
        } else {
            const group = vscode.window.tabGroups.activeTabGroup;
            return new vscode.LanguageModelToolResult([new vscode.LanguageModelTextPart(`There are ${group.tabs.length} tabs open.`)]);
        }
    }
    

在 VS Code 扩展示例存储库中查看实现语言模型工具的完整源代码。

工具调用流程

当用户发送聊天提示时,将执行以下步骤

  1. Copilot 根据用户的配置确定可用工具列表。

    工具列表包括内置工具、扩展注册的工具以及来自MCP 服务器的工具。您可以通过扩展或 MCP 服务器(图中绿色部分所示)为代理模式做出贡献。

  2. Copilot 将请求发送到 LLM,并为 LLM 提供提示、聊天上下文和要考虑的工具定义列表。

    LLM 生成响应,其中可能包含一个或多个调用工具的请求。

  3. 如果需要,Copilot 将使用 LLM 提供的参数值调用建议的工具。

    工具响应可能会导致更多工具调用的请求。

  4. 如果存在错误或后续工具请求,Copilot 将在工具调用流程中进行迭代,直到所有工具请求都得到解决。

  5. Copilot 将最终响应返回给用户,其中可能包含来自多个工具的响应。

指南和约定

  • 命名:为工具和参数编写清晰且描述性的名称。

    • 工具名称:应是唯一的,并清晰地描述其意图。将工具名称格式化为{verb}_{noun}。例如,get_weatherget_azure_deploymentget_terminal_output

    • 参数名称:应描述参数的用途。将参数名称格式化为{noun}。例如,destination_locationtickerfile_name

  • 描述:为工具和参数编写详细的描述。

    • 描述工具的作用以及何时应使用它,何时不应使用。例如,“此工具检索给定位置的天气。”
    • 描述每个参数的作用以及它与工具功能的联系。例如,“destination_location参数指定要检索天气的位置。它应为有效的地点名称或坐标。”
    • 描述工具的重要限制或约束。例如,“此工具仅检索美国境内的天气数据。对于其他地区可能不起作用。”
  • 用户确认:为工具调用提供确认消息。始终会显示一个通用的确认对话框,用于扩展中的工具,但工具可以自定义确认消息。为用户提供足够的信息以了解工具正在做什么。

  • 错误处理:发生错误时,请抛出一条对 LLM 有意义的错误消息。或者,提供有关 LLM 接下来应该做什么的说明,例如使用不同的参数重试,或执行不同的操作。

在此处获取创建工具的更多最佳实践,请参阅OpenAI 文档Anthropic 文档

© . This site is unofficial and not affiliated with Microsoft.