🔖

neovimをAI IDEに進化させるavante.nvim

2024/10/21に公開2

モチベーション

CursorというAI支援機能を搭載したエディタによって、AIのコード支援能力の高さが際立ちました。
neovimでもAIパワーを授かりたいと思い良いプラグインが無いか探していたところavante.nvimという素晴らしいプラグインを見つけました。

個人的に試した内容を記録する目的で本記事を作成しています。ついでに誰かに役に立てば嬉しいです。

avante.nvimとは

avante.nvimはNeovimをcursorのようなAI IDEに進化させるプラグインです。
ファーストリリースv0.0.1は2024/9/3と最近のためか一部エラー処理が不十分なところはありますが個人的には十分使えるクオリティです。

avante1.gif

Ask

デフォルトキーマップでは<leader>aaでサイドバーが開きAskが開始されます。
以下のスクリーンショットではAskをフローティングウィンドウで表示されるように設定しています。
cursorのCommand+K風です。

avante_ask.png

<leader>atでUIの表示がトグルされます。この場合はサイドバーで表示されます。
サイドバーの下部がAskウィンドウとなっておりここでAIにプロンプトを送信します。
プロンプトの結果がその上のウィンドウに表示されます。

avante_sidebar.png

特徴

主な機能は以下になります。

  • カレントバッファに対してチャットによるコード生成
  • コードベース(ワークスペース)でのチャットによるコード生成
  • オートサジェスション
  • カスタムプロンプト

このうちチャットでコード生成するモデル(provider)とオートサジェスションするモデル(auto_suggestion_provider)を別々に設定可能です。
ただしモデルを切り替えるにはnvimを再起動する必要があります。

利用出来るモデル

様々なモデルに対応していますが、開発の都合上avante.nvimの機能が全て動作するのはClaude-3.5-Sonnetに限定されます。
それ以外のモデルでも大抵動作するようですが保証はしないようです。
また優先的に機能追加をするのはClaudeとOpenAIのAPIに対してとのことです。

  • Claude
    • Claude-3.5-Sonnet (recommended)
    • Claude-3-Opus
    • Claude-3-Haiku
  • OpenAI
    • gpt-4o
    • gpt-4o-mini
  • Google
    • gemini-1.5-flash
    • gemini-1.5-pro(?未確認)
  • Azure
    • gpt-4o
  • Cohere
    • CommandR+
  • Copilot
    • gpt-4o
    • gpt-4o-mini
  • LocalLLM
    • Ollamaなど

費用が掛けられない状況ならLocalLLMの導入も悪くないかもしれません。ただしLocalLLMはマシンパワーがそこそこ必要なのでマシンに合ったモデルを選択する必要があります。

インストール方法

avante.nvimはcargoが必要です。事前にインストールするようにしてください。

lazy.nvimの場合は以下のインストール設定が推奨されています。READMEからそのまま引っ張ってきただけです。

{
  "yetone/avante.nvim",
  event = "VeryLazy",
  lazy = false,
  version = false, -- set this if you want to always pull the latest change
  opts = {
    -- add any opts here
  },
  -- if you want to build from source then do `make BUILD_FROM_SOURCE=true`
  build = "make",
  -- build = "powershell -ExecutionPolicy Bypass -File Build.ps1 -BuildFromSource false" -- for windows
  dependencies = {
    "nvim-treesitter/nvim-treesitter",
    "stevearc/dressing.nvim",
    "nvim-lua/plenary.nvim",
    "MunifTanjim/nui.nvim",
    --- The below dependencies are optional,
    "nvim-tree/nvim-web-devicons", -- or echasnovski/mini.icons
    "zbirenbaum/copilot.lua", -- for providers='copilot'
    {
      -- support for image pasting
      "HakonHarnes/img-clip.nvim",
      event = "VeryLazy",
      opts = {
        -- recommended settings
        default = {
          embed_image_as_base64 = false,
          prompt_for_file_name = false,
          drag_and_drop = {
            insert_mode = true,
          },
          -- required for Windows users
          use_absolute_path = true,
        },
      },
    },
    {
      -- Make sure to set this up properly if you have lazy=true
      'MeanderingProgrammer/render-markdown.nvim',
      opts = {
        file_types = { "markdown", "Avante" },
      },
      ft = { "markdown", "Avante" },
    },
  },
}

