チャット参加者 API

チャット参加者(Chat participants)とは、専門知識を持つエキスパートとして VS Code のチャット機能を拡張できる、特殊なアシスタントです。ユーザーは @-メンションを使ってチャット参加者を呼び出し、呼び出された参加者はユーザーの自然言語によるプロンプトを処理する責任を負います。

この拡張機能ガイドでは、チャット参加者 API を使用してチャット参加者を作成する方法を学習します。

VS Code には、@vscode@terminal@workspace といった組み込みのチャット参加者がいくつか存在します。これらはそれぞれの専門分野に関する質問に回答できるよう最適化されています。

チャット参加者は、ユーザーのチャットプロンプトを解決するために必要なステップを LLM が調整する過程で呼び出される 言語モデルツール とは異なります。チャット参加者はユーザーのプロンプトを受け取り、必要なタスクを自ら調整します。

なぜ拡張機能にチャット参加者を実装するのか?

拡張機能にチャット参加者を実装することには、いくつかの利点があります。

  • チャットを拡張する: 専門的でドメイン固有の知識や専門知識を提供します。例えば、組み込みの @vscode 参加者は VS Code とその拡張機能 API に関する知識を持っています。
  • 会話をコントロールする: ユーザーのチャットプロンプトと応答をエンドツーエンドで管理します。
  • VS Code と深く統合する: 幅広い拡張機能 API を活用できます。例えば、デバッグ API を使用して現在のデバッグコンテキストを取得し、それをツール機能の一部として利用できます。
  • 配布と展開: Visual Studio Marketplace を通じてチャット参加者を配布・展開し、ユーザーに信頼性の高いシームレスな体験を提供します。ユーザーは個別のインストールや更新プロセスを気にする必要はありません。

自律的なエージェントによるコーディングセッションの一部として自動的に呼び出されるドメイン固有の機能を提供したい場合は、言語モデルツール または MCP サーバー の実装を検討してください。さまざまなオプションの詳細や、どの手法を採用すべきかの判断基準については、AI 拡張性概要 を参照してください。

チャットユーザーエクスペリエンスの構成要素

以下のスクリーンショットは、サンプル拡張機能における VS Code チャット体験の概念を示しています。

Chat concepts explanation

  1. @ 構文を使用して @cat チャット参加者を呼び出す
  2. / 構文を使用して /teach コマンドを呼び出す
  3. ユーザーが入力したクエリ(ユーザープロンプト)
  4. Copilot が @cat チャット参加者を使用していることを示すアイコンと参加者の fullName
  5. @cat が提供する Markdown 形式の応答
  6. Markdown 応答に含まれるコードフラグメント
  7. @cat の応答に含まれるボタン。クリックすると VS Code コマンドが実行される
  8. チャット参加者が提供する推奨の フォローアップ質問
  9. チャット参加者の description プロパティによるプレースホルダーテキストが表示されたチャット入力フィールド

チャット参加者を作成する

チャット参加者の実装は、以下の工程で構成されます。

  1. 拡張機能の package.json ファイルでチャット参加者を定義する。
  2. リクエストハンドラーを実装し、ユーザーのチャットプロンプトを処理して応答を返す。
  3. (オプション)チャットのスラッシュコマンドを実装し、よく使うタスクを簡単に呼び出せるようにする。
  4. (オプション)推奨されるフォローアップ質問を定義する。
  5. (オプション)参加者の検出機能を実装し、ユーザーが明示的にメンションしなくても VS Code が適切なチャット参加者にリクエストを自動ルーティングできるようにする。

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

Diagram showing how extension can contribute to chat

1. チャット参加者を登録する

チャット拡張機能を作成する最初のステップは、package.json で以下のプロパティを指定して登録することです。

  • id: package.json ファイルで定義された、チャット参加者の一意の識別子。
  • name: チャットでの @-メンションに使用される短い名前。
  • fullName: 応答のタイトルエリアに表示される、チャット参加者の正式名称。
  • description: チャット参加者の目的を示す簡潔な説明。チャット入力フィールドのプレースホルダーとして使用されます。
  • isSticky: 応答後にチャット参加者が入力フィールドに残り続けるかどうかを示すブール値。
