Claude Opus 5.5 が SeedRouter で利用できます

Claude Code で Nano Banana Pro を使う:画像を生成・編集するスキル

Claude Code に Nano Banana Pro のスキルを用意する方法。リクエスト送信、タスクのポーリング、画像の保存を行う小さなスクリプトと、名前で呼び出せる SKILL.md。

Markdown で読む

Claude Code は、スキルを使って Nano Banana Pro で画像を生成・編集できます。スキルとは、SKILL.md ファイルと、SeedRouter API を呼び出す短いスクリプトを入れたフォルダです。/nano-banana-pro と入力して画像の内容を伝えると、Claude がプロンプトを書いてスクリプトを実行し、スクリプトがリクエストの送信、タスクのポーリング、プロジェクトへの画像の保存を行います。同じフォルダは OpenAI Codex でも使えます。SeedRouter は公式のスキルや MCP サーバーを提供していないため、このガイドではそのままコピーできるものを紹介します。スキルの形式は、2026 年 9 月 29 日に確認した Anthropic と OpenAI のドキュメントに従っています。

Claude Code は Nano Banana Pro でどう画像を作る?

Claude Code 自身は画像を描きません。コマンドを実行できるので、画像 API を呼び出すスクリプトを実行できます。スキルを用意すると、1 回のリクエストは次のように進みます。

  1. スキルを呼び出して画像の内容を伝えます。たとえば /nano-banana-pro a hero image for the pricing page です。
  2. Claude が説明を Nano Banana Pro のプロンプトに書き直し、サイズとアスペクト比を選びます。
  3. Claude がスクリプトを実行します。スクリプトはリクエストを POST https://api.seedrouter.ai/v1/images/generations に送り、タスク ID を受け取ります。
  4. スクリプトは画像ができるまで数秒ごとに GET /v1/tasks/{id} をポーリングし、完成したら images/ フォルダにダウンロードします。
  5. Claude がファイルのパスを伝え、そのままコードで画像を使うこともできます。

指示だけでなくスクリプトを使うことで、API 呼び出しを正確に保てます。Claude がどんなプロンプトを書いても、リクエストの本文、ポーリングのループ、ファイルの保存方法は毎回同じです。

始める前に必要なものは?

  • SeedRouter の API キー。Claude Code を起動するターミナルでエクスポートしておきます。
export SEEDROUTER_API_KEY="your-key"
  • 残高。 実行するたびに有料のリクエストが 1 回発生します。新規アカウントには少額の無料残高があり、失敗したリクエストには課金されません。
  • Python 3。 スクリプトは標準ライブラリだけを使うので、インストールは不要です。

スクリプト:送信、ポーリング、保存

次のコードを、スキルのフォルダ内の scripts/nano_banana_pro.py として保存します。

#!/usr/bin/env python3
import argparse
import json
import os
import pathlib
import sys
import time
import urllib.error
import urllib.request

API = "https://api.seedrouter.ai/v1"
AGENT = "nano-banana-pro-skill/1.0"
MIME = {
    ".jpg": "image/jpeg",
    ".jpeg": "image/jpeg",
    ".png": "image/png",
    ".webp": "image/webp",
    ".heic": "image/heic",
    ".heif": "image/heif",
}
RATIOS = ["1:1", "2:3", "3:2", "3:4", "4:3", "4:5", "5:4", "9:16", "16:9", "21:9"]


def call(method, path, body=None):
    request = urllib.request.Request(
        API + path,
        data=None if body is None else json.dumps(body).encode(),
        method=method,
        headers={
            "Authorization": "Bearer " + os.environ["SEEDROUTER_API_KEY"],
            "Content-Type": "application/json",
            "User-Agent": AGENT,
        },
    )
    try:
        with urllib.request.urlopen(request, timeout=60) as response:
            return json.load(response)
    except urllib.error.HTTPError as error:
        sys.exit(f"HTTP {error.code}: {error.read().decode()}")


def submit(args):
    parts = [{"text": args.prompt}]
    for url in args.ref:
        suffix = pathlib.PurePosixPath(url.split("?")[0]).suffix.lower()
        if suffix not in MIME:
            sys.exit(f"Cannot tell the image type of {url}; use a .jpg, .png, .webp, .heic or .heif URL.")
        parts.append({"fileData": {"mimeType": MIME[suffix], "fileUri": url}})
    image_config = {}
    if args.ratio:
        image_config["aspectRatio"] = args.ratio
    if args.size:
        image_config["imageSize"] = args.size
    generation_config = {"responseModalities": ["IMAGE"]}
    if image_config:
        generation_config["imageConfig"] = image_config
    body = {
        "model": args.model,
        "contents": [{"role": "user", "parts": parts}],
        "generationConfig": generation_config,
    }
    return call("POST", "/images/generations", body)["id"]


