Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Generate and edit images using Gemini's Nano Banana Pro model (gemini-3-pro-image-preview). Use this skill when the user asks you to generate images, create visuals, edit photos, create logos, generate product mockups, or perform any image generation/editing task.
.claude/skills/sickn33-image-generator/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-01 | ✗→✓ | ▲ Improved | 252% | 0% |
| case-06 | ✗→✓ | ▲ Improved | 111% | 0% |
| case-08 | ✗→✓ | ▲ Improved | 194% | 0% |
| case-11 | ✗→✓ | ▲ Improved | 175% | 0% |
| case-20 | ✗→✓ | ▲ Improved | 187% | 0% |
Read the detailed guide before executing this skill. It retains the complete procedure and reference material. Treat its safety, prerequisites, and validation requirements as mandatory. For focused work, load the relevant sections; for end-to-end work, read the guide completely.
Use when this workflow matches the user request: Generate and edit images using Gemini's Nano Banana Pro model (gemini-3-pro-image-preview). Use this skill when the user asks you to generate images, create visuals, edit photos, create logos, generate product mockups, or perform any image generation/editing task.
_Source: dair-ai/dair-academy-plugins (MIT)._
This skill generates and edits images using Google's Gemini Nano Banana Pro model (gemini-3-pro-image-preview).
pythonfrom google import genai from google.genai import types client = genai.Client() response = client.models.generate_content( model="gemini-3-pro-image-preview", contents=["Your prompt here"], config=types.GenerateContentConfig( response_modalities=['TEXT', 'IMAGE'], image_config=types.ImageConfig( aspect_ratio="16:9", # Optional image_size="2K" # Optional: "1K", "2K", "4K" ) ) ) for part in response.parts: if part.text is not None: print(part.text) elif part.inline_data is not None: image = part.as_image() image.save("generated_image.png")
javascriptimport { GoogleGenAI } from "@google/genai"; import * as fs from "node:fs"; const ai = new GoogleGenAI({}); const response = await ai.models.generateContent({ model: "gemini-3-pro-image-preview", contents: "Your prompt here", config: { responseModalities: ['TEXT', 'IMAGE'], imageConfig: { aspectRatio: "16:9", imageSize: "2K" } } }); for (const part of response.candidates[0].content.parts) { if (part.text) { console.log(part.text); } else if (part.inlineData) { const buffer = Buffer.from(part.inlineData.data, "base64"); fs.writeFileSync("generated_image.png", buffer); } }
bashcurl -s -X POST \ "https://generativelanguage.googleapis.com/v1beta/models/gemini-3-pro-image-preview:generateContent" \ -H "x-goog-api-key: $GEMINI_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "contents": [{ "parts": [{"text": "Your prompt here"}] }], "generationConfig": { "responseModalities": ["TEXT", "IMAGE"], "imageConfig": { "aspectRatio": "16:9", "imageSize": "2K" } } }' | jq -r '.candidates[0].content.parts[] | select(.inlineData) | .inlineData.data' | base64 --decode > output.png
pythonfrom google import genai from google.genai import types from PIL import Image client = genai.Client() input_image = Image.open('input.png') prompt = "Add a wizard hat to the cat in this image" response = client.models.generate_content( model="gemini-3-pro-image-preview", contents=[prompt, input_image], config=types.GenerateContentConfig( response_modalities=['TEXT', 'IMAGE'] ) ) for part in response.parts: if part.inline_data is not None: image = part.as_image() image.save("edited_image.png")
pythonfrom google import genai from google.genai import types from PIL import Image client = genai.Client() image1 = Image.open('dress.png') image2 = Image.open('model.png') prompt = "Put the dress from the first image on the model from the second image" response = client.models.generate_content( model="gemini-3-pro-image-preview", contents=[image1, image2, prompt], config=types.GenerateContentConfig( response_modalities=['TEXT', 'IMAGE'], image_config=types.ImageConfig( aspect_ratio="3:4", image_size="2K" ) ) )
pythonfrom google import genai from google.genai import types client = genai.Client() response = client.models.generate_content( model="gemini-3-pro-image-preview", contents="Visualize the current weather forecast for San Francisco", config=types.GenerateContentConfig( response_modalities=['TEXT', 'IMAGE'], image_config=types.ImageConfig(aspect_ratio="16:9"), tools=[{"google_search": {}}] ) )
| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-01 | fail→pass | 9,301 | 16,868 | +81% | 1 | 1 | 0% | 1,644 | 5,782 | +252% | 0 | 0 | — |
case-02 | fail→fail | 10,350 | 7,101 | -31% | 1 | 1 | 0% | 645 | 4,799 | +644% | 0 | 0 | — |
case-03 | fail→fail | 9,818 | 8,254 | -16% | 1 | 1 | 0% | 1,672 | 4,757 | +185% | 0 | 0 | — |
case-04 | fail→fail | 13,838 | 26,978 | +95% | 1 | 1 | 0% | 2,510 | 8,605 | +243% | 0 | 0 | — |
case-05 | pass→pass | 15,020 | 10,647 | -29% | 1 | 1 | 0% | 2,666 | 6,566 | +146% | 0 | 0 | — |
case-06 | fail→pass | 17,799 | 11,642 | -35% | 1 | 1 | 0% | 3,118 | 6,591 | +111% | 0 | 0 | — |
case-07 | pass→pass | 7,643 | 3,700 | -52% | 1 | 1 | 0% | 1,416 | 5,026 | +255% | 0 | 0 | — |
case-08 | fail→pass | 11,134 | 7,225 | -35% | 1 | 1 | 0% | 1,961 | 5,775 | +194% | 0 | 0 | — |
case-09 | pass→pass | 7,457 | 5,890 | -21% | 1 | 1 | 0% | 1,481 | 5,511 | +272% | 0 | 0 | — |
case-10 | pass→pass | 6,154 | 4,373 | -29% | 1 | 1 | 0% | 1,066 | 5,107 | +379% | 0 | 0 | — |
case-11 | fail→pass | 11,518 | 5,781 | -50% | 1 | 1 | 0% | 2,012 | 5,541 | +175% | 0 | 0 | — |
case-12 | pass→pass | 2,975 | 2,660 | -11% | 1 | 1 | 0% | 517 | 4,865 | +841% | 0 | 0 | — |
case-13 | pass→pass | 3,297 | 1,901 | -42% | 1 | 1 | 0% | 527 | 4,692 | +790% | 0 | 0 | — |
case-14 | pass→pass | 7,228 | 2,685 | -63% | 1 | 1 | 0% | 1,228 | 4,862 | +296% | 0 | 0 | — |
case-15 | pass→pass | 13,421 | 7,093 | -47% | 1 | 1 | 0% | 2,443 | 5,760 | +136% | 0 | 0 | — |
case-16 | pass→pass | 5,673 | 4,843 | -15% | 1 | 1 | 0% | 931 | 5,329 | +472% | 0 | 0 | — |
case-17 | pass→pass | 8,689 | 6,068 | -30% | 1 | 1 | 0% | 856 | 4,915 | +474% | 0 | 0 | — |
case-18 | pass→pass | 5,661 | 5,714 | +1% | 1 | 1 | 0% | 535 | 4,888 | +814% | 0 | 0 | — |
case-19 | pass→pass | 9,916 | 7,581 | -24% | 1 | 1 | 0% | 1,595 | 5,669 | +255% | 0 | 0 | — |
case-20 | fail→pass | 10,156 | 1,886 | -81% | 1 | 1 | 0% | 1,617 | 4,640 | +187% | 0 | 0 | — |
case-21 | pass→pass | 13,624 | 7,203 | -47% | 1 | 1 | 0% | 2,046 | 5,535 | +171% | 0 | 0 | — |
case-22 | fail→pass | 3,542 | 2,083 | -41% | 1 | 1 | 0% | 576 | 4,775 | +729% | 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. 22 cases were attempted, and 20 counted toward the lift figure. The other 2 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 +27 percentage points is the difference between those two pass rates over the 20 comparable cases.
The publisher has shipped newer versions since this run, so these numbers describe v1, not the version currently listed.
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.