rksoftware

Visual Studio とか C# とかが好きです

GitHub Copilot Extensions でローカル コンテキストを受け取れる POCO

以前に GitHub Copilot Extensions でローカル コンテキストを受け取る方法を書きました。
簡単に言うと、permission の設定です。
rksoftware.hatenablog.com
しかし、実は以前から使っている検証用の Extensions のソースコードでは受け取りことができません。

検証では、こちらの素晴らしい記事のコードを活用させていただいています。
zenn.dev

※ 参照先のコードが不十分ということではなく、あくまで動作させるサンプルとしてみた場合、できるだけそぎ落としたコードがいいわけですからなくても動作している様子が見られるローカル コンテキストに対応していないのは正しいことです。

■ ローカル コンテキストとは

ローカル コンテキストという言葉が正しいかはわかりませんし、もしかしたら私の造語かもしれません。
ここでは、GitHub Copilot Chat の Chat 欄が表示されている PC の Visual Studio Code でエディター開いているファイルや添付ファイル、エディター上の選択内容など、チャットのプロンプトとともに送信される情報を指して使っています。

■ ローカル コンテキストまで取得できる POCO クラス

こんな感じです。ローカル コンテキストというか、送信されている情報をデバッグで取得して全部含めました。

public class Payload
{
    public bool Stream { get; set; }
    public string? Copilot_thread_id { get; set; }
    public List<Message>? Messages { get; set; }
    public object? Stop { get; set; }
    public int top_p { get; set; }
    public float temperature { get; set; }
    public int max_tokens { get; set; }
    public int presence_penalty { get; set; }
    public int frequency_penalty { get; set; }
    public object? response_format { get; set; }
    public List<object>? Copilot_skills { get; set; }
    public string? Agent { get; set; }
    public string? Client_id { get; set; }
    public object? Tools { get; set; }
    public object? Functions { get; set; }
    public string? Model { get; set; }
}

public class Message
{
    public string? Role { get; set; }
    public string? Content { get; set; }
    public List<Copilot_References>? Copilot_references { get; set; }
    public object? Copilot_confirmations { get; set; }
}

public class Copilot_References
{
    public string? Type { get; set; }
    public Data? Data { get; set; }
    public string? Id { get; set; }
    public bool Is_implicit { get; set; }
    public Metadata? Metadata { get; set; }
}

public class Data
{
    public string? Type { get; set; }
    public int Id { get; set; }
    public string? Login { get; set; }
    public string? AvatarURL { get; set; }
    public string? Url { get; set; }
    public string? Content { get; set; }
    public string? Language { get; set; }
    public End? End { get; set; }
    public Start? Start { get; set; }
}

public class End
{
    public int Col { get; set; }
    public int Line { get; set; }
}

public class Start
{
    public int Col { get; set; }
    public int Line { get; set; }
}

public class Metadata
{
    public string? Display_name { get; set; }
    public string? Display_icon { get; set; }
    public string? Display_url { get; set; }
}

■ Json の情報を C# クラスにする

Json 文字列がある場合に、それを保持する C# のクラスを作りたい! そういうこと、ありますよね?
そんな時は Visual Studio です!

Json 文字列をコピーして、Visual Studio のメニューの 編集 > 形式を選択して貼り付け > JSON をクラスとして貼り付ける 。これだけです。

Visual Studio Code でも同様のことができる拡張機能があるようです (検索すると Visual Studio の記事に隠れて 10 件目とかにひっそりと出てきます) 。が、私は Visual Studio が手元にあって使っていないので特に語れません。検索して見つけてください。