AI出力はmarkdown形式なので、render-markdown.nvimを利用して出力をレンダリングすることも可能です。

個人的な設定

ご参考程度ですが私は以下のように設定しています。
ほぼデフォルト設定ですがproviderを変えています。普段はCopilotでcodebaseを利用して、少し賢い出力が必要なときはClaudeに切り替えるなどしています。
auto_suggestionsはcopilotで固定です。Copilotは月額定価なので安心して使えます。

return {
    "yetone/avante.nvim",
    enabled = true,
    event = "VeryLazy",
    lazy = false,
    version = false,
    opts = {
        provider = "copilot",
        -- provider = "claude",
        -- provider = "openai",
        auto_suggestions_provider = "copilot",
        behaviour = {
            auto_suggestions = true,
            auto_set_highlight_group = true,
            auto_set_keymaps = true,
            auto_apply_diff_after_generation = true,
            support_paste_from_clipboard = true,
        },
        windows = {
            position = "right",
            width = 30,
            sidebar_header = {
                align = "center",
                rounded = false,
            },
            ask = {
                floating = true,
                start_insert = true,
                border = "rounded"
            }
        },
        -- providers-setting
        claude = {
            model = "claude-3-5-sonnet-20240620", -- $3/$15, maxtokens=8000
            -- model = "claude-3-opus-20240229",  -- $15/$75
            -- model = "claude-3-haiku-20240307", -- $0.25/1.25
            max_tokens = 8000,
        },
        copilot = {
            model = "gpt-4o-2024-05-13",
            -- model = "gpt-4o-mini",
            max_tokens = 4096,
        },
        openai = {
            model = "gpt-4o", -- $2.5/$10
            -- model = "gpt-4o-mini", -- $0.15/$0.60
            max_tokens = 4096,
        },
    },
    -- if you want to build from source then do `make BUILD_FROM_SOURCE=true`
    -- build = "make",
    -- build = "powershell -ExecutionPolicy Bypass -File Build.ps1 -BuildFromSource false",
    dependencies = {
        "nvim-treesitter/nvim-treesitter",
        "stevearc/dressing.nvim",
        "nvim-lua/plenary.nvim",
        "MunifTanjim/nui.nvim",
        --- The below dependencies are optional,
        "nvim-tree/nvim-web-devicons",
        "zbirenbaum/copilot.lua",  -- for providers='copilot'
        {
            -- support for image pasting
            "HakonHarnes/img-clip.nvim",
            event = "VeryLazy",
            opts = {
                -- recommended settings
                default = {
                    embed_image_as_base64 = false,
                    prompt_for_file_name = false,
                    drag_and_drop = {
                        insert_mode = true,
                    },
                    -- required for Windows users
                    use_absolute_path = true,
                },
            },
        },
    },
}

Cursor、GitHub Copilot、avante.nvimの比較 (2024/10/20時点)

Cursorやcopilotと俯瞰的に比較するためにサクッと始めるAIコードエディタ【Cursor / VS Code / ChatGPT】- Chapter14より表を引用させていただきavante.nvimを加えました。
主観的な部分が多分に含まれますので参考程度にご覧ください。

機能 Cursor GitHub Copilot avante.nvim avante.nvim備考
Command K <leader>aaでAskウィンドウ
Chat <leader>atでサイドバーチャット
@Symbols ワークスペースのコード全体を読む@codetaseは実装済み,@sample.py など個別クエリは無し, @Docsも無し
スラッシュコマンド /help, /clear, /linesのみ。copilotほどの多彩な機能は無い
Codebase Answers チャットで@codebase {問い合わせ内容}
Docs
Auto-Debug
Fix Lints
コード自動補完
プロジェクト生成 調査不足、よくわからず

特にcursorはしっかり使えていないので間違っていたらコメントで教えていただけると喜びます

追記 CursorとのCodebase機能の比較

codebaseについて大きな差があることが分かりました。
avante.nvimでcodebaseを使用するとカレントバッファの拡張子に基づいて検索が実行されます。

例えばRustのファイルをカレントバッファで開いているとして、.rs拡張子のファイルをワークスペース内で検索し.rsについてのrepo_mapというオブジェクトを生成、jsonファイルとして保存します。Rustのみで構成されるプロジェクトであれば問題ありませんが、別言語と混在するプロジェクトでは欠点となります。