def wait(task_id, out_dir, timeout):
    deadline = time.monotonic() + timeout
    while time.monotonic() < deadline:
        task = call("GET", "/tasks/" + task_id)
        if task["status"] == "completed":
            out_dir.mkdir(parents=True, exist_ok=True)
            extension = "jpg" if task["output"]["output_format"] == "jpeg" else task["output"]["output_format"]
            for index, image in enumerate(task["output"]["data"]):
                path = out_dir / f"{task_id}-{index}.{extension}"
                download = urllib.request.Request(image["url"], headers={"User-Agent": AGENT})
                with urllib.request.urlopen(download, timeout=120) as response:
                    path.write_bytes(response.read())
                print(path)
            return
        if task["status"] == "failed":
            sys.exit(f"Task {task_id} failed: {task['error']['message']}")
        time.sleep(3)
    sys.exit(f"Task {task_id} is still processing. Resume with --resume {task_id}")


def main():
    parser = argparse.ArgumentParser()
    parser.add_argument("--prompt")
    parser.add_argument("--ref", action="append", default=[])
    parser.add_argument("--ratio", choices=RATIOS)
    parser.add_argument("--size", choices=["1K", "2K", "4K"])
    parser.add_argument("--model", default="gemini-3-pro-image",
                        choices=["gemini-3-pro-image", "gemini-3-pro-image-official"])
    parser.add_argument("--out", default="images")
    parser.add_argument("--timeout", type=int, default=600)
    parser.add_argument("--resume")
    args = parser.parse_args()
    if args.resume:
        task_id = args.resume
    elif args.prompt:
        task_id = submit(args)
        print(f"task {task_id}", file=sys.stderr)
    else:
        parser.error("--prompt or --resume is required")
    wait(task_id, pathlib.Path(args.out), args.timeout)


if __name__ == "__main__":
    main()

このスクリプトが行うこと:

  • 送信は 1 回だけ。 --prompt がプロンプトのテキスト、--ref が参照画像の URL の追加(複数なら繰り返し指定)、--ratio と --size が imageConfig の設定です。リクエスト本文は Google の generateContent 形式に model フィールドを加えたもので、Nano Banana Pro API リファレンスの定義どおりです。
  • タスクができた時点でタスク ID を表示 してから待機に入ります。
  • ポーリングしてから保存。 タスクが完了すると、すべての画像を images/ にダウンロードしてパスを表示します。失敗した場合は理由を表示します。
  • 再送信ではなく再開。 待機がタイムアウトしたら、--resume <task id> で同じタスクを再確認します。もう一度送信すると、2 回目の有料リクエストになります。
  • User-Agent ヘッダーを送る。 この行は残してください。Python 既定の User-Agent を拒否するサーバーがあり、これがないとダウンロードが 403 で失敗することがあります。

Claude に使わせる前に、単体でテストできます。

python3 scripts/nano_banana_pro.py --prompt "A ceramic teapot on a linen tablecloth, soft window light" --ratio 16:9 --size 2K

スキル本体:SKILL.md には何を書く?

Claude Code のドキュメントは、スキルを SKILL.md ファイルを含むディレクトリとして説明しています。「--- マーカーで囲まれた YAML フロントマターが、いつスキルを使うかを Claude に伝え、markdown の本文がスキル実行時に Claude が従う指示になります。」scripts/ フォルダのような補助ファイルは、その隣に置きます。

同じフォルダに、次の内容を SKILL.md として保存します。

---
name: nano-banana-pro
description: Generate or edit an image with Nano Banana Pro (gemini-3-pro-image) through the SeedRouter API and save it into the project. Use when the user asks for an image, illustration, icon, poster or edit of an existing image.
argument-hint: "[what the image should show]"
disable-model-invocation: true
---

Create an image for this request: $ARGUMENTS

1. Write one prompt in full sentences: subject, framing, action, setting and style. Put any text that must appear in the image in double quotes and say where it goes. For an edit, say what changes and what must stay the same.
2. Choose --ratio from 1:1, 2:3, 3:2, 3:4, 4:3, 4:5, 5:4, 9:16, 16:9, 21:9 and --size from 1K, 2K, 4K (4K only for print).
3. Reference images must be public HTTPS URLs ending in .jpg, .png, .webp, .heic or .heif, passed with --ref. If the user points to a local file, ask for a public URL instead. Never send base64.
4. Show the user the prompt and options, and wait for approval. Each run is a paid request.
5. Run: python3 ${CLAUDE_SKILL_DIR}/scripts/nano_banana_pro.py --prompt "..." [--ratio R] [--size S] [--ref URL]
6. If it stops with "still processing", run it again with --resume and the same task ID. Never submit the same request twice.
7. Report the saved file paths. If the task failed, explain the reason and suggest a change to the prompt.

ここで重要なフィールドは 2 つです。

  • disable-model-invocation: true は、あなただけがスキルを起動できるようにします。Claude Code のドキュメントは、これを「副作用のあるワークフローや、実行のタイミングを自分で管理したいワークフロー」に勧めています。実行のたびに費用がかかるので、Claude が自分の判断で画像を生成すべきではありません。
  • ${CLAUDE_SKILL_DIR} はスキル自身のフォルダに置き換えられるので、スキルをどこにインストールしてもスクリプトが動きます。

スキルはどこに置き、どう実行する?

Claude Code は主に 2 つの場所からスキルを読み込みます。

