Generate/edit images with OpenAI gpt-image-2 by default, falling back to Gemini (gemini-3.1-flash-image-preview) when OPENAI_API_KEY is unset. Supports text-to-image + image-to-image; 1K/2K/4K; use --input-image for editing, --provider to force a provider, --model to override the model.
76%
Does it follow best practices?
Run evals on this skill
Adds up to 20 points to the overall score
Passed
No findings from the security scan
Fix and improve this skill with Tessl
tessl review fix ./skills/inno-figure-gen/SKILL.mdGenerate new images or edit existing ones. The script picks a provider based on which API keys are available:
gpt-image-2 — used when OPENAI_API_KEY is set (default).gemini-3.1-flash-image-preview — used when only GEMINI_API_KEY is set.When both keys are set, OpenAI is picked by default; force Gemini with --provider gemini. If an auto-selected OpenAI call fails at runtime (quota, moderation, network), the script transparently falls back to Gemini when a Gemini key is available.
The script is at scripts/generate_image.py relative to this skill's directory (the directory containing this SKILL.md). Resolve the full path from the skill's location before running. Do not hardcode ~/.codex/..., because the skill may be installed in a different location.
Keep the distinction clear:
generate_image.py.--filename.Generate new image:
uv run <this-skill-directory>/scripts/generate_image.py --prompt "your image description" --filename "output-name.png" [--resolution 1K|2K|4K] [--provider auto|openai|gemini] [--model MODEL] [--openai-api-key KEY | --gemini-api-key KEY]Edit existing image:
uv run <this-skill-directory>/scripts/generate_image.py --prompt "editing instructions" --filename "output-name.png" --input-image "path/to/input.png" [--resolution 1K|2K|4K] [--provider auto|openai|gemini] [--model MODEL] [--openai-api-key KEY | --gemini-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.
Goal: fast iteration without burning time on 4K until the prompt is correct.
uv run <this-skill-directory>/scripts/generate_image.py --prompt "<draft prompt>" --filename "yyyy-mm-dd-hh-mm-ss-draft.png" --resolution 1K--input-image for every iteration until you’re happy.uv run <this-skill-directory>/scripts/generate_image.py --prompt "<final prompt>" --filename "yyyy-mm-dd-hh-mm-ss-final.png" --resolution 4KThe script accepts three resolution tiers (uppercase K required):
Map user requests to API parameters:
1K1K2K4KOpenAI 4K note: gpt-image-2 supports non-square 4K outputs within its size limits. --resolution 4K with OpenAI maps to 3840×2160.
Two providers are available:
| Provider | Default model | When chosen |
|---|---|---|
| OpenAI | gpt-image-2 | --provider auto (default) when OPENAI_API_KEY is set, or --provider openai |
| Gemini | gemini-3.1-flash-image-preview | --provider auto when only GEMINI_API_KEY is set, or --provider gemini, or as runtime fallback from a failed auto-OpenAI call |
Override either default with --model. Note: the model name is provider-specific; passing a Gemini model name while the script falls back to Gemini automatically will not preserve a user-specified OpenAI model (each provider uses its own default during fallback).
Common model options:
gpt-image-2 (default)gemini-3.1-flash-image-preview (default, fast), gemini-3-pro-image-preview (higher quality, slower)The script resolves provider-specific keys first, while preserving the original Gemini-only --api-key behavior:
--openai-api-key KEY, --gemini-api-key KEY--api-key KEY — kept for backward compatibility with the original Gemini-only script. Under auto, it is treated as a Gemini key unless an OpenAI key is provided by --openai-api-key or OPENAI_API_KEY. Under explicit --provider openai, it is treated as an OpenAI key; under explicit --provider gemini, it is treated as a Gemini key.OPENAI_API_KEY, GEMINI_API_KEYWhen --provider auto is selected and OpenAI fails at runtime, fallback to Gemini requires --gemini-api-key, --api-key, or the GEMINI_API_KEY env var.
If no key is resolvable for the chosen provider, the script exits with a clear error message listing both ways to fix it.
Preflight:
command -v uv (must exist)test -n "$OPENAI_API_KEY" -o -n "$GEMINI_API_KEY" (or pass --openai-api-key, --gemini-api-key, or backward-compatible --api-key)test -f "path/to/input.png"Common failures:
Error: No API key found... → set OPENAI_API_KEY or GEMINI_API_KEY, or pass an explicit --*-api-key flagError loading input image: → wrong path / unreadable file; verify --input-image points to a real image[warn] OpenAI call failed (...); falling back to Gemini. → informational; a Gemini key was available and produced the image. Investigate the OpenAI error separately (quota, moderation, network)--provider openai (explicit provider disables fallback). Try a different key, or drop the explicit provider to enable fallbackGenerate filenames with the pattern: yyyy-mm-dd-hh-mm-ss-name.png
Format: {timestamp}-{descriptive-name}.png
yyyy-mm-dd-hh-mm-ss (24-hour format)x9k2, a7b3)Examples:
2025-11-23-14-23-05-japanese-garden.png2025-11-23-15-30-12-sunset-mountains.png2025-11-23-16-45-33-robot.png2025-11-23-17-12-48-x9k2.pngWhen the user wants to modify an existing image:
--input-image parameter with the path to the imageFor 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.
Use templates when the user is vague or when edits must be precise.
Generation template:
Editing template (preserve everything else):
Generate new image (auto provider):
uv run <this-skill-directory>/scripts/generate_image.py --prompt "A serene Japanese garden with cherry blossoms" --filename "2025-11-23-14-23-05-japanese-garden.png" --resolution 2KForce Gemini:
uv run <this-skill-directory>/scripts/generate_image.py --prompt "A serene Japanese garden with cherry blossoms" --filename "2025-11-23-14-23-05-japanese-garden-4k.png" --resolution 4K --provider geminiEdit existing image (auto provider):
uv run <this-skill-directory>/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 2KOpenLAIR/dr-claw
3456bb4
If you maintain this skill, you can claim it as your own. Once claimed, you can manage eval scenarios, bundle related skills, attach documentation or rules, and ensure cross-agent compatibility.