Generate high-quality images with GPT Image 2 (OpenAI gpt-image-2) via the ClawdChat tool gateway. Use when the user asks to create / generate / draw / paint...
---
name: gpt-image2
description: "Generate high-quality images with GPT Image 2 (OpenAI gpt-image-2) via the ClawdChat tool gateway. Use when the user asks to create / generate / draw / paint an image, mentions GPT image, gpt-image-2, OpenAI image generation, or needs accurate text rendering (posters, infographics, menu typography), strict multi-element prompt following, image-to-image with subject/identity preservation, or specific styles such as Ghibli / Pixar / LEGO / cyberpunk / claymation / Pop Mart figurine."
homepage: https://clawdchat.cn
metadata:
emoji: "๐ผ๏ธ"
category: creative
version: "0.1.0"
language: en
publisher: clawdchat
requires:
primary_credential:
type: clawdchat_api_key
managed_by: uno-cli skill
stored_at: ~/.clawdchat/credentials.json
obtained_via: interactive `uno login` command (delegates to ClawdChat OAuth, see https://clawdchat.cn)
scope: "Used as Authorization Bearer token to call the ClawdChat tool gateway. The credential is acquired and stored by the uno-cli skill; this skill only reuses it via the `uno` CLI and never reads, prints, or transmits the file directly."
config_paths:
- ~/.clawdchat/credentials.json (read-only, owned by uno-cli)
network_endpoints:
- "ClawdChat tool gateway (HTTPS, via uno-cli) โ receives the prompt and reference-image URLs"
write_actions:
- "Submits paid image-generation jobs (300 credits per submit). Each call deducts ClawdChat credits from the logged-in account."
- "Writes no local files. Generated image URLs are returned in the response; the agent decides whether to download them."
cost:
gpt_image2_submit: "300 credits per call"
gpt_image2_result: "0 credits per call"
openclaw:
requires:
bins: ["uno"]
skills: ["uno-cli"]
---
# GPT Image 2 โ High-quality AI image generation
> Powered by ClawdChat โ calls OpenAI `gpt-image-2` through the Uno tool gateway.
## What this skill does
Two thin command-line invocations against the public ClawdChat tool gateway:
| Tool slug | Purpose | Cost |
|---|---|---|
| `gpt-image-2.gpt_image2_submit` | Submit a generation job, returns `job_id` immediately (async) | **300 credits / call** |
| `gpt-image-2.gpt_image2_result` | Poll job status / fetch image URL when ready | 0 credits |
This skill ships **no local Python code**. It defers all credential, transport and rate-limit handling to the `uno-cli` companion skill.
## Credentials & permissions (please read before first use)
- **Credential type**: ClawdChat API key (Bearer token).
- **Where it lives**: `~/.clawdchat/credentials.json`. The file is **created and owned by the `uno-cli` skill**; this skill never opens, prints or copies it.
- **How it was obtained**: the user runs `uno login` in `uno-cli`, which opens an OAuth flow on https://clawdchat.cn and stores the resulting token.
- **What it authorises**: calling the ClawdChat tool gateway as the logged-in user. Each `gpt_image2_submit` deducts 300 credits from that account.
- **Network egress**: the user's `prompt` text and any `reference_image_urls` are sent to the ClawdChat gateway over HTTPS. **Do not paste private, confidential, or personally-identifying content into the prompt unless you are comfortable with the gateway's data handling โ see https://clawdchat.cn for the data policy.**
- **Logging out / revoking**: run `uno logout` (managed by `uno-cli`).
## Cost transparency & confirmation rule
Every `gpt_image2_submit` call costs the logged-in account real credits. The agent **must**:
1. Show the user the planned prompt, size, style, and number of images **before** the first call.
2. Ask for explicit confirmation when the user has not already approved a generation in the current turn.
3. For multi-image batches (`n > 1`) or retries, treat each submission as a separate spending event and confirm again unless the user has pre-authorised the batch.
4. On `error` responses, surface the error to the user instead of silently retrying.
Polling via `gpt_image2_result` is free; only `submit` spends credits.
## Setup
This skill depends on the `uno-cli` skill (declared in `metadata.openclaw.skills`).
1. Install `uno-cli` (skipping if already installed):
```bash
clawhub install uno-cli
```
On platforms that honour `metadata.openclaw.skills`, this dependency is installed automatically when this skill is installed.
2. Log in once:
```bash
uno login
```
The login flow, credential storage, and refresh are entirely handled by `uno-cli`. This skill only invokes `uno call ...` afterwards.
> If `uno` is not on `PATH`, replace it in the examples below with `python /path/to/uno-cli/bin/uno.py`.
## Generating an image โ full async flow
A single 1024ร1024 image typically takes **~150 s**, longer than the default MCP 60 s timeout. Always use the **submit โ poll-result** pattern.
### Step 1 โ submit
```bash
uno call gpt-image-2.gpt_image2_submit --compact \
--args '{"prompt":"A shiba inu under cherry blossoms, sunny afternoon","size":"1024x1024","style":"ghibli_anime"}'
```
Response (already flattened by `uno-cli` โ no need to unwrap `content[0].text`):
```json
{"success": true, "data": {"status": "pending", "job_id": "0b84b8f0f0c8", "estimated_seconds": 150}, "meta": {"latency_ms": 120, "credits_used": 300}}
```
Record `data.job_id`.
### Step 2 โ poll for result
```bash
uno call gpt-image-2.gpt_image2_result --compact --timeout 70 \
--args '{"job_id":"0b84b8f0f0c8","wait_seconds":50}'
```
`wait_seconds=50` makes the server-side wait 50 s (within the 60 s MCP envelope); `--timeout 70` adds a small client buffer.
Repeat the call until `data.status` is one of:
- `done` โ image ready, URLs in `data.items[].url`.
- `error` โ generation failed, message in `data.error`.
- `pending` / `running` โ call again immediately. **Do not add a client-side sleep**; the server already waited 50 s on your behalf.
Three to five iterations (~150โ250 s total) is normal.
### Reference shell loop
```bash
RESP=$(uno call gpt-image-2.gpt_image2_submit --compact \
--args '{"prompt":"Van Gogh starry night","style":"oil_painting_vangogh"}')
JOB_ID=$(echo "$RESP" | python3 -c "import json,sys; print(json.load(sys.stdin)['data']['job_id'])")
for i in 1 2 3 4 5 6; do
R=$(uno call gpt-image-2.gpt_image2_result --compact --timeout 70 \
--args "{\"job_id\":\"$JOB_ID\",\"wait_seconds\":50}")
STATUS=$(echo "$R" | python3 -c "import json,sys; print(json.load(sys.stdin)['data']['status'])")
[ "$STATUS" = "done" ] && echo "$R" && break
[ "$STATUS" = "error" ] && echo "$R" && exit 1
done
```
## Parameters
| Field | Meaning | Values |
|---|---|---|
| `prompt` | Image description (required, any language) | free text |
| `size` | Image dimensions | `1024x1024` (default), `1024x1536` (portrait), `1536x1024` (landscape), `auto` |
| `n` | Number of images to generate | 1โ4 (default 1) |
| `style` | Built-in style preset | one of the 20 keys below |
| `reference_image_urls` | Reference images (image-to-image) | URL string, comma-separated for multiple |
## 20 built-in style presets
| key | description |
|---|---|
| `ghibli_anime` | Studio Ghibli / hand-drawn anime |
| `pixar_3d` | Pixar / Disney 3D animation |
| `claymation` | Stop-motion claymation (Laika / Aardman) |
| `lego_brick` | LEGO bricks |
| `popmart_figurine` | Blind-box / Pop Mart figurine |
| `isometric_game` | Isometric 2.5D game scene |
| `cinematic_photo` | Cinematic photorealism (35mm) |
| `polaroid_film` | Polaroid film snapshot |
| `watercolor_ink` | Watercolour / East-Asian ink wash |
| `oil_painting_vangogh` | Van Gogh impasto oil painting |
| `cyberpunk_neon` | Cyberpunk neon nightscape |
| `vintage_infographic` | Retro infographic / data poster |
| `movie_poster` | Movie poster (large title + still) |
| `flat_vector` | Flat-vector illustration / banner |
| `pixel_8bit` | Pixel art (8/16-bit) |
| `papercraft_layered` | Layered papercraft |
| `exploded_diagram` | Exploded technical diagram |
| `dreamcore_liminal` | Dreamcore / liminal space |
| `knolling_flatlay` | Top-down knolling / flat-lay |
| `botanical_engraving` | Botanical engraving / antique illustration |
## Where this model shines (vs Midjourney / Flux / SD)
- **Accurate text rendering** โ poster headlines, infographics, menu typography, meme captions: written into the image as specified.
- **Strong prompt following** โ multi-element scenes, ordering and spatial relationships obeyed.
- **Subject preservation in image-to-image** โ faces, brands, and characters stay consistent across reference images.
- **Wide style coverage** โ Ghibli, Pixar, claymation, LEGO, Pop Mart, botanical engraving etc. all handled.
## Agent guidance
- Tell the user up-front that one image takes ~150 s.
- The `gpt_image2_result` tool already sleeps 50 s server-side โ never add an extra client-side sleep between polls.
- Use `--timeout 70` for `result` calls (50 s server wait + buffer).
- Pass the user's prompt verbatim, including non-English text.
- Reference images: combine `reference_image_urls` with a `style` preset for "restyle while keeping the subject".
- Posters / infographics / menus: lean on the text-rendering strength.
- If `submit` returns `success=false`, surface the `error`/`hint` fields to the user.
- If the loop exhausts (~600 s) and status is still `running`, tell the user the job can be re-polled later with the same `job_id`.
## Response shape
Already flattened by `uno-cli`:
```json
{
"success": true,
"data": {"status": "...", "job_id": "...", "items": [{"url": "..."}]},
"meta": {"latency_ms": 120, "credits_used": 300}
}
```
Read `data.status`, `data.job_id`, `data.items[].url` directly.
Errors:
```json
{"success": false, "error": "...", "hint": "..."}
```
don't have the plugin yet? install it then click "run inline in claude" again.