"contributes": {
        "chatParticipants": [
            {
                "id": "chat-sample.my-participant",
                "name": "my-participant",
                "fullName": "My Participant",
                "description": "What can I teach you?",
                "isSticky": true
            }
        ]
}

既存のチャット参加者と合わせるために、name は小文字にし、fullName はタイトルケース(単語の先頭を大文字)にすることをお勧めします。チャット参加者の命名規則に関する詳細を確認してください。

注意

一部の参加者名は予約されています。予約された名前を使用した場合、VS Code はチャット参加者の完全修飾名(拡張機能 ID を含む)を表示します。

2. リクエストハンドラーを実装する

チャット参加者 API を使用してチャット参加者を実装します。これには以下のステップが含まれます。

  1. 拡張機能の有効化時に、vscode.chat.createChatParticipant を使用して参加者を作成する。

    package.json で定義した ID と、次のステップで実装するリクエストハンドラーへの参照を渡す。

    export function activate(context: vscode.ExtensionContext) {
      // Register the chat participant and its request handler
      const cat = vscode.chat.createChatParticipant('chat-sample.my-participant', handler);
    
      // Optionally, set some properties for @cat
      cat.iconPath = vscode.Uri.joinPath(context.extensionUri, 'cat.jpeg');
    
      // Add the chat request handler here
    }
    
  2. activate 関数内で vscode.ChatRequestHandler リクエストハンドラーを定義する。

    リクエストハンドラーは、VS Code チャットビューでのユーザーのチャットリクエストを処理する責任を負います。ユーザーがチャット入力フィールドにプロンプトを入力するたびに、チャットリクエストハンドラーが呼び出されます。

    const handler: vscode.ChatRequestHandler = async (
      request: vscode.ChatRequest,
      context: vscode.ChatContext,
      stream: vscode.ChatResponseStream,
      token: vscode.CancellationToken
    ): Promise<ICatChatResult> => {
      // Chat request handler implementation goes here
    };
    
  3. vscode.ChatRequest からユーザーの意図を判断する。

    ユーザーのリクエスト意図を判断するために、vscode.ChatRequest パラメーターを参照して、ユーザーのプロンプトテキスト、コマンド、チャットの場所(Location)にアクセスできます。

    オプションとして、従来のロジックを使用する代わりに言語モデルを活用して意図を判断することも可能です。request オブジェクトの一部として、ユーザーがチャットモデルのドロップダウンで選択した言語モデルのインスタンスを取得できます。拡張機能で 言語モデル API を使用する方法を学習してください。

    以下のコードスニペットは、最初にコマンドを使用し、次にユーザーのプロンプトを使用してユーザーの意図を判断する基本的な構造を示しています。

    const handler: vscode.ChatRequestHandler = async (
      request: vscode.ChatRequest,
      context: vscode.ChatContext,
      stream: vscode.ChatResponseStream,
      token: vscode.CancellationToken
    ): Promise<ICatChatResult> => {
      // Test for the `teach` command
      if (request.command == 'teach') {
        // Add logic here to handle the teaching scenario
        doTeaching(request.prompt, request.variables);
      } else {
        // Determine the user's intent
        const intent = determineUserIntent(request.prompt, request.variables, request.model);
    
        // Add logic here to handle other scenarios
      }
    };
    
  4. ユーザーリクエストを処理するロジックを追加する。

    チャット拡張機能では、多くの場合 request.model 言語モデルインスタンスを使用してリクエストを処理します。その際、ユーザーの意図に合わせて言語モデルのプロンプトを調整することがあります。

    あるいは、バックエンドサービスを呼び出したり、従来のプログラミングロジックを使用したり、あるいはこれらすべてを組み合わせて拡張機能のロジックを実装することもできます。例えば、ウェブ検索を呼び出して情報を収集し、それをコンテキストとして言語モデルに提供するといったことが可能です。

    現在のリクエストを処理する際、過去のチャットメッセージを参照したい場合があるでしょう。例えば、前の応答で C# のコードスニペットが返された場合、ユーザーの現在のリクエストが「これを Python で書いて」である可能性があります。チャットメッセージ履歴の使用方法を確認してください。

    チャット入力の場所(チャットビュー、クイックチャット、インラインチャット)に基づいてリクエストの処理方法を変えたい場合は、vscode.ChatRequestlocation プロパティを使用できます。例えば、ターミナルのインラインチャットからリクエストが送信された場合はシェルコマンドを検索し、チャットビューから送信された場合はより丁寧な応答を返す、といったことが可能です。

  5. チャットの応答をユーザーに返す。

    リクエストの処理が完了したら、チャットビューでユーザーに応答を返す必要があります。ストリーミングを使用してユーザーのクエリに応答できます。

    応答には、Markdown、画像、参照、進行状況、ボタン、ファイルツリーなど、さまざまなコンテンツタイプを含めることができます。

    Response from the cat extension that includes code, markdown and a button

    拡張機能は以下のように応答ストリームを使用できます。

    stream.progress('Picking the right topic to teach...');
    stream.markdown(`\`\`\`typescript
    const myStack = new Stack();
    myStack.push(1); // pushing a number on the stack (or let's say, adding a fish to the stack)
    myStack.push(2); // adding another fish (number 2)
    console.log(myStack.pop()); // eating the top fish, will output: 2
    \`\`\`
    So remember, Code Kitten, in a stack, the last fish in is the first fish out - which we tech cats call LIFO (Last In, First Out).`);
    
    stream.button({
      command: 'cat.meow',
      title: vscode.l10n.t('Meow!'),
      arguments: []
    });
    

    サポートされているチャット応答の出力タイプに関する詳細を確認してください。

    実際には、拡張機能は通常、言語モデルにリクエストを送信します。言語モデルから応答を受け取ったら、それをさらに処理し、ユーザーに何をストリーミングで返すかを決定します。VS Code Chat API はストリーミングベースであり、ストリーミング可能な 言語モデル API と互換性があります。これにより、拡張機能は進行状況や結果を継続的に報告し、スムーズなユーザー体験を提供できます。言語モデル API の使用方法を学んでください。

