Claude Opus 5.5 ist auf SeedRouter verfügbar

Nano Banana Pro in Claude Code: ein Skill, der Bilder erzeugt und bearbeitet

Gib Claude Code einen Nano Banana Pro Skill: ein kleines Skript, das Anfragen sendet, Aufgaben abfragt und Bilder speichert, dazu eine SKILL.md.

Als Markdown lesen

Claude Code kann mit Nano Banana Pro über einen Skill Bilder erzeugen und bearbeiten: einen Ordner mit einer SKILL.md-Datei und einem kurzen Skript, das die SeedRouter API aufruft. Du tippst /nano-banana-pro und beschreibst das Bild; Claude schreibt den Prompt und führt das Skript aus, und das Skript sendet die Anfrage, fragt die Aufgabe ab und speichert das Bild in deinem Projekt. Derselbe Ordner funktioniert auch in OpenAI Codex. SeedRouter liefert keinen offiziellen Skill und keinen MCP-Server, deshalb bekommst du hier einen zum Kopieren. Das Skill-Format folgt der Dokumentation von Anthropic und OpenAI, geprüft am 29. September 2026.

Wie erzeugt Claude Code Bilder mit Nano Banana Pro?

Claude Code zeichnet selbst keine Bilder. Es führt Befehle aus und kann deshalb ein Skript ausführen, das eine Bild-API aufruft. Mit einem Skill läuft eine Anfrage so ab:

  1. Du rufst den Skill auf und beschreibst das Bild, zum Beispiel /nano-banana-pro a hero image for the pricing page.
  2. Claude macht aus deiner Beschreibung einen Nano Banana Pro Prompt und wählt Größe und Seitenverhältnis.
  3. Es führt das Skript aus. Das Skript schickt die Anfrage an POST https://api.seedrouter.ai/v1/images/generations und bekommt eine Aufgaben-ID zurück.
  4. Das Skript fragt GET /v1/tasks/{id} alle paar Sekunden ab, bis das Bild fertig ist, und lädt es dann in einen Ordner images/ herunter.
  5. Claude nennt dir den Dateipfad und kann das Bild anschließend in deinem Code verwenden.

Ein Skript statt reiner Anweisungen hält die API-Aufrufe exakt: Request-Body, Abfrageschleife und Speichern der Datei sind jedes Mal gleich, egal welchen Prompt Claude schreibt.

Was brauchst du, bevor du anfängst?

  • Einen SeedRouter API-Key, exportiert in dem Terminal, aus dem du Claude Code startest:
export SEEDROUTER_API_KEY="your-key"
  • Guthaben. Jeder Lauf ist eine kostenpflichtige Anfrage. Neue Konten starten mit einem kleinen Gratisguthaben, und fehlgeschlagene Anfragen werden nicht berechnet.
  • Python 3. Das Skript nutzt nur die Standardbibliothek, du musst also nichts installieren.

Das Skript: senden, abfragen und speichern

Speichere das hier als scripts/nano_banana_pro.py im Skill-Ordner:

#!/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()

Was es macht:

  • Sendet einmal. --prompt ist der Text, --ref fügt eine Referenzbild-URL hinzu (für mehrere wiederholen), und --ratio sowie --size setzen imageConfig. Der Request-Body ist Googles generateContent-Format mit einem model-Feld, wie es die API-Referenz zu Nano Banana Pro definiert.
  • Gibt die Aufgaben-ID aus, sobald die Aufgabe erstellt ist, noch bevor es wartet.
  • Fragt ab und speichert dann. Wenn die Aufgabe fertig ist, lädt es jedes Bild nach images/ herunter und gibt jeden Pfad aus. Wenn die Aufgabe fehlschlägt, gibt es den Grund aus.
  • Setzt fort, statt neu zu senden. Läuft die Wartezeit ab, prüft --resume <task id> dieselbe Aufgabe erneut. Ein zweites Senden wäre eine zweite kostenpflichtige Anfrage.
  • Sendet einen User-Agent-Header. Lass diese Zeile drin: Manche Server lehnen den Standard-User-Agent von Python ab, und ohne ihn kann der Download mit 403 fehlschlagen.

Du kannst es allein testen, bevor Claude es benutzt:

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

Der Skill: Was gehört in die SKILL.md?

Die Dokumentation von Claude Code beschreibt einen Skill als Verzeichnis mit einer SKILL.md-Datei: „YAML-Frontmatter zwischen ----Markierungen, das Claude sagt, wann der Skill verwendet werden soll, und Markdown-Inhalt mit den Anweisungen, denen Claude folgt, wenn der Skill läuft.“ Hilfsdateien wie ein Ordner scripts/ liegen daneben.

Speichere das hier als SKILL.md im selben Ordner:

---
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.

Zwei Felder sind hier wichtig:

  • disable-model-invocation: true bedeutet, dass nur du den Skill starten kannst. Die Dokumentation von Claude Code empfiehlt das für „Workflows mit Nebenwirkungen oder solche, deren Zeitpunkt du selbst bestimmen willst“. Jeder Lauf kostet Geld, also sollte Claude nicht von sich aus entscheiden, ein Bild zu erzeugen.
  • ${CLAUDE_SKILL_DIR} wird durch den Ordner des Skills ersetzt, sodass das Skript läuft, egal wo du den Skill installiert hast.

Wo liegt der Skill, und wie führst du ihn aus?

Claude Code lädt Skills vor allem aus zwei Orten:

OrtPfadVerfügbar in
Persönlich~/.claude/skills/nano-banana-pro/allen deinen Projekten auf diesem Rechner
Projekt.claude/skills/nano-banana-pro/diesem Repository; committe ihn, um ihn mit deinem Team zu teilen

Der fertige Ordner sieht so aus:

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

Starte Claude Code in einem Terminal, in dem SEEDROUTER_API_KEY gesetzt ist, und tippe den Skill-Namen, gefolgt von dem, was du willst:

/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 zeigt Prompt und Optionen, du gibst frei, und das Bild landet in images/. Sofern du den Befehl nicht vorab erlaubt hast, fragt Claude Code außerdem nach Erlaubnis, bevor es das Skript ausführt, eine zweite Kontrolle, bevor etwas berechnet wird.

Zum Prompt selbst geht der Nano Banana Pro Prompt-Guide ausführlicher auf Aufbau, Text im Bild und Referenzen ein.

Kann Codex denselben Nano Banana Pro Skill nutzen?

Ja. Beide Tools folgen dem offenen Agent-Skills-Standard. Die Codex-Dokumentation von OpenAI sagt, ein Skill „ist ein Verzeichnis mit einer SKILL.md-Datei plus optionalen Skripten und Referenzen“ und die Datei „muss name und description enthalten“, was der Skill oben hat.

Codex sucht Skills in anderen Ordnern:

OrtPfad
Persönlich~/.agents/skills/nano-banana-pro/
Repository.agents/skills/nano-banana-pro/

Kopier den Ordner dorthin oder leg einen Symlink darauf an; beide Tools folgen verlinkten Skill-Ordnern. In Codex rufst du ihn mit /skills auf oder tippst $nano-banana-pro.

Zwei Unterschiede solltest du kennen:

  • Der Skriptpfad. ${CLAUDE_SKILL_DIR} ist eine Ersetzung von Claude Code. Codex zeigt dem Modell den Dateipfad jedes Skills, sodass es scripts/nano_banana_pro.py neben der SKILL.md findet; führt es den falschen Pfad aus, sag ihm, wo das Skript liegt.
  • Automatische Nutzung. disable-model-invocation ist ein Feld von Claude Code. Das Gegenstück in Codex ist eine Datei agents/openai.yaml im Skill-Ordner mit allow_implicit_invocation: false unter policy, damit Codex den Skill nur ausführt, wenn du ihn aufrufst.

Das Skript braucht Netzwerkzugriff, um api.seedrouter.ai zu erreichen. Läuft dein Agent in einer Sandbox ohne Netzwerk, erlaube den Netzwerkzugriff für diese Sitzung.

Wie bearbeitest du Bilder, die schon in deinem Projekt liegen?

Nano Banana Pro bearbeitet anhand von Referenzbildern, und die API nimmt diese nur als öffentliche URLs an. Eine Datei auf deiner Festplatte muss zuerst irgendwo gehostet werden, zum Beispiel in deinem eigenen Storage-Bucket, und wird dann mit --ref übergeben.

Erzeugte Bilder sind schon gehostet: Jede fertige Aufgabe liefert das Bild als URL. Um ein Ergebnis zu verfeinern, gib diese URL als Referenz zurück, zusammen mit der gewünschten Änderung:

/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 verwendet die vorherige Bild-URL mit --ref wieder und schreibt einen Bearbeitungs-Prompt, der sagt, was gleich bleiben soll. Für mehrstufige Bearbeitungen, bei denen das Modell seinen eigenen Kontext zwischen den Runden behält, erklärt die API-Referenz, wie du frühere Runden zurückschickst; das Skript oben sendet jeweils eine Runde.

Wenn du GPT Image 2 schon aus einem Coding-Agenten nutzt, beschreibt GPT Image 2 in Codex und Claude Code dieses Setup, das auf einem Prompt aufbaut, den du in den Agenten einfügst.

Häufig gestellte Fragen

Gibt es einen offiziellen Nano Banana Pro Skill oder MCP-Server von SeedRouter?

Nein. SeedRouter liefert keinen. Der Skill in dieser Anleitung ist ein einfacher Ordner, der dir gehört und den du ändern kannst, und er ruft die öffentliche API mit deinem Key auf.

Warum fragt das Skript ab, statt auf das Bild zu warten?

Nano Banana Pro Anfragen sind bei SeedRouter Aufgaben: Das Senden liefert eine Aufgaben-ID, und das Bild kommt, wenn die Aufgabe fertig ist. Das Abfragen hält die Verbindung kurz, und wenn das Warten unterbrochen wird, bleibt die Aufgaben-ID gültig.

Kann ich denselben Skill für Nano Banana 2 verwenden?

Ja, mit kleinen Änderungen. Stell Standardwert und Auswahl von --model im Skript auf gemini-3.1-flash-image um und ergänze 512 bei den Werten für --size, eine Größe, die Nano Banana 2 unterstützt und Pro nicht. Nano Banana 2 vs Pro vs 2 Lite vergleicht die Modelle.

Kostet das Laden des Skills etwas?

Nein. Dass Claude die SKILL.md liest, kostet bei SeedRouter nichts. Jeder Lauf des Skripts ist eine Anfrage, abgerechnet zum Tarif auf der Modellseite, und eine fehlgeschlagene Aufgabe wird nicht berechnet.

Fang an, aus Claude Code heraus zu generieren

Leg den Ordner an, exportiere deinen Key und probier /nano-banana-pro zuerst mit einem kleinen Bild aus. Aktuelle Preise findest du auf der Nano Banana Pro Seite, jedes Anfragefeld in der API-Referenz.

Verwandte Leitfäden