chatpgpt-prompt-wrapper
OpenAIのAPIを使ってChatGPTにコマンドラインからアクセスするためのツール。
Homebrewを使っているなら
1
| |
もしくはPython 3.9 ~ 3.11がインストールされている環境なら
1
| |
とすればインストールでき、cgというコマンドが使えるようになります。
(エイリアスとしてchatgpt-prompt-wrapperというコマンドもインストールされます。)
準備
必要なものは、まずはPython 3.9~3.11。そのpipを利用すれば上のようにpipでインストールできます。
あとは Account API Keys - OpenAI API からOpenAIのAPI Keyを取得しておきます。
これを
1
| |
のようにしてOPENAI_API_KEYという環境変数にいれておきます。
常に使うなら上のコマンドを.bashrcや.zshrcに書いておいてください。
簡単な使い方
ask
cg ask <message>のようにして質問を投げるとChatGPTが答えてくれます。
1 2 | |
chat
cg askとするとchatを開始できます。

chatではやり取りを続けられますが、Ctrl-Cを押すかbye, exit, quitというメッセージを送ると終わります。
デフォルトではmultilineモードで、複数行の書き込みが可能です。 Enterは改行になるので、 メッセージを送る際にはAlt(Opt)-Enter、もしくはEscEnter(続けて押す)を入力すると送信できます。
Backspaceや方向キーも普通のエディタのように使えます。
chatモードのオプション
--no_multilineオプションを与えるとシングルラインモードになって
Enterでメッセージを送るようになります。
また、デフォルトでは通常のターミナル操作などのようにEmacsモードで動作しますが(Ctrl-B/Fで一文字戻る/進む、など)、
--viオプションを与えるとViモードになってEscを押すとH/J/K/Lで左/下/上/右に進めたりするようになります。
この辺の動作は Python Prompt Toolkit を使ってます。
本当はブラウザなどでよくあるようなShift-Enterで送信(もしくはEnterを送信でShift-Enterは改行)とかやりたかったのですが、 ターミナル自体がその区別をサポートしていないものもあるらしく難しい模様。
ということでmultilineモードの送信などはPython Prompt Toolkitのデフォルトの動作になっています。
chatモードでやっていること
chatモードではそれまでのやり取りを踏襲した答えを出してくれますが、 送信するたび、それまで全てのやり取りを送って答えを聞いているだけです。
Token数に制限があるので、制限を超えそうな場合には古いものからメッセージを削除して送るようにしています。
Token数は大体英語だと1 wordが1 tokenちょっと、日本語だと1文字1 tokenちょっとな感じです。
token数はOpenAIが提供している
tiktokenというライブラリを使えば数えることが出来ます。
これと、
以下のノートにあるnum_tokens_from_messages関数を参考に正確なtoken数を見積もることが可能です。
各メッセージの文字数以外にroleなどの情報も送るために少しプラスアルファがあることに注意が必要です。
openai-cookbook/How_to_count_tokens_with_tiktoken.ipynb at main · openai/openai-cookbook · GitHub
ある程度やり取りを行ったまま続けると、常にToken数制限ギリギリのやり取りを行うことになるのでちょっとcostに気をつけたほうが良いです。
gpt-3.5-turboなら4096 tokensの制限で最大1円弱なので機械的に大量に送らない限りは気にならない程度かと。
gpt-4-32kとかだと32768 tokensまで送れて、かつ1k tokensあたりの料金も数十倍になるので 最大で一回で100円程度かかってしまうこともあります。
また、
Chat completion
といううAPIを使っていますが、
streamというオプションがあり、これをTrueにすると
回答を少しずつ受け取ることが出来るので
受け取り次第書き出すようにすると
Webでやってるようなツラツラと書いているような様子になります。
openai-cookbook/How_to_stream_completions.ipynb at main · openai/openai-cookbook · GitHub
Usage
cg helpでコマンドのヘルプ、cg commandsで使えるサブコマンド一覧を見ることが出来ます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | |
1 2 3 4 5 6 7 8 9 10 11 12 13 | |
自作サブコマンド
あらかじめ指定したプロンプトを用意しておいて、それを自作のサブコマンドとして呼ぶことも出来ます。
設定ファイルは~/.config/cg/config.tomlのTOML formatのファイルです。
各コマンドは以下のような感じで。
testというサブコマンドを作っています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | |

質問も含まれたものが用意されてるので何も追加メッセージ無しで実行して、
最後のassitantのところでその答えが帰ってきています。
Pythonの辞書に直すと
1 2 3 4 5 6 7 8 9 10 11 12 | |
description:cg commandsでコマンドリストを表示する際に出す説明文。show: 入力のプロンプトを表示するかどうか。デフォルトではfalse。<cmd>.messages:[[]]は同じものを一連のリストにします。それぞれrole、contentという値を持った辞書です。role:system,user,assistantのいずれか。system: 役割の指定などの指示。ただ、gpt-3.5では余り意味をなさず、userとして指示を出したほうがうまくいく場合が多い、とのことなので、cgコマンドの中ではgpt-3.5系ではuserに変換して送っています。user: ユーザーの入力。assitant: AIの返信。あらかじめやり取りを行ったという想定で質問したい場合などに使う。
content: メッセージ内容。
これ以外に
chat = trueとすればchatモードとしてやり取りを開始することが出来ます。
自作サブコマンドの簡単な例
上のは特に追加で質問せずともそのまま答えてもらう文章を書いてしまっていますが、 よく使いそうな例としては役割を与えておいて、質問はその都度する、というもの。
1 2 3 4 5 | |
みたいな感じで設定しておくと、
$ cg sh show number of cpus
To show the number of CPUs in a shell script, you can use the `nproc` command which prints the number of available processing units (CPU cores or threads) that the system has.
To use it, you can simply run the following command in your terminal:
```
nproc
```
This will output a single number representing the number of available processing units on your system.
To save the output of the `nproc` command in a script variable, you can use command substitution like this:
```
num_cpus=$(nproc)
echo "Number of CPUs: $num_cpus"
```
This will store the output of the `nproc` command (number of CPUs) in the `$num_cpus` variable and print it to the console.
こんな感じで、特に質問ではシェルスクリプトと言わなくてもシェルスクリプトで使えるような方法を答えてくれます。
同様にchat = trueでも相手の役割や事前知識をあらかじめ指定した上で開始することが出来ます。
まとめ
ChatGPTをコマンドラインやシェルスクリプトなどからサクッと呼びたかったのでそれ用のツールを作ってみました。 多分同じようなものはすでに色々とあるとは思いますが。
適当なプロンプト入れたsubcommandを作っておけば手短に質問するだけでもいい感じに答えてくれるように出来るので ターミナルで作業を使う身としては便利。
