じゃあ、おうちで学べる

本能を呼び覚ますこのコードに、君は抗えるか

Neovimで使うCopilotのモデルをClaudeに変更する苦労話 - 技術ブログ未満の個人的体験談

※カスハックの時間は終了して正式版に機能としてリリースされます。

github.com

免責事項: この記事は個人的な発見と試行錯誤を記録したものであり、正式なドキュメントに基づく推奨設定ではありません。ここで紹介する方法を実際の環境に適用する際は、十分な検証と自己責任でお願いします。

はじめに

こんにちは、Neovimユーザーのnwiizoです。今回は、NeovimでCopilotを使う際にAIモデルをClaudeに変更しようとして遭遇した「ちょっとした冒険」について共有したいと思います。

最近、mizchiさんの最高のブログを読んだ。

zenn.dev

この記事を読んで魂を揺さぶられた。だが、まだVSCodeには移行しない。Neovimを使い続けることを決意した。揺らいだ。しかし、Neovim環境でもCopilotのAIモデルを自由に変更できたほうが良いと思い、特にClaudeモデルを試してみることにした。

やりたかったこと

最近、GitHub Copilotが Claude-3.7-sonnetなどのAnthropicのモデルをサポートするようになり、コーディング支援にもっと高度なAIの力を借りたいと思いました。GitHubの公式ドキュメント「Copilot Chat の AI モデルを変更する」によると、Copilot ChatのデフォルトLLMを別のモデルに変更できるようになっています。

私のNeovim環境ではyetone/avante.nvimを使用してCopilotとの対話を行っていたので、このプラグインの設定でモデルを変更しようとしました。

syu-m-5151.hatenablog.com

最初の試み(失敗)

まず試したのは、avante.nvimの設定で直接モデルを指定する方法です:

{
    "yetone/avante.nvim",
    event = "VeryLazy",
    lazy = false,
    version = false,
    opts = {
      provider = "copilot", -- copilotを使用
      auto_suggestions_provider = "copilot",
      copilot = {
        endpoint = "https://api.githubcopilot.com",
        model = "claude-3.7-sonnet", -- ここでClaudeモデルを指定
        timeout = 30000,
        temperature = 0,
        max_tokens = 4096,
      },
      -- 以下省略...
    },
    -- 依存関係などの設定...
}

しかし、この設定を適用してもなぜか期待通りの動作をしませんでした。デバッグを試みましたが、avante.nvimの設定だけではモデルの変更がうまく反映されていないようでした。というかこのような設定はたぶんなくて⋯。

解決策:CopilotChat.nvimの力を借りる

調査を進めるうちに、面倒になってCopilotC-Nvim/CopilotChat.nvimというプラグインの設定も変更しようと思いました。このプラグインはCopilotのチャットインターフェースを提供するもので、モデル設定も直接サポートしています。

試しに以下の設定を追加してみました:

-- Copilotチャット用の設定
{
  "CopilotC-Nvim/CopilotChat.nvim",
  event = { "VeryLazy" },
  branch = "main",
  dependencies = {
    { "zbirenbaum/copilot.lua" },
    { "nvim-lua/plenary.nvim" },
  },
  opts = {
    model = "claude-3.7-sonnet", -- モデル名を指定
    debug = true, -- デバッグを有効化
  },
}

そして驚いたことに、この設定を追加した後、avante.nvim側でもClaudeモデルが使われるようになりました!どうやら、CopilotChat.nvimの設定がcopilot.luaの基本設定に影響を与え、それがavante.nvimにも「引きずられて」反映されたようです。

【注意】私の環境で観察した挙動であり、どの設定が影響したのかは確認できていません。再現する際は、プラグインごとの設定と動作を確かめてください。

なぜこうなったのか?

正確な理由は不明ですが、おそらく両方のプラグインが同じzbirenbaum/copilot.luaに依存しており、この共通の依存関係を通じて設定が共有されたのだと思われます。

CopilotChat.nvimがより直接的にCopilot APIとの連携部分を制御しているため、そちらでの設定が優先されたのでしょう。

教訓

Neovimのプラグインエコシステムでは、依存関係の連鎖によって予想外の相互作用が発生することがあります。今回のケースでは幸いにも望んだ結果につながりましたが、これは完全に「技術ブログ未満」の個人的な発見に過ぎません。

他の方も同様の状況に遭遇した場合、両方のプラグインを併用する方法が一つの解決策になるかもしれません。

最終的な設定

結局、私の設定はavante.nvimとCopilotChat.nvimの両方を含む形になりました:

-- avante.nvimの設定(一部省略)
{
    "yetone/avante.nvim",
    -- 省略...
    opts = {
      provider = "copilot",
      auto_suggestions_provider = "copilot",
      copilot = {
        endpoint = "https://api.githubcopilot.com",
        model = "claude-3.7-sonnet",
        -- 省略...
      },
    },
    -- 省略...
},

-- CopilotChat.nvimの設定
{
  "CopilotC-Nvim/CopilotChat.nvim",
  event = { "VeryLazy" },
  branch = "main",
  dependencies = {
    { "zbirenbaum/copilot.lua" },
    { "nvim-lua/plenary.nvim" },
  },
  opts = {
    model = "claude-3.7-sonnet",
    debug = true,
  },
},

これでNeovimでのコーディング体験がClaudeの能力で強化され、より的確なコード提案や説明が得られるようになりました。

Neovimの設定は時に「魔法」のように思えることもありますが、それも含めて楽しいハック体験の一部なのでしょう。


注:この記事は2025年2月時点の情報に基づいています。Copilotの仕様やプラグインの動作は変更される可能性があります。

参考リンク