avante.nvimのプロバイダ表示プラグインavante-status.nvimを作った
書き散らしに近い文体ですが大目に見ていただけると助かります。
avante-status.nvimの機能
avante-status.nvimはavante.nvimという生成AIアシスタントプラグインの拡張(ちょい足し)プラグインです。
以下の機能を利用できるように設計しています。
優先度付きプロバイダ切り替え関数
avante.nvimでは以下のように使用したいprovider, auto_suggestions_providerを文字列で設定します。指定したproviderは環境変数にAPIキーが設定されているか確認し、設定されていなければAPIキーを入力するように促されます。
{
"yetone/avante.nvim",
event = "VeryLazy",
lazy = false,
version = false, -- set this if you want to always pull the latest change
opts = {
provider = "claude",
auto_suggestions_provider = "copilot"
},
}
avante-status.nvimで提供する優先度付きプロバイダ切り替え関数を使用すると以下のようになります。
- provider = "claude",
+ provider = reuqire("avante-status").get_chat_provider({
+ "azure",
+ "openai",
+ "claude",
+ }),
- auto_suggestions_provider = "copilot"
+ auto_suggestions_provider = require("avante-status").get_suggestion_provider({
+ "azure",
+ "copilot",
+ "claude",
+ })
providerでは azure > openai > claude の順に優先的に使用するように優先度を付けており、優先度順にプロバイダのAPIキーを確認、一番最初に見つかったAPIキーを返すという単純な関数です。
リスト形式で列挙することでひと目で優先度が把握しやすく環境ごとに異なるAPIキーを簡単に管理でき、誤って機密情報を漏洩するリスクを減らすことができます。
優先度の変更は行を入れ替えればいいだけなので一時的にこっちのプロバイダを使いたいというときに便利です。
使用したくないプロバイダはそもそもリストに入れなければ良く、万が一のために環境変数にAPIキーを設定しなければ利用されることもありません。
利用するプロバイダのステータスライン表示用ユーティリティ
- 現時点ではLualine対応(自分が使っているので)
さて上記のプロバイダ切り替え関数でプロバイダの切り替えはしやすくなりましたが、現在どのプロバイダが実際に有効になっているのか簡単に確認したいです。ということでクソ雑設計ですがステータスラインに表示できるようにしました。
モチベーション
avante.nvimは大変優秀なAIアシスタントプラグインですが、個人PCと会社PCの双方でdotfilesを共有して使用しているとAPIの切り替えを間違えた場合ソースコードを始めとした機密情報の流出に繋がります。
環境ごとにブランチを切るだとかで色々方法はありますが、やり方を忘れた瞬間にめんどくさくなってしまいます。
avante.nvimはオートサジェスチョンを有効にしているとコードを開いた瞬間に問答無用で読み込んでしまうので、もし機密情報を含むソースコードを個人のAPIを設定した状態で開いてしまうとその瞬間に情報漏洩となります。100%防ぐとなると環境をしっかり分けるほうが説得力と安心感がありますがそれはそれでとても面倒なので、簡単にリスクを減らす、簡単にリスクが無いことを事前に確認できる、という仕組みにしたいと思いavante-status.nvimのコンセプトにしました。
あとnvimプラグインを作ったことなかったので練習程度の気持ちです。
プラグイン開発のお気持ち
vimプラグインは簡単なものは開発したことがありましたが、neovimプラグインの開発は初めてでした。
Luaでの開発は慣れればモジュール化がやりやすそうでいい感触です。
しかしlazy.nvimなどで遅延読み込み時にハイライトをどう適用すればいいのかなど細かい部分で躓きがちです。
あとvimスクリプトも同じですがデバッグがしづらい、、、デバッグ用のプラグインとか、自分の知識不足な気がしますがもう少し経験を積めばわかってくるのかな。精進してみます。
Discussion