vimで動くAIクライアントを作った
ごめん、完成はしていないです。いつ完成するんだ?
作りつつあり、既に動きますし、今回は新しい機能もあります。
それだけなんですが、君は次にこう言うでしょう。
「車輪の再発明」と。別にいいじゃん、硬いこと言わなくても。
ちなみに、この記事は網羅的に書く事はできていません。nincoについての解説は長く、骨のおれる事だからです。
前になかった特徴
- Tree型UI
- 時間をまきもどす
- Web検索
- 複数の文脈が協調して動く
特徴
- vim/neovimで動く
- 「言語モデル」はテキストエディタで動いてこそ最強では?
- typescriptで実装されていてdenopsで動く
- 移植が容易になる予定
- 会話の時間や対象を操作できる
- 会話の更新を止めて質問責めできる
- 時間を巻きもどして無茶振りできる
- 過去を改竄できる
- 会話を複製できる
- ツリー型UI
- 複数の文脈を操作できるため
- 文脈のIO
- JSONで保存、読みこみが可能
- JSONの設定ファイルを用いて同じ文脈を量産可能
- 複数のエンジンを使用可能
- ollama API互換
- openai API互換
- 作るのが容易
- 非エンジニアの僕ですらこのくらいは作れる
- 2025年7月13日現在、ソースは千行程度
- Web検索
- Duckduckgoの検索結果を参照できる
- w3m依存
- shell
- コマンドにAIの出力を投げる事ができる
- コマンドを自動実行しない
- コマンドは人が打つrm -rf /*とかされたら怖いじゃん?
- ずんだもんにも投げられる
- ninvoicevoxというクライアントを作ったぞ!
- エージェント的な動き
- タスクを分割して文書群を作成できる
背景の技術
vim/neovimにはdenopsというdenoを前景にした高速なplugin実行環境があります。
vim scriptのみで書けなくもないかもしれないけれど、こっちの方が速いしものによっては書きやすいですから、これを使いました。
設定
設定が柔軟にできるという事は、それだけユーザーに委ねられるので考えることは増えるのかもしれません。例えば下記のような辞書形式を設定に用います。もちろん、これはJSONから読みこめます。
ここではaiという名の文脈を作成しています。
let ai_config = #{
\ name: 'ai',
\ print: true,
\ repeat: true,
\ command: '',
\ command_arg: [],
\ key: '[Your API key]',
\ url: "https://api.openai.com/v1/chat/completions",
\ max_length: 20,
\ compress_num: 5
\ }
基本的な使い方
例えば、こうです。
let ai = ninco#new(ai_config)
call ninco#make_command(ai)
call ninco#set_bufname(ai)
call ninco#open(ai)
Ai こんにちは
メソッドチェーンもできます。
call ninco#new(ai_config)->ninco#make_command()->ninco#set_bufname()->ninco#open()
Ai こんにちは
ここで、ninco#make_command関数はコマンドを自動で生成します。もちろん、ninco#make_commandをしなければコマンドは生成されませんが…毎回関数を書くのめんどいじゃん?例えばAi
のようなコマンドが生成されます。このコマンド名は会話の文脈につけられた名前から自動で生成されます。
このコマンドはprintfのformatのように、visual modeでの選択範囲を%s
で引用できます。もちろんちなみにデフォルトでは%s
が引数なので、なにも考えずにAiコマンドを実行するとvisual modeの選択範囲の指示を実行します。
tree型UI
このクライアントは柔軟に色々できるのですが、折角だからわかりやすいUIを示します。
AIクライアントにtree型UI?と思うかもしれません。しかし、様々な文脈を切りかえながら使用していく場合には、それは一つの選択なのかもしれません。
なお、このクライアントには無名で使い捨ての文脈もあり、即座に捨てられるのでtreeには表示されません。
僕がAIクライアントに求めたもの
最後にポエムです。
一概にAIの是非を断じる事はできないでしょう。使う用途によって全自動がよかったり、半自動がよかったり、手動がよかったりするのかもしれません。使わない方がマシなケースすらあるのでしょう1。使うツールも様々なものがあってよいのかもしれません。
今回僕が求めたのはあくまで道具としてのシンプルさと自由度でした。きっとこの道具は僕にとって便利なもの。他の人にとっては違うかもしれません。
上記に書いたとおり、非エンジニアが千行程度で書けるレベルのものです。作る事自体が手軽です。楽しいから、みんな作ってみたらいいと思うよ。
まとめ
今回は僕が欲しかったAIクライアントを実装しました。
とても楽しい。