Nano Banana Pro в Claude Code: skill, который создаёт и редактирует изображения
Дайте Claude Code skill для Nano Banana Pro: небольшой скрипт, который отправляет запрос, опрашивает задачу и сохраняет изображение, плюс SKILL.md.
Читать в MarkdownClaude Code может создавать и редактировать изображения с Nano Banana Pro через skill — папку с файлом SKILL.md и коротким скриптом, который вызывает API SeedRouter. Вы вводите /nano-banana-pro и описываете изображение; Claude пишет промпт и запускает скрипт, а скрипт отправляет запрос, опрашивает задачу и сохраняет изображение в ваш проект. Та же папка работает и в OpenAI Codex. SeedRouter не предоставляет официального skill или MCP-сервера, поэтому в этом руководстве есть готовый skill, который можно скопировать. Формат 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 и выбирает размер и соотношение сторон.
- Claude запускает скрипт. Скрипт отправляет запрос на
POST https://api.seedrouter.ai/v1/images/generationsи получает ID задачи. - Скрипт каждые несколько секунд опрашивает
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. - Печатает ID задачи сразу после её создания, ещё до ожидания.
- Опрашивает, затем сохраняет. Когда задача завершена, скачивает каждое изображение в
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/ | В этом репозитории; закоммитьте, чтобы поделиться с командой |
Готовая папка выглядит так:
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/ |
Скопируйте туда папку или создайте на неё символическую ссылку; оба инструмента поддерживают папки 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 принимает их только как публичные 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 warmerClaude снова использует URL предыдущего изображения через --ref и пишет промпт для правки, в котором сказано, что должно остаться прежним. Для многоходового редактирования, при котором модель сохраняет собственный контекст между ходами, в справочнике API описано, как отправлять предыдущие ходы; скрипт выше отправляет по одному ходу за раз.
Если вы уже используете GPT Image 2 из ИИ-агента для программирования, статья GPT Image 2 в Codex и Claude Code описывает ту настройку, построенную вокруг промпта, который вы вставляете в агента.
Часто задаваемые вопросы
Есть ли у SeedRouter официальный skill или MCP-сервер для Nano Banana Pro?
Нет. SeedRouter их не предоставляет. Skill из этого руководства — обычная папка, которая принадлежит вам и которую можно менять; он вызывает публичный API с вашим ключом.
Почему скрипт опрашивает задачу, а не ждёт изображение?
В SeedRouter запросы Nano Banana Pro — это задачи: отправка возвращает ID задачи, а изображение появляется, когда задача завершится. Опрос делает соединения короткими, и если ожидание прервётся, ID задачи останется действительным.
Можно ли использовать тот же 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.