3. スラッシュコマンドを登録する

チャット参加者はスラッシュコマンドを提供できます。これは、拡張機能が提供する特定の機能へのショートカットです。ユーザーはチャット内で / 構文を使用してスラッシュコマンド(例: /explain)を呼び出すことができます。

質問に回答する際、ユーザーの意図を判断することが重要なタスクの1つです。例えば、「Node.js Express Pug TypeScript で新しいワークスペースを作成して」という要求を VS Code が解釈することもできますが、@workspace /new Node.js Express Pug TypeScript と入力する方がより明確で簡潔であり、タイピングの手間も省けます。チャット入力フィールドで / を入力すると、VS Code は登録済みのコマンドとその説明のリストを表示します。

List of commands in chat for @workspace

チャット参加者は、package.json に追加することで、説明付きのスラッシュコマンドを提供できます。

"contributes": {
    "chatParticipants": [
        {
            "id": "chat-sample.cat",
            "name": "cat",
            "fullName": "Cat",
            "description": "Meow! What can I teach you?",
            "isSticky": true,
            "commands": [
                {
                    "name": "teach",
                    "description": "Pick at random a computer science concept then explain it in purfect way of a cat"
                },
                {
                    "name": "play",
                    "description": "Do whatever you want, you are a cat after all"
                }
            ]
        }
    ]
}

スラッシュコマンドの命名規則に関する詳細を確認してください。

4. フォローアップリクエストを登録する

各チャットリクエストの後、VS Code はフォローアッププロバイダーを呼び出して、ユーザーに表示する推奨のフォローアップ質問を取得します。ユーザーはフォローアップ質問を選択し、即座にそれをチャット拡張機能に送信できます。ChatFollowupProvider API を使用して ChatFollowup 型のフォローアッププロンプトを登録します。

以下のコードスニペットは、チャット拡張機能でフォローアップリクエストを登録する方法を示しています。

cat.followupProvider = {
    provideFollowups(result: ICatChatResult, context: vscode.ChatContext, token: vscode.CancellationToken) {
        if (result.metadata.command === 'teach') {
            return [{
                prompt: 'let us play',
                label: vscode.l10n.t('Play with the cat')
            } satisfies vscode.ChatFollowup];
        }
    }
};
ヒント

フォローアップは、単なる簡潔なコマンドではなく、質問や指示の形式で記述する必要があります。

5. 参加者の検出機能を実装する

