前回、GitHub Copilot Extensions を作って動かしてみました。
https://rksoftware.hatenablog.com/entry/2025/01/24/010000rksoftware.hatenablog.com
今回は中身を作るうえで欠かせない、どんな情報がユーザーのローカルから GitHub を介して送られてくるのかを見てみましょう。
これを見なければ何ができるかわかりませんかね。
■ チャット履歴
GitHub Copilot はチャットの履歴を 保持しません 。
これはサーバーサイドにユーザーの情報を残さないという仕様のためです。しかし、Copilot はチャットの会話を覚えていてそれを踏まえて回答をしてくれているように見えると思います。
それはなぜでしょう? そう、チャットの送信のたびに、ローカルのチャット欄で持っている履歴を送っているからです!
ここで気になるのは、別の Extensions へのチャットの履歴が送られてくるのか、です。別の人が提供する Extensions との履歴が別の人の Extensions に送られることはあまり考えられませんがどうでしょうか?
はい


自分へのチャットの履歴は送られてきていますが、別の人へのチャットの履歴は含まれていませんね! 実際、安心!
■ ユーザーの情報はどこまで取れる?
ユーザーを特定できる情報やユーザーの所属する組織など、Extensions の動作時に参照して動作を変えたい! そう思っていますね。私もです。見てみましょう。
エラーになる
何も考えずに情報を得ようとするとエラーになったりします。
await octokitClient.User.Email.GetAll();
Octokit.ForbiddenException: 'Resource not accessible by integration'
こんな感じなら取れた
こんな感じなら取れました。
あんまりとれていないですね。Email は permission の設定もあるのですが (設定の仕方は後述) 、許可設定にしても読めませんでした。
組織も属する全部は取れずに今回取れたのは一つだけです。CheckMember メソッドでも true になるのは一つだけでした。これも Email も公開情報だけ取れる、ということのようですね。Email を非公開にしていた気がしますし、組織も所属が公開になっていない組織ばかりなきがします。
Id は数値が、Login はおそらくユーザーIDが入っているので、人を特定するにはこのあたりが使えそうですね。

var a_user = await octokitClient.User.Current(); var a_userId = (await octokitClient.User.Current()).Id; var a_userEmail = (await octokitClient.User.Current()).Email; var a_userLogin = (await octokitClient.User.Current()).Login; var a_userName = (await octokitClient.User.Current()).Name; var a_userUrl = (await octokitClient.User.Current()).Url; var a_organizations = await octokitClient.Organization.GetAllForUser(a_user.Login); var a_organizationCount = a_organizations.Count(); var a_organization0 = a_organizations[0]; var a_organization0Check = await octokitClient.Organization.Member.CheckMember(a_organization0.Login, a_user.Login); var a_organization0Email = a_organization0.Email; var a_organization0Login = a_organization0.Login; var a_organization0Name = a_organization0.Name; var a_organization0Url = a_organization0.Url; var a_enterprise = octokitClient.Enterprise;
Enterprise はよくわかりません。全然情報が取れないし、情報が取れるインタフェースをしていないですし。

Email の permisson

■ Editor 上のコード
コードというか Editor で開いていたりするファイルの内容ですね。通常、Editor でソースコードファイルを開いている状態でチャットし、開いているソースコードに関する質問をするのが一般的な Copilot Chat です.
まずは 取れない
何もしていないと何も送られてこないので、permisson を変更します。

Visual Studio Code 上で認可もやり直し?
※GitHub 上でアンインストール、インストールも必要かもしれません。必要ないかもしれません。少なくとも直ぐには反映されなかったように思います。

ファイルの添付もして、メッセージを送信!

copilot_references に情報が入ってきました。Editor でアクティブなファイルと、添付されたファイル、Editor上の選択が送られてきていますね!

隣のタブ
Copilot Chat はアクティブなタブだけではなく前後のタブも参照してくれることになっています。試してみましょう。


見てくれませんでした。
@~ の併用
画像取り忘れました。
@~の併用も不可です。例えば @workspace なども不可。@your_extension_name @worksoace など書いても @workspace はチャット入力欄で青い色になりませんし、実際ファイルも探してくっつけてくれません。
隣のタブも見せてくれないし、そのあたりは絞られていますね。
■ システムプロンプト
システムプロンプトが設定できます。実際に効くのですが、あまり効きません。試しに普通の AI チャットで試しに書くような AI に演じてもらう人格を書いてみてもそんなに効いてくれません。
ただ、効かないわけではなく、効くものは効きます。

語尾に さいたま は華麗にスルーされました。文脈に関係ない埼玉褒めもしていませんが、さいたまをポジティブにしようとしている様子は見えます。効いてる効いてる。

■ AI を複数回呼ぶ
Copilot Chat は一つ質問して一つ回答をもらうものだというところが難しいところです。Extensions ならそんな悩みにも寄り添ってくれそうです。
一回で複数回 AI に質問を行ってみました。
回答の形式が人にはちょっと読みにくいので中身の評価はまだできていませんが、とりあえずエラーにはならずに処理されていますね!
ただ、結果がほとんど一文字ずつ (たまに 2 文字) Json なので、結果を処理する際にはちょっと手間がかかりそうでうす。
ちなみに結果がこんなに面倒なフォーマットなのは、おそらくチャット欄で回答がそろって一気に返答を出すのでがなく、生成される都度文字を表示して、何も起きない待機時間を短くすることでユーザーの気持ちに寄り添うアレの実現のためだと思います。

■ 完全に理解した
Extensions 完全に理解した