diff --git a/skills/nano-banana-pro/SKILL.md b/skills/nano-banana-pro/SKILL.md index 20bf59a2e92..8a46f1a99ba 100644 --- a/skills/nano-banana-pro/SKILL.md +++ b/skills/nano-banana-pro/SKILL.md @@ -50,9 +50,16 @@ API key - `GEMINI_API_KEY` env var - Or set `skills."nano-banana-pro".apiKey` / `skills."nano-banana-pro".env.GEMINI_API_KEY` in `~/.openclaw/openclaw.json` +Specific aspect ratio (optional) + +```bash +uv run {baseDir}/scripts/generate_image.py --prompt "portrait photo" --filename "output.png" --aspect-ratio 9:16 +``` + Notes - Resolutions: `1K` (default), `2K`, `4K`. +- Aspect ratios: `1:1`, `2:3`, `3:2`, `3:4`, `4:3`, `4:5`, `5:4`, `9:16`, `16:9`, `21:9`. Without `--aspect-ratio` / `-a`, the model picks freely - use this flag for avatars, profile pics, or consistent batch generation. - Use timestamps in filenames: `yyyy-mm-dd-hh-mm-ss-name.png`. - The script prints a `MEDIA:` line for OpenClaw to auto-attach on supported chat providers. - Do not read the image back; report the saved path only. diff --git a/skills/nano-banana-pro/scripts/generate_image.py b/skills/nano-banana-pro/scripts/generate_image.py index 8d60882c456..cb470b384c9 100755 --- a/skills/nano-banana-pro/scripts/generate_image.py +++ b/skills/nano-banana-pro/scripts/generate_image.py @@ -21,6 +21,19 @@ import os import sys from pathlib import Path +SUPPORTED_ASPECT_RATIOS = [ + "1:1", + "2:3", + "3:2", + "3:4", + "4:3", + "4:5", + "5:4", + "9:16", + "16:9", + "21:9", +] + def get_api_key(provided_key: str | None) -> str | None: """Get API key from argument first, then environment.""" @@ -56,6 +69,12 @@ def main(): default="1K", help="Output resolution: 1K (default), 2K, or 4K" ) + parser.add_argument( + "--aspect-ratio", "-a", + choices=SUPPORTED_ASPECT_RATIOS, + default=None, + help=f"Output aspect ratio (default: model decides). Options: {', '.join(SUPPORTED_ASPECT_RATIOS)}" + ) parser.add_argument( "--api-key", "-k", help="Gemini API key (overrides GEMINI_API_KEY env var)" @@ -127,14 +146,17 @@ def main(): print(f"Generating image with resolution {output_resolution}...") try: + # Build image config with optional aspect ratio + image_cfg_kwargs = {"image_size": output_resolution} + if args.aspect_ratio: + image_cfg_kwargs["aspect_ratio"] = args.aspect_ratio + response = client.models.generate_content( model="gemini-3-pro-image-preview", contents=contents, config=types.GenerateContentConfig( response_modalities=["TEXT", "IMAGE"], - image_config=types.ImageConfig( - image_size=output_resolution - ) + image_config=types.ImageConfig(**image_cfg_kwargs) ) )