gpt-5 をラップした CLI で、生成AIによる軽作業をターミナルに分離した
gpt-5 をラップした CLI で、生成AIによる軽作業をターミナルに分離した
「なんでも CLI で完結させたい」。私が抱えているこの理想とこだわりが、今回の小さなツールづくりの芯にある。最近社内でも生成 AI 活用の熱が上がっており、調査や小さなメモ作成をPC 端末から素早く回す導線が欲しくなった。以前、Codex CLI の運用メモを記事にまとめた(当時から gpt‑5 の API 設計を強く意識していた)。今回は生成AIによる軽作業の導線をターミナルへ分離する。その方針で小さく作り、使い勝手を詰めてみた(Zenn)。
作ったもの
疑似コードを示す。本体は https://github.com/kazuhideoki/gpt-5-cli/blob/main/gpt-5-cli.sh にある。
#!/usr/bin/env bash
# ask: Tiny GPT-5 CLI (concept; non-production)
set -euo pipefail
MODEL_NANO="gpt-5-nano"; MODEL_MINI="gpt-5-mini"; MODEL_MAIN="gpt-5"
MODEL="$MODEL_NANO"; EFFORT="low"; VERBOSITY="low"
CONTINUE=""; PREV_ID=""; INPUT=""
while getopts ":m:e:v:cr:" opt; do
case "$opt" in
m) case "$OPTARG" in 0) MODEL="$MODEL_NANO";; 1) MODEL="$MODEL_MINI";; 2) MODEL="$MODEL_MAIN";; esac;;
e) case "$OPTARG" in 0) EFFORT="low";; 1) EFFORT="medium";; 2) EFFORT="high";; 9) EFFORT="minimal";; esac;;
v) case "$OPTARG" in 0) VERBOSITY="low";; 1) VERBOSITY="medium";; 2) VERBOSITY="high";; esac;;
c) CONTINUE=1;;
r) PREV_ID="$OPTARG";;
esac
done
shift $((OPTIND-1)); INPUT="${*:-}"
HIST="${OPENAI_HISTORY_INDEX_FILE:-$HOME/gpt-5-cli/history_index.json}"
if [[ -n "$CONTINUE" && -z "$PREV_ID" && -f "$HIST" ]]; then
PREV_ID="$(jq -r '.[0].last_id // empty' "$HIST" 2>/dev/null || true)"
fi
SYSTEM=""
if [[ -f system_prompt.txt ]]; then SYSTEM="$(sed 's/"/\\"/g' system_prompt.txt | tr -d '\n')"; fi
read -r -d '' BODY <<JSON
{
"model": "$MODEL",
"input": [
{"role":"system","content":[{"type":"input_text","text":"$SYSTEM"}]},
{"role":"user","content":[{"type":"input_text","text":"$INPUT"}]}
],
"tools": [{"type":"web_search"}],
"reasoning_effort":"$EFFORT",
"verbosity":"$VERBOSITY",
"previous_response_id":"$PREV_ID"
}
JSON
curl -s https://api.openai.com/v1/responses \
-H "Authorization: Bearer $OPENAI_API_KEY" \
-H "Content-Type: application/json" -d "$BODY" \
| jq -r '.output[0].content[0].text // .error.message'
作ったのは Bash 数百行の CLI「gpt‑5‑cli」である。OpenAI の Responses API を呼び出す。特徴は3つある。
- 会話は API 側のステートを利用して継続する。履歴を毎回送り直す必要はない。
previous_response_id
を渡せば枝分かれ(フォーク)もできる。なお、この分岐活用は今後検証予定である。 - Tool(web_search)を既定で有効にし、軽量モデルでも事実参照の抜けを補う。
- モデル・推論強度(
reasoning_effort
)・冗長度(verbosity
)を即時に切り替えられる。
参考: OpenAI Cookbook, OpenAI。
実装や使い方はリポジトリの README にまとまっている。-m0/-m1/-m2
で gpt‑5‑nano/mini/main
を選び、-e0/-e1/-e2
で推論強度、-v0/-v1/-v2
で冗長度を切り替える。-c
や -r{N}
で履歴から再開する際も、同じ要領でモデルや各種パラメータをその場で変更できる(フラグは連結・併用可)。既定は最軽量寄せの nano × low × low
とした。(GitHub)。
お気づきだと思われるが全てエージェントに作らせた。今時わざわざ言わなくても前提になりつつあるが、断っておきたくなるのは性か...
セットアップと最小の運用
導入は .env
に API キーと既定値を入れるだけでよい。詳しい手順は README を参照されたい。新規会話の先頭に常時付与するシステムプロンプトは system_prompt.txt
で管理している。例えば私は、web 検索の方針を明示するために以下のようにしている(引用は実際に使っている文面である)。
- ウェブ検索を必ず行います。
- 情報ソースURLは回答の末尾にのみ追記します。文末の追記はスキップします。
このように「web_search を既定でオン」にしておくと、軽量モデルでも情報の裏取りが効きやすく、ハルシネーションを抑えられる。端末からの一発で検索→要約→出典付きまでを完結できる点が最も嬉しい(GitHub, OpenAI Cookbook)。
なぜこう設計したか(動機とこだわり)
まず速度である。CLI は速い。そう、CLIは速い。入力→Enter→結果までの往復が短いほど、思考のフリクションは下がる。さらにコストである。gpt‑5 系 API の料金だが、とりわけ gpt‑5‑nano
は低コストなので、生成AIに任せる日常の軽作業に向くという判断である。モデルサイズと価格のレンジは公開情報として明示されている(gpt‑5‑nano
: $0.05/1M 入力トークン, $0.40/1M 出力トークン)(OpenAI)。nano で心許ないなら mini にすればいい。軽作業なら gpt‑5 を使うまでもない。速いは正義である
次に正確さの担保である。軽量モデルは高速だが、知識の空白や古い情報を引きずりやすい。そこで Tool の web_search を既定で有効にし、都度ウェブから根拠を調べさせる方針にした。Responses API 自体が stateful で、Tool 呼び出しも1つの応答経路に同居させられるため、CLI 側の制御は最小で済む。結果として生成AIによる軽作業を高速・低コストで回しつつ、出典付きの応答を標準化できる(OpenAI Cookbook)。
最後に操作の一貫性である。reasoning_effort
と verbosity
を明示する。これを上げるのは次のような場合などに。回答根拠の不足、推論の浅さ、要約の粗さのいずれかが見られる。low/medium/high
の切り替えは UI 上のモード感覚に近い。私の使い方では low × low
で速いのはもちろん、生成AIによる軽作業に適し思考の邪魔をしない。これらのパラメータは GPT‑5 の API で公式に導入されたコントロールであり、文章量と推論深度を明示的調整できるのが良い(OpenAI)。
使いどころと他ツールとの住み分け
本 CLI の守備範囲は、**生成AIによる軽作業(検索、簡易要約、メモ化)**である。端末から素早く聞き、出典付きで要約し、必要なら履歴からすぐ続ける。一方で、重い調査や長い思考の整理、複数ファイルの同時編集や大規模なコード変形は ChatGPT、あるいは Codex CLI でやるほうが快適である。私は以前、Claude Code と Codex CLI の運用を比較しながら、プロファイル設計や通知周りの工夫を記事にした。今回の CLI はその延長線上にあり、「生成AIによる軽作業はターミナルに分離する」という位置づけで設計した。(Zenn)。
まとめ
gpt‑5‑cli は、生成AIによる軽作業をターミナルに分離するための小さな道具である。Responses API のステートフルな会話継続と Tool(web_search)を既定で使う方針により、速さと出典付きの確からしさを両立しやすい。コストは CLI ではなく API の価格に依存するが、gpt‑5‑nano
を既定に据える構成で日常利用に十分実用的である。重い調査や大規模編集は ChatGPT 側に任せ、生成AIが得意な軽作業は CLI 側でさばく。この単純な住み分けが、いまの自分には最もしっくりくる運用である(OpenAI Cookbook, OpenAI)。
まあ、CLI を作っては捨てを繰り返しているので、数ヶ月程度の利用にとどまる見込みである。ただ、この CLI の作成と利用を通じて、gpt‑5 の API の感覚はエージェント作成に役立つと考えている。
参考リンク
- リポジトリ(README・フラグ仕様・履歴運用): kazuhideoki/gpt‑5‑cli (GitHub)
- Responses API のステート/Tool(web_search)の例: OpenAI Cookbook: Web Search and States (OpenAI Cookbook)
- GPT‑5 の
verbosity
とreasoning_effort
(minimal を含む)の概要: Introducing GPT‑5 for developers (OpenAI) - モデルの価格レンジ(gpt‑5‑nano など): GPT‑5 is here (OpenAI)
- Codex CLI の運用メモ(Publication): Claude Code ユーザーが、Codex CLI を使うためにした工夫と運用Tips (Zenn)
- MCP 連携の最小実装: kazuhideoki/gpt‑5‑mcp‑server (GitHub)
Discussion