Language Model Tool API

Language Model Tool(言語モデルツール)を使用すると、大規模言語モデル(LLM)のチャット機能をドメイン固有の能力で拡張できます。VS Code のエージェントは、ユーザーのチャットプロンプトを処理する際、これらのツールを自動的に呼び出して、会話の一環として専門的なタスクを実行できます。

VS Code 拡張機能で Language Model Tool を提供することで、エージェントによるコーディングワークフローを拡張しつつ、エディターとの深い統合を実現できます。拡張機能用のツールは、組み込みツールや MCP ツールと並んで、VS Code で利用可能な 3 種類のツールのひとつです。

この拡張機能ガイドでは、Language Model Tools API を使用してツールを作成する方法と、チャット拡張機能でツール呼び出しを実装する方法について学習します。

MCP サーバーを提供することで、専門的なツールを使用してチャット体験を拡張することも可能です。利用可能なオプションやアプローチの選択方法については、AI 拡張性に関する概要を参照してください。

ヒント

エンドユーザーとしてツールを使用する方法については、チャットでのツールの使用を参照してください。

LLM におけるツール呼び出しとは?

Language Model Tool は、言語モデルへのリクエストの一部として呼び出せる関数です。たとえば、データベースから情報を取得する、計算を実行する、オンライン API を呼び出すといった関数が考えられます。VS Code 拡張機能でツールを提供すると、エージェントモードは会話のコンテキストに基づいてそのツールを呼び出せるようになります。

LLM が実際にツール自体を実行することはありません。LLM はツールを呼び出すためのパラメーターを生成します。適切なコンテキストでツールが呼び出されるよう、ツールの目的、機能、および入力パラメーターを明確に説明することが重要です。

次の図は、VS Code のエージェントモードにおけるツール呼び出しフローを示しています。各ステップの詳細については、ツール呼び出しフローを参照してください。

Diagram that shows the Copilot tool-calling flow

OpenAI ドキュメントの関数呼び出し(function calling)に関する詳細も合わせてお読みください。

拡張機能で Language Model Tool を実装する理由

拡張機能に Language Model Tool を実装することには、いくつかの利点があります。

  • エージェントモードの拡張: ユーザープロンプトへの応答の一部として自動的に呼び出される、専門的なドメイン固有のツールを追加できます。たとえば、データベースの構築やクエリ実行を有効にすることで、LLM に関連するコンテキストを動的に提供できます。
  • VS Code との深い統合: 豊富な拡張機能 API を活用できます。たとえば、デバッグ API を使用して現在のデバッグコンテキストを取得し、それをツール機能の一部として利用できます。
  • 配布と展開: Visual Studio Marketplace を通じてツールを配布・展開できるため、ユーザーに信頼性の高いシームレスな体験を提供できます。ユーザーは、ツールのためだけに別途インストールや更新の手順を踏む必要がありません。

以下のようなシナリオでは、MCP サーバーを使用した Language Model Tool の実装を検討するとよいでしょう。

  • すでに MCP サーバーを実装しており、それを VS Code でも利用したい場合。
  • 異なる開発環境やプラットフォーム間で同じツールを再利用したい場合。
  • ツールがサービスとしてリモートホストされている場合。
  • VS Code API へのアクセスが不要な場合。

ツールタイプの違いについてさらに詳しく学習してください。

Language Model Tool を作成する

Language Model Tool の実装は、主に 2 つのステップで構成されます。

  1. 拡張機能の package.json ファイルでツールの設定を定義する。
  2. 拡張機能コード内で Language Model API リファレンスを使用してツールを実装する。

基本的なサンプルプロジェクトから始めることができます。

1. package.json での静的設定

拡張機能で Language Model Tool を定義するための最初のステップは、package.json ファイルに定義することです。この設定には、ツール名、説明、入力スキーマ、その他のメタデータが含まれます。

  1. 拡張機能の package.json ファイルの contributes.languageModelTools セクションに、ツールのエントリを追加します。

  2. ツールに一意の名前を付ける

    プロパティ 説明
    名前 拡張機能の実装コード内でツールを参照するために使用される一意の名前です。{動詞}_{名詞} の形式で指定します。命名ガイドラインを参照してください。
    displayName ユーザーインターフェース(UI)に表示される、ユーザーにとってわかりやすい名前です。
  3. ツールをエージェントで使用したり、チャットプロンプトで # を使って参照したりできるようにする場合は、以下のプロパティを追加します。

    ユーザーは、Model Context Protocol (MCP) ツールと同様に、チャットビューでツールを有効または無効にできます。

    プロパティ 説明
    canBeReferencedInPrompt ツールをエージェントで使用したり、チャットで参照したりできるようにする場合は true に設定します。
    toolReferenceName ユーザーがチャットプロンプト内で # を使用してツールを参照するための名前です。
    icon UI でツールを表示するためのアイコンです。
    userDescription UI に表示される、ユーザーにとってわかりやすい説明文です。
  4. modelDescription に詳細な説明を追加します。この情報は、LLM がどのコンテキストでツールを使用すべきかを判断するために使用されます。

    • このツールは具体的に何をするのか?
    • どのような情報を返すのか?
    • いつ使用すべきで、いつ使用すべきでないのか?
    • ツールの重要な制限事項や制約事項を記述する。
  5. ツールに入力パラメーターが必要な場合は、ツールの入力パラメーターを記述する inputSchema プロパティを追加します。

    この JSON スキーマは、ツールが入力として受け取るプロパティを持つオブジェクトと、それらが必須かどうかを記述します。ファイルパスは絶対パスである必要があります。

    各パラメーターの役割と、ツールの機能との関連性を説明します。

  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. ツールの実装

