GitHub Copilot SDK で遊ぼう - Copilot の「できない」を解決する
GitHub Copilot、めちゃくちゃ便利ですよね。VS Code 上で使っていることが多いのですが、コード補完はもちろん、Chat でかなりエージェント的な作業もできるようになりました。特に devcontainer のような隔離環境上で YOLO させるのに最近はハマっています。
でも、使い込んでいくと「これ、できないの?」と思う場面が出てきます。その代表例が、決定的なワークフローを組むことです。現状では、あくまで自然言語・LLM でフロー制御するしかありません。
ですが、最近登場した GitHub Copilot SDK を使えば、この課題を解決できます。
本記事では、Copilot SDK を使って決定的なワークフローを実現するサンプルとして、copilot-council という CLI ツールを作ってみた話を紹介します。
GitHub Copilot の「できない」こと
Agentic Workflow を組めない
GitHub Copilot のエージェントは「良い感じに」タスクを処理してくれますが、決定的なフローを仕組む方法がありません。「必ず A → B → C の順で処理する」「B の結果を必ず C に渡す」といった制御です。
もちろん、エージェントの定義にステップやフローを明記しておいたり、高性能なモデルを使うことで「ソフトな」フロー制御は可能です。また、handoffs などの仕組みを取り入れることで意図したフローを誘導することも可能です。
しかし、いずれも決定的なフロー制御が組み込めてはいません。
サブエージェントごとにモデルを変えられない
Copilot Chat でサブエージェントを呼び出す機能がありますが、現状では各サブエージェントに異なるモデルを指定することができません[1]。例えば「調査は Claude に、コード生成は GPT に」といった使い分けはできません。
GitHub Copilot SDK で解決する
GitHub Copilot SDK を使えば、こうした課題を外部のソフトウェアから制御することで解決できます。
SDK でできること
自分のアプリケーションから(ローカルの)GitHub Copilot CLI を呼び出して、LLM プロバイダーのように利用することが出来ます。これにより、次のような LLM 呼び出しが可能になります。
- モデルを指定: セッションごとに異なるモデルを使える
- フローを制御: コードでワークフローを定義できる
- 並列実行: 複数モデルへの同時クエリも可能
なお、事前に GitHub Copilot プランを持つアカウントで CLI にログインしておく必要があります。
アーキテクチャ
Copilot CLI には隠しオプションとして --server モードがあり、SDK はこれを利用して CLI をバックエンドとして利用しています[2]。プロトコルは JSON-RPC です。SDK が CLI のプロセスライフサイクルを自動管理してくれるので、開発者は API を呼ぶだけで OK です。
対応言語
現時点で 4 つの言語に対応しています。
| SDK | インストール |
|---|---|
| Node.js / TypeScript | npm install @github/copilot-sdk |
| Python | pip install github-copilot-sdk |
| Go | go get github.com/github/copilot-sdk/go |
| .NET | dotnet add package GitHub.Copilot.SDK |
なお、Java、Rust、C++ は、コミュニティーによる SDK 実装もあります。
サンプル: copilot-council を作ってみた
SDK の使い方を示すサンプルとして、Andrej Karpathy 氏の「LLM Council」パターン[3]を実装してみました。
LLM Council パターンとは
複数の AI モデルを「議会」のように協働させるアプローチです。
- Initial Responses: 複数モデルに同じ質問を並列で投げる
- Peer Review: 各モデルが他の回答を匿名でレビュー
- Final Synthesis: 議長モデルが統合して最終回答を生成
これを実現するには「モデルごとにセッションを作る」「決まった順序で処理する」という制御が必要です。まさに Copilot Chat 単体ではできないことですね。
実行例
「vim と emacs、初心者はどっちを学ぶべき?」という永遠の宗教論争を投げてみました。火を見るより明らかですが、結論は vim になりました。
$ copilot-council "Which should a beginner learn, vim or emacs?"
╔════════════════════════════════════════════════════════╗
║ 🏛️ Council - AI Model Council ║
╚════════════════════════════════════════════════════════╝
❓ Question: Which should a beginner learn, vim or emacs?
╔════════════════════════════════════════════════════════╗
║ 🔄 Querying models in parallel... ║
╚════════════════════════════════════════════════════════╝
[✓] gpt-5.2 ⏱️ 5.68s
[✓] claude-sonnet-4.5 ⏱️ 12.64s
[✓] gemini-3-pro-preview ⏱️ 13.36s
╔════════════════════════════════════════════════════════╗
║ 📝 Conducting peer review... ║
╚════════════════════════════════════════════════════════╝
[✓] claude-sonnet-4.5 (review) ⏱️ 26.26s
[✓] gpt-5.2 (review) ⏱️ 4.27s
[✓] gemini-3-pro-preview (review) ⏱️ 7.35s
[✓] Peer review complete: 3 models reviewed each other (37.89s)
╔════════════════════════════════════════════════════════╗
║ 🔄 Synthesizing responses... ║
╚════════════════════════════════════════════════════════╝
[✓] Synthesis complete (3.47s)
╔════════════════════════════════════════════════════════╗
║ ⭐ FINAL ANSWER ║
╚════════════════════════════════════════════════════════╝
For most beginners, you should learn **Vim** first.
**Why?**
- **Ubiquity:** Vim (or vi) is pre-installed on nearly every Unix/Linux system...
- **Transferable Skills:** Vim's modal editing and keybindings are widely adopted...
- **Faster Productivity:** While Vim's modal interface is initially unfamiliar...
╔════════════════════════════════════════════════════════╗
║ 📊 EXECUTION SUMMARY ║
╠════════════════════════════════════════════════════════╣
║ Stage 1: Initial Responses 13.36s (3/3 successful) ║
║ Stage 2: Peer Review 37.89s (3/3 successful) ║
║ Stage 3: Final Synthesis 3.47s ║
╠════════════════════════════════════════════════════════╣
║ Total execution time: 54.72s ║
╚════════════════════════════════════════════════════════╝
Claude、GPT、Gemini の 3 モデルが並列で回答し、相互レビューを経て、最終的に GPT-4.1 が統合。これが Copilot Chat 単体ではできないワークフローです。
実装のポイント
簡単にではありますが、SDK でどうやって「複数モデル協働」と「決定的フロー」を実現しているか紹介します。
モデルごとにセッションを作る
import copilot "github.com/github/copilot-sdk/go"
// Claude 用セッション
claudeSession, _ := client.CreateSession(&copilot.SessionConfig{
Model: "claude-sonnet-4.5",
})
// GPT 用セッション
gptSession, _ := client.CreateSession(&copilot.SessionConfig{
Model: "gpt-5.2",
})
SDK ではセッションごとにモデルを指定できます。これで「タスク A は Claude、タスク B は GPT」という使い分けが可能になります。
決定的なフローを実装する
func (c *Council) Execute(ctx context.Context, question string) Result {
// Step 1: 全モデルに並列で質問(必ず最初に実行)
responses := c.client.AskMultipleModels(ctx, c.config.Models, question, ...)
// Step 2: Peer Review(Step 1 の結果を使う)
reviews := c.conductPeerReview(ctx, question, responses, ...)
// Step 3: 統合(Step 1, 2 の結果を使う)
aggregated := c.client.AskSingleModel(ctx, c.config.Aggregator, aggregationPrompt, ...)
return Result{...}
}
コードで順序を明示的に定義しているので、必ず「回答収集 → レビュー → 統合」の順で処理されます。AI 任せではなく、決定的なフローです。
並列クエリの実装
func (c *Client) AskMultipleModels(ctx context.Context, models []string, question string, ...) []Response {
var wg sync.WaitGroup
responses := make([]Response, len(models))
for i, model := range models {
wg.Add(1)
go func(idx int, mdl string) {
defer wg.Done()
session, _ := c.CreateSession(ctx, mdl, false)
defer session.Destroy()
// ...
}(i, model)
}
wg.Wait()
return responses
}
goroutine で各モデルに並列クエリ。sync.WaitGroup で全ての完了を待ちます。
まとめ
GitHub Copilot は便利ですが、現状では「複数モデルの協働」や「決定的なワークフロー」は Copilot Chat 単体で実現できません。GitHub Copilot SDK を使えば、これらの課題を解決できます。
まだ Technical Preview ですが、Copilot の可能性を広げるツールとして要注目です。まずは公式の Getting Started を試しながら、Copilot SDK で何か課題が解決できないか考えてみてはいかがでしょうか 😊
参考情報
-
GitHub Copilot CLI では出来ることを教えてもらいました: https://x.com/v_intestine/status/2014687339705143457 ↩︎
Discussion