自然言語でチャット参加者を使いやすくするために、参加者の検出(Participant detection)を実装できます。参加者の検出とは、ユーザーがプロンプト内で明示的に言及しなくても、適切な参加者に質問を自動的にルーティングする仕組みです。例えば、ユーザーが「プロジェクトにログインページを追加するにはどうすればいい?」と尋ねた場合、プロジェクトに関する質問に回答できるため、@workspace 参加者に自動的にルーティングされます。

VS Code はチャット参加者の説明と例を使用して、どの参加者にプロンプトをルーティングするかを判断します。この情報は、拡張機能の package.json ファイルの disambiguation プロパティで指定できます。disambiguation プロパティには検出カテゴリのリストが含まれており、それぞれに説明と例が記述されています。

プロパティ 説明
category 検出カテゴリ。参加者が複数の異なる目的を持つ場合、目的ごとにカテゴリを作成できます。
  • cat
  • workspace_questions
  • web_questions
説明 その参加者に適した質問の種類についての詳細な説明。
  • ユーザーが特定のコンピュータサイエンスのトピックをカジュアルに学びたい場合。
  • ユーザーがただリラックスして、猫が遊んでいる様子を見たい場合。
examples 代表的な質問のリスト。
  • メタファーを使ってC++のポインタを教えて
  • 連結リストとは何か、簡単に説明して
  • レーザーポインタで遊んでいる猫を見せてくれる?

参加者全体、特定のコマンド、またはその両方の組み合わせに対して、参加者の検出を定義できます。

以下のコードスニペットは、参加者レベルで参加者の検出を実装する方法を示しています。

"contributes": {
    "chatParticipants": [
        {
            "id": "chat-sample.cat",
            "fullName": "Cat",
            "name": "cat",
            "description": "Meow! What can I teach you?",

            "disambiguation": [
                {
                    "category": "cat",
                    "description": "The user wants to learn a specific computer science topic in an informal way.",
                    "examples": [
                        "Teach me C++ pointers using metaphors",
                        "Explain to me what is a linked list in a simple way",
                        "Can you explain to me what is a function in programming?"
                    ]
                }
            ]
        }
    ]
}

同様に、commands プロパティ内の1つ以上のアイテムに対して disambiguation プロパティを追加することで、コマンドレベルで参加者の検出を構成することもできます。

拡張機能の参加者検出の精度を向上させるには、以下のガイドラインを適用してください。

  • 具体的であること: 説明と例は、他の参加者との衝突を避けるために可能な限り具体的に記述してください。参加者やコマンドの情報には一般的な用語を使用しないでください。
  • 例を使用する: 例は、その参加者に適した質問の種類を代表するものである必要があります。類義語やバリエーションを使用して、幅広いユーザークエリをカバーしてください。
  • 自然言語を使用する: 説明や例は、ユーザーに対して参加者を説明するように、自然言語で記述してください。
  • 検出をテストする: さまざまな例題を使用して参加者の検出をテストし、組み込みのチャット参加者と衝突しないことを確認してください。
注意

組み込みのチャット参加者は、参加者の検出において優先されます。例えば、ワークスペースファイルに対して動作するチャット参加者は、組み込みの @workspace 参加者と競合する可能性があります。

チャットメッセージ履歴を使用する

参加者は、現在のチャットセッションのメッセージ履歴にアクセスできます。参加者がアクセスできるのは、その参加者が言及されたメッセージのみです。履歴アイテムは ChatRequestTurn または ChatResponseTurn です。例えば、以下のコードスニペットを使用して、現在のチャットセッションでユーザーがあなたの参加者に送信したすべての過去のリクエストを取得できます。

const previousMessages = context.history.filter(h => h instanceof vscode.ChatRequestTurn);

履歴はプロンプトに自動的には含まれません。言語モデルにメッセージを渡す際に履歴をコンテキストとして追加するかどうかは、参加者が決定します。

サポートされているチャット応答の出力タイプ

チャットリクエストに応答を返すには、ChatRequestHandlerChatResponseStream パラメーターを使用します。

