👌

avante.nvimのプロバイダ表示プラグインavante-status.nvimを作った

2024/11/10に公開

書き散らしに近い文体ですが大目に見ていただけると助かります。

avante-status.nvimの機能

https://github.com/takeshiD/avante-status.nvim

avante-status.nvimはavante.nvimという生成AIアシスタントプラグインの拡張(ちょい足し)プラグインです。

以下の機能を利用できるように設計しています。

優先度付きプロバイダ取得関数

avante.nvimでは以下のように使用したいprovider, auto_suggestions_providerを文字列で設定します。指定したproviderは環境変数にAPIキーが設定されているか確認し、設定されていなければAPIキーを入力するように促されます。

avante-status.nvimで提供する優先度付きプロバイダ取得関数を使用すると以下のようになります。

providerでは azure > openai > claude の順に優先的に使用するように優先度を付けており、優先度順にプロバイダのAPIキーを確認、一番最初に見つかったAPIキーを返すという単純な関数です。

provider = reuqire("avante-status").get_chat_provider({
    "azure",    -- 最初に利用可能か確認
    "openai",   -- 最初のプロバイダが利用不可な場合、利用可能か確認
    "claude",   -- 同様
}), -- 一つも利用できなければエラー出力
auto_suggestions_provider = require("avante-status").get_suggestion_provider({
    "azure",
    "copilot",
    "claude",
})

リスト形式で列挙することでひと目で優先度が把握しやすく環境ごとに異なるAPIキーを簡単に管理でき、誤って機密情報を漏洩するリスクを減らすことができます。

使用したくないプロバイダはリストに入れなければOKです。

利用中プロバイダのステータスライン表示

  • 現時点ではLualine対応(自分が使っているので)

さて上記のプロバイダ切り替え関数でプロバイダの切り替えはしやすくなりましたが、有効なプロバイダを一目で確認したくなります。
ということでクソ雑設計ですがステータスラインに表示できるようにしました。

lualine.nvimでの例ですが、avante.nvimでget_chat_provider, get_suggestion_providerを利用していれば次のようにコンポーネントを作成し、設置できます。

dependencies = {
    -- other dependencies
    {
        "takeshid/avante-status.nvim",
        lazy = false,
    },
},
local avante_chat_component = {
    function()
        local chat = require("avante-status").chat_provider
        local msg = chat.name
        return msg
    end,
    icon = require("avante-status").chat_provider.icon,
    color = { fg = require("avante-status").chat_provider.fg}
}

local avante_suggestions_component = {
    function()
        local suggestions = require("avante-status").suggestions_provider
        local msg = suggestions.name
        return msg
    end,
    icon = require("avante-status").suggestions_provider.icon,
    color = { fg = require("avante-status").suggestions_provider.fg }
}
local config = {
    options = {
    -- your options ... 
    },
    sections = {
    -- your sections ... 
    lualine_x = { 'encoding', 'fileformat', 'filetype', avante_chat_component, avante_suggestions_component },
    -- your sections ...
    },
    inactive_sections = {
    -- your seciotns  ...
    },
}

ClaudeをChatプロバイダ、CopilotをSuggestionsプロバイダに設定していると以下のようになります。
avante-status with claude copilot

  • Cohere, Copilot
    avante-status with cohere copilot

  • ChatとSuggestionsを両方Azureに
    avante-status with azure azure

使用出来るプロバイダが無い場合はNoneで表示されます。

avante-status with none none

モチベーション

avante.nvimは大変優秀なAIアシスタントプラグインですが、個人PCと会社PCの双方でdotfilesを共有して使用しているとAPIの切り替えを間違えた場合ソースコードを始めとした機密情報の流出に繋がります。

環境ごとにブランチを切るだとかで色々方法はありますが、やり方を忘れた瞬間にめんどくさくなってしまいます。

avante.nvimはオートサジェスチョンを有効にしているとコードを開いた瞬間に問答無用で読み込んでしまうので、もし機密情報を含むソースコードを個人のAPIを設定した状態で開いてしまうとその瞬間に情報漏洩となります。100%防ぐとなると環境をしっかり分けるほうが説得力と安心感がありますがそれはそれでとても面倒なので、簡単にリスクを減らす、簡単にリスクが無いことを事前に確認できる、という仕組みにしたいと思いavante-status.nvimのコンセプトにしました。

あとnvimプラグインを作ったことなかったので練習程度の気持ちです。

プラグイン開発のお気持ち

vimプラグインは簡単なものは開発したことがありましたが、neovimプラグインの開発は初めてでした。
Luaでの開発は慣れればモジュール化がやりやすそうでいい感触です。

しかしlazy.nvimなどで遅延読み込み時にハイライトをどう適用すればいいのかなど細かい部分で躓きがちです。
あとvimスクリプトも同じですがデバッグがしづらい、、、デバッグ用のプラグインとか、自分の知識不足な気がしますがもう少し経験を積めばわかってくるのかな。精進してみます。

Todo

一度ある程度作ると欲望がいっぱい出てきます

  • LocalLLMなど任意のプロバイダを設定出来るようにする
  • アイコン、ハイライトを任意設定出来るようにする
  • ステータスラインプラグインにそのまま適用出来るコンポーネントの作成(Activeなプロバイダ名、アイコン、ForegroundColorを提供してますが、プリミティブなのでもう少し便利にしておきたい)
GitHubで編集を提案

Discussion