はじめに
GitHub Copilot SDKを利用すると、自前のプログラムにGitHub Copilotの機能を組み込んで利用することができるようになります。例えば、GitHub以外のGitリポジトリ(例えばBacklogが提供するGit)などでコードレビュー用のボットを作ろうとして挫折したような人でも比較的簡単に実装することができます。
ただ、自前のプログラムに組み込む場合、個人のプレミアムリクエストが消費されたり、クオータに引っかかりプレミアムモデルが使えなくなってしまうのは考え物です。この記事では、GitHub Copilot SDKでAzure FoundryのAPIキーを利用する方法について確認します。
まずはインストール
GitHub Copilot SDKはGitHub Copilotの機能をプログラムから使いやすくするためのものなので、GitHub Copilot自体のインストールは必要です。インストールにはいくつかの方法がありますが、現時点でGitHub Copilot SDKはPreviewでの公開であるため仕様変更も多く発生します。
GitHubのIssueを見ると、NPM版の更新が最も早いようなので最新機能を利用したい場合はnpm installで導入するのがよさそうです。
npm install -g @github/copilot-sdk
プログラムからの単純な呼び出し
それでは、プログラムから呼び出してみます。各プログラム言語ごとのサンプルプログラムが用意されています。例えばC#のサンプルコードはこのディレクトリで公開されています。
あらかじめCloneしたGitHub Copilot SDKのソースコード(c:\repos\copilot-sdk)に対し、アーキテクチャに関する質問をするとしたらこんな感じになります。
using GitHub.Copilot.SDK;
var workDirectory = @"c:\repos\copilot-sdk";
await using var client = new CopilotClient(new CopilotClientOptions
{
Cwd = workDirectory,
});
await using var session = await client.CreateSessionAsync(new SessionConfig
{
Model = "gpt-5"
});
var done = new TaskCompletionSource();
session.On(evt =>
{
if (evt is AssistantMessageEvent msg)
{
Console.WriteLine(msg.Data.Content);
}
else if (evt is SessionIdleEvent)
{
done.SetResult();
}
});
await session.SendAsync(new MessageOptions { Prompt =
"""
プロジェクトの概要と目的、プロジェクトで採用している主要なアーキテクチャについて教えてください。
""" });
await done.Task;
実行すると、次のような結果になります。
workDirectory の内容を確認し、プロンプトに応答してくれます。
プロジェクト概要:GitHub Copilot SDKは、Copilot CLIのエージェント機能を各言語(Python, TypeScript, Go, .NET)向けに提供するSDKです。
目的:アプリケーションにCopilotのエージェントワークフローを組み込み、プランニングやツール呼び出し、ファイル編集などを自動化します。
主要アーキテクチャ:SDKクライアントがJSON-RPC経由でCopilot CLI(サーバーモード)と通信し、アプリ→SDK→CLIの流れでエージェント機能を利用します。
APIキーの持ち込み BYOK (Bring Your Own Key)
通常であれば、GitHub Copilot SDKを利用する場合は、GitHub Copilotのサブスクリプションが必要ですが、自前のAzure AI FoundryやAnthropicが発行するAPIキーを利用することで、個人のサブスクリプションやプレミアムリクエストに依存しない形で実行することができます。
利用方法はこのドキュメントに記載があります。現時点でサポートされているAIプロバイダーは次の5つです。現時点では、AWS BedrockやGoogle AI Studioのモデルを直接利用することはできません。
- OpenAI "openai" OpenAI API and OpenAI-compatible endpoints
- Azure OpenAI / Azure AI Foundry "azure" Azure-hosted models
- Anthropic "anthropic" Claude models
- Ollama "openai" Local models via OpenAI-compatible API
- Other OpenAI-compatible "openai" vLLM, LiteLLM, etc.
また、APIキー(もしくはベアラートークン)での認証のみサポートされているため、APIキーは各自で管理する必要があります。
Azure AI Foundryで利用する
Azure AI Foundryにデプロイ済みのgpt-5.2というデプロイ名のモデルを利用する場合は次のようになります。
await using var session = await client.CreateSessionAsync(new SessionConfig
{
Model = "gpt-5.2",
Provider = new ProviderConfig
{
Type = "azure",
BaseUrl = "https://xxxx.services.ai.azure.com/api/projects/xxxxxx",
ApiKey = "********",
Azure = new AzureOptions
{
ApiVersion = "2025-04-01-preview",
}
}
});
上記のまま、gpt-5.2-codexを指定すると次のようなエラーが表示されます。
Execution failed: Error: Failed to get response from the AI model; retried 5 times (total retry wait time: 98.64467123875183 seconds) Last error: CAPIError: 400 The chatCompletion operation does not work with the specified model, gpt-5.2-codex. Please choose different model and try again. You can learn more about which models can be used with each operation here: https://go.microsoft.com/fwlink/?linkid=2197993.
gpt-5.2はcompletions、responsesの両方のAPIに対応しているので問題ありませんが、gpt-5.2-codexなどのcompletionsを持たないLLMを利用する場合は、WireApiでresponsesを指定する必要があります。
await using var session = await client.CreateSessionAsync(new SessionConfig
{
Model = "gpt-5.2-codex",
Provider = new ProviderConfig
{
Type = "openai",
BaseUrl = "https://xxxx.cognitiveservices.azure.com/openai/v1/",
ApiKey = "********",
WireApi = "responses",
Azure = new AzureOptions
{
ApiVersion = "2025-04-01-preview",
}
}
});
ローカルの Docker で起動した Ollama を利用する
何かもう一つぐらい...ということで、ollama上のgemma2:2bモデルで動作させてみましょう。
まずは、dockerでollamaを起動して、gemma2:2bをプルしておきます。
❯ docker run --name ollama -p 11434:11434 ollama/ollama
❯ docker exec -it ollama ollama pull gemma2:2b
❯ docker exec -it ollama ollama list
NAME ID SIZE MODIFIED
gemma2:2b 8ccf136fdd52 1.6 GB 23 minutes ago
ollama ollama listで表示されたNAMEのモデル名をModelに設定します。
BaseUrlはDockerでバインドしているポート番号に合わせましょう。
await using var session = await client.CreateSessionAsync(new SessionConfig
{
Model = "gemma2:2b",
Provider = new ProviderConfig
{
Type = "openai",
BaseUrl = "http://localhost:11434/v1"
}
});
実行したら次のエラーが表示されました。どうやらTool呼び出しに失敗しているようです。
Execution failed: Error: Failed to get response from the AI model; retried 5 times (total retry wait time: 91.81153967558512 seconds) Last error: CAPIError: 400 registry.ollama.ai/library/gemma2:2b does not support tools
llama3.2にしてみます。
❯ docker exec -it ollama ollama pull llama3.2
❯ docker exec -it ollama ollama list
NAME ID SIZE MODIFIED
llama3.2:latest a80c4f17acd5 2.0 GB 4 seconds ago
gemma2:2b 8ccf136fdd52 1.6 GB 40 minutes ago
モデル名を変更します。
await using var session = await client.CreateSessionAsync(new SessionConfig
{
Model = "llama3.2",
Provider = new ProviderConfig
{
Type = "openai",
BaseUrl = "http://localhost:11434/v1"
}
});
応答まで10分ぐらいかかりましたが、ちゃんと帰ってきました(Olamaのログを見ると一回500が返って呼び出しがリトライされてそうなので、もう少し早くなるかも)。
プロジェクト概要および目的に関して説明します。
プロジェクトは、複雑なタスクを自動化するために利用できるさまざまなツールとソリューションを開発することに重点をおいています。このプロジェクトの主な目的は、開発者が迅速かつ効率的にコードを書くことや codebase を管理している場合、これらのタスクに対処する能力を高めたり新しいアプリケーションを構築できるようにすることです。
おわりに
AIをプログラムに組み込む場合、LLM単体で利用したり、シーケンシャルにワークフローを組むのはやはりシンドイので、エージェントとして各種ツールを利用しながら、自律的に動いてくれると楽ですね。
GitHub Copilot は個人向けのツールなので、プログラムに組み込むという発想はあまりなかったのですが、BYOKで利用することを前提に、LangGraphやSemanticKernelなどの本格的なAIエージェントフレームワークを利用する前にGitHub Copilot SDKを利用してみるというのも一つの手かもしれませんね。