🦦

GitHub Copilotをカスタムできる? VS CodeのChat extensionsとは

2024/06/04に公開
4

※執筆時点の情報なので、内容が古くなっている可能性があります。最新の情報は公式ドキュメントをご確認ください。

はじめに

GitHub CopilotのAPIを自分で呼び出せて、カスタムできたらなーとなんとなく思っていた時代もあった私。

そんな私がVS CodeのAPIに Chat extensions というものが追加されたと知ってしまい、「これはもしや内部でGitHub CopilotのAPIを呼び出せるやつでは!?でもドキュメント見てもよくわからん…誰も記事書いてない…」となったので、実際にいじって確認した内容をまとめます。
ついでに出てくる言語モデルAPIについてもまとめています。

VS Codeの拡張機能開発も初めて、TypeScriptも不慣れなので間違いがあればご指摘ください。

VS Code拡張機能開発方法については取り上げませんので、こちらをご確認ください。

https://code.visualstudio.com/api/get-started/your-first-extension

結論

時間がない人向けに、Chat extensionsが何だったのかの結論です。

  • Chat extensionsはVS Codeの拡張機能開発時に使える機能
  • GitHub Copilot Chatと同じChat UIを使って拡張機能を開発できる
  • このChat UIを使うためには現状GitHub Copilotのライセンスが必要
  • 独自の「エージェント(Chat participants)」を作成して、チャットで独自のプロンプトをした言語モデルを呼び出せたり、独自の関数を呼び出せたりする
  • 現状呼び出せる言語モデルはvendorがcopilotgpt-3.5-turbogpt-4のみ(GitHub Copilotのモデルが呼び出されていそうな名前だがどんなモデルか明示はされていない)
  • チャット APIと言語モデル APIは執筆時点でVS Code Insiderでのみ利用可能で、2024年7月のVS Code 安定版リリースで完成する予定のもの

より詳しく知りたい方は続きをどうぞ!

Chat extensionsとは

公式ドキュメントはこちらです。

https://code.visualstudio.com/api/extension-guides/chat

Chat extensionsについてはこんな説明がなされています。

A chat extension is a VS Code extension that uses the Chat extension API by contributing a Chat participant.(チャット拡張機能は、チャット参加者を提供することによって、チャット拡張機能APIを使用するVS Code拡張機能です。)

VS Codeの拡張機能であること以外意味が分かりませんでした。チャット参加者??

Chat participant(チャット参加者)とは

GitHub Copilotでいう旧称「エージェント」(例:@workspace,@vscode)に値するものです。
@{{ChatParticipantName}} という形で呼び出すことができます。

Microsoft Buildで話題になったようなGitHub Copilot Extensionsを自分で作れるよ、という話です。

例えばCopilot Chatで@azureと指定するとAzureに関する質問ができるようになるGitHub Copilot for Azureが発表されていましたが、そのようなものを自作できます。
GitHub Copilot Extensionsについて詳細はこちらをご覧ください。

https://github.blog/2024-05-21-introducing-github-copilot-extensions/

チャット参加者ができること

1. AIを使用して要求を解釈し、応答を生成する(言語モデルAPIの利用)

GitHub Copilot Chatで質問をした後、その内容をAIに解釈させて応答させることができます。
この時、VS CodeのLanguage Model API(言語モデルAPI)を呼び出すことができます。

言語モデルAPIは、GPT-4など何らかの言語モデルを指定してそのモデルとのやり取りを担ってくれるAPIです。
モデルに送信するプロンプト作成、送信、応答の解釈を担ってるので、モデルさえあれば言語モデルとのやり取りを簡単にしてくれます。

これがあればAzure OpenAIにデプロイした独自のモデルを呼び出してVS Codeのチャット画面でやり取りできるようになるのでは!?と思いましたが、おそらくまだ対応されていませんでした。
「サポートされるモデルの一覧は増えていく」とは書かれていますが、今使えるモデルの一覧はどこにも見当たりませんでした…。
vendorの指定が必要なのですが、どこにもその一覧が見当たらないので見つけた方は教えてください。

ドキュメントに書かれている限り、現状vendorはcopilot、familyはgpt-3.5-turbogpt-4が指定できます。

名前からして現状できるのは以下2点のようです。

  • GitHub CopilotのAPI呼び出し
  • 呼び出すときに使うモデルをgpt-3.5-turbogpt-4など明示的に指定

なお、どんなモデルが呼び出されているのか、本当にGitHub Copilotのモデルが呼び出されているのかはドキュメントに明示されていませんでした。

この言語モデルAPIはChat以外でも呼び出し可能なので、VS Code拡張の開発の幅が広がりそうです。

2. 独自実装した関数の呼び出し

スラッシュコマンドが実装できるので、何らかのコマンドを受け取ったときに独自のワークフローを実行する、などができます。
TypeScriptで実装できるものなら何でもできるイメージなので、かなり自由度が高いです。