例えばTauriというRustのGUIクレートでのプロジェクトはバックエンドでRust、フロントエンドでtypescriptを使用するためファイル種が混在しますが、typescriptとRustのrepo_mapは別々で保存され、さらにcodebaseでの検索はカレントバッファの拡張子のrepo_mapに対してのみ検索されるためRustのファイルを開いているときにtypescriptのファイルの情報は回答してくれません。

これが決定的にcursorと異なる点です。cursorは拡張子によらずワークスペース内のファイルを全て対象にして回答をします。

また対応ファイル種別も限定的です。avante.nvimは以下の拡張子に対応しています。

  • C言語
  • C++
  • Rust
  • Typescritp
  • Javascript
  • Go
  • Lua
  • Python
  • Ruby
  • Zig

とはいえリリースされたばかりなので、こういう気になる点はどんどんコントリビュートしていけばいずれcursorを超えることもあり得なくはないです。
また現時点で機能が限定的とはいえこの調査もavante.nvimを利用して行ったのでAIパワーは発揮されています。どんどん便利にしていきたいですね。

モデルごとの評価

純Lispを実装するトークナイザ、パーサー、評価器を実装するようプロンプトを書いた結果が以下になります。
こうしたAIアシスタントの本領はcodebaseでのアシストですし、定量的な評価ではなく主観的な感覚的評価なので参考程度としてください。

評価 tendor Model 生成速度 基本関数 特殊形式 詳細
🥉 7/10 Athronpic Claude-3.5-Sonnet 15sec 特殊形式は実装されているが基本関数が無い。基本関数が生成されない中では一番まとも
🥇 9/10 Athronpic Claude-3-Opus 40sec 四則演算、論理演算+α程度まで動作するコードを生成
3/10 Athronpic Claude-3-Haiku 6sec 具体的な実装ではなく導入的なコードの生成をしている
🥈 8/10 OpenAI gpt-4o 10sec 四則演算、論理演算+α程度まで実装されたが、replなどは無し、グローバス変数の構造は実装されたが実際に動作するコードでは無い
3/10 OpenAI gpt-4o-mini 10sec 具体的な実装ではなく導入的なコードの生成をしている
3/10 GithubCopilot gpt-4o 3sec 具体的な実装ではなく導入的なコードの生成をしている
3/10 GithubCopilot gpt-4o-mini 3sec 具体的な実装ではなく導入的なコードの生成をしている

あえて順位をつけると

1位がClaude-3-Opus
2位がClaude-3.5-Sonnet
3位がgpt-4o

です。

avante.nvimのREADMEによると最もパフォーマンスが出るのはClaude-3.5-Sonnetのようですが、タスクによっては他モデルでも良さそうです。
プロンプトの相性によっても変わるかもしれません。

今回試してませんがOpenAIの新モデルのo1は単純な指示のほうがパフォーマンスが出て、gpt-4oは詳細な指示のほうがパフォーマンスが出やすいといった特徴があるようです。
o1はまだAPIは利用出来なかったので今後試してみたいですね。

終わりに

AIによるコードアシストは今後も拡大していくように思います。期待が高まります。新たなアシスト機能がどんどん出ると思いますし自分でも設計してみたいと思えました。
個人的にはコードアシストもとても便利ですが、ドキュメントをワークスペース内で理解して会話的に資料を作成出来るのがとても楽です。
生成AIはチャット形式で使用するのもそこそこ便利ですが、cursorやavante.nvimのように少し制限して人間の作業をアシストするものとして利用することで面白い使い方が出来そうです。

参考リンク

GitHubで編集を提案

Discussion

ryoppippiryoppippi

記事ありがとうございます
copilotchat.nvim ではlint fixの機能があったりします
codecompanion.nvimにはlint fixもあるし、結構多彩なslash commandが実装されてたりします。
そちらの比較もあると嬉しいなと思いました

avante.nvim使ってなかったので、使用感が伝わってよかったです!試してみます

たけぴょんたけぴょん

コメントありがとうございます
copilot関連のプラグインをあまり知らなかったのでとても助かります!試して比較を記事に追加してみたいと思います。(別記事にしてもいいかも)
ざっと見た感じcodecompanion.nvimがとても気になりますね。スラッシュコマンド多いですし、@ragというDocs相当の機能もありそうな。ジャンジャカ使ってみます!