以下のリストは、チャットビューにおけるチャット応答の出力タイプを示しています。チャット応答では、複数の出力タイプを組み合わせることができます。

  • Markdown

    Markdown テキスト、単純なテキスト、または画像を表示します。CommonMark 仕様の一部であるすべての Markdown 構文を使用できます。ChatResponseStream.markdown メソッドを使用し、Markdown テキストを提供します。

    コードスニペットの例

    // Render Markdown text
    stream.markdown('# This is a title \n');
    stream.markdown('This is stylized text that uses _italics_ and **bold**. ');
    stream.markdown('This is a [link](https://vscode.dokyumento.jp).\n\n');
    stream.markdown('![VS Code](https://vscode.dokyumento.jp/assets/favicon.ico)');
    
  • コードブロック

    IntelliSense、コードフォーマット、およびアクティブなエディターにコードを適用するための対話型コントロールをサポートするコードブロックを表示します。コードブロックを表示するには、ChatResponseStream.markdown メソッドを使用し、コードブロック用の Markdown 構文(バッククォートを使用)を適用します。

    コードスニペットの例

    // Render a code block that enables users to interact with
    stream.markdown('```bash\n');
    stream.markdown('```ls -l\n');
    stream.markdown('```');
    
  • コマンドリンク

    ユーザーが選択して VS Code コマンドを呼び出せるリンクをチャット応答内に表示します。コマンドリンクを表示するには、ChatResponseStream.markdown メソッドを使用し、リンクの Markdown 構文 [リンクテキスト](command:commandId) を使用します。ここで URL にコマンド ID を指定します。例えば、次のリンクはコマンドパレットを開きます: [コマンドパレット](command:workbench.action.showCommands)

    サービスから Markdown テキストを読み込む際、コマンドインジェクションから保護するために、isTrusted プロパティに信頼された VS Code コマンド ID のリストを設定した vscode.MarkdownString オブジェクトを使用する必要があります。コマンドリンクを機能させるにはこのプロパティが必須です。isTrusted プロパティが設定されていない場合やコマンドがリストにない場合、コマンドリンクは動作しません。

    コードスニペットの例

    // Use command URIs to link to commands from Markdown
    let markdownCommandString: vscode.MarkdownString = new vscode.MarkdownString(
      `[Use cat names](command:${CAT_NAMES_COMMAND_ID})`
    );
    markdownCommandString.isTrusted = { enabledCommands: [CAT_NAMES_COMMAND_ID] };
    
    stream.markdown(markdownCommandString);
    

    コマンドが引数を取る場合、まず引数を JSON エンコードし、その JSON 文字列を URI コンポーネントとしてエンコードする必要があります。その後、エンコードされた引数をクエリ文字列としてコマンドリンクに追加します。

    // Encode the command arguments
    const encodedArgs = encodeURIComponent(JSON.stringify(args));
    
    // Use command URIs with arguments to link to commands from Markdown
    let markdownCommandString: vscode.MarkdownString = new vscode.MarkdownString(
      `[Use cat names](command:${CAT_NAMES_COMMAND_ID}?${encodedArgs})`
    );
    markdownCommandString.isTrusted = { enabledCommands: [CAT_NAMES_COMMAND_ID] };
    
    stream.markdown(markdownCommandString);
    
  • コマンドボタン

    VS Code コマンドを呼び出すボタンを表示します。コマンドは、組み込みコマンドでも、拡張機能で定義したものでも構いません。ChatResponseStream.button メソッドを使用し、ボタンのテキストとコマンド ID を提供します。

    コードスニペットの例

    // Render a button to trigger a VS Code command
    stream.button({
      command: 'my.command',
      title: vscode.l10n.t('Run my command')
    });
    
  • ファイルツリー

    ユーザーが個々のファイルをプレビューできるファイルツリーコントロールを表示します。例えば、新しいワークスペースの作成を提案する際にワークスペースのプレビューを表示する場合などです。ChatResponseStream.filetree メソッドを使用し、ファイルツリー要素の配列とファイルのベース場所(フォルダー)を提供します。

    コードスニペットの例

    // Create a file tree instance
    var tree: vscode.ChatResponseFileTree[] = [
      {
        name: 'myworkspace',
        children: [{ name: 'README' }, { name: 'app.js' }, { name: 'package.json' }]
      }
    ];
    
    // Render the file tree control at a base location
    stream.filetree(tree, baseLocation);
    
  • 進行状況メッセージ

    時間のかかる操作中に、ユーザーに中間フィードバックを提供するための進行状況メッセージを表示します。例えば、マルチステップ操作の各ステップの完了を報告する場合などです。ChatResponseStream.progress メソッドを使用し、メッセージを提供します。

    コードスニペットの例

    // Render a progress message
    stream.progress('Connecting to the database.');
    
  • リファレンス

    コンテキストとしてどの情報を使用したかを示すために、参照リストに外部 URL やエディターの場所を追加します。ChatResponseStream.reference メソッドを使用し、参照場所を提供します。

    コードスニペットの例

    const fileUri: vscode.Uri = vscode.Uri.file('/path/to/workspace/app.js'); // On Windows, the path should be in the format of 'c:\\path\\to\\workspace\\app.js'
    const fileRange: vscode.Range = new vscode.Range(0, 0, 3, 0);
    const externalUri: vscode.Uri = vscode.Uri.parse('https://vscode.dokyumento.jp');
    
    // Add a reference to an entire file
    stream.reference(fileUri);
    
    // Add a reference to a specific selection within a file
    stream.reference(new vscode.Location(fileUri, fileRange));
    
    // Add a reference to an external URL
    stream.reference(externalUri);
    
  • インライン参照

    URI またはエディターの場所へのインライン参照を追加します。ChatResponseStream.anchor メソッドを使用し、アンカーの場所とオプションのタイトルを提供します。シンボル(クラスや変数など)を参照する場合は、エディター内の場所を使用します。

    コードスニペットの例

    const symbolLocation: vscode.Uri = vscode.Uri.parse('location-to-a-symbol');
    
    // Render an inline anchor to a symbol in the workspace
    stream.anchor(symbolLocation, 'MySymbol');
    

