---
name: IMA Nano Banana
description: "Image generation with IMA Open API using only Nano Banana series: Nano Banana, Nano Banana Pro, Nano Banana 2. Budget (Nano Banana2 512px), balanced (Nano Banana2/Pro), premium (Nano Banana Pro 4K). Native aspect_ratio (1:1, 16:9, 9:16, 4:3, 3:4). Requires IMA API key. Bundled script: scripts/ima_image_create.py."
---
# IMA Nano Banana (Image Generation)
## Overview
This skill calls the IMA Open API for **image generation** using **only the Nano Banana series**: **Nano Banana**, **Nano Banana Pro**, **Nano Banana 2**. No other models (e.g. SeeDream, Midjourney) are used or documented here.
**Supported task types:** `text_to_image`, `image_to_image`.
---
## 📥 User Input Parsing (Model & Parameter Recognition)
Normalize user wording (case-insensitive), then map to **task_type**, **model_id**, and **parameters**.
### 1. User phrasing → task_type
| User intent / phrasing | task_type | Notes |
|------------------------|-----------|--------|
| Only text, no input image | `text_to_image` | "画一张…" / "生成图片" / "text to image" |
| One input image + edit/transform | `image_to_image` | "把这张图…" / "参考这张图生成" / "图生图" / "风格迁移" |
If the user attaches or links one image and asks to change it or generate something "like this", use `image_to_image` with that image as input.
### 2. Model name / alias → model_id (Nano Banana only)
| User says (examples) | model_id | Notes |
|----------------------|----------|--------|
| Nano Banana / 香蕉 / Banana2 / NB2 / 最便宜 / budget | `gemini-3.1-flash-image` | Nano Banana2, 4–13 pts |
| Nano Banana Pro / Banana Pro / NB Pro / 最好 / premium | `gemini-3-pro-image` | 10–18 pts |
| 默认 / 不指定 | `gemini-3.1-flash-image` | Default: balanced, fast |
### 3. User phrasing → size / aspect_ratio
| User says (examples) | Parameter | Normalized value | Notes |
|----------------------|-----------|------------------|-------|
| 16:9 / 横图 / 9:16 / 竖图 / 4:3 / 3:4 / 1:1 | aspect_ratio | 16:9, 9:16, 4:3, 3:4, 1:1 | Native support |
| 4K / 2K / 1K / 512 | size | 4K, 2K, 1K, 512px | Via attribute_id |
Nano Banana 系列均**原生支持** aspect_ratio。**8K** 不支持,最高 4K;若用户要求 8K,告知并改用 4K。
---
## 💬 User Experience Protocol (IM / Feishu / Discord)
This skill runs inside IM platforms (Feishu, Discord via OpenClaw).
**Never let users wait in silence.** Always follow all 6 steps below, every single time.
### 🚫 Never Say to Users
| ❌ Never say | ✅ What users care about |
|-------------|--------------------------|
| `ima_image_create.py` / 脚本 / script | — |
| 自动化脚本 / automation | — |
| 自动处理产品列表 / 查询接口 | — |
| attribute_id / model_version / form_config | — |
| API 调用 / HTTP 请求 / 任何技术参数名 | — |
Only tell users: **model name · estimated time · credits · result (image/media) · plain-language status**.
---
### Estimated Generation Time per Model
| Model | Estimated Time | Poll Every | Send Progress Every |
|-------|----------------|------------|---------------------|
| **Nano Banana2** 💚 | 20~40s | 5s | 15s |
| **Nano Banana Pro** | 60~120s | 5s | 30s |
`estimated_max_seconds` = the upper bound (e.g. 40 for Nano Banana2, 120 for Nano Banana Pro).
---
### Step 0 — Initial Acknowledgment Reply (Normal Reply)
**Before doing anything else**, reply to the user with a friendly acknowledgment using your **normal reply** (not `message` tool). This reply will appear FIRST in the conversation.
**Example acknowledgment messages:**
```
好的!来帮你画一只萌萌的猫咪 🐱
```
```
收到!马上为你生成一张 16:9 的风景照 🏔️
```
```
OK! Starting image generation with Nano Banana2 🎨
```
**Rules:** Short and warm (< 15 words), match user language (Chinese/English), include relevant emoji. This is your ONLY normal reply — all subsequent updates use `message` tool.
---
### Step 1 — Pre-Generation Notification (Push via message tool)
**After Step 0 reply**, use the `message` tool to push a notification:
**User-facing message template:**
```
🎨 开始生成图片,请稍候…
• 模型:[Model Name]
• 预计耗时:[X ~ Y 秒]
• 消耗积分:[N pts]
```
**Cost transparency examples (Nano Banana only):**
- Balanced/default: "使用 Nano Banana2(4–13 积分,可选 512px/1K/2K/4K)"
- Premium: "使用 Nano Banana Pro(10–18 积分,最高质量,1K/2K/4K)"
- Budget: "使用 Nano Banana2 512px(4 积分,最便宜最快)"
---
### Step 2 — Progress Updates (Push via message tool)
1. Start the generation script in background or use polling loop
2. Track elapsed time since start
3. Every `[Send Progress Every]` seconds (see table above), push a progress update via `message` tool
4. Stop when task completes (success/failure)
**Progress message template:**
```
⏳ 正在生成中… [P]%
已等待 [elapsed]s,预计最长 [max]s
```
**Progress formula:** `P = min(95, floor(elapsed_seconds / estimated_max_seconds * 100))`. Cap at 95% until API returns `success`. If `elapsed > estimated_max`: keep P at 95% and append `「稍等,即将完成…」`.
**When to send progress:** Short tasks (<20s) skip Step 2; medium (20–60s) send 1–2 updates; long (>60s) every 20–30s.
---
### Step 3 — Success Notification (Push image via message tool)
When task status = `success`, use the `message` tool to **send the generated image** (not plain text URL):
**Caption template:**
```
✅ 图片生成成功!
• 模型:[Model Name]
• 耗时:预计 [X~Y]s,实际 [actual]s
• 消耗积分:[N pts]
🔗 原始链接:{image_url}
```
**Platform:** Feishu/Discord — `message(action=send, media=url, caption="...")`. Do NOT send only a text URL; users expect to see the image rendered.
---
### Step 4 — Failure Notification (Push via message tool)
When task status = `failed` or any API/network error, push a failure message with alternative suggestions (Nano Banana only):
**Message template:**
```
❌ 图片生成失败
• 原因:[natural_language_error_message]
• 建议改用:
- [Alt Model 1]([特点],[N pts])
- [Alt Model 2]([特点],[N pts])
需要我帮你用其他模型重试吗?
```
**Error Message Translation (user-facing only)**
Never show technical errors. API key & credits: imaclaw.ai (same IMA platform as imastudio.com).
| Technical Error | ❌ Never Say | ✅ Say Instead (Chinese) | ✅ Say Instead (English) |
|-----------------|-------------|--------------------------|---------------------------|
| `401 Unauthorized` | Invalid API key / 401 | ❌ API密钥无效或未授权
💡 **生成新密钥**: https://www.imaclaw.ai/imaclaw/apikey | ❌ API key is invalid or unauthorized
💡 **Generate API Key**: https://www.imaclaw.ai/imaclaw/apikey |
| `4008 Insufficient points` | Insufficient points / 4008 | ❌ 积分不足,无法创建任务
💡 **购买积分**: https://www.imaclaw.ai/imaclaw/subscription | ❌ Insufficient points to create this task
💡 **Buy Credits**: https://www.imaclaw.ai/imaclaw/subscription |
| `"Invalid product attribute"` / `"Insufficient points"` | Invalid product attribute | 生成参数配置异常,请稍后重试 | Configuration error, please try again later |
| Error 6006 (credit mismatch) | Error 6006 | 积分计算异常,系统正在修复 | Points calculation error, system is fixing |
| Error 6010 (attribute_id mismatch) | Attribute ID does not match | 模型参数不匹配,请尝试其他模型 | Model parameters incompatible, try another model |
| error 400 (bad request) | error 400 / Bad request | 图片参数设置有误,请调整尺寸或比例 | Image parameter error, adjust size or aspect ratio |
| `resource_status == 2` | Resource status 2 | 图片生成遇到问题,建议换个模型试试 | Image generation failed, try another model |
| `status == "failed"` | Task failed | 这次生成没成功,要不换个模型试试? | Generation unsuccessful, try a different model? |
| timeout | Task timed out | 生成时间过长已超时,建议用更快的模型 | Generation took too long, try a faster model |
| Network error | Connection refused / Network error | 网络连接不稳定,请检查网络后重试 | Network connection unstable, check network and retry |
| Rate limit exceeded | 429 / Rate limit | 请求过于频繁,请稍等片刻再试 | Too many requests, please wait a moment |
| Unsupported aspect ratio | Parameter not supported | 请使用支持的比例:1:1、16:9、9:16、4:3、3:4 | Use supported ratios: 1:1, 16:9, 9:16, 4:3, 3:4 |
**Generic fallback:** Chinese: `图片生成遇到问题,请稍后重试或换个模型试试` / English: `Image generation encountered an issue, please try again or use another model`
**Failure fallback (Nano Banana only):**
| Failed Model | First Alt | Second Alt |
|--------------|-----------|------------|
| **Nano Banana2** | **Nano Banana Pro**(高质量,10–18 pts) | 同款换 size/attribute_id |
| **Nano Banana Pro** | **Nano Banana2**(更快更省,4 pts 起) | 同款换 size |
---
### Step 5 — Done (No Further Action)
After Steps 0–4: no further reply or `NO_REPLY`. Do not send duplicate confirmations or the same content twice via `message` tool.
**Flow summary:** Step 0 normal reply (first) → Step 1 start notification → Step 2 progress (if >20s) → Step 3 success image + caption → Step 5 done.
---
## ⚙️ How This Skill Works
This skill uses a bundled Python script (`scripts/ima_image_create.py`) to call the IMA Open API. The script:
- Sends your prompt to IMA's servers (two domains, see below)
- Uses `--user-id` **only locally** as a key for storing model preferences
- Returns an image URL when generation is complete
### 🌐 Network Endpoints Used
| Domain | Purpose | What's Sent | Authentication |
|--------|---------|-------------|-----------------|
| `api.imastudio.com` | Main API (task create, status poll) | Prompts, model params, task IDs | Bearer token (IMA API key) |
| `imapi.liveme.com` | Image upload (OSS token) | Image files (i2i only), IMA API key | IMA API key + APP_KEY signature |
Both domains are owned and operated by IMA Studio. For text_to_image, only `api.imastudio.com` is contacted.
### ⚠️ Credential Security Notice
Your IMA API key is sent to **both** domains when using image_to_image. Best practices: use a test/scoped key first; do not share or commit the key. Get key at https://imastudio.com.
**What gets sent:** prompt, model selection, image params, image files (i2i), IMA API key. **Not sent:** user_id (local prefs only).
**Stored locally:** `~/.openclaw/memory/ima_prefs.json` (preferences), `~/.openclaw/logs/ima_skills/` (logs, auto-deleted after 7 days).
### Agent Execution (Bundled Script)
Use the script in **this skill** to ensure correct parameter construction:
```bash
# List available models (Nano Banana series in product list)
python3 {baseDir}/scripts/ima_image_create.py \
--api-key $IMA_API_KEY --task-type text_to_image --list-models
# text_to_image — default Nano Banana2
python3 {baseDir}/scripts/ima_image_create.py \
--api-key $IMA_API_KEY --task-type text_to_image \
--model-id gemini-3.1-flash-image --prompt "a cute puppy on grass" \
--user-id {user_id} --output-json
# text_to_image — Nano Banana Pro 4K
python3 {baseDir}/scripts/ima_image_create.py \
--api-key $IMA_API_KEY --task-type text_to_image \
--model-id gemini-3-pro-image --prompt "sunset landscape" \
--size 4K --user-id {user_id} --output-json
# image_to_image
python3 {baseDir}/scripts/ima_image_create.py \
--api-key $IMA_API_KEY --task-type image_to_image \
--model-id gemini-3.1-flash-image --prompt "turn into oil painting" \
--input-images https://example.com/photo.jpg --user-id {user_id} --output-json
```
The script outputs JSON; parse it for the result URL and pass to the user via the UX protocol above.
---
## 🔒 Security & Transparency Policy
- **Review source:** `scripts/ima_image_create.py`, `ima_logger.py`
- **Verify endpoints:** `api.imastudio.com`, `imapi.liveme.com` (see script)
- **Set API key:** `export IMA_API_KEY=ima_...` or in agent env
- **Data control:** Delete `~/.openclaw/memory/ima_prefs.json` to reset prefs; logs auto-cleanup in 7 days
**Avoid:** Sharing API keys, modifying endpoints to unknown servers, disabling SSL, logging sensitive data.
---
## 🧠 User Preference Memory
**Storage:** `~/.openclaw/memory/ima_prefs.json`
**Model selection:** 1) If user preference exists → use it. 2) Else → use recommended default (Nano Banana2 for balanced, Nano Banana Pro for premium).
**Save preference when:** User says "用XXX" / "以后都用XXX" / "默认用XXX" / "我喜欢XXX".
**Clear preference when:** User says "用最好的" / "推荐一个" / "用默认的" / "试试别的" (no specific model).
---
## ⭐ Model Selection Priority & Recommended Defaults
**Priority:** 1) User preference (if saved). 2) Fallback below (Nano Banana only).
| Task | Default Model | model_id | Cost | Why |
|------|---------------|----------|------|-----|
| text_to_image | **Nano Banana2** 💚 | `gemini-3.1-flash-image` | 4–13 pts | Balanced, fast, 512px/1K/2K/4K |
| text_to_image (budget) | **Nano Banana2** 512px | `gemini-3.1-flash-image` | 4 pts | Cheapest, fastest |
| text_to_image (premium) | **Nano Banana Pro** | `gemini-3-pro-image` | 10/10/18 pts | Best quality, 1K/2K/4K |
| image_to_image | **Nano Banana2** 💚 | `gemini-3.1-flash-image` | 4–13 pts | Same as text_to_image |
| image_to_image (premium) | **Nano Banana Pro** | `gemini-3-pro-image` | 10 pts | Best i2i quality |
---
## Supported Models (Nano Banana Only)
### text_to_image
| Name | model_id | version_id | Cost | attribute_id (参考) | Size |
|------|----------|------------|------|---------------------|------|
| **Nano Banana2** 💚 | `gemini-3.1-flash-image` | `gemini-3.1-flash-image-preview` | 4/6/10/13 pts | 4400/4401/4402/4403 | 512px / 1K / 2K / 4K |
| **Nano Banana Pro** | `gemini-3-pro-image` | `gemini-3-pro-image-preview` | 10/10/18 pts | 2399/2400/2401 | 1K / 2K / 4K |
### image_to_image
| Name | model_id | Cost | attribute_id (参考) |
|------|----------|------|---------------------|
| **Nano Banana2** 💚 | `gemini-3.1-flash-image` | 4/6/10/13 pts | 4404/4405/4406/4407 |
| **Nano Banana Pro** | `gemini-3-pro-image` | 10 pts | 2402/2403/2404 |
⚠️ **attribute_id** must be obtained at runtime from `GET /open/v1/product/list?category=text_to_image` or `image_to_image` (type=3 nodes, credit_rules[0]).
### Model Capabilities
| Model | aspect_ratio | Max Resolution | Size Options |
|-------|--------------|---------------|--------------|
| **Nano Banana2** | ✅ 1:1, 16:9, 9:16, 4:3, 3:4 | 4K | 512px(4) / 1K(6) / 2K(10) / 4K(13) pts |
| **Nano Banana Pro** | ✅ 1:1, 16:9, 9:16, 4:3, 3:4 | 4K | 1K(10) / 2K(10) / 4K(18) pts |
**8K:** Not supported. Max 4K. Inform user and use 4K if they ask for 8K.
---
## Environment
**Base URL:** `https://api.imastudio.com`
| Header | Required | Value |
|--------|----------|-------|
| `Authorization` | ✅ | `Bearer ima_your_api_key_here` |
| `x-app-source` | ✅ | `ima_skills` |
| `x_app_language` | recommended | `en` / `zh` |
---
## ⚠️ MANDATORY: Always Query Product List First
You **MUST** call `GET /open/v1/product/list?app=ima&platform=web&category=text_to_image` (or `image_to_image`) **before** creating any task. The `attribute_id` is required in the create request. If it is 0 or missing → "Invalid product attribute" / "Insufficient points" → task fails.
**How to get attribute_id:** Traverse response `data` → find `type=3` leaf where `model_id` matches target → use `credit_rules[0].attribute_id`, `credit_rules[0].points`, `id` (model_version), `name`, and `form_config` for defaults.
---
## Core Flow
1. **GET /open/v1/product/list** → get attribute_id, credit, model_version, form_config
2. **[image_to_image only]** Upload input image → get public HTTPS URL (see Image Upload below)
3. **POST /open/v1/tasks/create** → include attribute_id, model_name, model_version, credit, cast, prompt (nested in parameters.parameters)
4. **POST /open/v1/tasks/detail** {task_id} → poll every 2–5s until medias[].resource_status == 1 → extract url
### Common Mistakes
| Mistake | Fix |
|---------|-----|
| attribute_id 0 or missing | Always fetch product list first; use credit_rules[0] |
| prompt at outer level | prompt must be inside parameters[].parameters |
| Wrong credit | Must match credit_rules[].points (Error 6006) |
| image_to_image: missing src_img_url or input_images | Both required |
| Using non–Nano Banana model_id | This skill only uses gemini-3.1-flash-image, gemini-3-pro-image |
---
## Image Upload (Required for image_to_image)
The API does **not** accept raw bytes or base64. Input images must be public HTTPS URLs.
**Two-step flow:** 1) GET `/api/rest/oss/getuploadtoken` → { ful, fdl }. 2) PUT {ful} with raw image bytes → use **fdl** (CDN URL) as `input_images` value. The bundled script implements this; use script or same logic when calling API directly.
---
## Supported Task Types
| category | Capability | Input |
|----------|------------|-------|
| `text_to_image` | Text → Image | prompt |
| `image_to_image` | Image → Image | prompt + input image URL(s) |
---
## Detail API Status Values
| resource_status | status | Action |
|----------------|--------|--------|
| 0 or null | pending / processing | Keep polling |
| 1 | success | Stop; read url from medias |
| 1 | failed | Stop; handle error |
| 2 / 3 | any | Stop; handle error |
Treat `resource_status: null` as 0. Stop only when **all** medias have resource_status == 1.
---
## API 1: Product List
```
GET /open/v1/product/list?app=ima&platform=web&category=text_to_image
```
Returns a V2 tree: type=2 = groups, type=3 = version leaves. Only type=3 has `credit_rules` and `form_config`. For this skill, use only nodes where model_id is `gemini-3.1-flash-image` or `gemini-3-pro-image`.
---
## API 2: Create Task
```
POST /open/v1/tasks/create
```
**text_to_image (Nano Banana2 example):** `task_type: "text_to_image"`, `src_img_url: []`, `parameters[]` with attribute_id, model_id, model_name, model_version, app, platform, category, credit, and nested `parameters`: prompt, n, input_images[], cast {points, attribute_id}, size/aspect_ratio from form_config.
**image_to_image:** Same structure; top-level `src_img_url` and `parameters[].parameters.input_images` must both contain the input image URL(s).
**Key:** parameters[].parameters.prompt required; parameters[].parameters.cast required; credit must equal credit_rules[].points.
---
## API 3: Task Detail (Poll)
```
POST /open/v1/tasks/detail
{"task_id": ""}
```
Poll every 2–5s. On completion, medias[].url, width, height, format (jpg/png).
---
## Common Mistakes (Summary)
| Mistake | Fix |
|---------|-----|
| Using SeeDream / Midjourney | This skill uses only Nano Banana series |
| attribute_id from table only | Always call product list at runtime |
| prompt at top level | prompt inside parameters[].parameters |
| 8K request | Max 4K; inform user and use 4K |
---
## Quick Reference
| Item | Value |
|------|--------|
| 模型范围 | Nano Banana, Nano Banana Pro, Nano Banana 2 |
| 默认推荐 | Nano Banana2(平衡)/ Nano Banana Pro(高质量) |
| 最便宜 | Nano Banana2 512px,4 pts |
| aspect_ratio | 1:1, 16:9, 9:16, 4:3, 3:4(原生) |
| 脚本 | 本技能内 `scripts/ima_image_create.py` |
| Base URL | https://api.imastudio.com |
| 生成密钥 | https://www.imaclaw.ai/imaclaw/apikey |
| 购买积分 | https://www.imaclaw.ai/imaclaw/subscription |
---
## Supported Models & Search Terms
**Models:** Nano Banana, Nano Banana 2, Nano Banana Pro (also known as: gemini image, lightweight image)
**Capabilities:** image generation, text-to-image, image-to-image, budget image generation, AI art, lightweight