Nano Banana Pro ב-Claude Code: skill שיוצר ועורך תמונות
תן ל-Claude Code skill של Nano Banana Pro: סקריפט קטן ששולח את הבקשה, מתשאל את המשימה ושומר את התמונה, וקובץ SKILL.md שקוראים לו בשם.
קריאה כ-MarkdownClaude Code יכול ליצור ולערוך תמונות עם Nano Banana Pro באמצעות skill: תיקייה עם קובץ SKILL.md וסקריפט קצר שקורא ל-SeedRouter API. אתה מקליד /nano-banana-pro ומתאר את התמונה; Claude כותב את הפרומפט ומריץ את הסקריפט, והסקריפט שולח את הבקשה, מתשאל את המשימה ושומר את התמונה בפרויקט שלך. אותה תיקייה עובדת גם ב-OpenAI Codex. SeedRouter לא מספק skill רשמי או שרת MCP, ולכן המדריך הזה נותן לך אחד להעתקה. פורמט ה-skill תואם לתיעוד של Anthropic ושל OpenAI, שנבדק ב-29 בספטמבר 2026.
איך Claude Code יוצר תמונות עם Nano Banana Pro?
Claude Code לא מצייר תמונות בעצמו. הוא מריץ פקודות, ולכן הוא יכול להריץ סקריפט שקורא ל-API של תמונות. כשה-skill מותקן, בקשה אחת מתנהלת כך:
- אתה קורא ל-skill ומתאר את התמונה, למשל
/nano-banana-pro a hero image for the pricing page. - Claude הופך את התיאור שלך לפרומפט של Nano Banana Pro ובוחר גודל ויחס.
- הוא מריץ את הסקריפט. הסקריפט שולח את הבקשה אל
POST https://api.seedrouter.ai/v1/images/generationsומקבל מזהה משימה. - הסקריפט מתשאל את
GET /v1/tasks/{id}כל כמה שניות עד שהתמונה מוכנה, ואז מוריד אותה לתיקייהimages/. - Claude מוסר לך את נתיב הקובץ, ואחר כך יכול להשתמש בתמונה בקוד שלך.
סקריפט, ולא רק הוראות, שומר על קריאות API מדויקות: גוף הבקשה, לולאת התשאול ושמירת הקובץ זהים בכל פעם, לא משנה איזה פרומפט Claude כותב.
מה צריך לפני שמתחילים?
- מפתח API של SeedRouter, שמיוצא בטרמינל שממנו אתה מפעיל את Claude Code:
export SEEDROUTER_API_KEY="your-key"- קרדיטים. כל הרצה היא בקשה אחת בתשלום. חשבונות חדשים מתחילים עם יתרה חינמית קטנה, ובקשות שנכשלו אינן מחויבות.
- Python 3. הסקריפט משתמש רק בספרייה הסטנדרטית, כך שאין מה להתקין.
הסקריפט: שליחה, תשאול ושמירה
שמור את הקוד הזה כ-scripts/nano_banana_pro.py בתוך תיקיית ה-skill:
#!/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()מה הוא עושה:
- שולח פעם אחת.
--promptהוא הטקסט,--refמוסיף כתובת URL של תמונת ייחוס (חזור עליו כדי להוסיף כמה), ו---ratioו---sizeקובעים אתimageConfig. גוף הבקשה הוא פורמטgenerateContentשל Google עם שדהmodel, כפי שמגדיר תיעוד ה-API של Nano Banana Pro. - מדפיס את מזהה המשימה מיד כשהמשימה נוצרת, לפני ההמתנה.
- מתשאל ואז שומר. כשהמשימה מסתיימת, הוא מוריד כל תמונה אל
images/ומדפיס כל נתיב. כשהמשימה נכשלת, הוא מדפיס את הסיבה. - ממשיך במקום לשלוח מחדש. אם זמן ההמתנה נגמר,
--resume <task id>בודק שוב את אותה משימה. שליחה שנייה תהיה בקשה שנייה בתשלום. - שולח כותרת
User-Agent. השאר את השורה הזו: שרתים מסוימים דוחים את ה-User-Agent שמוגדר כברירת מחדל ב-Python, ובלעדיה ההורדה עלולה להיכשל עם שגיאה 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 עצמו: מה כותבים ב-SKILL.md?
התיעוד של Claude Code מתאר skill כתיקייה עם קובץ SKILL.md: "frontmatter של YAML בין סימוני --- שאומר ל-Claude מתי להשתמש ב-skill, ותוכן markdown עם ההוראות ש-Claude מבצע כשה-skill רץ." קבצים נלווים, כמו תיקיית 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.יש כאן שני שדות חשובים:
disable-model-invocation: trueפירושו שרק אתה יכול להפעיל את ה-skill. התיעוד של Claude Code ממליץ על כך עבור "תהליכי עבודה עם תופעות לוואי או כאלה שאתה רוצה לשלוט בתזמון שלהם". כל הרצה עולה כסף, ולכן Claude לא אמור להחליט בעצמו ליצור תמונה.${CLAUDE_SKILL_DIR}מוחלף בתיקייה של ה-skill עצמו, כך שהסקריפט רץ בלי קשר למקום שבו התקנת את ה-skill.
איפה שמים את ה-skill ואיך מריצים אותו?
Claude Code טוען skills בעיקר משני מקומות:
| מיקום | נתיב | זמין ב |
|---|---|---|
| אישי | ~/.claude/skills/nano-banana-pro/ | כל הפרויקטים שלך במחשב הזה |
| פרויקט | .claude/skills/nano-banana-pro/ | המאגר הזה; בצע commit כדי לשתף עם הצוות |
כך נראית התיקייה המוכנה:
nano-banana-pro/
├── SKILL.md
└── scripts/
└── nano_banana_pro.pyהפעל את Claude Code בטרמינל שבו מוגדר SEEDROUTER_API_KEY, ואז הקלד את שם ה-skill ואחריו את מה שאתה רוצה:
/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 textClaude מציג את הפרומפט והאפשרויות, אתה מאשר, והתמונה מגיעה אל images/. אלא אם כבר אישרת את הפקודה מראש, Claude Code גם מבקש הרשאה לפני שהוא מריץ את הסקריפט, וזו בדיקה שנייה לפני שמשהו מחויב.
לגבי הפרומפט עצמו, מדריך הפרומפטים ל-Nano Banana Pro נכנס לעומק המבנה, הטקסט בתמונה ותמונות הייחוס.
האם Codex יכול להשתמש באותו skill של Nano Banana Pro?
כן. שני הכלים פועלים לפי התקן הפתוח Agent Skills. התיעוד של Codex מבית OpenAI אומר ש-skill "הוא תיקייה עם קובץ SKILL.md ועוד סקריפטים וחומרי עזר אופציונליים", ושהקובץ "חייב לכלול name ו-description", וה-skill שלמעלה כולל את שניהם.
Codex מחפש skills בתיקיות אחרות:
| מיקום | נתיב |
|---|---|
| אישי | ~/.agents/skills/nano-banana-pro/ |
| מאגר | .agents/skills/nano-banana-pro/ |
העתק את התיקייה לשם, או צור אליה קישור סמלי; שני הכלים תומכים בתיקיות skill שמקושרות בקישור סמלי. ב-Codex, הרץ /skills או הקלד $nano-banana-pro כדי לקרוא לו.
יש שני הבדלים שכדאי להכיר:
- נתיב הסקריפט.
${CLAUDE_SKILL_DIR}הוא החלפה של Claude Code. Codex מציג למודל את נתיב הקובץ של כל skill, כך שהוא יכול למצוא אתscripts/nano_banana_pro.pyלידSKILL.md; אם הוא מריץ נתיב שגוי, אמור לו איפה הסקריפט. - הפעלה אוטומטית.
disable-model-invocationהוא שדה של Claude Code. המקבילה ב-Codex היא קובץagents/openai.yamlבתיקיית ה-skill עםallow_implicit_invocation: falseתחתpolicy, כך ש-Codex מריץ את ה-skill רק כשאתה קורא לו.
הסקריפט צריך גישה לרשת כדי להגיע אל api.seedrouter.ai. אם הסוכן שלך רץ בסביבה מבודדת בלי רשת, אפשר גישה לרשת לאותו סשן.
איך עורכים תמונות שכבר נמצאות בפרויקט?
Nano Banana Pro עורך על סמך תמונות ייחוס, וה-API מקבל אותן רק ככתובות URL ציבוריות. קובץ מהדיסק שלך צריך קודם להתארח במקום כלשהו, למשל בדלי אחסון משלך, ואז מועבר עם --ref.
תמונות שנוצרו כבר מתארחות: כל משימה שהסתיימה מחזירה את התמונה ככתובת 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 warmerClaude משתמש שוב בכתובת של התמונה הקודמת עם --ref וכותב פרומפט עריכה שאומר מה צריך להישאר כמו שהוא. לעריכה בכמה סבבים שבה המודל שומר על ההקשר שלו בין הסבבים, תיעוד ה-API מסביר איך לשלוח את הסבבים הקודמים; הסקריפט שלמעלה שולח סבב אחד בכל פעם.
אם אתה כבר משתמש ב-GPT Image 2 מתוך סוכן קוד, GPT Image 2 ב-Codex וב-Claude Code מתאר את ההגדרה הזו, שבנויה סביב פרומפט שאתה מדביק לסוכן.
שאלות נפוצות
האם יש ל-SeedRouter skill או שרת MCP רשמי ל-Nano Banana Pro?
לא. SeedRouter לא מספק אחד כזה. ה-skill במדריך הזה הוא תיקייה רגילה ששייכת לך ושאפשר לשנות, והוא קורא ל-API הציבורי עם המפתח שלך.
למה הסקריפט מתשאל את המשימה במקום לחכות לתמונה?
ב-SeedRouter, בקשות Nano Banana Pro הן משימות: שליחה מחזירה מזהה משימה, והתמונה מגיעה כשהמשימה מסתיימת. תשאול שומר על חיבורים קצרים, ואם ההמתנה נקטעת, מזהה המשימה נשאר תקף.
אפשר להשתמש באותו skill ל-Nano Banana 2?
כן, עם שינויים קטנים. שנה בסקריפט את ערך ברירת המחדל והאפשרויות של --model ל-gemini-3.1-flash-image, והוסף 512 לאפשרויות של --size, גודל ש-Nano Banana 2 תומך בו ו-Pro לא. Nano Banana 2 vs Pro vs 2 Lite משווה בין המודלים.
האם טעינת ה-skill עולה משהו?
לא. זה ש-Claude קורא את SKILL.md לא עולה כלום ב-SeedRouter. כל הרצה של הסקריפט היא בקשה אחת, שמחויבת לפי התעריף בעמוד המודל, ומשימה שנכשלה אינה מחויבת.
התחל ליצור מתוך Claude Code
צור את התיקייה, ייצא את המפתח שלך ונסה קודם את /nano-banana-pro על תמונה קטנה. המחירים העדכניים נמצאים בעמוד של Nano Banana Pro, וכל שדות הבקשה בתיעוד ה-API.