チャット拡張の公式実装例がこちらになります。これをみれば何でも実装できそうな感じが伝わると思います。

https://github.com/microsoft/vscode-extension-samples/blob/main/chat-sample/src/extension.ts

チャット参加者の定義

公式のサンプルはこちらになります。
chatParticipants "name": "cat"でチャット参加者名を定義しています。この場合は@catという名前で呼び出せるようになります。

https://github.com/microsoft/vscode-extension-samples/blob/main/chat-sample/package.json#L23-L41

例えば次のようにchatParticipantsの定義を書き換えてみます。

"chatParticipants": [
    {
        "id": "chat-sample.cat",
        "fullName": "Cat",
        "name": "nyan",
        "description": "何が知りたいにゃ",

すると画像のように@nyanという名前で呼び出せるようになります。

alt text

また、commands内にあるteach,playがスラッシュコマンドで呼び出せるものです。@chat /teachのように呼び出せます。

https://github.com/microsoft/vscode-extension-samples/blob/main/chat-sample/package.json#L30-L39

チャットUI

GitHub Copilot ChatのUIを利用できます。

今までCopilot Chatで見たとこがあるようなUIを独自の拡張機能でも利用できます。
例えばドキュメントでは次のようなものが紹介されていました。

  • 単純なテキストと画像の応答のためのMarkdown
  • VS Code コマンドを呼び出すボタン
  • 実行時間の長い操作の進行状況
  • URI またはエディターの場所への参照
  • ファイル ツリー (たとえば、チャット参加者が新しいワークスペースの作成を提案したときにワークスペースのプレビューを表示する場合)

この画像が分かりやすいです。

alt text
出典:チャットのユーザーエクスペリエンスの一部

おわりに

いろいろとドキュメントに書いてないので、本格的に使うのはもう少ししてからの方がいいかなと思いました。まだInsider版でしか使えないですし…。

GitHub Copilotを使わずに、Copilot ChatのUIを使ってAzure OpenAIの独自のモデルとやりとりできないかなーと期待していましたがチャットUI自体も利用するのにGitHub Copilotのライセンスが必要という、ドキュメントに書いていない制約があることが分かったのはよかったです。

言語モデルAPIについても好きなモデルを呼び出せるのかと思えばまだ呼び出せるモデル一覧もなく、おそらくGitHub Copilotのモデル(?)だけを呼び出せる状況でしたが、今後サポート対象が増えればAIとやりとりできるVS Code拡張機能開発が楽になって楽しそうだなーと思いました。
独自のスラッシュコマンドでワークフローを実行する、などの実装もできるので可能性は無限大感があります。知っておけば何らかの課題解決の手段にはなるかもしれません。

Discussion

Kento.YamadaKento.Yamada

これがあればAzure OpenAIにデプロイした独自のモデルを呼び出してVS Codeのチャット画面でやり取りできるようになるのでは!?と思いましたが、おそらくまだ対応されていませんでした。
「サポートされるモデルの一覧は増えていく」とは書かれていますが、今使えるモデルの一覧はどこにも見当たりませんでした…。
vendorの指定が必要なのですが、どこにもその一覧が見当たらないので見つけた方は教えてください。

ここを見ると実はLanguageModelの実装が書いてあります。以下のURLではselectLanguageModels
familyが書いてあるのでしつこく追えば、実装がわかるかなというところです。
https://github.com/microsoft/vscode/blob/dee8eaf52679a71ee790e3c09c1160e1ab037b99/src/vs/workbench/api/common/extHostLanguageModels.ts#L242

もしくはLanguage Access Model APIのissueを見るのも手です。
https://github.com/microsoft/vscode/issues/206265

LanguageModelChatSelectorというインターフェイスでChatModelの選択をしているのがわかります。
なのでここから追うことでそれとなくどこから持ってきているかわかるかなという感じですね。

yumayuma

コメントありがとうございます!
私がTypeScript初心者なせいかもしれませんが、実はこのあたりのコードとかを見たうえでどこでvendorが定義できるのか、どんなエンドポイントで言語モデルを呼び出しているのかわからなかったのです…。
そのうちドキュメントももっと整備されると思うので、それを待つかTypeScriptできる方が発掘してくださるのを待ちます笑

SIkebeSIkebe

Chat participant(チャット参加者)とは
GitHub Copilotでいう「エージェント」(例:@workspace,@vscode)に値するものです。

私もよく経緯を把握していないのですが、以下のドキュメントを読む限り、GitHub Copilot でも "agent" をやめて "Chat participant" という表現を正式に採用した...という方が正しいような気がしなくもない感じがするような...Visual Studio でも同様っぽいです。

https://docs.github.com/en/enterprise-cloud@latest/copilot/github-copilot-chat/copilot-chat-in-ides/using-github-copilot-chat-in-your-ide?tool=vscode#chat-participants

yumayuma

エージェントと言わなくなってますね…!!情報ありがとうございます🙏
言語モデルの方も追加情報出ていたので、合わせて後日修正します!