Nano Banana Pro Image Generation & Editing
Generate new images or edit existing ones using Google's Nano Banana Pro API (Gemini 3 Pro Image).
Usage
Dependencies
This skill requires these Python packages:
- •
google-genai(Gemini client) - •
pillow(image I/O)
Install them with uv (recommended):
uv pip install google-genai pillow
Note: scripts/generate_image.py also includes inline script metadata (PEP 723) so uv run ... can auto-resolve these dependencies, but pre-installing is faster for repeated runs.
Run the script using the skill's installed path (provided in system prompt as → file_read(path="skills/SKILL.md")).
Generate new image:
uv run skills/scripts/generate_image.py --prompt "your image description" --filename "output-name.png" [--resolution 1K|2K|4K] [--api-key KEY]
Edit existing image:
uv run skills/scripts/generate_image.py --prompt "editing instructions" --filename "output-name.png" --input-image "path/to/input.png" [--resolution 1K|2K|4K] [--api-key KEY]
Important: Always run from the user's current working directory so images are saved where the user is working, not in the skill directory.
Default Workflow (draft → iterate → final)
Goal: fast iteration without burning time on 4K until the prompt is correct.
- •Draft (1K): quick feedback loop
- •
uv run skills/scripts/generate_image.py --prompt "<draft prompt>" --filename "yyyy-mm-dd-hh-mm-ss-draft.png" --resolution 1K
- •
- •Iterate: adjust prompt in small diffs; keep filename new per run
- •If editing: keep the same
--input-imagefor every iteration until you’re happy.
- •If editing: keep the same
- •Final (4K): only when prompt is locked
- •
uv run skills/scripts/generate_image.py --prompt "<final prompt>" --filename "yyyy-mm-dd-hh-mm-ss-final.png" --resolution 4K
- •
Resolution Options
The Gemini 3 Pro Image API supports three resolutions (uppercase K required):
- •1K (default) - ~1024px resolution - PREFERRED for most requests
- •2K - ~2048px resolution
- •4K - ~4096px resolution
Default behavior: Always use 1K unless the user explicitly requests higher resolution.
Map user requests to API parameters:
- •No mention of resolution →
1K(default) - •"low resolution", "1080", "1080p", "1K", "quick", "fast", "draft" →
1K - •"2K", "2048", "normal", "medium resolution" →
2K - •"high resolution", "high-res", "hi-res", "4K", "ultra", "best quality", "final" →
4K
Important: Prefer lower resolution (1K) to save time and resources. Only use higher resolutions when the user specifically asks for quality/resolution.
API Key
The script checks for API key in this order:
- •
--api-keyargument (use if user provided key in chat) - •
GEMINI_API_KEYenvironment variable
If neither is available, the script exits with an error message.
Preflight + Common Failures (fast fixes)
- •
Preflight:
- •
command -v uv(must exist) - •
test -n \"$GEMINI_API_KEY\"(or pass--api-key) - •If editing:
test -f \"path/to/input.png\"
- •
- •
Common failures:
- •
Error: No API key provided.→ setGEMINI_API_KEYor pass--api-key - •
Error loading input image:→ wrong path / unreadable file; verify--input-imagepoints to a real image - •“quota/permission/403” style API errors → wrong key, no access, or quota exceeded; try a different key/account
- •
Filename Generation
Generate filenames with the pattern: yyyy-mm-dd-hh-mm-ss-name.png
Format: {timestamp}-{descriptive-name}.png
- •Timestamp: Current date/time in format
yyyy-mm-dd-hh-mm-ss(24-hour format) - •IMPORTANT: Generate the actual timestamp value (e.g.,
2026-01-29-13-30-45), do NOT use shell syntax like$(date ...) - •Name: Descriptive lowercase text with hyphens
- •Keep the descriptive part concise (1-5 words typically)
- •Use context from user's prompt or conversation
- •If unclear, use random identifier (e.g.,
x9k2,a7b3)
Examples:
- •Prompt "A serene Japanese garden" →
2025-11-23-14-23-05-japanese-garden.png - •Prompt "sunset over mountains" →
2025-11-23-15-30-12-sunset-mountains.png - •Prompt "create an image of a robot" →
2025-11-23-16-45-33-robot.png - •Unclear context →
2025-11-23-17-12-48-x9k2.png
Image Editing
When the user wants to modify an existing image:
- •Check if they provide an image path or reference an image in the current directory
- •Use
--input-imageparameter with the path to the image - •The prompt should contain editing instructions (e.g., "make the sky more dramatic", "remove the person", "change to cartoon style")
- •Common editing tasks: add/remove elements, change style, adjust colors, blur background, etc.
Prompt Handling
For generation: Pass user's image description as-is to --prompt. Only rework if clearly insufficient.
For editing: Pass editing instructions in --prompt (e.g., "add a rainbow in the sky", "make it look like a watercolor painting")
Preserve user's creative intent in both cases.
Prompt Templates (high hit-rate)
Use templates when the user is vague or when edits must be precise.
- •
Generation template:
- •“Create an image of: <subject>. Style: <style>. Composition: <camera/shot>. Lighting: <lighting>. Background: <background>. Color palette: <palette>. Avoid: <list>.”
- •
Editing template (preserve everything else):
- •“Change ONLY: <single change>. Keep identical: subject, composition/crop, pose, lighting, color palette, background, text, and overall style. Do not add new objects. If text exists, keep it unchanged.”
Output
- •Saves PNG to current directory (or specified path if filename includes directory)
- •Script outputs the full path to the generated image
- •After generating: Use
send_file(file_path="<full_path>")to send the image to the user - •Do not read the image back - just send it with send_file
Examples
Generate new image:
uv run skills/scripts/generate_image.py --prompt "A serene Japanese garden with cherry blossoms" --filename "2025-11-23-14-23-05-japanese-garden.png" --resolution 4K
Edit existing image:
uv run skills/scripts/generate_image.py --prompt "make the sky more dramatic with storm clouds" --filename "2025-11-23-14-25-30-dramatic-sky.png" --input-image "original-photo.jpg" --resolution 2K