
コマンドラインからさっとAIのAPIを使うためのシェルスクリプトを なるべく外部依存を減らして作って通常のUnix環境なら即使えるようなものとして作ってみました。
スクリプト
jq
とか使えばJSONのパースとか簡単で複雑なことも確実にできるのですが、
そういうの使わずにやってみます。
ない可能性があるものとしてはcurl
とsed
くらいかな、と思いますが、
sed
に関してはGNU版でもmacOSなどに入ってるBSD版でも動くようにしているので
1、
ネットワークさえ繋がっていれば殆どの場合で使えるはずです。
こんな感じ。
重要なのは
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
|
追記: 2025/02/15
Windowsで作業する際に改行コードがCRLFが混じってdiffに入るとエラーになることがあるので
それを削除するために$'\r'
を削除する部分を追加。
追記ここまで
と
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
|
の部分。
encode
で入力をエスケープして改行も\n
に変換してJSONとして扱えるようにします。
出力はextract
で$key
に対応する値を取り出します。
model
, message[0].role
, message[0].content
をJSONにしてcurl
を使ってAPIに送ります。
ChatGPTなどのAPIは.../chat/completions
というエンドポイントを叩くと、
返してくるJSON形式のデータの中にchoices[0].message.content
に出力があるのでcontent
を取り出します。
最後にprintf
でエスケープされてる文字なども直して出力します。
ここでは一回問いかけをするだけのデータを送ってるので返ってくるchoicesは1つなのでシンプルに最初に見つかったものだけを取り出していますが、 複数になるとこのようにやるのはけっこう大変にはなってしまいます。
失敗した際にはmessage
にエラーメッセージが入っているのでそれを取り出して表示します。
あとの部分はモデルやエンドポイント、またAPIキーなどを設定して実行するだけです。
https://api.openai.com/v1/chat/completions
と同じ使い方のできるAPIであれば別のAPIでも使えるようになっています。
DeepSeekやローカルLLMのollamaなども基本的にOpenAIと互換性をもたせるような形を作ってくれているので
このスクリプトで使うことができます。
使い方
スクリプトは Simple Chat API call script のページからRAWのURLを取得して、
1
|
|
`
とするかZIPでダウンロードして展開して使ってください。
コピペでやろうとするとエスケープした部分とかが変わってしまう可能性があるので注意。
使い方としては引数として質問を与えるか、パイプでつなげて標準入力として与えることができます。 両方与えた場合は標準入力のあとに引数で与えた入力を改行した後につなげます。
オプションは
-m [MODEL]
: モデル指定。デフォルトはgpt-4o
。-e [ENDPOINT]
: エンドポイント指定。デフォルトはhttps://api.openai.com/v1/chat/completions
。-k [KEY_NAME]
: APIキーを入れた環境変数名の指定。デフォルトはOPENAI_API_KEY
。-v
: 詳細モード。入力に使ったJSONデータと出力のJSONデータそのものも表示する。-h
: ヘルプ表示。
MODEL
, ENDPOINT
, KEY_NAME
は~/.config/chat/configでも変更できます。
例えば
1 2 3 |
|
とかすればDeepSeekのAPIを使うようになります。
OpenAIとDeepSeekに関しては、ENDPOINTを指定しなくても
gpt*
, chatgpt*
, o1-*
の場合はOpenAIのAPIを、
deepseek*
の場合はDeepSeekのAPIを使うようにしています。
これら以外でENDPOINTを指定しないとローカル、
http://localhost:11434/v1/chat/completions
を使うようにしています。
これはollamaのデフォルトのエンドポイントです。
必要に応じて
-M
: max_completion_tokens-t
: temperature
などのオプションを追加してもいいかもしれませんが、
この辺おオプションはdeepseekだとまだmax_tokens
しかなかったり
OpenAIだとtemperature
しかなかったりするので
デフォルトでは入れずに指定されたらjsonに追加するようにする、的な感じが良いかと思います。
モデルを変えてみる
というわけで、実際に使ってみると
1 2 3 4 5 6 |
|
こんな感じでモデルの変更もしながら簡単に使えます。 まあ、各モデルが嘘をつくこともあるので、 この返信で正しいという確実な保証はできませんが2。
ちょっと長めの質問、返信を試す
長めの質問をする場合はファイルに書いておいて中身を標準入力で渡すのが楽です。
1 2 3 4 |
|
こんな質問をしてみます。
1
|
|
~15秒位。
1
|
|
~45秒位。
1
|
|
~20秒位(グラボはRTX 2070 Super)。
結構古いグラボであれですが、一応ollama使ってllima3.2でやってみてもこんな感じでできました。 deepseek-chat (deepseek-v3)は結構時間がかかりましたが一番複雑な構造になっています。
まあ、こういった使い方するのであれば普通にウェブでやったほうがその後のやり取りも出来るので 無理にシェルスクリプトでやる必要はありませんが。
Gitのcommitメッセージを生成する
の記事でChatGPTを使ってGitのcommitメッセージを生成するスクリプトを作りましたが、 この中では chatgpt-prompt-wrapper というPythonスクリプトを使ってAPIを叩いていました。
これが入ってないと動かないので、これをcurl
でやる上の方法に変更しました。
git-gpt-commit/bin/git-gpt-commit のスクリプトをダウンロードしてPATHの通ったところに置いて使ってください。
もしくはHomebrewでインストールすることもできます。
1
|
|
これで、git gpt-commit
というGitのサブコマンドが使えるようになります。
長いので、
1 2 |
|
とかのエイリアスを設定して使ってます。
これで、commit
の代わりにc
を使えばgit dif --cached
の出力を使ってcommitメッセージを生成してくれて、
作られたメッセージがデフォルトで記入された状態でcommitメッセージを編集するためにエディタが起動します。
gpt-commitでMODEL等を変更したい場合は~/.config/git_gpt_commit/configに書くことで変更できます。
-
特に改行関連で
sed
での動作に違いがあるので注意です。