🐜

Gemini API を利用した Vim Plugin

2024/01/28に公開

Google Gemini の API が出ており、今は無料で使える!ということで、denops.vim を利用したプラグインを作成してみました。

https://github.com/yukimemi/futago.vim

こんな感じで、チャットできるプラグインです。

futago

使い方

  1. Gemini API の key を取得

以下の URL から取得できます。

Get API key

  1. 環境変数へ設定

環境変数 GEMINI_API_KEY へ、取得した API key を設定してください。

  1. g:denops#server#deno_args--unstable-kv を追加

チャット履歴を保存するために、 Deno KV を使用しています。
そのため、 g:denops#server#deno_args--unstable-kv を追加してください。

let g:denops#server#deno_args = ['-q', '--no-lock', '--unstable-kv', '-A']
  1. プラグインインストール

お好きなプラグインマネージャーでプラグインをインストールしてください。
もちろん、 denops.vim も必須です。

  1. futago#start_chat() の呼び出し
call futago#start_chat()

デフォルトだと新規タブでチャット画面が開きます。

You: 2024-01-28T16-43-48.988
-------------

と出るので、 ------------- の下になんか打ち込んでから保存すると、回答が返ってきます。

履歴からの継続チャット

Deno KV を利用して会話履歴を保存しているので、過去チャットから継続して会話することもできます。
過去チャットからの継続では初回の API 呼び出しで会話履歴を合わせて投げるので、あんま会話履歴が長いのだとダメになるかもです。

  1. FutagoHistory コマンド呼び出し

履歴からの継続チャットを行うには、会話履歴を QuickFix に表示する、 FutagoHistory コマンドを呼び出します。

QuickFix にこれまでの会話履歴が出るので、開くことで継続して会話することができます。
一番最後の ------------- 配下の行以降に書き込みをしてください。
特にチェックとかはしていないので変な所に書き込まれたりするとおかしくなります。

カスタマイズ

futago#start_chat() には、辞書でいくつか引数を与えることができます。
例えばこんな感じです。

nnoremap <Leader>fc <Cmd>call futago#start_chat({
  \ "opener": "vsplit",
  \ "history": [
  \   {"role": "user", "parts": [{ "text": "僕の名前は yukimemi" }]},
  \   {"role": "model", "parts": [{ "text": "了解!覚えておくね" }]},
  \ ],
  \ "humanPrompt": "yukimemi"
  \ })<cr>

futago_friendly

開き方を vsplit に変え、自分のプロンプト が yukimemi になって、 Gemini もフレンドリーに返してくれるようになります。

Gemini API では、 GPT みたいなシステムプロンプトがないようで、会話履歴、という形で指示を出すことはできるみたいです。

また、 Gemini API には、 SafetySetting という設定があり、
デフォルトだと安全性チェックが働き、閾値を超えた場合は動作がブロックされます。

一応、設定で変更できるようにしてありますが、すべての閾値を下げてブロックなし、とした場合でもブロックされるものはブロックされちゃうようです。

こんな感じで設定できます。

let g:futago_safety_settings = [
  \ { "category": "HARM_CATEGORY_HATE_SPEECH", "threshold": "BLOCK_NONE" },
  \ { "category": "HARM_CATEGORY_SEXUALLY_EXPLICIT", "threshold": "BLOCK_NONE"  },
  \ { "category": "HARM_CATEGORY_HARASSMENT", "threshold": "BLOCK_ONLY_HIGH" },
  \ { "category": "HARM_CATEGORY_DANGEROUS_CONTENT", "threshold": "BLOCK_MEDIUM_AND_ABOVE" },
  \ ]

設定できる categorythreshold はそれぞれ以下を参照ください。

ずんだもんとプログラミング!

会話履歴で指示出しはできるということなので、こちら のプロンプトを参考に初期会話履歴として与えることで、ずんだもんとしてキャラ付けもできました。

https://github.com/yukimemi/dotfiles/blob/008541aa7e3c783d9c2e5357166435ece4774e05/.config/nvim/denops/config/plugins/ai.ts#L107-L219

※設定が TypeScript なのは こちらの記事 参照

これで、ずんだもんと楽しくプログラミングすることができます!!

試しにフィボナッチ数列の書き方を聞いてみましょう。

futago_zundamon

・・・\(^o^)/

Discussion