重要: 画像とリンクは、信頼されたドメインリストに含まれるドメインが発信元である場合にのみ利用可能です。VS Code のリンク保護に関する詳細を確認してください。

ツール呼び出しを実装する

ユーザーのリクエストに応答するために、チャット拡張機能は言語モデルツールを呼び出すことができます。言語モデルツール および ツール呼び出しフロー について詳しく学んでください。

ツール呼び出しは2つの方法で実装できます。

  • @vscode/chat-extension-utils ライブラリ を使用して、チャット拡張機能でのツール呼び出しプロセスを簡略化する。
  • ツール呼び出しを自分で実装し、プロセスをより詳細に制御する。例えば、追加の検証を行ったり、LLM に送信する前にツールからの応答を特定の方法で処理したりする場合です。

チャット拡張ライブラリを使用したツール呼び出しの実装

@vscode/chat-extension-utils ライブラリ を使用すると、ツール呼び出しを簡略化できます。

チャット参加者vscode.ChatRequestHandler 関数内でツール呼び出しを実装します。

  1. 現在のチャットコンテキストに関連するツールを決定します。vscode.lm.tools を使用して、利用可能なすべてのツールにアクセスできます。

    以下のコードスニペットは、特定のタグを持つツールのみをフィルタリングする方法を示しています。

    const tools =
      request.command === 'all'
        ? vscode.lm.tools
        : vscode.lm.tools.filter(tool => tool.tags.includes('chat-tools-sample'));
    
  2. sendChatParticipantRequest を使用して、リクエストとツールの定義を LLM に送信します。

    const libResult = chatUtils.sendChatParticipantRequest(
      request,
      chatContext,
      {
        prompt: 'You are a cat! Answer as a cat.',
        responseStreamOptions: {
          stream,
          references: true,
          responseText: true
        },
        tools
      },
      token
    );
    

    ChatHandlerOptions オブジェクトには以下のプロパティがあります。

    • prompt: (オプション)チャット参加者のプロンプトに対する指示。
    • model: (オプション)リクエストに使用するモデル。指定しない場合は、チャットコンテキストのモデルが使用されます。
    • tools: (オプション)リクエストの検討対象となるツールのリスト。
    • requestJustification: (オプション)なぜそのリクエストが行われるのかを説明する文字列。
    • responseStreamOptions: (オプション)sendChatParticipantRequest を有効にして、応答を VS Code にストリーミングします。オプションで、参照や応答テキストを有効にすることも可能です。
  3. LLM からの結果を返します。これにはエラーの詳細やツール呼び出しのメタデータが含まれる場合があります。

    return await libResult.result;
    

