Copilot Chat の utility model をローカル LLM に切り替えた話

VS Code Copilot Chat の utility model をローカルの LLM に切り替えた話をします。設定ファイルに数行足すだけです。

GitHub Copilot は freeでもcommitメッセージが生成できるので、freeのまま使用してましたが、いつの間にか制限が来てました。commit メッセージを自力で書く時の面倒さが地味に侮れなかったので(AIに染まり始めてる)、ローカルLLMに向けるように設定しました。

VS Code の custom endpoint 設定

VS Code には Language Model の custom endpoint を登録する仕組みがあります。Ctrl+Shift+P でコマンドパレットを開いて「Manage Language Models」を選び、「Add models」→「Custom Endpoint」と進むと設定画面が開きます。内容は chatLanguageModels.json に保存されます。

[
{
"name": "homelab",
"vendor": "customendpoint",
"apiKey": "${input:chat.lm.secret.-44f93762}",
"apiType": "chat-completions",
"models": [
{
"id": "Gemma-4-E4B-it-GGUF",
"name": "Gemma-4-E4B-it-GGUF",
"url": "https://inference.homelab.otama-playground.com/v1/chat/completions",
"toolCalling": true,
"vision": true,
"maxInputTokens": 128000,
"maxOutputTokens": 16000
},
{
"id": "Gemma-4-E4B-it-GGUF-nothink",
"name": "Gemma-4-E4B-it-GGUF-nothink",
"url": "https://inference.homelab.otama-playground.com/v1/chat/completions",
"toolCalling": true,
"vision": true,
"maxInputTokens": 128000,
"maxOutputTokens": 16000
},
{
"id": "Qwen3.6-35B-A3B-GGUF",
"name": "Qwen3.6-35B-A3B-GGUF",
"url": "https://inference.homelab.otama-playground.com/v1/chat/completions",
"toolCalling": true,
"vision": true,
"maxInputTokens": 128000,
"maxOutputTokens": 16000
},
{
"id": "Qwen3.6-35B-A3B-GGUF-nothink",
"name": "Qwen3.6-35B-A3B-GGUF-nothink",
"url": "https://inference.homelab.otama-playground.com/v1/chat/completions",
"toolCalling": true,
"vision": true,
"maxInputTokens": 128000,
"maxOutputTokens": 16000
}
]
}
]

apiKey は VS Code の input 変数で参照していて、初回追加時に入力を求められます。LiteLLM の api key をここに入れておきます。設定後は Copilot Chat のモデル選択に homelab プロバイダーのモデルが並ぶようになります。

utility model の向き先を変える

モデルの用途別割り当ては settings.json に追記します。

"chat.utilitySmallModel": "customendpoint/Gemma-4-E4B-it-GGUF",
"chat.utilityModel": "customendpoint/Gemma-4-E4B-it-GGUF",
"chat.planAgent.defaultModel": "Qwen3.6-35B-A3B-GGUF (customendpoint)",
"inlineChat.defaultModel": "Qwen3.6-35B-A3B-GGUF (customendpoint)",
"chat.exploreAgent.defaultModel": "Gemma-4-E4B-it-GGUF (customendpoint)"

chat.utilitySmallModelchat.utilityModel が commit メッセージ生成などの軽い処理を担うモデルです。ここを Gemma-4-E4B に向けることで、Copilot の premium クォータを消費しなくなります。

plan agent や inline chat は少し重めのタスクを扱うので Qwen3.6-35Bを当てています。

実際のところ

commit メッセージの品質は premium モデルと比べると若干落ちます。ただ「差分を読んで一行にまとめる」程度の作業は Gemma-4-E4B で十分こなせます。

気になる点が一つあって、初回リクエスト時はモデルを VRAM に載せる時間があるため、数秒待たされることがあります。ウォームアップ後は 1〜2 秒程度になりますが、最初のコミットだけ妙に遅い、という感覚はあります。

LiteLLM に ChatGPT も統合してあるので、utility model を gpt-5.2 や gpt-5.3 に切り替えるという選択肢もあります。ChatGPT サブスクリプション枠なので課金は増えませんし、ウォームアップ問題もありません。ただ Gemma-4-E4B で十分な品質が出ているうちはローカルで完結させたいので、今のところはそのままにしています。

まとめ

chatLanguageModels.json にローカル LLM を登録して、chat.utilityModel を向けるだけで commit メッセージ生成が Copilot のクォータを消費しなくなりました。

Copilot Chatに課金したくないけど、commitメッセージだけ自動生成させたいみたいな方の参考になれば幸いです。