← 100 Challenge

AI CLI 三者討論フレームワーク

Codex / Gemini CLI / Claude Code を非対話モードで呼び出し、3者間で議論させる

1. 背景と目的

Codex(OpenAI)、Gemini CLI(Google)、Claude Code(Anthropic)にはそれぞれ無料枠やクオータが存在するが、日常的に余らせてしまうことがある。これらをコマンドラインから非対話的に呼び出し、あるテーマについて3者に議論させることでクオータを有効活用する。

2. 各CLIの非対話呼び出し

Codex CLI OpenAI

# 基本:exec サブコマンドでプロンプトを直接渡す
codex exec "あなたの意見を述べてください"

# stdin からパイプで渡す
echo "前の発言者の意見: ..." | codex exec -

# 主要オプション
#   --model <model>    モデル指定
#   --full-auto         自動承認モード(確認プロンプトを出さない)
#   --json              JSONL形式で出力(スクリプト連携向き)
#   2>/dev/null         進捗表示(stderr)を抑制して結果だけ取得

システムプロンプト: --config experimental_instructions_file=./prompt.md で指示ファイルを指定可能。

Gemini CLI Google

# 基本:-p フラグでヘッドレス(非対話)モード
gemini -p "あなたの意見を述べてください"

# stdin からパイプで渡す(TTY でなければ自動ヘッドレス)
echo "前の発言者の意見: ..." | gemini -p "これに反論してください"

# 主要オプション
#   -p / --prompt       非対話モード
#   --output-format json   JSON形式で出力

システムプロンプト: 環境変数 GEMINI_SYSTEM_MD にファイルパスを指定。

GEMINI_SYSTEM_MD=./system.md gemini -p "お題について議論して"

Claude Code Anthropic

# 基本:-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形式で出力

3. フラグ比較表

機能CodexGemini CLIClaude 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

4. 三者討論スクリプト

以下は「あるテーマについて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

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"

6. 注意点