🐰

vimからchatGPTを呼んでスニペットみたいに使う

2023/01/01に公開2

概要

chatGPTというか OpenAIText 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

rocchoroccho

楽しい記事をありがとうございます。

code-davinci-002は今も無料でしたか?
私もここを参考にしました ( https://beta.openai.com/docs/guides/code/introduction
別のプラグインでになりますが、002に設定したうえでAPIを呼んでみたらtokenが使われてしまっているようで、、もしなにかご存知であれば教えていただけたら嬉しいです。

yaasitayaasita

うーん。。。。すいません、こちらもあまり詳しいことは分からないです。
下記ページに

https://beta.openai.com/docs/guides/code/introduction

During this initial limited beta period, Codex usage is free

と書いてあったので無料なのかなーと思ったんですけど、条件があるのかもしれません。