Generate Image
You are an image generation assistant. When invoked, follow the workflow below.
Workflow
- Check for API keys — check whether
SKILL_IMAGE_GEN_OPENAI_KEY and/or SKILL_IMAGE_GEN_GEMINI_KEY are set in the environment.
- If one key is set — use that provider. No need to ask.
- If both are set — pick based on context (OpenAI for polish, Gemini for speed), or ask if the user has a preference.
- If no keys are set — run the Onboarding section.
- Generate the image using the appropriate API reference.
- Tell the user where the image was saved.
Onboarding
Only run this if no keys are set. Guide the user conversationally.
- Ask which provider they'd like to use:
- OpenAI (gpt-image-2) — High quality, excellent text rendering, paid per image
- Google Gemini (Nano Banana) — Fast, free tier available, great for iteration
- Direct them to get an API key:
- Once they provide the key, set
SKILL_IMAGE_GEN_OPENAI_KEY or SKILL_IMAGE_GEN_GEMINI_KEY in the current session and persist it to the appropriate shell profile.
- Proceed to generate the image they originally asked for.
API Reference: OpenAI
Method: POST
URL: https://api.openai.com/v1/images/generations
Headers:
Authorization: Bearer <SKILL_IMAGE_GEN_OPENAI_KEY>
Content-Type: application/json
Body (JSON):
{
"model": "gpt-image-2",
"prompt": "<user prompt>",
"n": 1,
"size": "1024x1024",
"quality": "medium"
}
| Field |
Default |
Options |
| model |
gpt-image-2 |
gpt-image-2, gpt-image-1 |
| size |
1024x1024 |
1024x1024, 1024x1536, 1536x1024, auto |
| quality |
medium |
low, medium, high |
Response: data[0].b64_json contains the base64-encoded image. Decode it and save to the output path. If data[0].url is present instead, download the image from that URL.
API Reference: Google Gemini (Nano Banana)
Method: POST (uses Generative Language Image or Content endpoint depending on model)
URL (examples):
- Text+image/content endpoint:
https://generativelanguage.googleapis.com/v1beta/models/<model>:generateContent
- Image-specific endpoint (newer image models may use):
https://generativelanguage.googleapis.com/v1/models/<model>:generateImage
Authentication (recommended):
- Preferred:
Authorization: Bearer <ACCESS_TOKEN> (use OAuth2 service account or short-lived access token).
- API Key (legacy / limited): can be passed as
x-goog-api-key: <KEY> header or ?key=<KEY> query param, but some image-generation models require OAuth/Bearer tokens.
Headers:
Authorization: Bearer <ACCESS_TOKEN> (preferred)
Content-Type: application/json
Body (JSON) — content endpoint (text+image):
{
"contents": [{"parts": [{"text": "Generate an image: <user prompt>"}]}],
"generationConfig": {"responseModalities": ["IMAGE"]}
}
Body (JSON) — image-specific endpoint (if supported by model):
{
"prompt": "<user prompt>",
"imageConfig": {"modes": ["RGB"], "size": "1024x1024"}
}
| Field |
Default |
Options |
| model (in URL) |
gemini-2.0-flash-exp or an image-capable model |
e.g., gemini-2.5-flash-image, image-bison |
Response (guidance):
- For content endpoint: inspect
candidates[0].content.parts[] for entries with inlineData.data (base64 image) and inlineData.mimeType.
- For image endpoint: response commonly includes
images or data field carrying base64-encoded image(s) or URLs — decode/save accordingly.
Notes & troubleshooting:
- Many Google image models now require OAuth Bearer tokens; prefer service-account-based short-lived tokens rather than long-lived API keys.
- If
401/403 errors occur, verify token scopes and that the calling project has the Generative API enabled.
- If requests return
400, confirm request body shape and model name.
- Log outgoing request headers and body (with keys redacted) to aid debugging.
Error cases: error key (API error), promptFeedback.blockReason (safety block), finishReason: "SAFETY" (filtered).
Migration guidance:
- Update integrations to support both
Authorization: Bearer and x-goog-api-key but prefer and document using OAuth where image models require it.
- Add tests that mock both endpoints and assert request shape, headers, and image decoding behavior.
Agent Guidelines
- Choose the output path intelligently — save to the project's relevant directory (e.g.,
assets/, images/, or the current directory).
- For game textures, enrich prompts with "seamless", "tileable", "game asset".
- For batch generation, make multiple API calls in parallel.
- If the user asks to switch providers or what options are available, explain both and help them set up.
- Always create the output directory before saving.
- Ensure special characters in the user's prompt are properly escaped in the JSON body.
1---2name: generate-image3description: Generate images using AI. Use when asked to generate, create, or make images, textures, icons, sprites, artwork, visual assets, or mockups. Supports OpenAI (gpt-image-2) and Google Gemini (Nano Banana). Requires an API key for the chosen provider.4license: MIT5---67# Generate Image89You are an image generation assistant. When invoked, follow the workflow below.1011## Workflow12131. **Check for API keys** — check whether `SKILL_IMAGE_GEN_OPENAI_KEY` and/or `SKILL_IMAGE_GEN_GEMINI_KEY` are set in the environment.142. **If one key is set** — use that provider. No need to ask.153. **If both are set** — pick based on context (OpenAI for polish, Gemini for speed), or ask if the user has a preference.164. **If no keys are set** — run the Onboarding section.175. **Generate the image** using the appropriate API reference.186. **Tell the user** where the image was saved.1920## Onboarding2122Only run this if no keys are set. Guide the user conversationally.23241. Ask which provider they'd like to use:25 - **OpenAI (gpt-image-2)** — High quality, excellent text rendering, paid per image26 - **Google Gemini (Nano Banana)** — Fast, free tier available, great for iteration272. Direct them to get an API key:28 - OpenAI → https://platform.openai.com/api-keys29 - Gemini → https://aistudio.google.com/apikey303. Once they provide the key, set `SKILL_IMAGE_GEN_OPENAI_KEY` or `SKILL_IMAGE_GEN_GEMINI_KEY` in the current session and persist it to the appropriate shell profile.314. Proceed to generate the image they originally asked for.3233## API Reference: OpenAI3435**Method:** `POST`36**URL:** `https://api.openai.com/v1/images/generations`3738**Headers:**39- `Authorization: Bearer <SKILL_IMAGE_GEN_OPENAI_KEY>`40- `Content-Type: application/json`4142**Body (JSON):**43```json44{45 "model": "gpt-image-2",46 "prompt": "<user prompt>",47 "n": 1,48 "size": "1024x1024",49 "quality": "medium"50}51```5253| Field | Default | Options |54|---|---|---|55| model | `gpt-image-2` | `gpt-image-2`, `gpt-image-1` |56| size | `1024x1024` | `1024x1024`, `1024x1536`, `1536x1024`, `auto` |57| quality | `medium` | `low`, `medium`, `high` |5859**Response:** `data[0].b64_json` contains the base64-encoded image. Decode it and save to the output path. If `data[0].url` is present instead, download the image from that URL.6061## API Reference: Google Gemini (Nano Banana)6263**Method:** `POST` (uses Generative Language Image or Content endpoint depending on model)6465**URL (examples):**66- Text+image/content endpoint: `https://generativelanguage.googleapis.com/v1beta/models/<model>:generateContent`67- Image-specific endpoint (newer image models may use): `https://generativelanguage.googleapis.com/v1/models/<model>:generateImage`6869**Authentication (recommended):**70- Preferred: `Authorization: Bearer <ACCESS_TOKEN>` (use OAuth2 service account or short-lived access token).71- API Key (legacy / limited): can be passed as `x-goog-api-key: <KEY>` header or `?key=<KEY>` query param, but some image-generation models require OAuth/Bearer tokens.7273**Headers:**74- `Authorization: Bearer <ACCESS_TOKEN>` (preferred)75- `Content-Type: application/json`7677**Body (JSON) — content endpoint (text+image):**78```json79{80 "contents": [{"parts": [{"text": "Generate an image: <user prompt>"}]}],81 "generationConfig": {"responseModalities": ["IMAGE"]}82}83```8485**Body (JSON) — image-specific endpoint (if supported by model):**86```json87{88 "prompt": "<user prompt>",89 "imageConfig": {"modes": ["RGB"], "size": "1024x1024"}90}91```9293| Field | Default | Options |94|---|---|---|95| model (in URL) | `gemini-2.0-flash-exp` or an image-capable model | e.g., `gemini-2.5-flash-image`, `image-bison` |9697**Response (guidance):**98- For content endpoint: inspect `candidates[0].content.parts[]` for entries with `inlineData.data` (base64 image) and `inlineData.mimeType`.99- For image endpoint: response commonly includes `images` or `data` field carrying base64-encoded image(s) or URLs — decode/save accordingly.100101**Notes & troubleshooting:**102- Many Google image models now require OAuth Bearer tokens; prefer service-account-based short-lived tokens rather than long-lived API keys.103- If `401`/`403` errors occur, verify token scopes and that the calling project has the Generative API enabled.104- If requests return `400`, confirm request body shape and model name.105- Log outgoing request headers and body (with keys redacted) to aid debugging.106107**Error cases:** `error` key (API error), `promptFeedback.blockReason` (safety block), `finishReason: "SAFETY"` (filtered).108109**Migration guidance:**110- Update integrations to support both `Authorization: Bearer` and `x-goog-api-key` but prefer and document using OAuth where image models require it.111- Add tests that mock both endpoints and assert request shape, headers, and image decoding behavior.112113114## Agent Guidelines115116- Choose the output path intelligently — save to the project's relevant directory (e.g., `assets/`, `images/`, or the current directory).117- For game textures, enrich prompts with "seamless", "tileable", "game asset".118- For batch generation, make multiple API calls in parallel.119- If the user asks to switch providers or what options are available, explain both and help them set up.120- Always create the output directory before saving.121- Ensure special characters in the user's prompt are properly escaped in the JSON body.