Nano Banana Pro في Claude Code: skill يولّد الصور ويعدّلها
امنح Claude Code skill لـ Nano Banana Pro: سكربت صغير يرسل الطلب ويستعلم عن المهمة ويحفظ الصورة، مع ملف SKILL.md تستدعيه باسمه.
اقرأ بصيغة Markdownيستطيع Claude 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يضيف رابط صورة مرجعية (كرّره لإضافة أكثر من صورة)، و--ratioو--sizeيضبطانimageConfig. جسم الطلب هو صيغةgenerateContentمن Google مع حقلmodel، كما يحدده مرجع Nano Banana Pro API. - يطبع معرّف المهمة فور إنشائها، قبل أن يبدأ الانتظار.
- يستعلم ثم يحفظ. عندما تكتمل المهمة، ينزّل كل صورة إلى
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: «مقدمة 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 textيعرض Claude الموجّه والخيارات، فتوافق، وتصل الصورة إلى 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/ |
انسخ المجلد إلى هناك، أو أنشئ رابطًا رمزيًا إليه؛ فالأداتان تدعمان مجلدات الـ skills المرتبطة برابط رمزي. في 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 إلا روابطَ عامة. لذا يجب أولًا استضافة الملف الموجود على جهازك في مكان ما، مثل حاوية التخزين الخاصة بك، ثم تمريره عبر --ref.
أما الصور المولَّدة فهي مستضافة أصلًا: كل مهمة مكتملة تعيد الصورة رابطًا. ولتحسين نتيجة ما، مرّر ذلك الرابط مجددًا مرجعًا مع التغيير الذي تريده:
/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 استخدام رابط الصورة السابقة عبر --ref ويكتب موجّه تعديل يحدد ما يجب أن يبقى كما هو. أما للتعديل عبر عدة جولات يحتفظ فيه النموذج بسياقه الخاص بين الجولات، فيشرح مرجع API كيفية إرسال الجولات السابقة؛ والسكربت أعلاه يرسل جولة واحدة في كل مرة.
إذا كنت تستخدم GPT Image 2 من وكيل برمجة، فيشرح مقال GPT Image 2 في Codex وClaude Code ذلك الإعداد، القائم على موجّه تلصقه في الوكيل.
الأسئلة الشائعة
هل لدى SeedRouter skill أو خادم MCP رسمي لـ Nano Banana Pro؟
لا. لا يوفّر SeedRouter أيًا منهما. الـ skill في هذا الدليل مجلد عادي تملكه ويمكنك تعديله، ويستدعي الـ API العامة بمفتاحك.
لماذا يستعلم السكربت عن المهمة بدلًا من انتظار الصورة؟
طلبات Nano Banana Pro على SeedRouter مهام: إرسال الطلب يعيد معرّف مهمة، وتصل الصورة عندما تكتمل المهمة. يُبقي الاستعلام الاتصالات قصيرة، وإذا انقطع الانتظار يبقى معرّف المهمة صالحًا.
هل يمكنني استخدام الـ 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.



