チャット参加者 API
チャット参加者は、ユーザーがVS Code のチャットをドメイン固有のエキスパートで拡張できるようにする特殊なアシスタントです。ユーザーは @-メンションすることでチャット参加者を呼び出し、参加者はユーザーの自然言語プロンプトを処理する責任を負います。
この拡張機能ガイドでは、チャット参加者 API を使用してチャット参加者を作成する方法を学びます。
VS Code には、@vscode
、@terminal
、@workspace
などのいくつかの組み込みチャット参加者があります。これらはそれぞれのドメインに関する質問に答えるように最適化されています。
チャット参加者は、ユーザーのチャット プロンプトを解決するために必要なステップを LLM がオーケストレーションする一環として呼び出される言語モデル ツールとは異なります。チャット参加者はユーザーのプロンプトを受け取り、必要なタスクを自らオーケストレーションします。
拡張機能にチャット参加者を実装する理由
拡張機能にチャット参加者を実装することには、いくつかの利点があります。
- 専門的でドメイン固有の知識と専門知識でチャットを拡張します。たとえば、組み込みの
@vscode
参加者は、VS Code とその拡張機能 API に関する知識を持っています。 - エンドツーエンドのユーザー チャット プロンプトと応答を管理することで、会話を所有します。
- 幅広い拡張機能 API を使用して、VS Code と深く統合します。たとえば、デバッグ API を使用して、現在のデバッグ コンテキストを取得し、それをツールの機能の一部として使用します。
- Visual Studio Marketplace を介してチャット参加者を配布および展開し、ユーザーに信頼性の高いシームレスなエクスペリエンスを提供します。ユーザーは個別のインストールおよび更新プロセスを必要としません。
自律的なエージェント的なコーディングセッションの一部として自動的に呼び出されるドメイン固有の機能を提供したい場合は、言語モデルツールまたはMCPサーバーの実装を検討できます。さまざまなオプションと、どのアプローチを使用するかを決定する方法については、AI拡張機能の概要を参照してください。
チャットユーザーエクスペリエンスの一部
次のスクリーンショットは、サンプル拡張機能のVisual Studio Codeチャットエクスペリエンスにおけるさまざまなチャットの概念を示しています。
@
構文を使用して@cat
チャット参加者を呼び出す/
構文を使用して/teach
コマンドを呼び出す- ユーザーが提供するクエリ。ユーザープロンプトとも呼ばれます。
- Copilotが
@cat
チャット参加者を使用していることを示すアイコンと参加者のfullName
@cat
によって提供されるマークダウン応答- マークダウン応答に含まれるコードフラグメント
@cat
応答に含まれるボタン。このボタンはVS Codeコマンドを呼び出します。- チャット参加者によって提供される提案されたフォローアップの質問
- チャット参加者の
description
プロパティによって提供されるプレースホルダーテキストを含むチャット入力フィールド
チャット参加者を作成する
チャット参加者の実装は、以下の部分から構成されます
- 拡張機能の
package.json
ファイルでチャット参加者を定義します。 - ユーザーのチャットプロンプトを処理し、応答を返すリクエストハンドラーを実装します。
- (オプション) 共通のタスクのショートハンド表記をユーザーに提供するために、チャットスラッシュコマンドを実装します。
- (オプション) 提案されたフォローアップの質問を定義します。
- (オプション) 参加者検出を実装します。これにより、VS Codeはユーザーからの明示的な言及なしに、チャットリクエストを適切なチャット参加者に自動的にルーティングします。
基本的なサンプルプロジェクトから始めることができます。
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 を使用してチャット参加者を実装します。これには次のステップが含まれます。
-
拡張機能のアクティベーション時に、
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 }
-
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 };
-
vscode.ChatRequest
からユーザーの意図を判断します。ユーザーのリクエストの意図を判断するには、
vscode.ChatRequest
パラメーターを参照して、ユーザーのプロンプト テキスト、コマンド、チャットの場所をアクセスできます。オプションとして、従来のロジックを使用する代わりに、言語モデルを利用してユーザーの意図を判断することもできます。
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 } };
-
ユーザーのリクエストを処理するロジックを追加します。
チャット拡張機能は、多くの場合、
request.model
言語モデル インスタンスを使用して要求を処理します。この場合、ユーザーの意図に合わせて言語モデルのプロンプトを調整することがあります。または、バックエンドサービスを呼び出す、従来のプログラミングロジックを使用する、またはこれらのオプションすべてを組み合わせて拡張機能ロジックを実装することもできます。たとえば、ウェブ検索を呼び出して追加情報を収集し、それを言語モデルにコンテキストとして提供できます。
現在のリクエストを処理している間、以前のチャットメッセージを参照したい場合があります。たとえば、以前の応答がC#コードスニペットを返した場合、ユーザーの現在のリクエストは「Pythonでコードを教えてください」かもしれません。チャットメッセージ履歴](#use-the-chat-message-history)の使用方法を学んでください。
チャット入力の場所 (チャットビュー、クイックチャット、インラインチャット) に応じてリクエストを異なる方法で処理したい場合は、
vscode.ChatRequest
のlocation
プロパティを使用できます。たとえば、ユーザーがターミナルのインラインチャットからリクエストを送信した場合、シェルコマンドを検索するかもしれません。一方、ユーザーがチャットビューを使用した場合、より詳細な応答を返すことができます。 -
チャットの応答をユーザーに返す。
リクエストを処理したら、チャットビューでユーザーに応答を返す必要があります。ストリーミングを使用してユーザーのクエリに応答できます。
応答には、Markdown、画像、参照、進行状況、ボタン、ファイルツリーなど、さまざまなコンテンツタイプを含めることができます。
拡張機能は、次の方法で応答ストリームを使用できます。
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つは、ユーザーの意図を判断することです。たとえば、VS Codeは「Node.js Express Pug TypeScriptで新しいワークスペースを作成」が新しいプロジェクトを意味すると推測できますが、「@workspace /new Node.js Express Pug TypeScript
」の方がより明示的で簡潔であり、入力時間を節約できます。チャット入力フィールドに/
と入力すると、VS Codeは登録されたコマンドとその説明のリストを提供します。
チャット参加者は、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はフォローアッププロバイダーを呼び出して、ユーザーに表示する提案されたフォローアップの質問を取得します。ユーザーはフォローアップの質問を選択し、すぐにチャット拡張機能に送信できます。フォローアップの質問は、ユーザーが会話をさらに進めるためのインスピレーションを提供したり、チャット拡張機能のより多くの機能を探索したりするのに役立ちます。
次のコードスニペットは、チャット拡張機能でフォローアップリクエストを登録する方法を示しています。
cat.followupProvider = {
provideFollowups(result: ICatChatResult, context: vscode.ChatContext, token: vscode.CancellationToken) {
if (result.metadata.command === 'teach') {
return [{
prompt: 'let us play',
title: vscode.l10n.t('Play with the cat')
} satisfies vscode.ChatFollowup];
}
}
};
フォローアップは、単なる簡潔なコマンドではなく、質問または指示として記述する必要があります。
5. 参加者検出を実装する
自然言語でチャット参加者をより簡単に使用できるように、参加者検出を実装できます。参加者検出は、ユーザーの質問を適切な参加者に自動的にルーティングする方法であり、プロンプトで参加者を明示的に言及する必要はありません。たとえば、ユーザーが「プロジェクトにログインページを追加するにはどうすればよいですか?」と尋ねた場合、その質問は自動的に@workspace
参加者にルーティングされます。これは、ユーザーのプロジェクトに関する質問に答えることができるためです。
VS Codeは、チャット参加者の説明と例を使用して、どの参加者にチャットプロンプトをルーティングするかを決定します。この情報は、拡張機能のpackage.json
ファイルのdisambiguation
プロパティで指定できます。disambiguation
プロパティには、各検出カテゴリのリストが含まれ、それぞれに説明と例があります。
プロパティ | 説明 | 例 |
---|---|---|
カテゴリー |
検出カテゴリ。参加者が異なる目的を持つ場合、それぞれのカテゴリを持つことができます。 |
|
説明 |
この参加者に適した質問の種類について、詳細な説明。 |
|
例 |
代表的な質問の例のリスト。 |
|
全体的なチャット参加者、特定のコマンド、またはその両方の組み合わせに対して参加者検出を定義できます。
次のコードスニペットは、参加者レベルで参加者検出を実装する方法を示しています。
"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
参加者と競合する可能性があります。
チャットメッセージ履歴を使用する
参加者は、現在のチャットセッションのメッセージ履歴にアクセスできます。参加者は、自分が言及されたメッセージのみにアクセスできます。history
アイテムは、ChatRequestTurn
またはChatResponseTurn
のいずれかです。たとえば、次のコードスニペットを使用して、ユーザーが現在のチャットセッションで参加者に送信した以前のリクエストをすべて取得します。
const previousMessages = context.history.filter(h => h instanceof vscode.ChatRequestTurn);
履歴はプロンプトに自動的に含まれることはありません。メッセージを言語モデルに渡す際に、追加のコンテキストとして履歴を追加するかどうかは参加者が決定します。
サポートされているチャット応答出力タイプ
チャットリクエストに応答を返すには、ChatRequestHandler
のChatResponseStream
パラメータを使用します。
次のリストは、チャットビューでのチャット応答の出力タイプを示しています。チャット応答は、複数の異なる出力タイプを組み合わせることができます。
-
マークダウン
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('');
-
コードブロック
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)
。サービスからマークダウンテキストをロードする際のコマンドインジェクションから保護するために、
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
関数でツール呼び出しを実装します。
-
現在のチャットコンテキストに関連するツールを決定します。
vscode.lm.tools
を使用して利用可能なすべてのツールにアクセスできます。次のコードスニペットは、特定のタグを持つツールのみをフィルターする方法を示しています。
const tools = request.command === 'all' ? vscode.lm.tools : vscode.lm.tools.filter(tool => tool.tags.includes('chat-tools-sample'));
-
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にストリーミングできるようにします。オプションで、参照や応答テキストも有効にできます。
-
LLMから結果を返します。これにはエラーの詳細やツール呼び出しのメタデータが含まれる場合があります。
return await libResult.result;
このツール呼び出しサンプルの完全なソースコードは、VS Code拡張機能サンプルリポジトリで入手できます。
自分でツール呼び出しを実装する
より高度なシナリオでは、自分でツール呼び出しを実装することもできます。オプションで、LLMプロンプトの作成には@vscode/prompt-tsx
ライブラリを使用できます。自分でツール呼び出しを実装することで、ツール呼び出しプロセスをより詳細に制御できます。たとえば、追加の検証を実行したり、LLMに送信する前にツール応答を特定の方法で処理したりするためです。
prompt-tsx を使用したツール呼び出しの実装の完全なソースコードは、VS Code 拡張機能サンプルリポジトリで確認できます。
成功の測定
参加者の成功を測定するには、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++のCopilot回答の品質を向上させることができます。 - 言語モデルを、オプションで従来の言語サービス知識と組み合わせて使用し、優れたユーザーエクスペリエンスを提供するスマートアクションを提供します。たとえば、C++は、言語モデルを使用して新しいメソッドに適切なデフォルト名を生成する「メソッド抽出」スマートアクションをすでに提供している場合があります。
チャット拡張機能は、コストのかかる操作を実行したり、元に戻せないものを編集または削除しようとしたりする場合、ユーザーの同意を明示的に求める必要があります。優れたユーザーエクスペリエンスを実現するために、拡張機能が複数のチャット参加者を提供することは推奨されません。1つの拡張機能につき1つのチャット参加者までというシンプルなモデルは、UIでうまく拡張できます。
チャット参加者命名規則
プロパティ | 説明 | 命名ガイドライン |
---|---|---|
ID |
チャット参加者の一意のグローバル識別子 |
|
名前 |
チャット参加者の名前で、ユーザーが@ 記号で参照します。 |
|
フルネーム |
(オプション) 参加者のフルネーム。参加者からの応答のラベルとして表示されます。 |
|
説明 |
(オプション) チャット参加者が何をするかについての短い説明。チャット入力フィールドのプレースホルダーテキストとして、または参加者リストに表示されます。 |
|
プロパティ、チャット応答、チャットユーザーインターフェースなど、ユーザー向け要素でチャット参加者を参照する場合、APIの名前であるため「参加者」という用語を使用しないことをお勧めします。たとえば、@cat
拡張機能は「GitHub Copilot用猫拡張機能」と呼ぶことができます。
スラッシュコマンドの命名規則
プロパティ | 説明 | 命名ガイドライン |
---|---|---|
名前 |
スラッシュコマンドの名前。ユーザーが/ 記号で参照します。 |
|
説明 |
(オプション) スラッシュコマンドの短い説明。チャット入力フィールドのプレースホルダーテキスト、または参加者とコマンドのリストに表示されます。 |
|
拡張機能の公開
AI拡張機能を作成したら、Visual Studio Marketplaceに拡張機能を公開できます。
- VS Marketplace に公開する前に、Microsoft AI ツールと実践ガイドラインを読むことをお勧めします。これらのガイドラインは、AI 技術の責任ある開発と使用に関するベストプラクティスを提供します。
- VS Marketplaceに公開することにより、あなたの拡張機能はGitHub Copilot拡張機能の許容される開発および使用ポリシーに準拠していることになります。
- 拡張機能の公開に記載されているとおりにマーケットプレイスにアップロードします。
- 拡張機能がチャット以外の機能も提供している場合、拡張機能マニフェストで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の言語サービスを組み合わせた複数のツールによって駆動されています。