Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Generate and edit images using OpenAI's GPT Image 1.5 model. Use when the user asks to generate, create, edit, modify, change, alter, or update images. Also use when user references an existing image file and asks to modify it in any way (e.g., "modify this image", "change the background", "replace X with Y"). Supports text-to-image generation and image editing with optional mask. DO NOT read the image file first - use this skill directly with the --input-image parameter.
.claude/skills/mkurman-gpt-image-1-5/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-04 | ✗→✓ | ▲ Improved | 122% | 0% |
| case-13 | ✓→✗ | ▼ Worse | 8% | 0% |
| case-19 | ✓→✗ | ▼ Worse | 434% | 0% |
| case-21 | ✓→✗ | ▼ Worse | 57% | 0% |
| case-22 | ✓→✓ | = Same ✓ | 51% | 0% |
Generate new images or edit existing ones using OpenAI's GPT Image 1.5 model.
Run the script using absolute path (do NOT cd to skill directory first):
Generate new image:
bashuv run ~/.claude/skills/gpt-image-1-5/scripts/generate_image.py --prompt "your image description" --filename "output-name.png" [--quality low|medium|high] [--size 1024x1024|1024x1536|1536x1024|auto] [--background transparent|opaque|auto] [--api-key KEY]
Edit existing image (without mask - full image edit):
bashuv run ~/.claude/skills/gpt-image-1-5/scripts/generate_image.py --prompt "editing instructions" --filename "output-name.png" --input-image "path/to/input.png" [--size 1024x1024|1024x1536|1536x1024|auto] [--api-key KEY]
Edit existing image (with mask - precise inpainting):
bashuv run ~/.claude/skills/gpt-image-1-5/scripts/generate_image.py --prompt "what to put in masked area" --filename "output-name.png" --input-image "path/to/input.png" --mask "path/to/mask.png" [--size 1024x1024|1024x1536|1536x1024|auto] [--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.
Map user requests:
mediumlowhighMap user requests:
1024x10241024x10241024x15361536x1024The script checks for API key in this order:
--api-key argument (use if user provided key in chat)OPENAI_API_KEY environment variableIf neither is available, the script exits with an error message.
Generate 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-12-17-14-23-05-japanese-garden.png2025-12-17-15-30-12-sunset-mountains.png2025-12-17-16-45-33-robot.png2025-12-17-17-12-48-x9k2.pngBoth editing modes use the Image API (images.edit endpoint) with gpt-image-1.5 for reliable results.
When the user wants to modify an existing image without specifying exact regions:
--input-image parameter with the path to the imageWhen the user wants to edit specific regions:
--input-image parameter with the path to the image--mask parameter with a PNG mask fileCommon editing tasks: add/remove elements, change style, adjust colors, replace backgrounds, etc.
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.
Generate new image:
bashuv run ~/.claude/skills/gpt-image-1-5/scripts/generate_image.py --prompt "A serene Japanese garden with cherry blossoms" --filename "2025-12-17-14-23-05-japanese-garden.png" --quality high --size 1536x1024
Generate with transparent background:
bashuv run ~/.claude/skills/gpt-image-1-5/scripts/generate_image.py --prompt "A cute cartoon cat mascot" --filename "2025-12-17-14-25-30-cat-mascot.png" --background transparent --quality high
Edit existing image (full image):
bashuv run ~/.claude/skills/gpt-image-1-5/scripts/generate_image.py --prompt "make the sky more dramatic with storm clouds" --filename "2025-12-17-14-27-00-dramatic-sky.png" --input-image "original-photo.jpg"
Edit with mask (inpainting):
bashuv run ~/.claude/skills/gpt-image-1-5/scripts/generate_image.py --prompt "a flamingo swimming" --filename "2025-12-17-14-30-00-lounge-flamingo.png" --input-image "lounge.png" --mask "mask.png"
| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-01 | fail→fail | 10,854 | 18,621 | +72% | 1 | 1 | 0% | 854 | 2,202 | +158% | 0 | 0 | — |
case-02 | fail→fail | 9,411 | 17,882 | +90% | 1 | 1 | 0% | 711 | 2,301 | +224% | 0 | 0 | — |
case-03 | fail→fail | 8,063 | 19,922 | +147% | 1 | 1 | 0% | 563 | 2,087 | +271% | 0 | 0 | — |
case-04 | fail→pass | 13,774 | 15,265 | +11% | 1 | 1 | 0% | 1,603 | 3,565 | +122% | 0 | 0 | — |
case-05 | fail→fail | 19,890 | 18,423 | -7% | 1 | 1 | 0% | 2,728 | 2,506 | -8% | 0 | 0 | — |
case-06 | fail→fail | 12,316 | 17,376 | +41% | 1 | 1 | 0% | 1,041 | 2,248 | +116% | 0 | 0 | — |
case-07 | fail→fail | 10,700 | 18,177 | +70% | 1 | 1 | 0% | 745 | 2,283 | +206% | 0 | 0 | — |
case-08 | fail→fail | 11,757 | 16,772 | +43% | 1 | 1 | 0% | 1,060 | 2,185 | +106% | 0 | 0 | — |
case-09 | fail→fail | 8,543 | 12,277 | +44% | 1 | 1 | 0% | 1,214 | 2,164 | +78% | 0 | 0 | — |
case-10 | fail→fail | 14,621 | 13,404 | -8% | 1 | 1 | 0% | 1,370 | 2,202 | +61% | 0 | 0 | — |
case-11 | fail→fail | 24,688 | 10,590 | -57% | 1 | 1 | 0% | 1,471 | 2,171 | +48% | 0 | 0 | — |
case-12 | fail→fail | 14,314 | 22,346 | +56% | 1 | 1 | 0% | 1,643 | 3,072 | +87% | 0 | 0 | — |
case-13 | pass→fail | 17,377 | 12,825 | -26% | 1 | 1 | 0% | 2,069 | 2,235 | +8% | 0 | 0 | — |
case-14 | fail→fail | 22,094 | 17,650 | -20% | 1 | 1 | 0% | 3,507 | 2,115 | -40% | 0 | 0 | — |
case-15 | fail→fail | 24,975 | 19,981 | -20% | 1 | 1 | 0% | 1,861 | 2,505 | +35% | 0 | 0 | — |
case-16 | fail→fail | 15,851 | 7,459 | -53% | 1 | 1 | 0% | 2,832 | 2,342 | -17% | 0 | 0 | — |
case-17 | fail→fail | 54,808 | 14,800 | -73% | 1 | 1 | 0% | 8,199 | 2,404 | -71% | 0 | 0 | — |
case-18 | fail→fail | 17,355 | 7,807 | -55% | 1 | 1 | 0% | 1,881 | 2,292 | +22% | 0 | 0 | — |
case-19 | pass→fail | 5,165 | 12,761 | +147% | 1 | 1 | 0% | 448 | 2,391 | +434% | 0 | 0 | — |
case-20 | fail→fail | 16,991 | 11,458 | -33% | 1 | 1 | 0% | 1,752 | 2,211 | +26% | 0 | 0 | — |
case-21 | pass→fail | 12,126 | 27,161 | +124% | 1 | 1 | 0% | 1,535 | 2,413 | +57% | 0 | 0 | — |
case-22 | pass→pass | 11,627 | 9,985 | -14% | 1 | 1 | 0% | 1,839 | 2,783 | +51% | 0 | 0 | — |
case-23 | fail→fail | 2,270 | 22,092 | +873% | 1 | 1 | 0% | 334 | 3,019 | +804% | 0 | 0 | — |
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. 23 cases were attempted, and 2 counted toward the lift figure. The other 21 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 -9 percentage points is the difference between those two pass rates over the 2 comparable cases. 5 cases got worse with the skill loaded, and they are included in that figure.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
Other measured skills in the registry, with their headline benchmark lift.