Language Model 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,
        };
    }
    

    prepareInvocationundefined を返した場合、汎用的な確認メッセージが表示されます。なお、ユーザーは特定のツールに対して「常に許可する」を選択することもできます。

  4. ツールの入力パラメーターを記述するインターフェースを定義します。

    このインターフェースは vscode.LanguageModelTool クラスの invoke メソッドで使用されます。入力パラメーターは、package.jsoninputSchema で定義した JSON スキーマと照らし合わせて検証されます。

    次の例は、タブカウントツールのインターフェースです。

    export interface ITabCountParameters {
      tabGroup?: number;
    }
    
  5. invoke メソッドを実装します。このメソッドは、チャットプロンプトの処理中に Language Model Tool が呼び出されたときに実行されます。

    invoke メソッドは、options パラメーターでツールの入力パラメーターを受け取ります。これらのパラメーターは、package.jsoninputSchema で定義された JSON スキーマに基づいて検証されます。

    エラーが発生した場合は、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 拡張機能サンプルリポジトリで、Language Model Tool 実装の完全なソースコードを参照してください。

ツール呼び出しフロー

ユーザーがチャットプロンプトを送信すると、次のステップが発生します。

  1. Copilot はユーザーの設定に基づいて利用可能なツールの一覧を決定します。

    ツールの一覧は、組み込みツール、拡張機能によって登録されたツール、および MCP サーバーからのツールで構成されます。拡張機能または MCP サーバーを介してエージェントモードに貢献できます(図の緑色の部分)。

  2. Copilot はプロンプト、チャットコンテキスト、および検討すべきツール定義の一覧とともに、LLM にリクエストを送信します。

    LLM は応答を生成し、その中にツール呼び出しのリクエストが含まれる場合があります。

  3. 必要に応じて、Copilot は LLM によって提供されたパラメーター値を使用して、提案されたツールを呼び出します。

    ツールの応答が、さらなるツール呼び出しリクエストにつながる場合があります。

  4. エラーや後続のツールリクエストがある場合、Copilot はすべてのツールリクエストが解決されるまで、ツール呼び出しフローを繰り返します。

  5. Copilot は最終的な回答をユーザーに返します。これには複数のツールからの応答が含まれる可能性があります。

ガイドラインと慣習

  • 命名: ツールとパラメーターには、明確でわかりやすい名前を付けます。

    • ツール名: 一意であり、目的を明確に記述する必要があります。ツール名は {動詞}_{名詞} の形式で構成します。例: get_weather, get_azure_deployment, get_terminal_output

    • パラメーター名: パラメーターの目的を記述する必要があります。パラメーター名は {名詞} の形式で構成します。例: destination_location, ticker, file_name

  • 説明: ツールとパラメーターの詳細な説明を記述します。

    • ツールの役割と、いつ使用すべきか、いつ使用すべきでないかを説明します。例: 「このツールは、指定された場所の天気を取得します。」
    • 各パラメーターの役割と、それがツールの機能とどう関連するかを説明します。例: 「destination_location パラメーターは、天気を取得する場所を指定します。有効な場所名または座標である必要があります。」
    • ツールの重要な制限事項や制約事項を説明します。例: 「このツールは米国国内の場所の天気データのみを取得します。他の地域では動作しない可能性があります。」
  • ユーザーの確認: ツール呼び出しの確認メッセージを提供します。拡張機能のツールに対しては常に汎用的な確認ダイアログが表示されますが、ツール側で確認メッセージをカスタマイズすることも可能です。ツールが何をしているのかをユーザーが理解できるよう、十分なコンテキストを提供してください。

  • エラー処理: エラーが発生した場合は、LLM が解釈できるエラーメッセージをスローします。オプションで、再試行や別の操作を実行するなど、LLM が次に取るべき行動について指示を出してください。

ツール作成のベストプラクティスについては、OpenAI ドキュメントおよび Anthropic ドキュメントを参照してください。

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