場所パス使える範囲
個人~/.claude/skills/nano-banana-pro/このマシン上のすべてのプロジェクト
プロジェクト.claude/skills/nano-banana-pro/このリポジトリ。コミットすればチームと共有できます

完成したフォルダは次のようになります。

nano-banana-pro/
├── SKILL.md
└── scripts/
    └── nano_banana_pro.py

SEEDROUTER_API_KEY を設定したターミナルで Claude Code を起動し、スキル名に続けて作りたいものを入力します。

/nano-banana-pro a 16:9 hero image for the pricing page: a calm desk with a laptop, a notebook and a cup of tea, soft morning light, muted green palette, no text

Claude がプロンプトとオプションを示し、あなたが承認すると、画像が images/ に保存されます。コマンドを事前に許可していない限り、Claude Code はスクリプトを実行する前に許可も求めます。これが課金前の 2 つ目の確認になります。

プロンプトそのものについては、Nano Banana Pro プロンプトガイドで構成、画像内の文字、参照画像をより詳しく解説しています。

Codex でも同じ Nano Banana Pro スキルを使える?

使えます。どちらのツールもオープンな Agent Skills 標準に従っています。OpenAI の Codex ドキュメントによると、スキルは「SKILL.md ファイルと、任意のスクリプトや参照資料を含むディレクトリ」で、このファイルには「name と description が必須」です。上のスキルには両方あります。

Codex は別のフォルダでスキルを探します。

場所パス
個人~/.agents/skills/nano-banana-pro/
リポジトリ.agents/skills/nano-banana-pro/

フォルダをそこにコピーするか、シンボリックリンクを張ります。どちらのツールもシンボリックリンクのスキルフォルダに対応しています。Codex では /skills を実行するか、$nano-banana-pro と入力して呼び出します。

違いが 2 つあります。

  • スクリプトのパス。 ${CLAUDE_SKILL_DIR} は Claude Code の置換変数です。Codex は各スキルのファイルパスをモデルに示すので、SKILL.md の隣にある scripts/nano_banana_pro.py を見つけられます。ただし違うパスを実行した場合は、スクリプトの場所を伝えてください。
  • 自動での呼び出し。 disable-model-invocation は Claude Code のフィールドです。Codex で同じことをするには、スキルのフォルダに agents/openai.yaml を置き、policy の下に allow_implicit_invocation: false を設定します。これで Codex は、あなたが呼び出したときだけスキルを実行します。

スクリプトが api.seedrouter.ai に接続するにはネットワークアクセスが必要です。エージェントがネットワークのないサンドボックスで動いている場合は、そのセッションでネットワークアクセスを許可してください。

プロジェクトにある画像を編集するには?

Nano Banana Pro は参照画像をもとに編集しますが、API は参照画像を公開 URL でしか受け付けません。手元のファイルは、自分のストレージバケットなどにまずアップロードしてから --ref で渡します。

生成された画像はすでに公開されています。完了したタスクは画像を URL で返すからです。結果をさらに修正するには、その URL を参照画像として渡し、変えたい点を伝えます。

/nano-banana-pro edit the last image: keep the desk and the laptop, change the tea cup to a glass of water, and make the light warmer

Claude は直前の画像の URL を --ref で再利用し、何を残すかを明記した編集用のプロンプトを書きます。ターン間でモデル自身の文脈を保つマルチターン編集については、それまでのターンを送り返す方法を API リファレンスで説明しています。上のスクリプトは 1 ターンずつ送信します。

コーディングエージェントで GPT Image 2 をすでに使っている場合は、Codex と Claude Code で GPT Image 2 を使うでその設定を紹介しています。そちらはエージェントに貼り付けるプロンプトが中心です。

よくある質問

SeedRouter 公式の Nano Banana Pro スキルや MCP サーバーはある?

ありません。SeedRouter は提供していません。このガイドのスキルは、あなたが所有して自由に変更できる普通のフォルダで、あなたのキーで公開 API を呼び出します。

スクリプトが画像を待ち続けるのではなくポーリングするのはなぜ?

SeedRouter の Nano Banana Pro のリクエストはタスクです。送信するとタスク ID が返り、タスクが完了した時点で画像が届きます。ポーリングなら接続が短く済み、待機が中断されてもタスク ID は有効なままです。

同じスキルを Nano Banana 2 にも使える?

使えます。少し変更が必要です。スクリプトの --model のデフォルト値と選択肢を gemini-3.1-flash-image に変え、--size の選択肢に 512 を加えます。このサイズは Nano Banana 2 は対応していますが、Pro は対応していません。モデルの比較は Nano Banana 2 vs Pro vs 2 Lite を参照してください。

スキルを読み込むだけで費用はかかる?

かかりません。Claude が SKILL.md を読んでも、SeedRouter では費用は発生しません。スクリプトを 1 回実行するごとに 1 回のリクエストとしてモデルページの料金で課金され、失敗したタスクには課金されません。

Claude Code から画像生成を始める

フォルダを作り、キーをエクスポートして、まずは小さな画像で /nano-banana-pro を試してください。現在の料金は Nano Banana Pro のページに、リクエストのすべてのフィールドは API リファレンスに記載しています。

関連ガイド