Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Generate new images or edit existing ones. The script picks a provider based on which API keys are available:
.claude/skills/inno-figure-gen/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-04 | ✗→✓ | ▲ Improved | — | — |
| case-17 | ✗→✓ | ▲ Improved | — | — |
| case-18 | ✗→✓ | ▲ Improved | — | — |
| case-12 | ✗→✓ | ▲ Improved | — | — |
| case-02 | ✗→✗ | = Same ✗ | — | — |
Generate 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:
bashuv 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:
bashuv 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.
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"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.
Generate new image (auto provider):
bashuv 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 2K
Force Gemini:
bashuv 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 gemini
Edit existing image (auto provider):
bashuv 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 2K
| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-02 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-04 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-06 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-21 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-01 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-08 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-20 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-15 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-17 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-18 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-07 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-13 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-16 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-14 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-05 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-11 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-19 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-03 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-12 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-09 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-10 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-22 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 22 cases were attempted, and 8 counted toward the lift figure. The other 14 produced results that are not comparable between the two arms, so they are excluded from the headline rather than averaged into it. The headline lift of +18 percentage points is the difference between those two pass rates over the 8 comparable cases. 2 cases got worse with the skill loaded, and they are included in that figure.
The per-case answers from this run were removed by the retention sweep, so the case table below shows the verdicts without the text either arm produced. The counts above were recorded at the time and are unaffected. Answers are now kept for 180 days.
Other measured skills in the registry, with their headline benchmark lift.