image-gen-router について
image-gen-routerは、テキストプロンプトからラスター画像を生成するスキルです。GPTとGeminiのローカルCLIを選べ、ログイン済みアカウントを使うためAPIキーは不要です。選択したモデルと出力先に従って処理します。
主な機能
- 01GPTまたはGeminiでラスター画像を生成
- 02ログイン済みアカウントを使いAPIキー不要
- 03プロンプトファイルとPNG出力先に対応
- 04生成ファイルの保存先を報告
- 05失敗時にバックエンドを無断で切り替えない
活用シーン
- 01テキストの説明から画像を生成
- 02指定した場所に画像を保存
- 03長い指示にプロンプトファイルを使用
- 04選択したバックエンドの認証や生成エラーに対処
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ andrewii23/ ii23-skills --skill image-gen-routerインストール後、Claude Code で/image-gen-routerを入力して読み込まれたか確認します。
同梱ファイルscripts/gen_gemini.pyscripts/gen_gpt.py
詳細
Image Gen Router
2 つのローカルでヘッドレスな、API キー不要のバックエンドのいずれかを使って、テキストプロンプトからラスター画像を生成します。どちらも既存のログイン済みアカウントで実行され、ユーザーが各ツールに直接プロンプトを入力した場合とまったく同じように動作します(API キー不要、画像ごとの API 課金なし)。
- GPT — ユーザーの ChatGPT ログインを使う、Codex CLI の
imagegenツール。 - Gemini — ユーザーの Google ログインを使う、ヘッドレスの Antigravity
agyCLI。
このスキルの目的は、ユーザーがモデルを選べるようにすることです。それ以外の要素(被写体、スタイル、アスペクト比、配色、雰囲気)は、すべてプロンプトから選択したバックエンドにそのまま渡されます。
最も重要な選択:使用するバックエンド
生成を始める前に、使用するバックエンドを把握する必要があります。ケースは次の 2 つだけです。
1. ユーザーがすでにバックエンドを指定している → そのバックエンドを使い、尋ねないでください。 指定内容に従い、そのまま生成に進みます。ユーザーの表現は次のように対応づけてください。
- GPT、OpenAI、ChatGPT、codex、「gpt のやつ」、DALL·E (API ではなくモデルファミリーとして) → gpt
- Gemini、Google、agy、Antigravity、「nano banana」、「Google のやつ」 → gemini
すでに指定されているのに再度尋ねるのは煩わしく、やり取りを無駄に増やします。ユーザーが明示したのには理由があります。
2. ユーザーがバックエンドを指定していない → デフォルトを設けずに尋ねてください。 AskUserQuestion ツールを使って、選択肢をちょうど 2 つ提示する単一の質問を行います。どちらも同等の選択肢として提示してください(「おすすめ」の表示は付けません。ユーザーが希望を示していないので、こちらで勝手に決めないでください)。たとえば次のようにします。
AskUserQuestion(questions=[{
"question": "Which model should generate this image?",
"header": "Image model",
"multiSelect": false,
"options": [
{"label": "GPT (codex)", "description": "OpenAI image model via Codex CLI, under your ChatGPT login."},
{"label": "Gemini (agy)", "description": "Google image model via Antigravity CLI, under your Google login."}
]
}])
回答を読み取り、gpt または gemini に対応づけて処理を続けます。(ユーザーが「その他」を選んで何か入力した場合は、その内容を解釈してください。たとえば「速いほうならどちらでも」なら、いずれかを選び、どちらを使ったか伝えます。)
バックエンドが決まったら、同じリクエスト中に再度尋ねてはいけません。
ファイルの保存先
出力先が重要であることが明らかな成果物を依頼され、ユーザーが保存先を指定していない場合に限り、出力パスを尋ねてください。それ以外の場合は、処理をそこで止めないでください。
- パスまたは明確な保存先(「デスクトップに保存」など)が指定されている場合は、
--outで渡します。 - 保存先を気にしていない場合は、
--outを省略します。スクリプトがファイルの保存先を報告します。
選択したバックエンドの実行
各バックエンドにはそれぞれ専用のスクリプトがあります。どちらも同じ引数を受け取り、最終行に IMAGE: <abs-path> として最終的な保存先を出力します。その行を解析してファイルの場所を把握し、ユーザーに表示するか説明してください。
GPT バックエンド:
python3 ~/.claude/skills/image-gen-router/scripts/gen_gpt.py "<prompt>" [--out <path>] [--timeout <sec>]
Gemini バックエンド:
python3 ~/.claude/skills/image-gen-router/scripts/gen_gemini.py "<prompt>" [--out <path>] [--timeout <sec>]
共通オプション:
- 位置引数のプロンプト — 被写体とスタイルを指定します。具体的に、メディア、照明、配色、構図、アスペクト比を指定してください。どちらのモデルも細かな指定に対応します。例:
"isometric 3D illustration of a coffee shop, warm pastel palette, soft shadows, 16:9"。 --prompt-file <path>— 長いプロンプト向けです。シェルのクォートに関する問題を避けられます。--out <path>— 出力先の PNG ファイルです。省略すると、バックエンドがファイルをそのまま保存し、パスだけを報告します。--timeout <sec>— デフォルトは 600 です。画像生成は通常 1 分以内に終わりますが、画像モデルはコールドスタート時に時間がかかることがあるため、理由なく値を小さくしないでください。
実行後、IMAGE: の行を解析し、絶対パスをユーザーに伝えます。必要であれば、成功を報告する前に画像を読み込み、依頼内容に合っているか確認してください。
実行例
1 — ユーザーがモデルとパスを指定している場合:
「gemini を使って、ミニマルな線画の山のロゴを白地に黒で作成し、~/Desktop/logo.png に保存して」
バックエンド(gemini)とパスが明示されています → 質問せず、そのまま実行します。
python3 ~/.claude/skills/image-gen-router/scripts/gen_gemini.py \
"minimalist line-art mountain logo, single weight stroke, black on white" \
--out ~/Desktop/logo.png
2 — ユーザーがモデルを指定していない場合:
「宇宙空間に浮かぶレッサーパンダの宇宙飛行士の画像を、シネマティックでフォトリアルに生成して」
バックエンドが指定されていません → AskUserQuestion(GPT と Gemini、デフォルトなし)を行い、選ばれたスクリプトをプロンプトとともに実行します。ユーザーはパスに言及しておらず、気軽な依頼なので、パスについて尋ねず、--out を省略して保存先を報告します。
3 — 長いプロンプトでモデルは指定されているが、パスは指定されていない場合:
「gpt で、このシーンを描画して:」(長い段落が続く)
段落を一時ファイルに書き込み、--prompt-file を使います。
python3 ~/.claude/skills/image-gen-router/scripts/gen_gpt.py \
--prompt-file /tmp/scene_prompt.txt
失敗時の処理
どちらのスクリプトも、ゼロ以外の終了コードで終了し、stderr に理由を出力します。
- 終了コード 2 — バックエンドの CLI が見つからないか、認証されていません。GPT の場合は
codex login statusを実行してください。Gemini の場合は、agy --versionを確認し、ユーザーが Antigravity にログインしていることを確認してください。どのログインを修正すべきか、ユーザーに具体的に伝えてください。 - 終了コード 3 — CLI は実行されましたが、画像が生成されなかったか、タイムアウトしました。通常は バックエンドの一時的な不具合か、画像生成に対応していないモデルが原因です。1 回再実行してください。それでも 解決しない場合は、スクリプトが出力した stderr を報告してください。
黙ってもう一方のバックエンドや、課金対象の画像 API に切り替えないでください。ユーザーはバックエンドを選択したか(または選択を求められたはずです)、その選択を伝えずに切り替えると、実際に何が起きたのかが隠れてしまいます。選択されたバックエンドで画像を生成できない場合は、その失敗を伝え、もう一方を試すかどうかはユーザーに判断してもらってください。