この ツール呼び出しサンプル の完全なソースコードは、VS Code 拡張機能サンプルリポジトリで公開されています。

ツール呼び出しを自分で実装する

より高度なシナリオでは、ツール呼び出しを自分で実装することもできます。オプションとして、LLM プロンプトを作成するために @vscode/prompt-tsx ライブラリを使用できます。自ら実装することで、ツール呼び出しプロセスをより細かく制御できます。例えば、追加の検証を行ったり、LLM に送信する前にツール応答を特定の方法で処理したりする場合です。

VS Code 拡張機能サンプルリポジトリで、prompt-tsx を使用したツール呼び出しの実装 の完全なソースコードを確認してください。

成功を測定する

ユーザーフィードバックの「役に立たない(Unhelpful)」イベントに対するテレメトリログを追加し、参加者が処理したリクエストの総数をカウントすることで、成功を測定することをお勧めします。初期の参加者の成功メトリクスは、unhelpful_feedback_count / total_requests として定義できます。

const logger = vscode.env.createTelemetryLogger({
  // telemetry logging implementation goes here
});

cat.onDidReceiveFeedback((feedback: vscode.ChatResultFeedback) => {
  // Log chat result feedback to be able to compute the success metric of the participant
  logger.logUsage('chatResultFeedback', {
    kind: feedback.kind
  });
});

チャットの応答に対するその他のユーザー操作も、ポジティブな指標として測定する必要があります(例:チャット応答で生成されたボタンをユーザーが選択したなど)。AI は非決定論的な技術であるため、テレメトリを使用して成功を測定することは非常に重要です。実験を行い、測定し、反復的に参加者を改善して、優れたユーザー体験を確保してください。

ガイドラインと規則

ガイドライン

チャット参加者は、単なる質問回答ボットであるべきではありません。チャット参加者を構築する際は、創造性を発揮し、既存の VS Code API を使用して VS Code 内に豊かな統合を作成してください。ユーザーは、応答内のボタンや、チャット内の参加者へ導くメニュー項目など、豊かで便利なインタラクションを好みます。AI がユーザーを支援できる実生活のシナリオを考えてみてください。

すべての拡張機能がチャット参加者を提供するのが適切というわけではありません。参加者が多すぎると、ユーザー体験が低下する可能性があります。チャット参加者は、言語モデルへの指示を含むプロンプト全体を制御したい場合に最適です。注意深く作成された Copilot のシステムメッセージを再利用したり、他の参加者にコンテキストを提供したりできます。

例えば、言語拡張機能(C++ 拡張機能など)は、他のさまざまな方法で貢献できます。

  • 言語サービスの知能をユーザーのクエリにもたらすツールを提供する。例えば、C++ 拡張機能は #cpp ツールをワークスペースの C++ 状態に解決できます。これにより、Copilot 言語モデルに適切な C++ コンテキストが提供され、C++ に関する回答の質が向上します。
  • 言語モデルを活用したスマートアクションを提供する。従来の言語サービスの知識と組み合わせて、優れたユーザー体験を実現できます。例えば、C++ 拡張機能では既に「メソッドに抽出」といったスマートアクションを提供しており、これに言語モデルを使って新しいメソッドの適切なデフォルト名を生成させることが可能です。

チャット拡張機能は、費用のかかる操作や、取り消し不可能な編集・削除を行う場合には、明示的にユーザーの同意を求める必要があります。優れたユーザー体験のために、1つの拡張機能が複数のチャット参加者を提供することは推奨されません。拡張機能ごとに最大1つのチャット参加者にするというモデルは、UI 上でもスケールしやすいシンプルなものです。

チャット参加者の命名規則

プロパティ 説明 命名ガイドライン
id チャット参加者のグローバル一意識別子
  • 文字列値
  • 拡張機能名をプレフィックスとして使用し、その後に拡張機能の一意の ID を続ける
  • 例: chat-sample.catcode-visualizer.code-visualizer-participant
