🐰
vimからchatGPTを呼んでスニペットみたいに使う
概要
chatGPTというか OpenAI の Text completion を使ってコードスニペット的に使ってる
自分はこんな感じで使ってますというメモ
もしかしたら既存のvimプラグインでもっと便利なのがあるかも
設定
まずは以下のようなnodejsのスクリプトをどこかに置いておきます
標準入力で受け取った文字列をOpenAIのAPIに投げて、帰ってきた文字列を標準出力するだけです
モデルはtext-davinci-003
を使っていますが、現在は無料のCode completion に投げても良いかもしれないです
その場合はモデル名をcode-davinci-002
にします
ここではopenai.mjsとして保存しています
#!/usr/bin/env node
"use strict";
import { Configuration, OpenAIApi } from "openai";
import fs from "fs";
const configuration = new Configuration({
apiKey: process.env.OPENAI_API_KEY,
});
const openai = new OpenAIApi(configuration);
const input = fs.readFileSync("/dev/stdin", "utf8");
const response = await openai.createCompletion({
model: "text-davinci-003",
prompt: input,
temperature: 0,
max_tokens: 1000,
});
console.log(response.data.choices[0].text);
あとはvimrcに以下を追記します
やっていることは、上記nodeスクリプトに文字列を渡すだけです
渡す際にファイルタイプによる言語指定を追加します
例えばファイルタイプがperlで質問が「配列を結合したい」だった場合は、APIに投げる文字列は
「perlで配列を結合したい」となります
ファイルタイプがshだった場合は「bashで」、tfだった場合は「terraformで」という指定にしています
(自分の場合はbashとterraformを書く場合が多いので)
ここら辺は好みで
command! -nargs=0 -range AI <line1>,<line2>call AI()
function! AI() range
" ファイルタイプの読み替え設定を好みで
let lang_name = {
\ "sh": "bash",
\ "tf": "terraform",
\ }
let lines = getline(a:firstline, a:lastline)
if has_key(lang_name, &ft)
let question = join([ lang_name[&ft] .. "で" ] + lines, "")
else
let question = join([ &ft .. "で" ] + lines, "")
endif
echomsg "to openai: " .. question
" 上記スクリプトを置いたパスに変更
let result = systemlist("/path/to/openai.mjs", question)
call append(a:lastline, result)
execute(a:firstline .. "," .. a:lastline .. "delete")
endfunction
使い方
あとは:AI
コマンドでAPIに投げるだけです
bash
perl
tfファイルはterraformとして
Discussion
楽しい記事をありがとうございます。
code-davinci-002は今も無料でしたか?
私もここを参考にしました ( https://beta.openai.com/docs/guides/code/introduction )
別のプラグインでになりますが、002に設定したうえでAPIを呼んでみたらtokenが使われてしまっているようで、、もしなにかご存知であれば教えていただけたら嬉しいです。
うーん。。。。すいません、こちらもあまり詳しいことは分からないです。
下記ページに
と書いてあったので無料なのかなーと思ったんですけど、条件があるのかもしれません。