Install
openclaw skills install openrouter-image-generationGenerate or edit images through OpenRouter's multimodal image generation endpoint (`/api/v1/chat/completions`) using OpenRouter-compatible image models. Use...
openclaw skills install openrouter-image-generationGenerate new images or edit existing ones using OpenRouter image-capable models via the Chat Completions API.
Run the script using absolute path (do NOT cd to the skill directory first):
Generate new image:
# Ensure outbound directory exists first
mkdir -p ~/.openclaw/media/outbound
uv run ~/.openclaw/workspace/skills/openrouter-image-generation/scripts/generate_image.py \
--prompt "your image description" \
--filename "~/.openclaw/media/outbound/output-name.png" \
--model google/gemini-2.5-flash-image \
[--aspect-ratio 16:9] \
[--image-size 2K]
Edit existing image (image-to-image):
# Ensure outbound directory exists first
mkdir -p ~/.openclaw/media/outbound
uv run ~/.openclaw/workspace/skills/openrouter-image-generation/scripts/generate_image.py \
--prompt "editing instructions" \
--filename "~/.openclaw/media/outbound/output-name.png" \
--input-image "path/to/input.png" \
--model google/gemini-2.5-flash-image
Important: Default OpenClaw delivery path is ~/.openclaw/media/outbound/. Save generated images there so other OpenClaw flows can pick them up easily.
The script checks for API key in this order:
--api-key argumentOPENROUTER_API_KEY environment variableOptional OpenRouter attribution headers:
--site-url or OPENROUTER_SITE_URL--app-name or OPENROUTER_APP_NAME--model <openrouter-model-id> is required (no script default)google/gemini-2.5-flash-image--aspect-ratio for image_config.aspect_ratio (for example 1:1, 16:9)--image-size for image_config.image_size (1K, 2K, 4K)--image-config-json '{"key":"value"}' for advanced/provider-specific extras (merged into image_config)Note: OpenRouter docs show aspect_ratio and image_size as the common image config fields for image generation. Additional keys may exist for specific providers/models (for example Sourceful features). If a request fails, remove unsupported options or switch models.
Note: The script always sends modalities: ["image", "text"]. Image-only models (some FLUX variants) may reject this — if you get an unexpected error with a non-Gemini model, this may be the cause. No workaround is currently exposed via CLI args.
Goal: iterate quickly before spending time on higher-quality settings.
--image-size 1K--image-size 4K --aspect-ratio 16:9Preflight:
command -v uvtest -n "$OPENROUTER_API_KEY" (or pass --api-key)test -d ~/.openclaw/media/outbound || mkdir -p ~/.openclaw/media/outboundtest -f "path/to/input.png"Common failures:
Error: No API key provided. -> set OPENROUTER_API_KEY or pass --api-keyError loading input image: -> bad path or unreadable fileHTTP 400 with model/image config error -> unsupported model or invalid image_config.aspect_ratio / image_config.image_sizeHTTP 401/403 -> invalid key, no model access, or quota/credits issueNo image found in response -> model may not support image output or request format rejectedGenerate filenames with the pattern: ~/.openclaw/media/outbound/yyyy-mm-dd-hh-mm-ss-name.png
Examples:
~/.openclaw/media/outbound/2026-02-26-14-23-05-product-shot.png~/.openclaw/media/outbound/2026-02-26-14-25-30-sky-edit.pngPrompt template for precise edits:
Change ONLY: <change>. Keep identical: subject, composition/crop, pose, lighting, color palette, background, text, and overall style. Do not add new objects.~/.openclaw/media/outbound/output-name.png by default (pass that full path in --filename)message.images[0].image_url.url)Generate new image:
mkdir -p ~/.openclaw/media/outbound
uv run ~/.openclaw/workspace/skills/openrouter-image-generation/scripts/generate_image.py \
--prompt "A cinematic product photo of a matte black mechanical keyboard on a wooden desk, warm window light" \
--filename "~/.openclaw/media/outbound/2026-02-26-14-23-05-keyboard-product-shot.png" \
--model google/gemini-2.5-flash-image \
--aspect-ratio 16:9 \
--image-size 2K
Edit existing image:
mkdir -p ~/.openclaw/media/outbound
uv run ~/.openclaw/workspace/skills/openrouter-image-generation/scripts/generate_image.py \
--prompt "Change ONLY: make the sky dramatic with orange sunset clouds. Keep identical: subject, composition, lighting on foreground, and overall style." \
--filename "~/.openclaw/media/outbound/2026-02-26-14-25-30-sunset-sky-edit.png" \
--model google/gemini-2.5-flash-image \
--input-image "original-photo.jpg"