名前 ユーザーが @ 記号を通じて参照するチャット参加者の名前
  • 英数字、アンダースコア、ハイフンで構成される文字列値
  • 既存のチャット参加者との一貫性を保つため、すべて小文字にすることをお勧めします
  • 会社名や機能を関連付けることで、参加者の目的が名前から明確になるようにする
  • 一部の参加者名は予約されています。予約された名前を使用した場合、拡張機能 ID を含む完全修飾名が表示されます
  • 例: vscodeterminalcode-visualizer
fullName (オプション)参加者の正式名称。参加者からの応答のラベルとして表示されます
  • 文字列値
  • タイトルケースの使用を推奨します
  • 参加者には、会社名、ブランド名、またはユーザーにとって分かりやすい名前を使用してください
  • 例: GitHub CopilotVS CodeMath Tutor
説明 (オプション)チャット入力フィールドのプレースホルダーや参加者リストに表示される、チャット参加者が何をするかの短い説明
  • 文字列値
  • 文末に句読点を付けず、文章の先頭のみ大文字(センテンスケース)にすることをお勧めします
  • 水平方向のスクロールを避けるため、説明は短く保ってください
  • 例: Ask questions about VS CodeGenerate UML diagrams for your code

プロパティ、チャット応答、チャットユーザーインターフェースなど、ユーザー向けの要素でチャット参加者に言及する際は、API 名であるため「participant(参加者)」という用語を使用しないことを推奨します。例えば、@cat 拡張機能は「Cat extension for GitHub Copilot」のように呼ぶことができます。

スラッシュコマンドの命名規則

プロパティ 説明 命名ガイドライン
名前 ユーザーが / 記号を通じて参照するスラッシュコマンドの名前
  • 文字列値
  • 既存のスラッシュコマンドに合わせるため、ローワーキャメルケースの使用を推奨します
  • コマンド名からその目的が明確になるようにしてください
  • 例: fixexplainrunCommand
説明 (オプション)チャット入力フィールドやコマンドリストにプレースホルダーテキストとして表示される、スラッシュコマンドの簡単な説明
  • 文字列値
  • 文末に句読点を付けず、文章の先頭のみ大文字(センテンスケース)にすることをお勧めします
  • 水平方向のスクロールを避けるため、説明は短く保ってください
  • 例: Search for and execute a command in VS CodeGenerate unit tests for the selected code

拡張機能を公開する

AI 拡張機能を作成したら、Visual Studio Marketplace に公開できます。

  • VS Marketplace に公開する前に、Microsoft AI ツールと実践ガイドライン を読むことをお勧めします。これらのガイドラインは、AI 技術の責任ある開発と使用に関するベストプラクティスを提供しています。
  • VS Marketplace に公開することで、拡張機能は GitHub Copilot 拡張性に関する許容される開発および使用ポリシー を遵守することになります。
  • 拡張機能の公開 に記載されている手順に従って、Marketplace にアップロードしてください。
  • もし拡張機能が既にチャット以外の機能を提供している場合、拡張機能マニフェスト 内で GitHub Copilot への依存関係を導入しないことを強く推奨します。これにより、GitHub Copilot を使用していないユーザーも、GitHub Copilot をインストールすることなく、チャット以外の機能を利用できるようになります。

GitHub Apps を通じて GitHub Copilot を拡張する

あるいは、チャットビューでチャット参加者を提供する GitHub App を作成することで、GitHub Copilot を拡張することも可能です。GitHub App はサービスによって支えられており、github.com、Visual Studio、VS Code など、すべての GitHub Copilot サーフェス全体で機能します。一方で、GitHub App は VS Code API へのフルアクセスは持ちません。GitHub App を通じて GitHub Copilot を拡張する方法の詳細については、GitHub ドキュメント を参照してください。

言語モデルを使用する

チャット参加者は、幅広い方法で言語モデルを使用できます。例えば、サンプルチャット参加者 のように、カスタムプロンプトへの回答を得るためだけに使用する参加者もいます。より高度な参加者は、言語モデルの助けを借りて複数のツールを呼び出す自律的なエージェントのように動作します。このような高度な参加者の例として、組み込みの @workspace があります。これはワークスペースについて理解しており、ワークスペースに関する質問に回答できます。内部的には、@workspace は複数のツール(GitHub のナレッジグラフ、セマンティック検索、ローカルコードインデックス、VS Code の言語サービス)によって支えられています。

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