Codex / Gemini CLI / Claude Code を非対話モードで呼び出し、3者間で議論させる
Codex(OpenAI)、Gemini CLI(Google)、Claude Code(Anthropic)にはそれぞれ無料枠やクオータが存在するが、日常的に余らせてしまうことがある。これらをコマンドラインから非対話的に呼び出し、あるテーマについて3者に議論させることでクオータを有効活用する。
# 基本:exec サブコマンドでプロンプトを直接渡す
codex exec "あなたの意見を述べてください"
# stdin からパイプで渡す
echo "前の発言者の意見: ..." | codex exec -
# 主要オプション
# --model <model> モデル指定
# --full-auto 自動承認モード(確認プロンプトを出さない)
# --json JSONL形式で出力(スクリプト連携向き)
# 2>/dev/null 進捗表示(stderr)を抑制して結果だけ取得
システムプロンプト: --config experimental_instructions_file=./prompt.md で指示ファイルを指定可能。
# 基本:-p フラグでヘッドレス(非対話)モード
gemini -p "あなたの意見を述べてください"
# stdin からパイプで渡す(TTY でなければ自動ヘッドレス)
echo "前の発言者の意見: ..." | gemini -p "これに反論してください"
# 主要オプション
# -p / --prompt 非対話モード
# --output-format json JSON形式で出力
システムプロンプト: 環境変数 GEMINI_SYSTEM_MD にファイルパスを指定。
GEMINI_SYSTEM_MD=./system.md gemini -p "お題について議論して"
# 基本:-p (--print) フラグで非対話モード
claude -p "あなたの意見を述べてください"
# stdin からパイプで渡す
echo "前の発言者の意見: ..." | claude -p "これに対するコメントを述べて"
# 主要オプション
# -p / --print 非対話モード
# --append-system-prompt <text> デフォルト指示に追記(推奨)
# --system-prompt <text> システムプロンプトを完全置換
# --system-prompt-file <path> ファイルからシステムプロンプト読込
# --output-format json JSON形式で出力
| 機能 | Codex | Gemini CLI | Claude Code |
|---|---|---|---|
| 非対話実行 | codex exec "..." | gemini -p "..." | claude -p "..." |
| stdin 入力 | | codex exec - | | gemini -p "..." | | claude -p "..." |
| システムプロンプト | 設定ファイル経由 | 環境変数 GEMINI_SYSTEM_MD | --append-system-prompt |
| JSON出力 | --json | --output-format json | --output-format json |
以下は「あるテーマについて3者が順番に発言し、前の発言を踏まえて議論する」シェルスクリプトの基本形。
#!/bin/bash
set -euo pipefail
TOPIC="${1:?Usage: $0 <topic> [rounds]}"
ROUNDS="${2:-3}"
ROLE="あなたはパネルディスカッションのパネリストです。他の参加者の意見を踏まえつつ、自分の立場で簡潔に発言してください。"
log=""
for round in $(seq 1 "$ROUNDS"); do
echo "====== Round $round / $ROUNDS ======"
# --- Codex ---
prompt_codex="テーマ: ${TOPIC}\n\nこれまでの議論:\n${log:-(まだ発言なし)}\n\n${ROLE}"
say_codex=$(echo -e "$prompt_codex" | codex exec - 2>/dev/null)
echo -e "\n[Codex] $say_codex"
log="${log}\n\n[Codex Round${round}] ${say_codex}"
# --- Gemini ---
prompt_gemini="テーマ: ${TOPIC}\n\nこれまでの議論:\n${log}\n\n${ROLE}"
say_gemini=$(echo -e "$prompt_gemini" | gemini -p "上記の議論を踏まえて発言してください")
echo -e "\n[Gemini] $say_gemini"
log="${log}\n\n[Gemini Round${round}] ${say_gemini}"
# --- Claude ---
prompt_claude="テーマ: ${TOPIC}\n\nこれまでの議論:\n${log}\n\n${ROLE}"
say_claude=$(echo -e "$prompt_claude" | claude -p "上記の議論を踏まえて発言してください")
echo -e "\n[Claude] $say_claude"
log="${log}\n\n[Claude Round${round}] ${say_claude}"
done
echo ""
echo "====== 議論終了 ======"
echo -e "$log"
# テーマを指定して3ラウンド(デフォルト)
./debate.sh "ソフトウェア開発においてテストは本当に必要か"
# ラウンド数を指定
./debate.sh "AIは人間の創造性を超えるか" 5
各AIに異なる「立場」を与えることで、より構造的な議論が可能になる。システムプロンプトで立場を注入する。
#!/bin/bash
set -euo pipefail
TOPIC="${1:?Usage: $0 <topic> [rounds]}"
ROUNDS="${2:-3}"
# 各AIに異なる立場を付与
ROLE_CODEX="あなたは楽観主義者です。技術の可能性を積極的に評価する立場で発言してください。"
ROLE_GEMINI="あなたは現実主義者です。データと事実に基づいてバランスの取れた視点で発言してください。"
ROLE_CLAUDE="あなたは懐疑主義者です。リスクや見落とされがちな問題点を指摘する立場で発言してください。"
log=""
for round in $(seq 1 "$ROUNDS"); do
echo "====== Round $round / $ROUNDS ======"
ctx="テーマ: ${TOPIC}\n\nこれまでの議論:\n${log:-(まだ発言なし)}"
say_codex=$(echo -e "${ctx}\n\n${ROLE_CODEX}" | codex exec - 2>/dev/null)
echo -e "\n[楽観派/Codex] $say_codex"
log="${log}\n\n[楽観派 Round${round}] ${say_codex}"
say_gemini=$(echo -e "${ctx}\n\n${ROLE_GEMINI}" | gemini -p "上記を踏まえて発言してください")
echo -e "\n[現実派/Gemini] $say_gemini"
log="${log}\n\n[現実派 Round${round}] ${say_gemini}"
say_claude=$(echo -e "${ctx}\n\n${ROLE_CLAUDE}" \
| claude -p --append-system-prompt "$ROLE_CLAUDE" "上記を踏まえて発言してください")
echo -e "\n[懐疑派/Claude] $say_claude"
log="${log}\n\n[懐疑派 Round${round}] ${say_claude}"
done
echo ""
echo "====== 議論終了 ======"
echo -e "$log"
2>/dev/null でリダイレクトすると結果だけ取得できるsleep を入れるのが安全--json / --output-format json を使うと安定する