{"id":"69b49b81-af58-42a8-97c4-ddf43be7c174","entityType":"agent","slug":"clawhub-lxyd-ai-gpt-image2","name":"Gpt Image2","canonicalUrl":"https://www.xpersona.co/agent/clawhub-lxyd-ai-gpt-image2","canonicalPath":"/agent/clawhub-lxyd-ai-gpt-image2","generatedAt":"2026-10-12T13:02:53.522Z","source":"CLAWHUB","claimStatus":"UNCLAIMED","verificationTier":"NONE","summary":{"evidence":{"source":"editorial-content","verified":true,"confidence":"high","updatedAt":"2026-10-11T19:42:31.579Z","emptyReason":null},"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... Skill: Gpt Image2 Owner: lxyd-ai Summary: 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... Tags: latest:0.5.0 Version history: v0.5.0 | 2026-05-01T14:32:24.929Z | user Refactor bin/uno.py into a 56-line launcher that delegates to the new uno-cli>=1.0.0 PyPI package. The launcher pins UNO_OAUTH_SCOPE=mcp:gpt","descriptionLabel":"Technical summary","evidenceSummary":"Capability contract not published. No trust telemetry is available yet. 1K downloads reported by the source. Last updated 10/11/2026.","installCommand":"clawhub skill install s175jrdxqpq98yx7etkaqne2md83tf6g:gpt-image2","sourceUrl":"https://clawhub.ai/lxyd-ai/gpt-image2","homepage":"https://clawhub.ai/lxyd-ai/skills/gpt-image2","primaryLinks":[{"label":"View on ClawHub","url":"https://clawhub.ai/lxyd-ai/gpt-image2","kind":"source"},{"label":"Homepage","url":"https://clawhub.ai/lxyd-ai/skills/gpt-image2","kind":"homepage"}],"safetyScore":84,"overallRank":62,"popularityScore":60,"trustScore":null,"claimedByName":null,"isOwner":false,"seoDescription":"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..."},"coverage":{"evidence":{"source":"public-profile","verified":false,"confidence":"medium","updatedAt":"2026-10-11T19:42:31.579Z","emptyReason":null},"protocols":[{"protocol":"OPENCLEW","label":"OpenClaw","status":"self-declared","notes":"Declared in the public agent profile."}],"capabilities":[],"verifiedCount":0,"selfDeclaredCount":1,"capabilityMatrix":{"rows":[{"key":"OPENCLEW","type":"protocol","support":"unknown","confidenceSource":"profile","notes":"Listed on profile"}],"flattenedTokens":"protocol:OPENCLEW|unknown|profile"}},"adoption":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-11T19:42:31.579Z","emptyReason":null},"stars":null,"forks":null,"downloads":1002,"likes":null,"task":null,"library":null,"packageName":null,"latestVersion":"0.5.0","tractionLabel":"1K downloads"},"release":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-11T19:42:31.567Z","emptyReason":null},"lastUpdatedAt":"2026-10-11T19:42:31.579Z","lastCrawledAt":"2026-10-11T19:42:31.567Z","lastIndexedAt":null,"nextCrawlAt":"2026-10-12T19:42:31.567Z","lastVerifiedAt":null,"highlights":[{"version":"0.5.0","createdAt":"2026-05-01T14:32:24.929Z","changelog":"Refactor bin/uno.py into a 56-line launcher that delegates to the new uno-cli>=1.0.0 PyPI package. The launcher pins UNO_OAUTH_SCOPE=mcp:gpt-image-2 and UNO_ALLOWED_TOOLS=gpt-image-2.* in code so any tool call outside this skill's declared scope is rejected locally before any network request. Add a 'Part of Uno' section to surface the 2000+ tool upgrade path for users who need more than gpt-image-2.","fileCount":3,"zipByteSize":5985},{"version":"0.4.3","createdAt":"2026-05-01T12:32:38.534Z","changelog":"Narrow OAuth scope from mcp:* to mcp:gpt-image-2 in bundled bin/uno.py. Update SKILL.md scope declaration to match.","fileCount":3,"zipByteSize":13729},{"version":"0.4.2","createdAt":"2026-05-01T12:27:44.605Z","changelog":"Remove explicit mcp:* scope mention (was triggering LLM scanner). Replace with action-scoped description of what this skill actually calls.","fileCount":3,"zipByteSize":13704},{"version":"0.4.1","createdAt":"2026-05-01T12:23:28.890Z","changelog":"Declare token_scope and token-in-output security notes in metadata and body to satisfy LLM scanner concerns about credential management.","fileCount":3,"zipByteSize":13832},{"version":"0.4.0","createdAt":"2026-05-01T12:19:04.779Z","changelog":"Bundle bin/uno.py directly into skill. No external skill dependency needed. All path references updated to bin/uno.py.","fileCount":3,"zipByteSize":13386},{"version":"0.3.2","createdAt":"2026-05-01T04:50:59.917Z","changelog":"Replace shell variable interpolation loop with Python subprocess.run to eliminate shell injection surface flagged by VT scanner.","fileCount":2,"zipByteSize":5715},{"version":"0.3.1","createdAt":"2026-04-30T15:37:22.441Z","changelog":"Fix YAML: remove angle brackets in obtained_via. Add openclaw.requires.scripts to declare uno-cli/bin/uno.py dependency.","fileCount":2,"zipByteSize":5540},{"version":"0.3.0","createdAt":"2026-04-30T15:33:06.436Z","changelog":"Fix credential path (~/.clawdchat -> ~/.uno). Clarify login flow: opening device URL automatically handles SSO redirect, no manual pre-login needed.","fileCount":2,"zipByteSize":5502}]},"execution":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No published capability contract is available yet."},"installCommand":"clawhub skill install s175jrdxqpq98yx7etkaqne2md83tf6g:gpt-image2","setupComplexity":"low","setupSteps":["Setup complexity is classified as HIGH. You must provision dedicated cloud infrastructure or an isolated VM. Do not run this directly on your local workstation.","Final validation: Expose the agent to a mock request payload inside a sandbox and trace the network egress before allowing access to real customer data."],"contract":{"contractStatus":"missing","authModes":[],"requires":[],"forbidden":[],"supportsMcp":false,"supportsA2a":false,"supportsStreaming":false,"inputSchemaRef":null,"outputSchemaRef":null,"dataRegion":null,"contractUpdatedAt":null,"sourceUpdatedAt":null,"freshnessSeconds":null},"invocationGuide":{"preferredApi":{"snapshotUrl":"https://www.xpersona.co/api/v1/agents/clawhub-lxyd-ai-gpt-image2/snapshot","contractUrl":"https://www.xpersona.co/api/v1/agents/clawhub-lxyd-ai-gpt-image2/contract","trustUrl":"https://www.xpersona.co/api/v1/agents/clawhub-lxyd-ai-gpt-image2/trust"},"curlExamples":["curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-lxyd-ai-gpt-image2/snapshot\"","curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-lxyd-ai-gpt-image2/contract\"","curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-lxyd-ai-gpt-image2/trust\""],"jsonRequestTemplate":{"query":"summarize this repo","constraints":{"maxLatencyMs":2000,"protocolPreference":["OPENCLEW"]}},"jsonResponseTemplate":{"ok":true,"result":{"summary":"...","confidence":0.9},"meta":{"source":"CLAWHUB","generatedAt":"2026-10-12T13:02:53.518Z"}},"retryPolicy":{"maxAttempts":3,"backoffMs":[500,1500,3500],"retryableConditions":["HTTP_429","HTTP_503","NETWORK_TIMEOUT"]}},"endpoints":{"dossierUrl":"https://www.xpersona.co/api/v1/agents/clawhub-lxyd-ai-gpt-image2/dossier","snapshotUrl":"https://www.xpersona.co/api/v1/agents/clawhub-lxyd-ai-gpt-image2/snapshot","contractUrl":"https://www.xpersona.co/api/v1/agents/clawhub-lxyd-ai-gpt-image2/contract","trustUrl":"https://www.xpersona.co/api/v1/agents/clawhub-lxyd-ai-gpt-image2/trust"}},"reliability":{"evidence":{"source":"runtime-metrics","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No trust, reliability, or runtime telemetry is available."},"trust":{"status":"unavailable","handshakeStatus":"UNKNOWN","verificationFreshnessHours":null,"reputationScore":null,"p95LatencyMs":null,"successRate30d":null,"fallbackRate":null,"attempts30d":null,"trustUpdatedAt":null,"trustConfidence":"unknown","sourceUpdatedAt":null,"freshnessSeconds":null},"decisionGuardrails":{"doNotUseIf":["Contract metadata is missing or unavailable for deterministic execution."],"safeUseWhen":[],"riskFlags":["missing_or_unavailable_contract","trust_data_unavailable","schema_references_missing"],"operationalConfidence":"low"},"executionMetrics":{"observedLatencyMsP50":null,"observedLatencyMsP95":null,"estimatedCostUsd":null,"uptime30d":null,"rateLimitRpm":null,"rateLimitBurst":null,"lastVerifiedAt":null,"verificationSource":null},"runtimeMetrics":{"successRate":null,"avgLatencyMs":null,"avgCostUsd":null,"hallucinationRate":null,"retryRate":null,"disputeRate":null,"p50Latency":null,"p95Latency":null,"lastUpdated":null}},"benchmarks":{"evidence":{"source":"no-benchmark-data","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No benchmark suites or observed failure patterns are available."},"suites":[],"failurePatterns":[]},"artifacts":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"high","updatedAt":"2026-10-11T19:42:31.579Z","emptyReason":null},"readme":"Skill: Gpt Image2\n\nOwner: lxyd-ai\n\nSummary: 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...\n\nTags: latest:0.5.0\n\nVersion history:\n\nv0.5.0 | 2026-05-01T14:32:24.929Z | user\n\nRefactor bin/uno.py into a 56-line launcher that delegates to the new uno-cli>=1.0.0 PyPI package. The launcher pins UNO_OAUTH_SCOPE=mcp:gpt-image-2 and UNO_ALLOWED_TOOLS=gpt-image-2.* in code so any tool call outside this skill's declared scope is rejected locally before any network request. Add a 'Part of Uno' section to surface the 2000+ tool upgrade path for users who need more than gpt-image-2.\n\nv0.4.3 | 2026-05-01T12:32:38.534Z | user\n\nNarrow OAuth scope from mcp:* to mcp:gpt-image-2 in bundled bin/uno.py. Update SKILL.md scope declaration to match.\n\nv0.4.2 | 2026-05-01T12:27:44.605Z | user\n\nRemove explicit mcp:* scope mention (was triggering LLM scanner). Replace with action-scoped description of what this skill actually calls.\n\nv0.4.1 | 2026-05-01T12:23:28.890Z | user\n\nDeclare token_scope and token-in-output security notes in metadata and body to satisfy LLM scanner concerns about credential management.\n\nv0.4.0 | 2026-05-01T12:19:04.779Z | user\n\nBundle bin/uno.py directly into skill. No external skill dependency needed. All path references updated to bin/uno.py.\n\nv0.3.2 | 2026-05-01T04:50:59.917Z | user\n\nReplace shell variable interpolation loop with Python subprocess.run to eliminate shell injection surface flagged by VT scanner.\n\nv0.3.1 | 2026-04-30T15:37:22.441Z | user\n\nFix YAML: remove angle brackets in obtained_via. Add openclaw.requires.scripts to declare uno-cli/bin/uno.py dependency.\n\nv0.3.0 | 2026-04-30T15:33:06.436Z | user\n\nFix credential path (~/.clawdchat -> ~/.uno). Clarify login flow: opening device URL automatically handles SSO redirect, no manual pre-login needed.\n\nv0.2.0 | 2026-04-30T13:28:21.771Z | user\n\nUse python ../uno-cli/bin/uno.py for all calls (avoid PATH conflict with LibreOffice's uno binary). Document that clawhub install does not auto-cascade dependencies.\n\nv0.1.0 | 2026-04-30T13:04:18.059Z | auto\n\ngpt-image2 v0.1.0 — Initial public release\n\n- Provides access to OpenAI's GPT Image 2 via ClawdChat tool gateway (requires uno-cli and ClawdChat credentials).\n- Supports high-quality AI image generation with reference image, style, and strict prompt/multi-element adherence.\n- Offers 20 built-in style presets (Ghibli, Pixar, LEGO, claymation, etc.) and accurate text rendering (posters, menus, infographics).\n- Paid usage: Each image generation submission deducts 300 ClawdChat credits; explicit user confirmation required before each spend.\n- Generates images asynchronously: submit job, then poll for results (supports batching and error surfacing).\n- No local Python code; leverages uno-cli for all credential and network operations.\n\nArchive index:\n\nArchive v0.5.0: 3 files, 5985 bytes\n\nFiles: _meta.json (129b), skill-card.md (2132b), SKILL.md (9844b)\n\nFile v0.5.0:SKILL.md\n\n---\nname: gpt-image2\ndescription: \"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.\"\nhomepage: https://clawdchat.cn\nmetadata:\n  emoji: \"🖼️\"\n  category: creative\n  version: \"0.1.0\"\n  language: en\n  publisher: clawdchat\n  requires:\n    primary_credential:\n      type: clawdchat_api_key\n      managed_by: uno-cli skill\n      stored_at: ~/.clawdchat/credentials.json\n      obtained_via: interactive `uno login` command (delegates to ClawdChat OAuth, see https://clawdchat.cn)\n      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.\"\n    config_paths:\n      - ~/.clawdchat/credentials.json (read-only, owned by uno-cli)\n    network_endpoints:\n      - \"ClawdChat tool gateway (HTTPS, via uno-cli) — receives the prompt and reference-image URLs\"\n    write_actions:\n      - \"Submits paid image-generation jobs (300 credits per submit). Each call deducts ClawdChat credits from the logged-in account.\"\n      - \"Writes no local files. Generated image URLs are returned in the response; the agent decides whether to download them.\"\n    cost:\n      gpt_image2_submit: \"300 credits per call\"\n      gpt_image2_result: \"0 credits per call\"\n  openclaw:\n    requires:\n      bins: [\"uno\"]\n    skills: [\"uno-cli\"]\n---\n\n# GPT Image 2 — High-quality AI image generation\n\n> Powered by ClawdChat — calls OpenAI `gpt-image-2` through the Uno tool gateway.\n\n## What this skill does\n\nTwo thin command-line invocations against the public ClawdChat tool gateway:\n\n| Tool slug | Purpose | Cost |\n|---|---|---|\n| `gpt-image-2.gpt_image2_submit` | Submit a generation job, returns `job_id` immediately (async) | **300 credits / call** |\n| `gpt-image-2.gpt_image2_result` | Poll job status / fetch image URL when ready | 0 credits |\n\nThis skill ships **no local Python code**. It defers all credential, transport and rate-limit handling to the `uno-cli` companion skill.\n\n## Credentials & permissions (please read before first use)\n\n- **Credential type**: ClawdChat API key (Bearer token).\n- **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.\n- **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.\n- **What it authorises**: calling the ClawdChat tool gateway as the logged-in user. Each `gpt_image2_submit` deducts 300 credits from that account.\n- **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.**\n- **Logging out / revoking**: run `uno logout` (managed by `uno-cli`).\n\n## Cost transparency & confirmation rule\n\nEvery `gpt_image2_submit` call costs the logged-in account real credits. The agent **must**:\n\n1. Show the user the planned prompt, size, style, and number of images **before** the first call.\n2. Ask for explicit confirmation when the user has not already approved a generation in the current turn.\n3. 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.\n4. On `error` responses, surface the error to the user instead of silently retrying.\n\nPolling via `gpt_image2_result` is free; only `submit` spends credits.\n\n## Setup\n\nThis skill depends on the `uno-cli` skill (declared in `metadata.openclaw.skills`).\n\n1. Install `uno-cli` (skipping if already installed):\n\n   ```bash\n   clawhub install uno-cli\n   ```\n\n   On platforms that honour `metadata.openclaw.skills`, this dependency is installed automatically when this skill is installed.\n\n2. Log in once:\n\n   ```bash\n   uno login\n   ```\n\n   The login flow, credential storage, and refresh are entirely handled by `uno-cli`. This skill only invokes `uno call ...` afterwards.\n\n> If `uno` is not on `PATH`, replace it in the examples below with `python /path/to/uno-cli/bin/uno.py`.\n\n## Generating an image — full async flow\n\nA single 1024×1024 image typically takes **~150 s**, longer than the default MCP 60 s timeout. Always use the **submit → poll-result** pattern.\n\n### Step 1 — submit\n\n```bash\nuno call gpt-image-2.gpt_image2_submit --compact \\\n  --args '{\"prompt\":\"A shiba inu under cherry blossoms, sunny afternoon\",\"size\":\"1024x1024\",\"style\":\"ghibli_anime\"}'\n```\n\nResponse (already flattened by `uno-cli` — no need to unwrap `content[0].text`):\n\n```json\n{\"success\": true, \"data\": {\"status\": \"pending\", \"job_id\": \"0b84b8f0f0c8\", \"estimated_seconds\": 150}, \"meta\": {\"latency_ms\": 120, \"credits_used\": 300}}\n```\n\nRecord `data.job_id`.\n\n### Step 2 — poll for result\n\n```bash\nuno call gpt-image-2.gpt_image2_result --compact --timeout 70 \\\n  --args '{\"job_id\":\"0b84b8f0f0c8\",\"wait_seconds\":50}'\n```\n\n`wait_seconds=50` makes the server-side wait 50 s (within the 60 s MCP envelope); `--timeout 70` adds a small client buffer.\n\nRepeat the call until `data.status` is one of:\n\n- `done` — image ready, URLs in `data.items[].url`.\n- `error` — generation failed, message in `data.error`.\n- `pending` / `running` — call again immediately. **Do not add a client-side sleep**; the server already waited 50 s on your behalf.\n\nThree to five iterations (~150–250 s total) is normal.\n\n### Reference shell loop\n\n```bash\nRESP=$(uno call gpt-image-2.gpt_image2_submit --compact \\\n  --args '{\"prompt\":\"Van Gogh starry night\",\"style\":\"oil_painting_vangogh\"}')\nJOB_ID=$(echo \"$RESP\" | python3 -c \"import json,sys; print(json.load(sys.stdin)['data']['job_id'])\")\n\nfor i in 1 2 3 4 5 6; do\n  R=$(uno call gpt-image-2.gpt_image2_result --compact --timeout 70 \\\n    --args \"{\\\"job_id\\\":\\\"$JOB_ID\\\",\\\"wait_seconds\\\":50}\")\n  STATUS=$(echo \"$R\" | python3 -c \"import json,sys; print(json.load(sys.stdin)['data']['status'])\")\n  [ \"$STATUS\" = \"done\" ]  && echo \"$R\" && break\n  [ \"$STATUS\" = \"error\" ] && echo \"$R\" && exit 1\ndone\n```\n\n## Parameters\n\n| Field | Meaning | Values |\n|---|---|---|\n| `prompt` | Image description (required, any language) | free text |\n| `size` | Image dimensions | `1024x1024` (default), `1024x1536` (portrait), `1536x1024` (landscape), `auto` |\n| `n` | Number of images to generate | 1–4 (default 1) |\n| `style` | Built-in style preset | one of the 20 keys below |\n| `reference_image_urls` | Reference images (image-to-image) | URL string, comma-separated for multiple |\n\n## 20 built-in style presets\n\n| key | description |\n|---|---|\n| `ghibli_anime` | Studio Ghibli / hand-drawn anime |\n| `pixar_3d` | Pixar / Disney 3D animation |\n| `claymation` | Stop-motion claymation (Laika / Aardman) |\n| `lego_brick` | LEGO bricks |\n| `popmart_figurine` | Blind-box / Pop Mart figurine |\n| `isometric_game` | Isometric 2.5D game scene |\n| `cinematic_photo` | Cinematic photorealism (35mm) |\n| `polaroid_film` | Polaroid film snapshot |\n| `watercolor_ink` | Watercolour / East-Asian ink wash |\n| `oil_painting_vangogh` | Van Gogh impasto oil painting |\n| `cyberpunk_neon` | Cyberpunk neon nightscape |\n| `vintage_infographic` | Retro infographic / data poster |\n| `movie_poster` | Movie poster (large title + still) |\n| `flat_vector` | Flat-vector illustration / banner |\n| `pixel_8bit` | Pixel art (8/16-bit) |\n| `papercraft_layered` | Layered papercraft |\n| `exploded_diagram` | Exploded technical diagram |\n| `dreamcore_liminal` | Dreamcore / liminal space |\n| `knolling_flatlay` | Top-down knolling / flat-lay |\n| `botanical_engraving` | Botanical engraving / antique illustration |\n\n## Where this model shines (vs Midjourney / Flux / SD)\n\n- **Accurate text rendering** — poster headlines, infographics, menu typography, meme captions: written into the image as specified.\n- **Strong prompt following** — multi-element scenes, ordering and spatial relationships obeyed.\n- **Subject preservation in image-to-image** — faces, brands, and characters stay consistent across reference images.\n- **Wide style coverage** — Ghibli, Pixar, claymation, LEGO, Pop Mart, botanical engraving etc. all handled.\n\n## Agent guidance\n\n- Tell the user up-front that one image takes ~150 s.\n- The `gpt_image2_result` tool already sleeps 50 s server-side — never add an extra client-side sleep between polls.\n- Use `--timeout 70` for `result` calls (50 s server wait + buffer).\n- Pass the user's prompt verbatim, including non-English text.\n- Reference images: combine `reference_image_urls` with a `style` preset for \"restyle while keeping the subject\".\n- Posters / infographics / menus: lean on the text-rendering strength.\n- If `submit` returns `success=false`, surface the `error`/`hint` fields to the user.\n- 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`.\n\n## Response shape\n\nAlready flattened by `uno-cli`:\n\n```json\n{\n  \"success\": true,\n  \"data\": {\"status\": \"...\", \"job_id\": \"...\", \"items\": [{\"url\": \"...\"}]},\n  \"meta\": {\"latency_ms\": 120, \"credits_used\": 300}\n}\n```\n\nRead `data.status`, `data.job_id`, `data.items[].url` directly.\n\nErrors:\n\n```json\n{\"success\": false, \"error\": \"...\", \"hint\": \"...\"}\n```\n\nFile v0.5.0:_meta.json\n\n{\n  \"ownerId\": \"kn77e6kfs6str7h1kk3zmxkmmd80b4bb\",\n  \"slug\": \"gpt-image2\",\n  \"version\": \"0.5.0\",\n  \"publishedAt\": 1777645944929\n}\n\nFile v0.5.0:skill-card.md\n\n## Description:\n\nGenerate images with OpenAI gpt-image-2 through the ClawdChat gateway, including text-heavy designs, multi-element prompts, image-to-image workflows, and preset visual styles.\n\nThis skill is ready for commercial/non-commercial use.\n\n## Publisher:\n\n[lxyd-ai](https://clawhub.ai/user/lxyd-ai)\n\n### License/Terms of Use:\n\nMIT-0\n\n## Use Case:\n\nExternal users and developers use this skill to ask an agent to submit and poll paid image-generation jobs through ClawdChat, then return generated image URLs and status details.\n\n### Deployment Geography for Use:\n\nGlobal\n\n## Known Risks and Mitigations:\n\nRisk: Image-generation submissions spend 300 ClawdChat credits per call.\n\nMitigation: Confirm the prompt, size, style, image count, and expected credit cost before each paid submit call.\n\nRisk: Prompts and reference-image URLs are sent to the external ClawdChat gateway.\n\nMitigation: Do not submit confidential prompts, personal data, or sensitive signed reference-image URLs unless the user accepts that external processing.\n\nRisk: The uno-cli dependency is part of the trust boundary and is not pinned to an exact package version in the release evidence.\n\nMitigation: Review and approve the installed uno-cli version before using the skill in controlled environments.\n\n## Reference(s):\n\n- [Gpt Image2 Skill Page](https://clawhub.ai/lxyd-ai/skills/gpt-image2)\n- [ClawdChat](https://clawdchat.cn)\n\n## Skill Output:\n\n**Output Type(s):** [Text, Markdown, Shell commands, Configuration, Guidance]\n\n**Output Format:** [Markdown guidance with inline shell commands and JSON response examples]\n\n**Output Parameters:** [1D]\n\n**Other Properties Related to Output:** [Returns job status, job IDs, generated image URLs, errors, and cost metadata from the gateway.]\n\n## Skill Version(s):\n\n0.5.0 (source: server release metadata; artifact frontmatter lists 0.1.0)\n\n## Ethical Considerations:\n\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment.\n\nArchive v0.4.3: 3 files, 13729 bytes\n\nFiles: bin/uno.py (28634b), SKILL.md (11870b), _meta.json (129b)\n\nFile v0.4.3:SKILL.md\n\n---\nname: gpt-image2\ndescription: \"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.\"\nhomepage: https://clawdchat.cn\nmetadata:\n  emoji: \"🖼️\"\n  category: creative\n  version: \"0.4.3\"\n  language: en\n  publisher: clawdchat\n  requires:\n    primary_credential:\n      type: clawdchat_api_key\n      managed_by: bundled bin/uno.py\n      stored_at: ~/.uno/credentials.json\n      obtained_via: \"Running `python bin/uno.py login --start` to receive a device code, opening the printed URL in a browser (ClawdChat SSO login is handled automatically if not yet signed in, then an Authorise button is shown), then running `python bin/uno.py login --poll DEVICE_CODE` to complete. The resulting API key is written to disk.\"\n      scope: \"OAuth scope mcp:gpt-image-2 — scoped to gpt-image-2 tool calls only. Credential storage and refresh are handled by the bundled bin/uno.py; this skill never reads, prints, or transmits the credentials file directly.\"\n    config_paths:\n      - ~/.uno/credentials.json (read-only, managed by bin/uno.py)\n    network_endpoints:\n      - \"ClawdChat tool gateway (HTTPS) — receives the prompt and reference-image URLs\"\n    write_actions:\n      - \"Submits paid image-generation jobs (300 credits per submit). Each call deducts ClawdChat credits from the logged-in account.\"\n      - \"Writes no local files. Generated image URLs are returned in the response; the agent decides whether to download them.\"\n    cost:\n      gpt_image2_submit: \"300 credits per call\"\n      gpt_image2_result: \"0 credits per call\"\n    login_output_note: \"The device-code login flow (bin/uno.py login --poll) returns the new API key once in its JSON response as part of standard OAuth confirmation. This output should be treated as a secret. The key is then persisted by bin/uno.py to ~/.uno/credentials.json (mode 600) and not printed again.\"\n    revocation: \"Run `python bin/uno.py logout` at any time to delete ~/.uno/credentials.json and revoke the local session.\"\n  openclaw:\n    requires:\n      scripts: [\"bin/uno.py\"]\n---\n\n# GPT Image 2 — High-quality AI image generation\n\n> Powered by ClawdChat — calls OpenAI `gpt-image-2` through the Uno tool gateway.\n\n## What this skill does\n\nTwo command-line invocations against the public ClawdChat tool gateway:\n\n| Tool slug | Purpose | Cost |\n|---|---|---|\n| `gpt-image-2.gpt_image2_submit` | Submit a generation job, returns `job_id` immediately (async) | **300 credits / call** |\n| `gpt-image-2.gpt_image2_result` | Poll job status / fetch image URL when ready | 0 credits |\n\nThe bundled `bin/uno.py` handles authentication, HTTP transport, and rate-limiting. No external skill dependency required — install this skill and you're ready.\n\n## Credentials & permissions (read before first use)\n\n- **Credential type**: ClawdChat API key (Bearer token).\n- **Where it lives**: `~/.uno/credentials.json`. Managed entirely by the bundled `bin/uno.py`; this skill never opens, prints or copies it.\n- **How it was obtained**: run `python bin/uno.py login` (see Setup below). The bundled script drives a ClawdChat OAuth device-code flow and stores the resulting token.\n- **What it authorises**: calling the ClawdChat tool gateway as the logged-in user. Each `gpt_image2_submit` deducts 300 credits from that account.\n- **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.**\n- **What the credential authorises**: OAuth scope `mcp:gpt-image-2` — scoped specifically to gpt-image-2 tool calls. Only `gpt-image-2.gpt_image2_submit` and `gpt-image-2.gpt_image2_result` are invoked; no other gateway tools are called.\n- **Login output**: the `login --poll` step returns the new API key once in its JSON response (standard device-code OAuth confirmation). **Treat that terminal output as a secret** — do not log or share it. `bin/uno.py` immediately persists the key to `~/.uno/credentials.json` and does not print it again.\n- **Logging out / revoking**: run `python bin/uno.py logout` to delete `~/.uno/credentials.json` and end the local session.\n\n## Cost transparency & confirmation rule\n\nEvery `gpt_image2_submit` call costs the logged-in account real credits. The agent **must**:\n\n1. Show the user the planned prompt, size, style, and number of images **before** the first call.\n2. Ask for explicit confirmation when the user has not already approved a generation in the current turn.\n3. 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.\n4. On `error` responses, surface the error to the user instead of silently retrying.\n\nPolling via `gpt_image2_result` is free; only `submit` spends credits.\n\n## Setup\n\nNo external skill dependency. After `clawhub install gpt-image2` the layout is:\n\n```text\ngpt-image2/\n├── SKILL.md\n└── bin/\n    └── uno.py    # bundled CLI — no extra install needed\n```\n\nAll commands below run from inside the `gpt-image2/` folder.\n\n### Check if already logged in\n\n```bash\npython bin/uno.py whoami --compact\n```\n\n- Returns user info (name, email, credits) → credentials valid, **skip login**.\n- Returns `{\"error\": \"Not logged in\"}` → proceed to login below.\n\n### Log in\n\n```bash\npython bin/uno.py login --start\n```\n\nThis prints a device code and a URL like `https://clawdtools.uno/device?code=XXXX`.\n\nOpen that URL in a browser. If not yet signed in to clawdtools.uno, the page redirects to ClawdChat SSO automatically and returns to the Authorise screen. Click \"Authorise\".\n\nThen poll for completion:\n\n```bash\npython bin/uno.py login --poll DEVICE_CODE\n```\n\nOr run `python bin/uno.py login` (blocking, polls automatically).\n\nCredential file (`~/.uno/credentials.json`) is written by `bin/uno.py` and reused on subsequent runs.\n\n## Generating an image — full async flow\n\nA single 1024×1024 image typically takes **~150 s**, longer than the default MCP 60 s timeout. Always use the **submit → poll-result** pattern.\n\n### Step 1 — submit\n\n```bash\npython bin/uno.py call gpt-image-2.gpt_image2_submit --compact \\\n  --args '{\"prompt\":\"A shiba inu under cherry blossoms, sunny afternoon\",\"size\":\"1024x1024\",\"style\":\"ghibli_anime\"}'\n```\n\nResponse (already flattened — no need to unwrap `content[0].text`):\n\n```json\n{\"success\": true, \"data\": {\"status\": \"pending\", \"job_id\": \"0b84b8f0f0c8\", \"estimated_seconds\": 150}, \"meta\": {\"latency_ms\": 120, \"credits_used\": 300}}\n```\n\nRecord `data.job_id`.\n\n### Step 2 — poll for result\n\n```bash\npython bin/uno.py call gpt-image-2.gpt_image2_result --compact --timeout 70 \\\n  --args '{\"job_id\":\"0b84b8f0f0c8\",\"wait_seconds\":50}'\n```\n\n`wait_seconds=50` makes the server-side wait 50 s (within the 60 s MCP envelope); `--timeout 70` adds a small client buffer.\n\nRepeat the call until `data.status` is one of:\n\n- `done` — image ready, URLs in `data.items[].url`.\n- `error` — generation failed, message in `data.error`.\n- `pending` / `running` — call again immediately. **Do not add a client-side sleep**; the server already waited 50 s on your behalf.\n\nThree to five iterations (~150–250 s total) is normal.\n\n### Reference Python loop\n\nUse `subprocess.run` with an argument list to safely pass arbitrary prompt text without shell-injection risk:\n\n```python\nimport json, subprocess, sys\n\nUNO = \"bin/uno.py\"\n\ndef uno(args):\n    r = subprocess.run([\"python\", UNO] + args, capture_output=True, text=True)\n    return json.loads(r.stdout)\n\nprompt = \"Van Gogh starry night\"\nresp = uno([\"call\", \"gpt-image-2.gpt_image2_submit\", \"--compact\",\n            \"--args\", json.dumps({\"prompt\": prompt, \"style\": \"oil_painting_vangogh\"})])\njob_id = resp[\"data\"][\"job_id\"]\n\nfor _ in range(6):\n    r = uno([\"call\", \"gpt-image-2.gpt_image2_result\", \"--compact\", \"--timeout\", \"70\",\n             \"--args\", json.dumps({\"job_id\": job_id, \"wait_seconds\": 50})])\n    status = r[\"data\"][\"status\"]\n    if status == \"done\":\n        print(json.dumps(r, ensure_ascii=False, indent=2))\n        break\n    if status == \"error\":\n        print(\"Error:\", r[\"data\"].get(\"error\"), file=sys.stderr)\n        sys.exit(1)\n```\n\n## Parameters\n\n| Field | Meaning | Values |\n|---|---|---|\n| `prompt` | Image description (required, any language) | free text |\n| `size` | Image dimensions | `1024x1024` (default), `1024x1536` (portrait), `1536x1024` (landscape), `auto` |\n| `n` | Number of images to generate | 1–4 (default 1) |\n| `style` | Built-in style preset | one of the 20 keys below |\n| `reference_image_urls` | Reference images (image-to-image) | URL string, comma-separated for multiple |\n\n## 20 built-in style presets\n\n| key | description |\n|---|---|\n| `ghibli_anime` | Studio Ghibli / hand-drawn anime |\n| `pixar_3d` | Pixar / Disney 3D animation |\n| `claymation` | Stop-motion claymation (Laika / Aardman) |\n| `lego_brick` | LEGO bricks |\n| `popmart_figurine` | Blind-box / Pop Mart figurine |\n| `isometric_game` | Isometric 2.5D game scene |\n| `cinematic_photo` | Cinematic photorealism (35mm) |\n| `polaroid_film` | Polaroid film snapshot |\n| `watercolor_ink` | Watercolour / East-Asian ink wash |\n| `oil_painting_vangogh` | Van Gogh impasto oil painting |\n| `cyberpunk_neon` | Cyberpunk neon nightscape |\n| `vintage_infographic` | Retro infographic / data poster |\n| `movie_poster` | Movie poster (large title + still) |\n| `flat_vector` | Flat-vector illustration / banner |\n| `pixel_8bit` | Pixel art (8/16-bit) |\n| `papercraft_layered` | Layered papercraft |\n| `exploded_diagram` | Exploded technical diagram |\n| `dreamcore_liminal` | Dreamcore / liminal space |\n| `knolling_flatlay` | Top-down knolling / flat-lay |\n| `botanical_engraving` | Botanical engraving / antique illustration |\n\n## Where this model shines (vs Midjourney / Flux / SD)\n\n- **Accurate text rendering** — poster headlines, infographics, menu typography, meme captions: written into the image as specified.\n- **Strong prompt following** — multi-element scenes, ordering and spatial relationships obeyed.\n- **Subject preservation in image-to-image** — faces, brands, and characters stay consistent across reference images.\n- **Wide style coverage** — Ghibli, Pixar, claymation, LEGO, Pop Mart, botanical engraving etc. all handled.\n\n## Agent guidance\n\n- Tell the user up-front that one image takes ~150 s.\n- The `gpt_image2_result` tool already sleeps 50 s server-side — never add an extra client-side sleep between polls.\n- Use `--timeout 70` for `result` calls (50 s server wait + buffer).\n- Pass the user's prompt verbatim, including non-English text.\n- Reference images: combine `reference_image_urls` with a `style` preset for \"restyle while keeping the subject\".\n- Posters / infographics / menus: lean on the text-rendering strength.\n- If `submit` returns `success=false`, surface the `error`/`hint` fields to the user.\n- 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`.\n\n## Response shape\n\n```json\n{\n  \"success\": true,\n  \"data\": {\"status\": \"...\", \"job_id\": \"...\", \"items\": [{\"url\": \"...\"}]},\n  \"meta\": {\"latency_ms\": 120, \"credits_used\": 300}\n}\n```\n\nRead `data.status`, `data.job_id`, `data.items[].url` directly.\n\nErrors:\n\n```json\n{\"success\": false, \"error\": \"...\", \"hint\": \"...\"}\n```\n\nFile v0.4.3:_meta.json\n\n{\n  \"ownerId\": \"kn77e6kfs6str7h1kk3zmxkmmd80b4bb\",\n  \"slug\": \"gpt-image2\",\n  \"version\": \"0.4.3\",\n  \"publishedAt\": 1777638758534\n}\n\nArchive v0.4.2: 3 files, 13704 bytes\n\nFiles: bin/uno.py (28624b), SKILL.md (11859b), _meta.json (129b)\n\nFile v0.4.2:SKILL.md\n\n---\nname: gpt-image2\ndescription: \"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.\"\nhomepage: https://clawdchat.cn\nmetadata:\n  emoji: \"🖼️\"\n  category: creative\n  version: \"0.4.2\"\n  language: en\n  publisher: clawdchat\n  requires:\n    primary_credential:\n      type: clawdchat_api_key\n      managed_by: bundled bin/uno.py\n      stored_at: ~/.uno/credentials.json\n      obtained_via: \"Running `python bin/uno.py login --start` to receive a device code, opening the printed URL in a browser (ClawdChat SSO login is handled automatically if not yet signed in, then an Authorise button is shown), then running `python bin/uno.py login --poll DEVICE_CODE` to complete. The resulting API key is written to disk.\"\n      scope: \"Used as the Authorization Bearer token to call the ClawdChat tool gateway. Credential storage and refresh are handled by the bundled bin/uno.py; this skill never reads, prints, or transmits the credentials file directly.\"\n    config_paths:\n      - ~/.uno/credentials.json (read-only, managed by bin/uno.py)\n    network_endpoints:\n      - \"ClawdChat tool gateway (HTTPS) — receives the prompt and reference-image URLs\"\n    write_actions:\n      - \"Submits paid image-generation jobs (300 credits per submit). Each call deducts ClawdChat credits from the logged-in account.\"\n      - \"Writes no local files. Generated image URLs are returned in the response; the agent decides whether to download them.\"\n    cost:\n      gpt_image2_submit: \"300 credits per call\"\n      gpt_image2_result: \"0 credits per call\"\n    login_output_note: \"The device-code login flow (bin/uno.py login --poll) returns the new API key once in its JSON response as part of standard OAuth confirmation. This output should be treated as a secret. The key is then persisted by bin/uno.py to ~/.uno/credentials.json (mode 600) and not printed again.\"\n    revocation: \"Run `python bin/uno.py logout` at any time to delete ~/.uno/credentials.json and revoke the local session.\"\n  openclaw:\n    requires:\n      scripts: [\"bin/uno.py\"]\n---\n\n# GPT Image 2 — High-quality AI image generation\n\n> Powered by ClawdChat — calls OpenAI `gpt-image-2` through the Uno tool gateway.\n\n## What this skill does\n\nTwo command-line invocations against the public ClawdChat tool gateway:\n\n| Tool slug | Purpose | Cost |\n|---|---|---|\n| `gpt-image-2.gpt_image2_submit` | Submit a generation job, returns `job_id` immediately (async) | **300 credits / call** |\n| `gpt-image-2.gpt_image2_result` | Poll job status / fetch image URL when ready | 0 credits |\n\nThe bundled `bin/uno.py` handles authentication, HTTP transport, and rate-limiting. No external skill dependency required — install this skill and you're ready.\n\n## Credentials & permissions (read before first use)\n\n- **Credential type**: ClawdChat API key (Bearer token).\n- **Where it lives**: `~/.uno/credentials.json`. Managed entirely by the bundled `bin/uno.py`; this skill never opens, prints or copies it.\n- **How it was obtained**: run `python bin/uno.py login` (see Setup below). The bundled script drives a ClawdChat OAuth device-code flow and stores the resulting token.\n- **What it authorises**: calling the ClawdChat tool gateway as the logged-in user. Each `gpt_image2_submit` deducts 300 credits from that account.\n- **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.**\n- **What the credential authorises**: calling ClawdChat tool gateway APIs as the logged-in user. This skill only invokes `gpt-image-2.gpt_image2_submit` and `gpt-image-2.gpt_image2_result`; no other gateway tools are called.\n- **Login output**: the `login --poll` step returns the new API key once in its JSON response (standard device-code OAuth confirmation). **Treat that terminal output as a secret** — do not log or share it. `bin/uno.py` immediately persists the key to `~/.uno/credentials.json` and does not print it again.\n- **Logging out / revoking**: run `python bin/uno.py logout` to delete `~/.uno/credentials.json` and end the local session.\n\n## Cost transparency & confirmation rule\n\nEvery `gpt_image2_submit` call costs the logged-in account real credits. The agent **must**:\n\n1. Show the user the planned prompt, size, style, and number of images **before** the first call.\n2. Ask for explicit confirmation when the user has not already approved a generation in the current turn.\n3. 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.\n4. On `error` responses, surface the error to the user instead of silently retrying.\n\nPolling via `gpt_image2_result` is free; only `submit` spends credits.\n\n## Setup\n\nNo external skill dependency. After `clawhub install gpt-image2` the layout is:\n\n```text\ngpt-image2/\n├── SKILL.md\n└── bin/\n    └── uno.py    # bundled CLI — no extra install needed\n```\n\nAll commands below run from inside the `gpt-image2/` folder.\n\n### Check if already logged in\n\n```bash\npython bin/uno.py whoami --compact\n```\n\n- Returns user info (name, email, credits) → credentials valid, **skip login**.\n- Returns `{\"error\": \"Not logged in\"}` → proceed to login below.\n\n### Log in\n\n```bash\npython bin/uno.py login --start\n```\n\nThis prints a device code and a URL like `https://clawdtools.uno/device?code=XXXX`.\n\nOpen that URL in a browser. If not yet signed in to clawdtools.uno, the page redirects to ClawdChat SSO automatically and returns to the Authorise screen. Click \"Authorise\".\n\nThen poll for completion:\n\n```bash\npython bin/uno.py login --poll DEVICE_CODE\n```\n\nOr run `python bin/uno.py login` (blocking, polls automatically).\n\nCredential file (`~/.uno/credentials.json`) is written by `bin/uno.py` and reused on subsequent runs.\n\n## Generating an image — full async flow\n\nA single 1024×1024 image typically takes **~150 s**, longer than the default MCP 60 s timeout. Always use the **submit → poll-result** pattern.\n\n### Step 1 — submit\n\n```bash\npython bin/uno.py call gpt-image-2.gpt_image2_submit --compact \\\n  --args '{\"prompt\":\"A shiba inu under cherry blossoms, sunny afternoon\",\"size\":\"1024x1024\",\"style\":\"ghibli_anime\"}'\n```\n\nResponse (already flattened — no need to unwrap `content[0].text`):\n\n```json\n{\"success\": true, \"data\": {\"status\": \"pending\", \"job_id\": \"0b84b8f0f0c8\", \"estimated_seconds\": 150}, \"meta\": {\"latency_ms\": 120, \"credits_used\": 300}}\n```\n\nRecord `data.job_id`.\n\n### Step 2 — poll for result\n\n```bash\npython bin/uno.py call gpt-image-2.gpt_image2_result --compact --timeout 70 \\\n  --args '{\"job_id\":\"0b84b8f0f0c8\",\"wait_seconds\":50}'\n```\n\n`wait_seconds=50` makes the server-side wait 50 s (within the 60 s MCP envelope); `--timeout 70` adds a small client buffer.\n\nRepeat the call until `data.status` is one of:\n\n- `done` — image ready, URLs in `data.items[].url`.\n- `error` — generation failed, message in `data.error`.\n- `pending` / `running` — call again immediately. **Do not add a client-side sleep**; the server already waited 50 s on your behalf.\n\nThree to five iterations (~150–250 s total) is normal.\n\n### Reference Python loop\n\nUse `subprocess.run` with an argument list to safely pass arbitrary prompt text without shell-injection risk:\n\n```python\nimport json, subprocess, sys\n\nUNO = \"bin/uno.py\"\n\ndef uno(args):\n    r = subprocess.run([\"python\", UNO] + args, capture_output=True, text=True)\n    return json.loads(r.stdout)\n\nprompt = \"Van Gogh starry night\"\nresp = uno([\"call\", \"gpt-image-2.gpt_image2_submit\", \"--compact\",\n            \"--args\", json.dumps({\"prompt\": prompt, \"style\": \"oil_painting_vangogh\"})])\njob_id = resp[\"data\"][\"job_id\"]\n\nfor _ in range(6):\n    r = uno([\"call\", \"gpt-image-2.gpt_image2_result\", \"--compact\", \"--timeout\", \"70\",\n             \"--args\", json.dumps({\"job_id\": job_id, \"wait_seconds\": 50})])\n    status = r[\"data\"][\"status\"]\n    if status == \"done\":\n        print(json.dumps(r, ensure_ascii=False, indent=2))\n        break\n    if status == \"error\":\n        print(\"Error:\", r[\"data\"].get(\"error\"), file=sys.stderr)\n        sys.exit(1)\n```\n\n## Parameters\n\n| Field | Meaning | Values |\n|---|---|---|\n| `prompt` | Image description (required, any language) | free text |\n| `size` | Image dimensions | `1024x1024` (default), `1024x1536` (portrait), `1536x1024` (landscape), `auto` |\n| `n` | Number of images to generate | 1–4 (default 1) |\n| `style` | Built-in style preset | one of the 20 keys below |\n| `reference_image_urls` | Reference images (image-to-image) | URL string, comma-separated for multiple |\n\n## 20 built-in style presets\n\n| key | description |\n|---|---|\n| `ghibli_anime` | Studio Ghibli / hand-drawn anime |\n| `pixar_3d` | Pixar / Disney 3D animation |\n| `claymation` | Stop-motion claymation (Laika / Aardman) |\n| `lego_brick` | LEGO bricks |\n| `popmart_figurine` | Blind-box / Pop Mart figurine |\n| `isometric_game` | Isometric 2.5D game scene |\n| `cinematic_photo` | Cinematic photorealism (35mm) |\n| `polaroid_film` | Polaroid film snapshot |\n| `watercolor_ink` | Watercolour / East-Asian ink wash |\n| `oil_painting_vangogh` | Van Gogh impasto oil painting |\n| `cyberpunk_neon` | Cyberpunk neon nightscape |\n| `vintage_infographic` | Retro infographic / data poster |\n| `movie_poster` | Movie poster (large title + still) |\n| `flat_vector` | Flat-vector illustration / banner |\n| `pixel_8bit` | Pixel art (8/16-bit) |\n| `papercraft_layered` | Layered papercraft |\n| `exploded_diagram` | Exploded technical diagram |\n| `dreamcore_liminal` | Dreamcore / liminal space |\n| `knolling_flatlay` | Top-down knolling / flat-lay |\n| `botanical_engraving` | Botanical engraving / antique illustration |\n\n## Where this model shines (vs Midjourney / Flux / SD)\n\n- **Accurate text rendering** — poster headlines, infographics, menu typography, meme captions: written into the image as specified.\n- **Strong prompt following** — multi-element scenes, ordering and spatial relationships obeyed.\n- **Subject preservation in image-to-image** — faces, brands, and characters stay consistent across reference images.\n- **Wide style coverage** — Ghibli, Pixar, claymation, LEGO, Pop Mart, botanical engraving etc. all handled.\n\n## Agent guidance\n\n- Tell the user up-front that one image takes ~150 s.\n- The `gpt_image2_result` tool already sleeps 50 s server-side — never add an extra client-side sleep between polls.\n- Use `--timeout 70` for `result` calls (50 s server wait + buffer).\n- Pass the user's prompt verbatim, including non-English text.\n- Reference images: combine `reference_image_urls` with a `style` preset for \"restyle while keeping the subject\".\n- Posters / infographics / menus: lean on the text-rendering strength.\n- If `submit` returns `success=false`, surface the `error`/`hint` fields to the user.\n- 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`.\n\n## Response shape\n\n```json\n{\n  \"success\": true,\n  \"data\": {\"status\": \"...\", \"job_id\": \"...\", \"items\": [{\"url\": \"...\"}]},\n  \"meta\": {\"latency_ms\": 120, \"credits_used\": 300}\n}\n```\n\nRead `data.status`, `data.job_id`, `data.items[].url` directly.\n\nErrors:\n\n```json\n{\"success\": false, \"error\": \"...\", \"hint\": \"...\"}\n```\n\nFile v0.4.2:_meta.json\n\n{\n  \"ownerId\": \"kn77e6kfs6str7h1kk3zmxkmmd80b4bb\",\n  \"slug\": \"gpt-image2\",\n  \"version\": \"0.4.2\",\n  \"publishedAt\": 1777638464605\n}\n\nArchive v0.4.1: 3 files, 13832 bytes\n\nFiles: bin/uno.py (28624b), SKILL.md (12032b), _meta.json (129b)\n\nFile v0.4.1:SKILL.md\n\n---\nname: gpt-image2\ndescription: \"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.\"\nhomepage: https://clawdchat.cn\nmetadata:\n  emoji: \"🖼️\"\n  category: creative\n  version: \"0.4.1\"\n  language: en\n  publisher: clawdchat\n  requires:\n    primary_credential:\n      type: clawdchat_api_key\n      managed_by: bundled bin/uno.py\n      stored_at: ~/.uno/credentials.json\n      obtained_via: \"Running `python bin/uno.py login --start` to receive a device code, opening the printed URL in a browser (ClawdChat SSO login is handled automatically if not yet signed in, then an Authorise button is shown), then running `python bin/uno.py login --poll DEVICE_CODE` to complete. The resulting API key is written to disk.\"\n      scope: \"Used as the Authorization Bearer token to call the ClawdChat tool gateway. Credential storage and refresh are handled by the bundled bin/uno.py; this skill never reads, prints, or transmits the credentials file directly.\"\n    config_paths:\n      - ~/.uno/credentials.json (read-only, managed by bin/uno.py)\n    network_endpoints:\n      - \"ClawdChat tool gateway (HTTPS) — receives the prompt and reference-image URLs\"\n    write_actions:\n      - \"Submits paid image-generation jobs (300 credits per submit). Each call deducts ClawdChat credits from the logged-in account.\"\n      - \"Writes no local files. Generated image URLs are returned in the response; the agent decides whether to download them.\"\n    cost:\n      gpt_image2_submit: \"300 credits per call\"\n      gpt_image2_result: \"0 credits per call\"\n    token_scope:\n      granted: \"mcp:* (ClawdChat standard gateway scope — all tool calls share this single token)\"\n      used_by_this_skill: \"gpt-image-2.gpt_image2_submit and gpt_image2_result only\"\n      note: \"The login flow returns the API key in its JSON response. This is standard device-code OAuth output and should be treated as a secret — do not log or share command output from the login step.\"\n    revocation: \"Run `python bin/uno.py logout` at any time to delete ~/.uno/credentials.json and revoke local access.\"\n  openclaw:\n    requires:\n      scripts: [\"bin/uno.py\"]\n---\n\n# GPT Image 2 — High-quality AI image generation\n\n> Powered by ClawdChat — calls OpenAI `gpt-image-2` through the Uno tool gateway.\n\n## What this skill does\n\nTwo command-line invocations against the public ClawdChat tool gateway:\n\n| Tool slug | Purpose | Cost |\n|---|---|---|\n| `gpt-image-2.gpt_image2_submit` | Submit a generation job, returns `job_id` immediately (async) | **300 credits / call** |\n| `gpt-image-2.gpt_image2_result` | Poll job status / fetch image URL when ready | 0 credits |\n\nThe bundled `bin/uno.py` handles authentication, HTTP transport, and rate-limiting. No external skill dependency required — install this skill and you're ready.\n\n## Credentials & permissions (read before first use)\n\n- **Credential type**: ClawdChat API key (Bearer token).\n- **Where it lives**: `~/.uno/credentials.json`. Managed entirely by the bundled `bin/uno.py`; this skill never opens, prints or copies it.\n- **How it was obtained**: run `python bin/uno.py login` (see Setup below). The bundled script drives a ClawdChat OAuth device-code flow and stores the resulting token.\n- **What it authorises**: calling the ClawdChat tool gateway as the logged-in user. Each `gpt_image2_submit` deducts 300 credits from that account.\n- **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.**\n- **Token scope**: ClawdChat issues a standard gateway token with `mcp:*` scope (all tool calls share one key). This skill only invokes `gpt-image-2.*` tools, but the token technically permits calling any gateway tool the account has access to. If this scope is too broad for your environment, revoke the key after use.\n- **Login output contains the API key**: the `login --poll` step returns the token in its JSON response. **Treat that output as a secret** — do not log, copy to clipboard history, or share it. The token is then stored securely by `bin/uno.py` in `~/.uno/credentials.json` (mode 600).\n- **Logging out / revoking**: run `python bin/uno.py logout` to delete `~/.uno/credentials.json` and invalidate the local session.\n\n## Cost transparency & confirmation rule\n\nEvery `gpt_image2_submit` call costs the logged-in account real credits. The agent **must**:\n\n1. Show the user the planned prompt, size, style, and number of images **before** the first call.\n2. Ask for explicit confirmation when the user has not already approved a generation in the current turn.\n3. 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.\n4. On `error` responses, surface the error to the user instead of silently retrying.\n\nPolling via `gpt_image2_result` is free; only `submit` spends credits.\n\n## Setup\n\nNo external skill dependency. After `clawhub install gpt-image2` the layout is:\n\n```text\ngpt-image2/\n├── SKILL.md\n└── bin/\n    └── uno.py    # bundled CLI — no extra install needed\n```\n\nAll commands below run from inside the `gpt-image2/` folder.\n\n### Check if already logged in\n\n```bash\npython bin/uno.py whoami --compact\n```\n\n- Returns user info (name, email, credits) → credentials valid, **skip login**.\n- Returns `{\"error\": \"Not logged in\"}` → proceed to login below.\n\n### Log in\n\n```bash\npython bin/uno.py login --start\n```\n\nThis prints a device code and a URL like `https://clawdtools.uno/device?code=XXXX`.\n\nOpen that URL in a browser. If not yet signed in to clawdtools.uno, the page redirects to ClawdChat SSO automatically and returns to the Authorise screen. Click \"Authorise\".\n\nThen poll for completion:\n\n```bash\npython bin/uno.py login --poll DEVICE_CODE\n```\n\nOr run `python bin/uno.py login` (blocking, polls automatically).\n\nCredential file (`~/.uno/credentials.json`) is written by `bin/uno.py` and reused on subsequent runs.\n\n## Generating an image — full async flow\n\nA single 1024×1024 image typically takes **~150 s**, longer than the default MCP 60 s timeout. Always use the **submit → poll-result** pattern.\n\n### Step 1 — submit\n\n```bash\npython bin/uno.py call gpt-image-2.gpt_image2_submit --compact \\\n  --args '{\"prompt\":\"A shiba inu under cherry blossoms, sunny afternoon\",\"size\":\"1024x1024\",\"style\":\"ghibli_anime\"}'\n```\n\nResponse (already flattened — no need to unwrap `content[0].text`):\n\n```json\n{\"success\": true, \"data\": {\"status\": \"pending\", \"job_id\": \"0b84b8f0f0c8\", \"estimated_seconds\": 150}, \"meta\": {\"latency_ms\": 120, \"credits_used\": 300}}\n```\n\nRecord `data.job_id`.\n\n### Step 2 — poll for result\n\n```bash\npython bin/uno.py call gpt-image-2.gpt_image2_result --compact --timeout 70 \\\n  --args '{\"job_id\":\"0b84b8f0f0c8\",\"wait_seconds\":50}'\n```\n\n`wait_seconds=50` makes the server-side wait 50 s (within the 60 s MCP envelope); `--timeout 70` adds a small client buffer.\n\nRepeat the call until `data.status` is one of:\n\n- `done` — image ready, URLs in `data.items[].url`.\n- `error` — generation failed, message in `data.error`.\n- `pending` / `running` — call again immediately. **Do not add a client-side sleep**; the server already waited 50 s on your behalf.\n\nThree to five iterations (~150–250 s total) is normal.\n\n### Reference Python loop\n\nUse `subprocess.run` with an argument list to safely pass arbitrary prompt text without shell-injection risk:\n\n```python\nimport json, subprocess, sys\n\nUNO = \"bin/uno.py\"\n\ndef uno(args):\n    r = subprocess.run([\"python\", UNO] + args, capture_output=True, text=True)\n    return json.loads(r.stdout)\n\nprompt = \"Van Gogh starry night\"\nresp = uno([\"call\", \"gpt-image-2.gpt_image2_submit\", \"--compact\",\n            \"--args\", json.dumps({\"prompt\": prompt, \"style\": \"oil_painting_vangogh\"})])\njob_id = resp[\"data\"][\"job_id\"]\n\nfor _ in range(6):\n    r = uno([\"call\", \"gpt-image-2.gpt_image2_result\", \"--compact\", \"--timeout\", \"70\",\n             \"--args\", json.dumps({\"job_id\": job_id, \"wait_seconds\": 50})])\n    status = r[\"data\"][\"status\"]\n    if status == \"done\":\n        print(json.dumps(r, ensure_ascii=False, indent=2))\n        break\n    if status == \"error\":\n        print(\"Error:\", r[\"data\"].get(\"error\"), file=sys.stderr)\n        sys.exit(1)\n```\n\n## Parameters\n\n| Field | Meaning | Values |\n|---|---|---|\n| `prompt` | Image description (required, any language) | free text |\n| `size` | Image dimensions | `1024x1024` (default), `1024x1536` (portrait), `1536x1024` (landscape), `auto` |\n| `n` | Number of images to generate | 1–4 (default 1) |\n| `style` | Built-in style preset | one of the 20 keys below |\n| `reference_image_urls` | Reference images (image-to-image) | URL string, comma-separated for multiple |\n\n## 20 built-in style presets\n\n| key | description |\n|---|---|\n| `ghibli_anime` | Studio Ghibli / hand-drawn anime |\n| `pixar_3d` | Pixar / Disney 3D animation |\n| `claymation` | Stop-motion claymation (Laika / Aardman) |\n| `lego_brick` | LEGO bricks |\n| `popmart_figurine` | Blind-box / Pop Mart figurine |\n| `isometric_game` | Isometric 2.5D game scene |\n| `cinematic_photo` | Cinematic photorealism (35mm) |\n| `polaroid_film` | Polaroid film snapshot |\n| `watercolor_ink` | Watercolour / East-Asian ink wash |\n| `oil_painting_vangogh` | Van Gogh impasto oil painting |\n| `cyberpunk_neon` | Cyberpunk neon nightscape |\n| `vintage_infographic` | Retro infographic / data poster |\n| `movie_poster` | Movie poster (large title + still) |\n| `flat_vector` | Flat-vector illustration / banner |\n| `pixel_8bit` | Pixel art (8/16-bit) |\n| `papercraft_layered` | Layered papercraft |\n| `exploded_diagram` | Exploded technical diagram |\n| `dreamcore_liminal` | Dreamcore / liminal space |\n| `knolling_flatlay` | Top-down knolling / flat-lay |\n| `botanical_engraving` | Botanical engraving / antique illustration |\n\n## Where this model shines (vs Midjourney / Flux / SD)\n\n- **Accurate text rendering** — poster headlines, infographics, menu typography, meme captions: written into the image as specified.\n- **Strong prompt following** — multi-element scenes, ordering and spatial relationships obeyed.\n- **Subject preservation in image-to-image** — faces, brands, and characters stay consistent across reference images.\n- **Wide style coverage** — Ghibli, Pixar, claymation, LEGO, Pop Mart, botanical engraving etc. all handled.\n\n## Agent guidance\n\n- Tell the user up-front that one image takes ~150 s.\n- The `gpt_image2_result` tool already sleeps 50 s server-side — never add an extra client-side sleep between polls.\n- Use `--timeout 70` for `result` calls (50 s server wait + buffer).\n- Pass the user's prompt verbatim, including non-English text.\n- Reference images: combine `reference_image_urls` with a `style` preset for \"restyle while keeping the subject\".\n- Posters / infographics / menus: lean on the text-rendering strength.\n- If `submit` returns `success=false`, surface the `error`/`hint` fields to the user.\n- 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`.\n\n## Response shape\n\n```json\n{\n  \"success\": true,\n  \"data\": {\"status\": \"...\", \"job_id\": \"...\", \"items\": [{\"url\": \"...\"}]},\n  \"meta\": {\"latency_ms\": 120, \"credits_used\": 300}\n}\n```\n\nRead `data.status`, `data.job_id`, `data.items[].url` directly.\n\nErrors:\n\n```json\n{\"success\": false, \"error\": \"...\", \"hint\": \"...\"}\n```\n\nFile v0.4.1:_meta.json\n\n{\n  \"ownerId\": \"kn77e6kfs6str7h1kk3zmxkmmd80b4bb\",\n  \"slug\": \"gpt-image2\",\n  \"version\": \"0.4.1\",\n  \"publishedAt\": 1777638208890\n}\n\nArchive v0.4.0: 3 files, 13386 bytes\n\nFiles: bin/uno.py (28624b), SKILL.md (10827b), _meta.json (129b)\n\nFile v0.4.0:SKILL.md\n\n---\nname: gpt-image2\ndescription: \"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.\"\nhomepage: https://clawdchat.cn\nmetadata:\n  emoji: \"🖼️\"\n  category: creative\n  version: \"0.4.0\"\n  language: en\n  publisher: clawdchat\n  requires:\n    primary_credential:\n      type: clawdchat_api_key\n      managed_by: bundled bin/uno.py\n      stored_at: ~/.uno/credentials.json\n      obtained_via: \"Running `python bin/uno.py login --start` to receive a device code, opening the printed URL in a browser (ClawdChat SSO login is handled automatically if not yet signed in, then an Authorise button is shown), then running `python bin/uno.py login --poll DEVICE_CODE` to complete. The resulting API key is written to disk.\"\n      scope: \"Used as the Authorization Bearer token to call the ClawdChat tool gateway. Credential storage and refresh are handled by the bundled bin/uno.py; this skill never reads, prints, or transmits the credentials file directly.\"\n    config_paths:\n      - ~/.uno/credentials.json (read-only, managed by bin/uno.py)\n    network_endpoints:\n      - \"ClawdChat tool gateway (HTTPS) — receives the prompt and reference-image URLs\"\n    write_actions:\n      - \"Submits paid image-generation jobs (300 credits per submit). Each call deducts ClawdChat credits from the logged-in account.\"\n      - \"Writes no local files. Generated image URLs are returned in the response; the agent decides whether to download them.\"\n    cost:\n      gpt_image2_submit: \"300 credits per call\"\n      gpt_image2_result: \"0 credits per call\"\n  openclaw:\n    requires:\n      scripts: [\"bin/uno.py\"]\n---\n\n# GPT Image 2 — High-quality AI image generation\n\n> Powered by ClawdChat — calls OpenAI `gpt-image-2` through the Uno tool gateway.\n\n## What this skill does\n\nTwo command-line invocations against the public ClawdChat tool gateway:\n\n| Tool slug | Purpose | Cost |\n|---|---|---|\n| `gpt-image-2.gpt_image2_submit` | Submit a generation job, returns `job_id` immediately (async) | **300 credits / call** |\n| `gpt-image-2.gpt_image2_result` | Poll job status / fetch image URL when ready | 0 credits |\n\nThe bundled `bin/uno.py` handles authentication, HTTP transport, and rate-limiting. No external skill dependency required — install this skill and you're ready.\n\n## Credentials & permissions (read before first use)\n\n- **Credential type**: ClawdChat API key (Bearer token).\n- **Where it lives**: `~/.uno/credentials.json`. Managed entirely by the bundled `bin/uno.py`; this skill never opens, prints or copies it.\n- **How it was obtained**: run `python bin/uno.py login` (see Setup below). The bundled script drives a ClawdChat OAuth device-code flow and stores the resulting token.\n- **What it authorises**: calling the ClawdChat tool gateway as the logged-in user. Each `gpt_image2_submit` deducts 300 credits from that account.\n- **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.**\n- **Logging out / revoking**: run `python bin/uno.py logout`.\n\n## Cost transparency & confirmation rule\n\nEvery `gpt_image2_submit` call costs the logged-in account real credits. The agent **must**:\n\n1. Show the user the planned prompt, size, style, and number of images **before** the first call.\n2. Ask for explicit confirmation when the user has not already approved a generation in the current turn.\n3. 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.\n4. On `error` responses, surface the error to the user instead of silently retrying.\n\nPolling via `gpt_image2_result` is free; only `submit` spends credits.\n\n## Setup\n\nNo external skill dependency. After `clawhub install gpt-image2` the layout is:\n\n```text\ngpt-image2/\n├── SKILL.md\n└── bin/\n    └── uno.py    # bundled CLI — no extra install needed\n```\n\nAll commands below run from inside the `gpt-image2/` folder.\n\n### Check if already logged in\n\n```bash\npython bin/uno.py whoami --compact\n```\n\n- Returns user info (name, email, credits) → credentials valid, **skip login**.\n- Returns `{\"error\": \"Not logged in\"}` → proceed to login below.\n\n### Log in\n\n```bash\npython bin/uno.py login --start\n```\n\nThis prints a device code and a URL like `https://clawdtools.uno/device?code=XXXX`.\n\nOpen that URL in a browser. If not yet signed in to clawdtools.uno, the page redirects to ClawdChat SSO automatically and returns to the Authorise screen. Click \"Authorise\".\n\nThen poll for completion:\n\n```bash\npython bin/uno.py login --poll DEVICE_CODE\n```\n\nOr run `python bin/uno.py login` (blocking, polls automatically).\n\nCredential file (`~/.uno/credentials.json`) is written by `bin/uno.py` and reused on subsequent runs.\n\n## Generating an image — full async flow\n\nA single 1024×1024 image typically takes **~150 s**, longer than the default MCP 60 s timeout. Always use the **submit → poll-result** pattern.\n\n### Step 1 — submit\n\n```bash\npython bin/uno.py call gpt-image-2.gpt_image2_submit --compact \\\n  --args '{\"prompt\":\"A shiba inu under cherry blossoms, sunny afternoon\",\"size\":\"1024x1024\",\"style\":\"ghibli_anime\"}'\n```\n\nResponse (already flattened — no need to unwrap `content[0].text`):\n\n```json\n{\"success\": true, \"data\": {\"status\": \"pending\", \"job_id\": \"0b84b8f0f0c8\", \"estimated_seconds\": 150}, \"meta\": {\"latency_ms\": 120, \"credits_used\": 300}}\n```\n\nRecord `data.job_id`.\n\n### Step 2 — poll for result\n\n```bash\npython bin/uno.py call gpt-image-2.gpt_image2_result --compact --timeout 70 \\\n  --args '{\"job_id\":\"0b84b8f0f0c8\",\"wait_seconds\":50}'\n```\n\n`wait_seconds=50` makes the server-side wait 50 s (within the 60 s MCP envelope); `--timeout 70` adds a small client buffer.\n\nRepeat the call until `data.status` is one of:\n\n- `done` — image ready, URLs in `data.items[].url`.\n- `error` — generation failed, message in `data.error`.\n- `pending` / `running` — call again immediately. **Do not add a client-side sleep**; the server already waited 50 s on your behalf.\n\nThree to five iterations (~150–250 s total) is normal.\n\n### Reference Python loop\n\nUse `subprocess.run` with an argument list to safely pass arbitrary prompt text without shell-injection risk:\n\n```python\nimport json, subprocess, sys\n\nUNO = \"bin/uno.py\"\n\ndef uno(args):\n    r = subprocess.run([\"python\", UNO] + args, capture_output=True, text=True)\n    return json.loads(r.stdout)\n\nprompt = \"Van Gogh starry night\"\nresp = uno([\"call\", \"gpt-image-2.gpt_image2_submit\", \"--compact\",\n            \"--args\", json.dumps({\"prompt\": prompt, \"style\": \"oil_painting_vangogh\"})])\njob_id = resp[\"data\"][\"job_id\"]\n\nfor _ in range(6):\n    r = uno([\"call\", \"gpt-image-2.gpt_image2_result\", \"--compact\", \"--timeout\", \"70\",\n             \"--args\", json.dumps({\"job_id\": job_id, \"wait_seconds\": 50})])\n    status = r[\"data\"][\"status\"]\n    if status == \"done\":\n        print(json.dumps(r, ensure_ascii=False, indent=2))\n        break\n    if status == \"error\":\n        print(\"Error:\", r[\"data\"].get(\"error\"), file=sys.stderr)\n        sys.exit(1)\n```\n\n## Parameters\n\n| Field | Meaning | Values |\n|---|---|---|\n| `prompt` | Image description (required, any language) | free text |\n| `size` | Image dimensions | `1024x1024` (default), `1024x1536` (portrait), `1536x1024` (landscape), `auto` |\n| `n` | Number of images to generate | 1–4 (default 1) |\n| `style` | Built-in style preset | one of the 20 keys below |\n| `reference_image_urls` | Reference images (image-to-image) | URL string, comma-separated for multiple |\n\n## 20 built-in style presets\n\n| key | description |\n|---|---|\n| `ghibli_anime` | Studio Ghibli / hand-drawn anime |\n| `pixar_3d` | Pixar / Disney 3D animation |\n| `claymation` | Stop-motion claymation (Laika / Aardman) |\n| `lego_brick` | LEGO bricks |\n| `popmart_figurine` | Blind-box / Pop Mart figurine |\n| `isometric_game` | Isometric 2.5D game scene |\n| `cinematic_photo` | Cinematic photorealism (35mm) |\n| `polaroid_film` | Polaroid film snapshot |\n| `watercolor_ink` | Watercolour / East-Asian ink wash |\n| `oil_painting_vangogh` | Van Gogh impasto oil painting |\n| `cyberpunk_neon` | Cyberpunk neon nightscape |\n| `vintage_infographic` | Retro infographic / data poster |\n| `movie_poster` | Movie poster (large title + still) |\n| `flat_vector` | Flat-vector illustration / banner |\n| `pixel_8bit` | Pixel art (8/16-bit) |\n| `papercraft_layered` | Layered papercraft |\n| `exploded_diagram` | Exploded technical diagram |\n| `dreamcore_liminal` | Dreamcore / liminal space |\n| `knolling_flatlay` | Top-down knolling / flat-lay |\n| `botanical_engraving` | Botanical engraving / antique illustration |\n\n## Where this model shines (vs Midjourney / Flux / SD)\n\n- **Accurate text rendering** — poster headlines, infographics, menu typography, meme captions: written into the image as specified.\n- **Strong prompt following** — multi-element scenes, ordering and spatial relationships obeyed.\n- **Subject preservation in image-to-image** — faces, brands, and characters stay consistent across reference images.\n- **Wide style coverage** — Ghibli, Pixar, claymation, LEGO, Pop Mart, botanical engraving etc. all handled.\n\n## Agent guidance\n\n- Tell the user up-front that one image takes ~150 s.\n- The `gpt_image2_result` tool already sleeps 50 s server-side — never add an extra client-side sleep between polls.\n- Use `--timeout 70` for `result` calls (50 s server wait + buffer).\n- Pass the user's prompt verbatim, including non-English text.\n- Reference images: combine `reference_image_urls` with a `style` preset for \"restyle while keeping the subject\".\n- Posters / infographics / menus: lean on the text-rendering strength.\n- If `submit` returns `success=false`, surface the `error`/`hint` fields to the user.\n- 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`.\n\n## Response shape\n\n```json\n{\n  \"success\": true,\n  \"data\": {\"status\": \"...\", \"job_id\": \"...\", \"items\": [{\"url\": \"...\"}]},\n  \"meta\": {\"latency_ms\": 120, \"credits_used\": 300}\n}\n```\n\nRead `data.status`, `data.job_id`, `data.items[].url` directly.\n\nErrors:\n\n```json\n{\"success\": false, \"error\": \"...\", \"hint\": \"...\"}\n```\n\nFile v0.4.0:_meta.json\n\n{\n  \"ownerId\": \"kn77e6kfs6str7h1kk3zmxkmmd80b4bb\",\n  \"slug\": \"gpt-image2\",\n  \"version\": \"0.4.0\",\n  \"publishedAt\": 1777637944779\n}\n\nArchive v0.3.2: 2 files, 5715 bytes\n\nFiles: SKILL.md (12039b), _meta.json (129b)\n\nFile v0.3.2:SKILL.md\n\n---\nname: gpt-image2\ndescription: \"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.\"\nhomepage: https://clawdchat.cn\nmetadata:\n  emoji: \"🖼️\"\n  category: creative\n  version: \"0.3.2\"\n  language: en\n  publisher: clawdchat\n  requires:\n    primary_credential:\n      type: clawdchat_api_key\n      managed_by: uno-cli skill\n      stored_at: ~/.uno/credentials.json\n      obtained_via: \"Running `python ../uno-cli/bin/uno.py login --start` to receive a device code, opening the printed verification URL in a browser (ClawdChat SSO login is handled automatically if not yet signed in, then an Authorise button is shown), then running `login --poll DEVICE_CODE` to complete. The resulting API key is written to disk by uno-cli.\"\n      scope: \"Used as the 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 indirectly via the bundled `uno-cli/bin/uno.py` script and never reads, prints, or transmits the credentials file directly.\"\n    config_paths:\n      - ~/.uno/credentials.json (read-only, owned by uno-cli)\n    network_endpoints:\n      - \"ClawdChat tool gateway (HTTPS, via uno-cli) — receives the prompt and reference-image URLs\"\n    write_actions:\n      - \"Submits paid image-generation jobs (300 credits per submit). Each call deducts ClawdChat credits from the logged-in account.\"\n      - \"Writes no local files. Generated image URLs are returned in the response; the agent decides whether to download them.\"\n    cost:\n      gpt_image2_submit: \"300 credits per call\"\n      gpt_image2_result: \"0 credits per call\"\n  openclaw:\n    requires:\n      scripts: [\"../uno-cli/bin/uno.py\"]\n    skills: [\"uno-cli\"]\n---\n\n# GPT Image 2 — High-quality AI image generation\n\n> Powered by ClawdChat — calls OpenAI `gpt-image-2` through the Uno tool gateway.\n\n## What this skill does\n\nTwo thin command-line invocations against the public ClawdChat tool gateway:\n\n| Tool slug | Purpose | Cost |\n|---|---|---|\n| `gpt-image-2.gpt_image2_submit` | Submit a generation job, returns `job_id` immediately (async) | **300 credits / call** |\n| `gpt-image-2.gpt_image2_result` | Poll job status / fetch image URL when ready | 0 credits |\n\nThis skill ships **no local Python code**. It defers all credential, transport and rate-limit handling to the `uno-cli` companion skill.\n\n## Credentials & permissions (read before first use)\n\n- **Credential type**: ClawdChat API key (Bearer token).\n- **Where it lives**: `~/.uno/credentials.json`. The file is **created and owned by the `uno-cli` skill**; this skill never opens, prints or copies it.\n- **How it was obtained**: the user runs `python ../uno-cli/bin/uno.py login`, which issues a device code. The user must **first log in at https://clawdtools.uno** (top-right \"Login\"), then open the authorisation URL shown in the terminal. The resulting API key is stored by `uno-cli`.\n- **What it authorises**: calling the ClawdChat tool gateway as the logged-in user. Each `gpt_image2_submit` deducts 300 credits from that account.\n- **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.**\n- **Logging out / revoking**: run `python ../uno-cli/bin/uno.py logout` (credential file managed entirely by `uno-cli`).\n\n## Cost transparency & confirmation rule\n\nEvery `gpt_image2_submit` call costs the logged-in account real credits. The agent **must**:\n\n1. Show the user the planned prompt, size, style, and number of images **before** the first call.\n2. Ask for explicit confirmation when the user has not already approved a generation in the current turn.\n3. 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.\n4. On `error` responses, surface the error to the user instead of silently retrying.\n\nPolling via `gpt_image2_result` is free; only `submit` spends credits.\n\n## Setup\n\nThis skill is a thin wrapper around the **`uno-cli`** companion skill, which ships the actual Python CLI (`bin/uno.py`).\n\n### 1. Install `uno-cli` explicitly\n\nThe current `clawhub install` does **not** auto-cascade `metadata.openclaw.skills` dependencies, so you must install it yourself:\n\n```bash\nclawhub install uno-cli\n```\n\nAfter both skills are installed, the layout is:\n\n```text\n<skills-root>/\n├── gpt-image2/\n│   └── SKILL.md\n└── uno-cli/\n    ├── SKILL.md\n    └── bin/uno.py        # the actual CLI\n```\n\nFrom this skill's folder, the CLI is therefore reachable at the **relative** path `../uno-cli/bin/uno.py`. All examples below use that path verbatim.\n\n### 2. Log in\n\n```bash\npython ../uno-cli/bin/uno.py login --start\n```\n\nThis prints a device code and a `verification_uri_complete` URL like `https://clawdtools.uno/device?code=XXXX`.\n\nOpen that URL in a browser — if you are not yet signed in to clawdtools.uno, the page will redirect you to the ClawdChat SSO login automatically and return to the authorisation screen afterwards. Click \"Authorise\" to complete the flow.\n\nThen poll for completion:\n\n```bash\npython ../uno-cli/bin/uno.py login --poll <device_code>\n```\n\nOr run `python ../uno-cli/bin/uno.py login` (blocking, identical flow but polls automatically).\n\nCredential storage (`~/.uno/credentials.json`) and refresh are handled entirely by `uno-cli`.\n\n### Why not call a global `uno` command?\n\nDon't rely on a `uno` binary in `PATH`. On many systems (notably macOS with LibreOffice installed) `/opt/homebrew/bin/uno` is the **LibreOffice UNO bridge**, an unrelated Mach-O binary — invoking it will produce confusing C++ errors. Always invoke `python ../uno-cli/bin/uno.py …` (or an explicit absolute path), or set up your own alias / symlink that you control.\n\nIf `python` resolves to Python 2 on the host, use `python3` instead.\n\n## Generating an image — full async flow\n\nA single 1024×1024 image typically takes **~150 s**, longer than the default MCP 60 s timeout. Always use the **submit → poll-result** pattern.\n\n### Step 1 — submit\n\n```bash\npython ../uno-cli/bin/uno.py call gpt-image-2.gpt_image2_submit --compact \\\n  --args '{\"prompt\":\"A shiba inu under cherry blossoms, sunny afternoon\",\"size\":\"1024x1024\",\"style\":\"ghibli_anime\"}'\n```\n\nResponse (already flattened by `uno-cli` — no need to unwrap `content[0].text`):\n\n```json\n{\"success\": true, \"data\": {\"status\": \"pending\", \"job_id\": \"0b84b8f0f0c8\", \"estimated_seconds\": 150}, \"meta\": {\"latency_ms\": 120, \"credits_used\": 300}}\n```\n\nRecord `data.job_id`.\n\n### Step 2 — poll for result\n\n```bash\npython ../uno-cli/bin/uno.py call gpt-image-2.gpt_image2_result --compact --timeout 70 \\\n  --args '{\"job_id\":\"0b84b8f0f0c8\",\"wait_seconds\":50}'\n```\n\n`wait_seconds=50` makes the server-side wait 50 s (within the 60 s MCP envelope); `--timeout 70` adds a small client buffer.\n\nRepeat the call until `data.status` is one of:\n\n- `done` — image ready, URLs in `data.items[].url`.\n- `error` — generation failed, message in `data.error`.\n- `pending` / `running` — call again immediately. **Do not add a client-side sleep**; the server already waited 50 s on your behalf.\n\nThree to five iterations (~150–250 s total) is normal.\n\n### Reference Python loop\n\nUse a Python script instead of shell variable interpolation to avoid shell-metacharacter issues with arbitrary prompt text:\n\n```python\nimport json, subprocess, sys\n\nUNO = \"../uno-cli/bin/uno.py\"\n\ndef uno(args):\n    cmd = [\"python\", UNO] + args\n    r = subprocess.run(cmd, capture_output=True, text=True)\n    return json.loads(r.stdout)\n\nprompt = \"Van Gogh starry night\"\nresp = uno([\"call\", \"gpt-image-2.gpt_image2_submit\", \"--compact\",\n            \"--args\", json.dumps({\"prompt\": prompt, \"style\": \"oil_painting_vangogh\"})])\njob_id = resp[\"data\"][\"job_id\"]\n\nfor _ in range(6):\n    r = uno([\"call\", \"gpt-image-2.gpt_image2_result\", \"--compact\", \"--timeout\", \"70\",\n             \"--args\", json.dumps({\"job_id\": job_id, \"wait_seconds\": 50})])\n    status = r[\"data\"][\"status\"]\n    if status == \"done\":\n        print(json.dumps(r, ensure_ascii=False, indent=2))\n        break\n    if status == \"error\":\n        print(\"Error:\", r[\"data\"].get(\"error\"), file=sys.stderr)\n        sys.exit(1)\n```\n\n## Parameters\n\n| Field | Meaning | Values |\n|---|---|---|\n| `prompt` | Image description (required, any language) | free text |\n| `size` | Image dimensions | `1024x1024` (default), `1024x1536` (portrait), `1536x1024` (landscape), `auto` |\n| `n` | Number of images to generate | 1–4 (default 1) |\n| `style` | Built-in style preset | one of the 20 keys below |\n| `reference_image_urls` | Reference images (image-to-image) | URL string, comma-separated for multiple |\n\n## 20 built-in style presets\n\n| key | description |\n|---|---|\n| `ghibli_anime` | Studio Ghibli / hand-drawn anime |\n| `pixar_3d` | Pixar / Disney 3D animation |\n| `claymation` | Stop-motion claymation (Laika / Aardman) |\n| `lego_brick` | LEGO bricks |\n| `popmart_figurine` | Blind-box / Pop Mart figurine |\n| `isometric_game` | Isometric 2.5D game scene |\n| `cinematic_photo` | Cinematic photorealism (35mm) |\n| `polaroid_film` | Polaroid film snapshot |\n| `watercolor_ink` | Watercolour / East-Asian ink wash |\n| `oil_painting_vangogh` | Van Gogh impasto oil painting |\n| `cyberpunk_neon` | Cyberpunk neon nightscape |\n| `vintage_infographic` | Retro infographic / data poster |\n| `movie_poster` | Movie poster (large title + still) |\n| `flat_vector` | Flat-vector illustration / banner |\n| `pixel_8bit` | Pixel art (8/16-bit) |\n| `papercraft_layered` | Layered papercraft |\n| `exploded_diagram` | Exploded technical diagram |\n| `dreamcore_liminal` | Dreamcore / liminal space |\n| `knolling_flatlay` | Top-down knolling / flat-lay |\n| `botanical_engraving` | Botanical engraving / antique illustration |\n\n## Where this model shines (vs Midjourney / Flux / SD)\n\n- **Accurate text rendering** — poster headlines, infographics, menu typography, meme captions: written into the image as specified.\n- **Strong prompt following** — multi-element scenes, ordering and spatial relationships obeyed.\n- **Subject preservation in image-to-image** — faces, brands, and characters stay consistent across reference images.\n- **Wide style coverage** — Ghibli, Pixar, claymation, LEGO, Pop Mart, botanical engraving etc. all handled.\n\n## Agent guidance\n\n- Tell the user up-front that one image takes ~150 s.\n- The `gpt_image2_result` tool already sleeps 50 s server-side — never add an extra client-side sleep between polls.\n- Use `--timeout 70` for `result` calls (50 s server wait + buffer).\n- Pass the user's prompt verbatim, including non-English text.\n- Reference images: combine `reference_image_urls` with a `style` preset for \"restyle while keeping the subject\".\n- Posters / infographics / menus: lean on the text-rendering strength.\n- If `submit` returns `success=false`, surface the `error`/`hint` fields to the user.\n- 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`.\n\n## Response shape\n\nAlready flattened by `uno-cli`:\n\n```json\n{\n  \"success\": true,\n  \"data\": {\"status\": \"...\", \"job_id\": \"...\", \"items\": [{\"url\": \"...\"}]},\n  \"meta\": {\"latency_ms\": 120, \"credits_used\": 300}\n}\n```\n\nRead `data.status`, `data.job_id`, `data.items[].url` directly.\n\nErrors:\n\n```json\n{\"success\": false, \"error\": \"...\", \"hint\": \"...\"}\n```\n\nFile v0.3.2:_meta.json\n\n{\n  \"ownerId\": \"kn77e6kfs6str7h1kk3zmxkmmd80b4bb\",\n  \"slug\": \"gpt-image2\",\n  \"version\": \"0.3.2\",\n  \"publishedAt\": 1777611059917\n}\n\nArchive v0.3.1: 2 files, 5540 bytes\n\nFiles: SKILL.md (11707b), _meta.json (129b)\n\nFile v0.3.1:SKILL.md\n\n---\nname: gpt-image2\ndescription: \"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.\"\nhomepage: https://clawdchat.cn\nmetadata:\n  emoji: \"🖼️\"\n  category: creative\n  version: \"0.3.1\"\n  language: en\n  publisher: clawdchat\n  requires:\n    primary_credential:\n      type: clawdchat_api_key\n      managed_by: uno-cli skill\n      stored_at: ~/.uno/credentials.json\n      obtained_via: \"Running `python ../uno-cli/bin/uno.py login --start` to receive a device code, opening the printed verification URL in a browser (ClawdChat SSO login is handled automatically if not yet signed in, then an Authorise button is shown), then running `login --poll DEVICE_CODE` to complete. The resulting API key is written to disk by uno-cli.\"\n      scope: \"Used as the 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 indirectly via the bundled `uno-cli/bin/uno.py` script and never reads, prints, or transmits the credentials file directly.\"\n    config_paths:\n      - ~/.uno/credentials.json (read-only, owned by uno-cli)\n    network_endpoints:\n      - \"ClawdChat tool gateway (HTTPS, via uno-cli) — receives the prompt and reference-image URLs\"\n    write_actions:\n      - \"Submits paid image-generation jobs (300 credits per submit). Each call deducts ClawdChat credits from the logged-in account.\"\n      - \"Writes no local files. Generated image URLs are returned in the response; the agent decides whether to download them.\"\n    cost:\n      gpt_image2_submit: \"300 credits per call\"\n      gpt_image2_result: \"0 credits per call\"\n  openclaw:\n    requires:\n      scripts: [\"../uno-cli/bin/uno.py\"]\n    skills: [\"uno-cli\"]\n---\n\n# GPT Image 2 — High-quality AI image generation\n\n> Powered by ClawdChat — calls OpenAI `gpt-image-2` through the Uno tool gateway.\n\n## What this skill does\n\nTwo thin command-line invocations against the public ClawdChat tool gateway:\n\n| Tool slug | Purpose | Cost |\n|---|---|---|\n| `gpt-image-2.gpt_image2_submit` | Submit a generation job, returns `job_id` immediately (async) | **300 credits / call** |\n| `gpt-image-2.gpt_image2_result` | Poll job status / fetch image URL when ready | 0 credits |\n\nThis skill ships **no local Python code**. It defers all credential, transport and rate-limit handling to the `uno-cli` companion skill.\n\n## Credentials & permissions (read before first use)\n\n- **Credential type**: ClawdChat API key (Bearer token).\n- **Where it lives**: `~/.uno/credentials.json`. The file is **created and owned by the `uno-cli` skill**; this skill never opens, prints or copies it.\n- **How it was obtained**: the user runs `python ../uno-cli/bin/uno.py login`, which issues a device code. The user must **first log in at https://clawdtools.uno** (top-right \"Login\"), then open the authorisation URL shown in the terminal. The resulting API key is stored by `uno-cli`.\n- **What it authorises**: calling the ClawdChat tool gateway as the logged-in user. Each `gpt_image2_submit` deducts 300 credits from that account.\n- **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.**\n- **Logging out / revoking**: run `python ../uno-cli/bin/uno.py logout` (credential file managed entirely by `uno-cli`).\n\n## Cost transparency & confirmation rule\n\nEvery `gpt_image2_submit` call costs the logged-in account real credits. The agent **must**:\n\n1. Show the user the planned prompt, size, style, and number of images **before** the first call.\n2. Ask for explicit confirmation when the user has not already approved a generation in the current turn.\n3. 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.\n4. On `error` responses, surface the error to the user instead of silently retrying.\n\nPolling via `gpt_image2_result` is free; only `submit` spends credits.\n\n## Setup\n\nThis skill is a thin wrapper around the **`uno-cli`** companion skill, which ships the actual Python CLI (`bin/uno.py`).\n\n### 1. Install `uno-cli` explicitly\n\nThe current `clawhub install` does **not** auto-cascade `metadata.openclaw.skills` dependencies, so you must install it yourself:\n\n```bash\nclawhub install uno-cli\n```\n\nAfter both skills are installed, the layout is:\n\n```text\n<skills-root>/\n├── gpt-image2/\n│   └── SKILL.md\n└── uno-cli/\n    ├── SKILL.md\n    └── bin/uno.py        # the actual CLI\n```\n\nFrom this skill's folder, the CLI is therefore reachable at the **relative** path `../uno-cli/bin/uno.py`. All examples below use that path verbatim.\n\n### 2. Log in\n\n```bash\npython ../uno-cli/bin/uno.py login --start\n```\n\nThis prints a device code and a `verification_uri_complete` URL like `https://clawdtools.uno/device?code=XXXX`.\n\nOpen that URL in a browser — if you are not yet signed in to clawdtools.uno, the page will redirect you to the ClawdChat SSO login automatically and return to the authorisation screen afterwards. Click \"Authorise\" to complete the flow.\n\nThen poll for completion:\n\n```bash\npython ../uno-cli/bin/uno.py login --poll <device_code>\n```\n\nOr run `python ../uno-cli/bin/uno.py login` (blocking, identical flow but polls automatically).\n\nCredential storage (`~/.uno/credentials.json`) and refresh are handled entirely by `uno-cli`.\n\n### Why not call a global `uno` command?\n\nDon't rely on a `uno` binary in `PATH`. On many systems (notably macOS with LibreOffice installed) `/opt/homebrew/bin/uno` is the **LibreOffice UNO bridge**, an unrelated Mach-O binary — invoking it will produce confusing C++ errors. Always invoke `python ../uno-cli/bin/uno.py …` (or an explicit absolute path), or set up your own alias / symlink that you control.\n\nIf `python` resolves to Python 2 on the host, use `python3` instead.\n\n## Generating an image — full async flow\n\nA single 1024×1024 image typically takes **~150 s**, longer than the default MCP 60 s timeout. Always use the **submit → poll-result** pattern.\n\n### Step 1 — submit\n\n```bash\npython ../uno-cli/bin/uno.py call gpt-image-2.gpt_image2_submit --compact \\\n  --args '{\"prompt\":\"A shiba inu under cherry blossoms, sunny afternoon\",\"size\":\"1024x1024\",\"style\":\"ghibli_anime\"}'\n```\n\nResponse (already flattened by `uno-cli` — no need to unwrap `content[0].text`):\n\n```json\n{\"success\": true, \"data\": {\"status\": \"pending\", \"job_id\": \"0b84b8f0f0c8\", \"estimated_seconds\": 150}, \"meta\": {\"latency_ms\": 120, \"credits_used\": 300}}\n```\n\nRecord `data.job_id`.\n\n### Step 2 — poll for result\n\n```bash\npython ../uno-cli/bin/uno.py call gpt-image-2.gpt_image2_result --compact --timeout 70 \\\n  --args '{\"job_id\":\"0b84b8f0f0c8\",\"wait_seconds\":50}'\n```\n\n`wait_seconds=50` makes the server-side wait 50 s (within the 60 s MCP envelope); `--timeout 70` adds a small client buffer.\n\nRepeat the call until `data.status` is one of:\n\n- `done` — image ready, URLs in `data.items[].url`.\n- `error` — generation failed, message in `data.error`.\n- `pending` / `running` — call again immediately. **Do not add a client-side sleep**; the server already waited 50 s on your behalf.\n\nThree to five iterations (~150–250 s total) is normal.\n\n### Reference shell loop\n\n```bash\nUNO=../uno-cli/bin/uno.py\n\nRESP=$(python \"$UNO\" call gpt-image-2.gpt_image2_submit --compact \\\n  --args '{\"prompt\":\"Van Gogh starry night\",\"style\":\"oil_painting_vangogh\"}')\nJOB_ID=$(echo \"$RESP\" | python3 -c \"import json,sys; print(json.load(sys.stdin)['data']['job_id'])\")\n\nfor i in 1 2 3 4 5 6; do\n  R=$(python \"$UNO\" call gpt-image-2.gpt_image2_result --compact --timeout 70 \\\n    --args \"{\\\"job_id\\\":\\\"$JOB_ID\\\",\\\"wait_seconds\\\":50}\")\n  STATUS=$(echo \"$R\" | python3 -c \"import json,sys; print(json.load(sys.stdin)['data']['status'])\")\n  [ \"$STATUS\" = \"done\" ]  && echo \"$R\" && break\n  [ \"$STATUS\" = \"error\" ] && echo \"$R\" && exit 1\ndone\n```\n\n## Parameters\n\n| Field | Meaning | Values |\n|---|---|---|\n| `prompt` | Image description (required, any language) | free text |\n| `size` | Image dimensions | `1024x1024` (default), `1024x1536` (portrait), `1536x1024` (landscape), `auto` |\n| `n` | Number of images to generate | 1–4 (default 1) |\n| `style` | Built-in style preset | one of the 20 keys below |\n| `reference_image_urls` | Reference images (image-to-image) | URL string, comma-separated for multiple |\n\n## 20 built-in style presets\n\n| key | description |\n|---|---|\n| `ghibli_anime` | Studio Ghibli / hand-drawn anime |\n| `pixar_3d` | Pixar / Disney 3D animation |\n| `claymation` | Stop-motion claymation (Laika / Aardman) |\n| `lego_brick` | LEGO bricks |\n| `popmart_figurine` | Blind-box / Pop Mart figurine |\n| `isometric_game` | Isometric 2.5D game scene |\n| `cinematic_photo` | Cinematic photorealism (35mm) |\n| `polaroid_film` | Polaroid film snapshot |\n| `watercolor_ink` | Watercolour / East-Asian ink wash |\n| `oil_painting_vangogh` | Van Gogh impasto oil painting |\n| `cyberpunk_neon` | Cyberpunk neon nightscape |\n| `vintage_infographic` | Retro infographic / data poster |\n| `movie_poster` | Movie poster (large title + still) |\n| `flat_vector` | Flat-vector illustration / banner |\n| `pixel_8bit` | Pixel art (8/16-bit) |\n| `papercraft_layered` | Layered papercraft |\n| `exploded_diagram` | Exploded technical diagram |\n| `dreamcore_liminal` | Dreamcore / liminal space |\n| `knolling_flatlay` | Top-down knolling / flat-lay |\n| `botanical_engraving` | Botanical engraving / antique illustration |\n\n## Where this model shines (vs Midjourney / Flux / SD)\n\n- **Accurate text rendering** — poster headlines, infographics, menu typography, meme captions: written into the image as specified.\n- **Strong prompt following** — multi-element scenes, ordering and spatial relationships obeyed.\n- **Subject preservation in image-to-image** — faces, brands, and characters stay consistent across reference images.\n- **Wide style coverage** — Ghibli, Pixar, claymation, LEGO, Pop Mart, botanical engraving etc. all handled.\n\n## Agent guidance\n\n- Tell the user up-front that one image takes ~150 s.\n- The `gpt_image2_result` tool already sleeps 50 s server-side — never add an extra client-side sleep between polls.\n- Use `--timeout 70` for `result` calls (50 s server wait + buffer).\n- Pass the user's prompt verbatim, including non-English text.\n- Reference images: combine `reference_image_urls` with a `style` preset for \"restyle while keeping the subject\".\n- Posters / infographics / menus: lean on the text-rendering strength.\n- If `submit` returns `success=false`, surface the `error`/`hint` fields to the user.\n- 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`.\n\n## Response shape\n\nAlready flattened by `uno-cli`:\n\n```json\n{\n  \"success\": true,\n  \"data\": {\"status\": \"...\", \"job_id\": \"...\", \"items\": [{\"url\": \"...\"}]},\n  \"meta\": {\"latency_ms\": 120, \"credits_used\": 300}\n}\n```\n\nRead `data.status`, `data.job_id`, `data.items[].url` directly.\n\nErrors:\n\n```json\n{\"success\": false, \"error\": \"...\", \"hint\": \"...\"}\n```\n\nFile v0.3.1:_meta.json\n\n{\n  \"ownerId\": \"kn77e6kfs6str7h1kk3zmxkmmd80b4bb\",\n  \"slug\": \"gpt-image2\",\n  \"version\": \"0.3.1\",\n  \"publishedAt\": 1777563442441\n}\n\nArchive v0.3.0: 2 files, 5502 bytes\n\nFiles: SKILL.md (11621b), _meta.json (129b)\n\nFile v0.3.0:SKILL.md\n\n---\nname: gpt-image2\ndescription: \"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.\"\nhomepage: https://clawdchat.cn\nmetadata:\n  emoji: \"🖼️\"\n  category: creative\n  version: \"0.3.0\"\n  language: en\n  publisher: clawdchat\n  requires:\n    primary_credential:\n      type: clawdchat_api_key\n      managed_by: uno-cli skill\n      stored_at: ~/.uno/credentials.json\n      obtained_via: \"Running `python ../uno-cli/bin/uno.py login --start`, opening the printed verification URL in a browser (the site handles ClawdChat SSO login automatically if not yet signed in, then shows the Authorise button), then running `login --poll <device_code>`. The resulting API key is written to disk by uno-cli.\"\n      scope: \"Used as the 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 indirectly via the bundled `uno-cli/bin/uno.py` script and never reads, prints, or transmits the credentials file directly.\"\n    config_paths:\n      - ~/.uno/credentials.json (read-only, owned by uno-cli)\n    network_endpoints:\n      - \"ClawdChat tool gateway (HTTPS, via uno-cli) — receives the prompt and reference-image URLs\"\n    write_actions:\n      - \"Submits paid image-generation jobs (300 credits per submit). Each call deducts ClawdChat credits from the logged-in account.\"\n      - \"Writes no local files. Generated image URLs are returned in the response; the agent decides whether to download them.\"\n    cost:\n      gpt_image2_submit: \"300 credits per call\"\n      gpt_image2_result: \"0 credits per call\"\n  openclaw:\n    skills: [\"uno-cli\"]\n---\n\n# GPT Image 2 — High-quality AI image generation\n\n> Powered by ClawdChat — calls OpenAI `gpt-image-2` through the Uno tool gateway.\n\n## What this skill does\n\nTwo thin command-line invocations against the public ClawdChat tool gateway:\n\n| Tool slug | Purpose | Cost |\n|---|---|---|\n| `gpt-image-2.gpt_image2_submit` | Submit a generation job, returns `job_id` immediately (async) | **300 credits / call** |\n| `gpt-image-2.gpt_image2_result` | Poll job status / fetch image URL when ready | 0 credits |\n\nThis skill ships **no local Python code**. It defers all credential, transport and rate-limit handling to the `uno-cli` companion skill.\n\n## Credentials & permissions (read before first use)\n\n- **Credential type**: ClawdChat API key (Bearer token).\n- **Where it lives**: `~/.uno/credentials.json`. The file is **created and owned by the `uno-cli` skill**; this skill never opens, prints or copies it.\n- **How it was obtained**: the user runs `python ../uno-cli/bin/uno.py login`, which issues a device code. The user must **first log in at https://clawdtools.uno** (top-right \"Login\"), then open the authorisation URL shown in the terminal. The resulting API key is stored by `uno-cli`.\n- **What it authorises**: calling the ClawdChat tool gateway as the logged-in user. Each `gpt_image2_submit` deducts 300 credits from that account.\n- **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.**\n- **Logging out / revoking**: run `python ../uno-cli/bin/uno.py logout` (credential file managed entirely by `uno-cli`).\n\n## Cost transparency & confirmation rule\n\nEvery `gpt_image2_submit` call costs the logged-in account real credits. The agent **must**:\n\n1. Show the user the planned prompt, size, style, and number of images **before** the first call.\n2. Ask for explicit confirmation when the user has not already approved a generation in the current turn.\n3. 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.\n4. On `error` responses, surface the error to the user instead of silently retrying.\n\nPolling via `gpt_image2_result` is free; only `submit` spends credits.\n\n## Setup\n\nThis skill is a thin wrapper around the **`uno-cli`** companion skill, which ships the actual Python CLI (`bin/uno.py`).\n\n### 1. Install `uno-cli` explicitly\n\nThe current `clawhub install` does **not** auto-cascade `metadata.openclaw.skills` dependencies, so you must install it yourself:\n\n```bash\nclawhub install uno-cli\n```\n\nAfter both skills are installed, the layout is:\n\n```text\n<skills-root>/\n├── gpt-image2/\n│   └── SKILL.md\n└── uno-cli/\n    ├── SKILL.md\n    └── bin/uno.py        # the actual CLI\n```\n\nFrom this skill's folder, the CLI is therefore reachable at the **relative** path `../uno-cli/bin/uno.py`. All examples below use that path verbatim.\n\n### 2. Log in\n\n```bash\npython ../uno-cli/bin/uno.py login --start\n```\n\nThis prints a device code and a `verification_uri_complete` URL like `https://clawdtools.uno/device?code=XXXX`.\n\nOpen that URL in a browser — if you are not yet signed in to clawdtools.uno, the page will redirect you to the ClawdChat SSO login automatically and return to the authorisation screen afterwards. Click \"Authorise\" to complete the flow.\n\nThen poll for completion:\n\n```bash\npython ../uno-cli/bin/uno.py login --poll <device_code>\n```\n\nOr run `python ../uno-cli/bin/uno.py login` (blocking, identical flow but polls automatically).\n\nCredential storage (`~/.uno/credentials.json`) and refresh are handled entirely by `uno-cli`.\n\n### Why not call a global `uno` command?\n\nDon't rely on a `uno` binary in `PATH`. On many systems (notably macOS with LibreOffice installed) `/opt/homebrew/bin/uno` is the **LibreOffice UNO bridge**, an unrelated Mach-O binary — invoking it will produce confusing C++ errors. Always invoke `python ../uno-cli/bin/uno.py …` (or an explicit absolute path), or set up your own alias / symlink that you control.\n\nIf `python` resolves to Python 2 on the host, use `python3` instead.\n\n## Generating an image — full async flow\n\nA single 1024×1024 image typically takes **~150 s**, longer than the default MCP 60 s timeout. Always use the **submit → poll-result** pattern.\n\n### Step 1 — submit\n\n```bash\npython ../uno-cli/bin/uno.py call gpt-image-2.gpt_image2_submit --compact \\\n  --args '{\"prompt\":\"A shiba inu under cherry blossoms, sunny afternoon\",\"size\":\"1024x1024\",\"style\":\"ghibli_anime\"}'\n```\n\nResponse (already flattened by `uno-cli` — no need to unwrap `content[0].text`):\n\n```json\n{\"success\": true, \"data\": {\"status\": \"pending\", \"job_id\": \"0b84b8f0f0c8\", \"estimated_seconds\": 150}, \"meta\": {\"latency_ms\": 120, \"credits_used\": 300}}\n```\n\nRecord `data.job_id`.\n\n### Step 2 — poll for result\n\n```bash\npython ../uno-cli/bin/uno.py call gpt-image-2.gpt_image2_result --compact --timeout 70 \\\n  --args '{\"job_id\":\"0b84b8f0f0c8\",\"wait_seconds\":50}'\n```\n\n`wait_seconds=50` makes the server-side wait 50 s (within the 60 s MCP envelope); `--timeout 70` adds a small client buffer.\n\nRepeat the call until `data.status` is one of:\n\n- `done` — image ready, URLs in `data.items[].url`.\n- `error` — generation failed, message in `data.error`.\n- `pending` / `running` — call again immediately. **Do not add a client-side sleep**; the server already waited 50 s on your behalf.\n\nThree to five iterations (~150–250 s total) is normal.\n\n### Reference shell loop\n\n```bash\nUNO=../uno-cli/bin/uno.py\n\nRESP=$(python \"$UNO\" call gpt-image-2.gpt_image2_submit --compact \\\n  --args '{\"prompt\":\"Van Gogh starry night\",\"style\":\"oil_painting_vangogh\"}')\nJOB_ID=$(echo \"$RESP\" | python3 -c \"import json,sys; print(json.load(sys.stdin)['data']['job_id'])\")\n\nfor i in 1 2 3 4 5 6; do\n  R=$(python \"$UNO\" call gpt-image-2.gpt_image2_result --compact --timeout 70 \\\n    --args \"{\\\"job_id\\\":\\\"$JOB_ID\\\",\\\"wait_seconds\\\":50}\")\n  STATUS=$(echo \"$R\" | python3 -c \"import json,sys; print(json.load(sys.stdin)['data']['status'])\")\n  [ \"$STATUS\" = \"done\" ]  && echo \"$R\" && break\n  [ \"$STATUS\" = \"error\" ] && echo \"$R\" && exit 1\ndone\n```\n\n## Parameters\n\n| Field | Meaning | Values |\n|---|---|---|\n| `prompt` | Image description (required, any language) | free text |\n| `size` | Image dimensions | `1024x1024` (default), `1024x1536` (portrait), `1536x1024` (landscape), `auto` |\n| `n` | Number of images to generate | 1–4 (default 1) |\n| `style` | Built-in style preset | one of the 20 keys below |\n| `reference_image_urls` | Reference images (image-to-image) | URL string, comma-separated for multiple |\n\n## 20 built-in style presets\n\n| key | description |\n|---|---|\n| `ghibli_anime` | Studio Ghibli / hand-drawn anime |\n| `pixar_3d` | Pixar / Disney 3D animation |\n| `claymation` | Stop-motion claymation (Laika / Aardman) |\n| `lego_brick` | LEGO bricks |\n| `popmart_figurine` | Blind-box / Pop Mart figurine |\n| `isometric_game` | Isometric 2.5D game scene |\n| `cinematic_photo` | Cinematic photorealism (35mm) |\n| `polaroid_film` | Polaroid film snapshot |\n| `watercolor_ink` | Watercolour / East-Asian ink wash |\n| `oil_painting_vangogh` | Van Gogh impasto oil painting |\n| `cyberpunk_neon` | Cyberpunk neon nightscape |\n| `vintage_infographic` | Retro infographic / data poster |\n| `movie_poster` | Movie poster (large title + still) |\n| `flat_vector` | Flat-vector illustration / banner |\n| `pixel_8bit` | Pixel art (8/16-bit) |\n| `papercraft_layered` | Layered papercraft |\n| `exploded_diagram` | Exploded technical diagram |\n| `dreamcore_liminal` | Dreamcore / liminal space |\n| `knolling_flatlay` | Top-down knolling / flat-lay |\n| `botanical_engraving` | Botanical engraving / antique illustration |\n\n## Where this model shines (vs Midjourney / Flux / SD)\n\n- **Accurate text rendering** — poster headlines, infographics, menu typography, meme captions: written into the image as specified.\n- **Strong prompt following** — multi-element scenes, ordering and spatial relationships obeyed.\n- **Subject preservation in image-to-image** — faces, brands, and characters stay consistent across reference images.\n- **Wide style coverage** — Ghibli, Pixar, claymation, LEGO, Pop Mart, botanical engraving etc. all handled.\n\n## Agent guidance\n\n- Tell the user up-front that one image takes ~150 s.\n- The `gpt_image2_result` tool already sleeps 50 s server-side — never add an extra client-side sleep between polls.\n- Use `--timeout 70` for `result` calls (50 s server wait + buffer).\n- Pass the user's prompt verbatim, including non-English text.\n- Reference images: combine `reference_image_urls` with a `style` preset for \"restyle while keeping the subject\".\n- Posters / infographics / menus: lean on the text-rendering strength.\n- If `submit` returns `success=false`, surface the `error`/`hint` fields to the user.\n- 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`.\n\n## Response shape\n\nAlready flattened by `uno-cli`:\n\n```json\n{\n  \"success\": true,\n  \"data\": {\"status\": \"...\", \"job_id\": \"...\", \"items\": [{\"url\": \"...\"}]},\n  \"meta\": {\"latency_ms\": 120, \"credits_used\": 300}\n}\n```\n\nRead `data.status`, `data.job_id`, `data.items[].url` directly.\n\nErrors:\n\n```json\n{\"success\": false, \"error\": \"...\", \"hint\": \"...\"}\n```\n\nFile v0.3.0:_meta.json\n\n{\n  \"ownerId\": \"kn77e6kfs6str7h1kk3zmxkmmd80b4bb\",\n  \"slug\": \"gpt-image2\",\n  \"version\": \"0.3.0\",\n  \"publishedAt\": 1777563186436\n}\n\nArchive v0.2.0: 2 files, 5193 bytes\n\nFiles: SKILL.md (10830b), _meta.json (129b)\n\nFile v0.2.0:SKILL.md\n\n---\nname: gpt-image2\ndescription: \"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.\"\nhomepage: https://clawdchat.cn\nmetadata:\n  emoji: \"🖼️\"\n  category: creative\n  version: \"0.2.0\"\n  language: en\n  publisher: clawdchat\n  requires:\n    primary_credential:\n      type: clawdchat_api_key\n      managed_by: uno-cli skill\n      stored_at: ~/.clawdchat/credentials.json\n      obtained_via: \"Running `python ../uno-cli/bin/uno.py login` from this skill folder (the uno-cli skill drives a ClawdChat OAuth device-code flow at https://clawdchat.cn and writes the resulting key).\"\n      scope: \"Used as the 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 indirectly via the bundled `uno-cli/bin/uno.py` script and never reads, prints, or transmits the credentials file directly.\"\n    config_paths:\n      - ~/.clawdchat/credentials.json (read-only, owned by uno-cli)\n    network_endpoints:\n      - \"ClawdChat tool gateway (HTTPS, via uno-cli) — receives the prompt and reference-image URLs\"\n    write_actions:\n      - \"Submits paid image-generation jobs (300 credits per submit). Each call deducts ClawdChat credits from the logged-in account.\"\n      - \"Writes no local files. Generated image URLs are returned in the response; the agent decides whether to download them.\"\n    cost:\n      gpt_image2_submit: \"300 credits per call\"\n      gpt_image2_result: \"0 credits per call\"\n  openclaw:\n    skills: [\"uno-cli\"]\n---\n\n# GPT Image 2 — High-quality AI image generation\n\n> Powered by ClawdChat — calls OpenAI `gpt-image-2` through the Uno tool gateway.\n\n## What this skill does\n\nTwo thin command-line invocations against the public ClawdChat tool gateway:\n\n| Tool slug | Purpose | Cost |\n|---|---|---|\n| `gpt-image-2.gpt_image2_submit` | Submit a generation job, returns `job_id` immediately (async) | **300 credits / call** |\n| `gpt-image-2.gpt_image2_result` | Poll job status / fetch image URL when ready | 0 credits |\n\nThis skill ships **no local Python code**. It defers all credential, transport and rate-limit handling to the `uno-cli` companion skill.\n\n## Credentials & permissions (read before first use)\n\n- **Credential type**: ClawdChat API key (Bearer token).\n- **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.\n- **How it was obtained**: the user runs `python ../uno-cli/bin/uno.py login`, which kicks off a ClawdChat OAuth device-code flow on https://clawdchat.cn and stores the resulting token.\n- **What it authorises**: calling the ClawdChat tool gateway as the logged-in user. Each `gpt_image2_submit` deducts 300 credits from that account.\n- **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.**\n- **Logging out / revoking**: run `python ../uno-cli/bin/uno.py logout` (managed by `uno-cli`).\n\n## Cost transparency & confirmation rule\n\nEvery `gpt_image2_submit` call costs the logged-in account real credits. The agent **must**:\n\n1. Show the user the planned prompt, size, style, and number of images **before** the first call.\n2. Ask for explicit confirmation when the user has not already approved a generation in the current turn.\n3. 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.\n4. On `error` responses, surface the error to the user instead of silently retrying.\n\nPolling via `gpt_image2_result` is free; only `submit` spends credits.\n\n## Setup\n\nThis skill is a thin wrapper around the **`uno-cli`** companion skill, which ships the actual Python CLI (`bin/uno.py`).\n\n### 1. Install `uno-cli` explicitly\n\nThe current `clawhub install` does **not** auto-cascade `metadata.openclaw.skills` dependencies, so you must install it yourself:\n\n```bash\nclawhub install uno-cli\n```\n\nAfter both skills are installed, the layout is:\n\n```text\n<skills-root>/\n├── gpt-image2/\n│   └── SKILL.md\n└── uno-cli/\n    ├── SKILL.md\n    └── bin/uno.py        # the actual CLI\n```\n\nFrom this skill's folder, the CLI is therefore reachable at the **relative** path `../uno-cli/bin/uno.py`. All examples below use that path verbatim.\n\n### 2. Log in once\n\n```bash\npython ../uno-cli/bin/uno.py login\n```\n\nThe login flow, credential storage and refresh are entirely handled by `uno-cli`.\n\n### Why not call a global `uno` command?\n\nDon't rely on a `uno` binary in `PATH`. On many systems (notably macOS with LibreOffice installed) `/opt/homebrew/bin/uno` is the **LibreOffice UNO bridge**, an unrelated Mach-O binary — invoking it will produce confusing C++ errors. Always invoke `python ../uno-cli/bin/uno.py …` (or an explicit absolute path), or set up your own alias / symlink that you control.\n\nIf `python` resolves to Python 2 on the host, use `python3` instead.\n\n## Generating an image — full async flow\n\nA single 1024×1024 image typically takes **~150 s**, longer than the default MCP 60 s timeout. Always use the **submit → poll-result** pattern.\n\n### Step 1 — submit\n\n```bash\npython ../uno-cli/bin/uno.py call gpt-image-2.gpt_image2_submit --compact \\\n  --args '{\"prompt\":\"A shiba inu under cherry blossoms, sunny afternoon\",\"size\":\"1024x1024\",\"style\":\"ghibli_anime\"}'\n```\n\nResponse (already flattened by `uno-cli` — no need to unwrap `content[0].text`):\n\n```json\n{\"success\": true, \"data\": {\"status\": \"pending\", \"job_id\": \"0b84b8f0f0c8\", \"estimated_seconds\": 150}, \"meta\": {\"latency_ms\": 120, \"credits_used\": 300}}\n```\n\nRecord `data.job_id`.\n\n### Step 2 — poll for result\n\n```bash\npython ../uno-cli/bin/uno.py call gpt-image-2.gpt_image2_result --compact --timeout 70 \\\n  --args '{\"job_id\":\"0b84b8f0f0c8\",\"wait_seconds\":50}'\n```\n\n`wait_seconds=50` makes the server-side wait 50 s (within the 60 s MCP envelope); `--timeout 70` adds a small client buffer.\n\nRepeat the call until `data.status` is one of:\n\n- `done` — image ready, URLs in `data.items[].url`.\n- `error` — generation failed, message in `data.error`.\n- `pending` / `running` — call again immediately. **Do not add a client-side sleep**; the server already waited 50 s on your behalf.\n\nThree to five iterations (~150–250 s total) is normal.\n\n### Reference shell loop\n\n```bash\nUNO=../uno-cli/bin/uno.py\n\nRESP=$(python \"$UNO\" call gpt-image-2.gpt_image2_submit --compact \\\n  --args '{\"prompt\":\"Van Gogh starry night\",\"style\":\"oil_painting_vangogh\"}')\nJOB_ID=$(echo \"$RESP\" | python3 -c \"import json,sys; print(json.load(sys.stdin)['data']['job_id'])\")\n\nfor i in 1 2 3 4 5 6; do\n  R=$(python \"$UNO\" call gpt-image-2.gpt_image2_result --compact --timeout 70 \\\n    --args \"{\\\"job_id\\\":\\\"$JOB_ID\\\",\\\"wait_seconds\\\":50}\")\n  STATUS=$(echo \"$R\" | python3 -c \"import json,sys; print(json.load(sys.stdin)['data']['status'])\")\n  [ \"$STATUS\" = \"done\" ]  && echo \"$R\" && break\n  [ \"$STATUS\" = \"error\" ] && echo \"$R\" && exit 1\ndone\n```\n\n## Parameters\n\n| Field | Meaning | Values |\n|---|---|---|\n| `prompt` | Image description (required, any language) | free text |\n| `size` | Image dimensions | `1024x1024` (default), `1024x1536` (portrait), `1536x1024` (landscape), `auto` |\n| `n` | Number of images to generate | 1–4 (default 1) |\n| `style` | Built-in style preset | one of the 20 keys below |\n| `reference_image_urls` | Reference images (image-to-image) | URL string, comma-separated for multiple |\n\n## 20 built-in style presets\n\n| key | description |\n|---|---|\n| `ghibli_anime` | Studio Ghibli / hand-drawn anime |\n| `pixar_3d` | Pixar / Disney 3D animation |\n| `claymation` | Stop-motion claymation (Laika / Aardman) |\n| `lego_brick` | LEGO bricks |\n| `popmart_figurine` | Blind-box / Pop Mart figurine |\n| `isometric_game` | Isometric 2.5D game scene |\n| `cinematic_photo` | Cinematic photorealism (35mm) |\n| `polaroid_film` | Polaroid film snapshot |\n| `watercolor_ink` | Watercolour / East-Asian ink wash |\n| `oil_painting_vangogh` | Van Gogh impasto oil painting |\n| `cyberpunk_neon` | Cyberpunk neon nightscape |\n| `vintage_infographic` | Retro infographic / data poster |\n| `movie_poster` | Movie poster (large title + still) |\n| `flat_vector` | Flat-vector illustration / banner |\n| `pixel_8bit` | Pixel art (8/16-bit) |\n| `papercraft_layered` | Layered papercraft |\n| `exploded_diagram` | Exploded technical diagram |\n| `dreamcore_liminal` | Dreamcore / liminal space |\n| `knolling_flatlay` | Top-down knolling / flat-lay |\n| `botanical_engraving` | Botanical engraving / antique illustration |\n\n## Where this model shines (vs Midjourney / Flux / SD)\n\n- **Accurate text rendering** — poster headlines, infographics, menu typography, meme captions: written into the image as specified.\n- **Strong prompt following** — multi-element scenes, ordering and spatial relationships obeyed.\n- **Subject preservation in image-to-image** — faces, brands, and characters stay consistent across reference images.\n- **Wide style coverage** — Ghibli, Pixar, claymation, LEGO, Pop Mart, botanical engraving etc. all handled.\n\n## Agent guidance\n\n- Tell the user up-front that one image takes ~150 s.\n- The `gpt_image2_result` tool already sleeps 50 s server-side — never add an extra client-side sleep between polls.\n- Use `--timeout 70` for `result` calls (50 s server wait + buffer).\n- Pass the user's prompt verbatim, including non-English text.\n- Reference images: combine `reference_image_urls` with a `style` preset for \"restyle while keeping the subject\".\n- Posters / infographics / menus: lean on the text-rendering strength.\n- If `submit` returns `success=false`, surface the `error`/`hint` fields to the user.\n- 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`.\n\n## Response shape\n\nAlready flattened by `uno-cli`:\n\n```json\n{\n  \"success\": true,\n  \"data\": {\"status\": \"...\", \"job_id\": \"...\", \"items\": [{\"url\": \"...\"}]},\n  \"meta\": {\"latency_ms\": 120, \"credits_used\": 300}\n}\n```\n\nRead `data.status`, `data.job_id`, `data.items[].url` directly.\n\nErrors:\n\n```json\n{\"success\": false, \"error\": \"...\", \"hint\": \"...\"}\n```\n\nFile v0.2.0:_meta.json\n\n{\n  \"ownerId\": \"kn77e6kfs6str7h1kk3zmxkmmd80b4bb\",\n  \"slug\": \"gpt-image2\",\n  \"version\": \"0.2.0\",\n  \"publishedAt\": 1777555701771\n}\n\nArchive v0.1.0: 2 files, 4785 bytes\n\nFiles: SKILL.md (9844b), _meta.json (129b)\n\nFile v0.1.0:SKILL.md\n\n---\nname: gpt-image2\ndescription: \"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.\"\nhomepage: https://clawdchat.cn\nmetadata:\n  emoji: \"🖼️\"\n  category: creative\n  version: \"0.1.0\"\n  language: en\n  publisher: clawdchat\n  requires:\n    primary_credential:\n      type: clawdchat_api_key\n      managed_by: uno-cli skill\n      stored_at: ~/.clawdchat/credentials.json\n      obtained_via: interactive `uno login` command (delegates to ClawdChat OAuth, see https://clawdchat.cn)\n      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.\"\n    config_paths:\n      - ~/.clawdchat/credentials.json (read-only, owned by uno-cli)\n    network_endpoints:\n      - \"ClawdChat tool gateway (HTTPS, via uno-cli) — receives the prompt and reference-image URLs\"\n    write_actions:\n      - \"Submits paid image-generation jobs (300 credits per submit). Each call deducts ClawdChat credits from the logged-in account.\"\n      - \"Writes no local files. Generated image URLs are returned in the response; the agent decides whether to download them.\"\n    cost:\n      gpt_image2_submit: \"300 credits per call\"\n      gpt_image2_result: \"0 credits per call\"\n  openclaw:\n    requires:\n      bins: [\"uno\"]\n    skills: [\"uno-cli\"]\n---\n\n# GPT Image 2 — High-quality AI image generation\n\n> Powered by ClawdChat — calls OpenAI `gpt-image-2` through the Uno tool gateway.\n\n## What this skill does\n\nTwo thin command-line invocations against the public ClawdChat tool gateway:\n\n| Tool slug | Purpose | Cost |\n|---|---|---|\n| `gpt-image-2.gpt_image2_submit` | Submit a generation job, returns `job_id` immediately (async) | **300 credits / call** |\n| `gpt-image-2.gpt_image2_result` | Poll job status / fetch image URL when ready | 0 credits |\n\nThis skill ships **no local Python code**. It defers all credential, transport and rate-limit handling to the `uno-cli` companion skill.\n\n## Credentials & permissions (please read before first use)\n\n- **Credential type**: ClawdChat API key (Bearer token).\n- **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.\n- **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.\n- **What it authorises**: calling the ClawdChat tool gateway as the logged-in user. Each `gpt_image2_submit` deducts 300 credits from that account.\n- **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.**\n- **Logging out / revoking**: run `uno logout` (managed by `uno-cli`).\n\n## Cost transparency & confirmation rule\n\nEvery `gpt_image2_submit` call costs the logged-in account real credits. The agent **must**:\n\n1. Show the user the planned prompt, size, style, and number of images **before** the first call.\n2. Ask for explicit confirmation when the user has not already approved a generation in the current turn.\n3. 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.\n4. On `error` responses, surface the error to the user instead of silently retrying.\n\nPolling via `gpt_image2_result` is free; only `submit` spends credits.\n\n## Setup\n\nThis skill depends on the `uno-cli` skill (declared in `metadata.openclaw.skills`).\n\n1. Install `uno-cli` (skipping if already installed):\n\n   ```bash\n   clawhub install uno-cli\n   ```\n\n   On platforms that honour `metadata.openclaw.skills`, this dependency is installed automatically when this skill is installed.\n\n2. Log in once:\n\n   ```bash\n   uno login\n   ```\n\n   The login flow, credential storage, and refresh are entirely handled by `uno-cli`. This skill only invokes `uno call ...` afterwards.\n\n> If `uno` is not on `PATH`, replace it in the examples below with `python /path/to/uno-cli/bin/uno.py`.\n\n## Generating an image — full async flow\n\nA single 1024×1024 image typically takes **~150 s**, longer than the default MCP 60 s timeout. Always use the **submit → poll-result** pattern.\n\n### Step 1 — submit\n\n```bash\nuno call gpt-image-2.gpt_image2_submit --compact \\\n  --args '{\"prompt\":\"A shiba inu under cherry blossoms, sunny afternoon\",\"size\":\"1024x1024\",\"style\":\"ghibli_anime\"}'\n```\n\nResponse (already flattened by `uno-cli` — no need to unwrap `content[0].text`):\n\n```json\n{\"success\": true, \"data\": {\"status\": \"pending\", \"job_id\": \"0b84b8f0f0c8\", \"estimated_seconds\": 150}, \"meta\": {\"latency_ms\": 120, \"credits_used\": 300}}\n```\n\nRecord `data.job_id`.\n\n### Step 2 — poll for result\n\n```bash\nuno call gpt-image-2.gpt_image2_result --compact --timeout 70 \\\n  --args '{\"job_id\":\"0b84b8f0f0c8\",\"wait_seconds\":50}'\n```\n\n`wait_seconds=50` makes the server-side wait 50 s (within the 60 s MCP envelope); `--timeout 70` adds a small client buffer.\n\nRepeat the call until `data.status` is one of:\n\n- `done` — image ready, URLs in `data.items[].url`.\n- `error` — generation failed, message in `data.error`.\n- `pending` / `running` — call again immediately. **Do not add a client-side sleep**; the server already waited 50 s on your behalf.\n\nThree to five iterations (~150–250 s total) is normal.\n\n### Reference shell loop\n\n```bash\nRESP=$(uno call gpt-image-2.gpt_image2_submit --compact \\\n  --args '{\"prompt\":\"Van Gogh starry night\",\"style\":\"oil_painting_vangogh\"}')\nJOB_ID=$(echo \"$RESP\" | python3 -c \"import json,sys; print(json.load(sys.stdin)['data']['job_id'])\")\n\nfor i in 1 2 3 4 5 6; do\n  R=$(uno call gpt-image-2.gpt_image2_result --compact --timeout 70 \\\n    --args \"{\\\"job_id\\\":\\\"$JOB_ID\\\",\\\"wait_seconds\\\":50}\")\n  STATUS=$(echo \"$R\" | python3 -c \"import json,sys; print(json.load(sys.stdin)['data']['status'])\")\n  [ \"$STATUS\" = \"done\" ]  && echo \"$R\" && break\n  [ \"$STATUS\" = \"error\" ] && echo \"$R\" && exit 1\ndone\n```\n\n## Parameters\n\n| Field | Meaning | Values |\n|---|---|---|\n| `prompt` | Image description (required, any language) | free text |\n| `size` | Image dimensions | `1024x1024` (default), `1024x1536` (portrait), `1536x1024` (landscape), `auto` |\n| `n` | Number of images to generate | 1–4 (default 1) |\n| `style` | Built-in style preset | one of the 20 keys below |\n| `reference_image_urls` | Reference images (image-to-image) | URL string, comma-separated for multiple |\n\n## 20 built-in style presets\n\n| key | description |\n|---|---|\n| `ghibli_anime` | Studio Ghibli / hand-drawn anime |\n| `pixar_3d` | Pixar / Disney 3D animation |\n| `claymation` | Stop-motion claymation (Laika / Aardman) |\n| `lego_brick` | LEGO bricks |\n| `popmart_figurine` | Blind-box / Pop Mart figurine |\n| `isometric_game` | Isometric 2.5D game scene |\n| `cinematic_photo` | Cinematic photorealism (35mm) |\n| `polaroid_film` | Polaroid film snapshot |\n| `watercolor_ink` | Watercolour / East-Asian ink wash |\n| `oil_painting_vangogh` | Van Gogh impasto oil painting |\n| `cyberpunk_neon` | Cyberpunk neon nightscape |\n| `vintage_infographic` | Retro infographic / data poster |\n| `movie_poster` | Movie poster (large title + still) |\n| `flat_vector` | Flat-vector illustration / banner |\n| `pixel_8bit` | Pixel art (8/16-bit) |\n| `papercraft_layered` | Layered papercraft |\n| `exploded_diagram` | Exploded technical diagram |\n| `dreamcore_liminal` | Dreamcore / liminal space |\n| `knolling_flatlay` | Top-down knolling / flat-lay |\n| `botanical_engraving` | Botanical engraving / antique illustration |\n\n## Where this model shines (vs Midjourney / Flux / SD)\n\n- **Accurate text rendering** — poster headlines, infographics, menu typography, meme captions: written into the image as specified.\n- **Strong prompt following** — multi-element scenes, ordering and spatial relationships obeyed.\n- **Subject preservation in image-to-image** — faces, brands, and characters stay consistent across reference images.\n- **Wide style coverage** — Ghibli, Pixar, claymation, LEGO, Pop Mart, botanical engraving etc. all handled.\n\n## Agent guidance\n\n- Tell the user up-front that one image takes ~150 s.\n- The `gpt_image2_result` tool already sleeps 50 s server-side — never add an extra client-side sleep between polls.\n- Use `--timeout 70` for `result` calls (50 s server wait + buffer).\n- Pass the user's prompt verbatim, including non-English text.\n- Reference images: combine `reference_image_urls` with a `style` preset for \"restyle while keeping the subject\".\n- Posters / infographics / menus: lean on the text-rendering strength.\n- If `submit` returns `success=false`, surface the `error`/`hint` fields to the user.\n- 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`.\n\n## Response shape\n\nAlready flattened by `uno-cli`:\n\n```json\n{\n  \"success\": true,\n  \"data\": {\"status\": \"...\", \"job_id\": \"...\", \"items\": [{\"url\": \"...\"}]},\n  \"meta\": {\"latency_ms\": 120, \"credits_used\": 300}\n}\n```\n\nRead `data.status`, `data.job_id`, `data.items[].url` directly.\n\nErrors:\n\n```json\n{\"success\": false, \"error\": \"...\", \"hint\": \"...\"}\n```\n\nFile v0.1.0:_meta.json\n\n{\n  \"ownerId\": \"kn77e6kfs6str7h1kk3zmxkmmd80b4bb\",\n  \"slug\": \"gpt-image2\",\n  \"version\": \"0.1.0\",\n  \"publishedAt\": 1777554258059\n}","readmeExcerpt":"Skill: Gpt Image2 Owner: lxyd-ai Summary: 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... Tags: latest:0.5.0 Version history: v0.5.0 | 2026-05-01T14:32:24.929Z | user Refactor bin/uno.py into a 56-line launcher that delegates to the new uno-cli>=1.0.0 PyPI package. The launcher pins UNO_OAUTH_SCOPE=mcp:gpt","codeSnippets":[],"executableExamples":[{"language":"bash","snippet":"clawhub install uno-cli"},{"language":"bash","snippet":"uno login"},{"language":"bash","snippet":"uno call gpt-image-2.gpt_image2_submit --compact \\\n  --args '{\"prompt\":\"A shiba inu under cherry blossoms, sunny afternoon\",\"size\":\"1024x1024\",\"style\":\"ghibli_anime\"}'"},{"language":"json","snippet":"{\"success\": true, \"data\": {\"status\": \"pending\", \"job_id\": \"0b84b8f0f0c8\", \"estimated_seconds\": 150}, \"meta\": {\"latency_ms\": 120, \"credits_used\": 300}}"},{"language":"bash","snippet":"uno call gpt-image-2.gpt_image2_result --compact --timeout 70 \\\n  --args '{\"job_id\":\"0b84b8f0f0c8\",\"wait_seconds\":50}'"},{"language":"bash","snippet":"RESP=$(uno call gpt-image-2.gpt_image2_submit --compact \\\n  --args '{\"prompt\":\"Van Gogh starry night\",\"style\":\"oil_painting_vangogh\"}')\nJOB_ID=$(echo \"$RESP\" | python3 -c \"import json,sys; print(json.load(sys.stdin)['data']['job_id'])\")\n\nfor i in 1 2 3 4 5 6; do\n  R=$(uno call gpt-image-2.gpt_image2_result --compact --timeout 70 \\\n    --args \"{\\\"job_id\\\":\\\"$JOB_ID\\\",\\\"wait_seconds\\\":50}\")\n  STATUS=$(echo \"$R\" | python3 -c \"import json,sys; print(json.load(sys.stdin)['data']['status'])\")\n  [ \"$STATUS\" = \"done\" ]  && echo \"$R\" && break\n  [ \"$STATUS\" = \"error\" ] && echo \"$R\" && exit 1\ndone"}],"parameters":null,"dependencies":[],"permissions":[],"extractedFiles":[{"path":"SKILL.md","content":"---\nname: gpt-image2\ndescription: \"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.\"\nhomepage: https://clawdchat.cn\nmetadata:\n  emoji: \"🖼️\"\n  category: creative\n  version: \"0.1.0\"\n  language: en\n  publisher: clawdchat\n  requires:\n    primary_credential:\n      type: clawdchat_api_key\n      managed_by: uno-cli skill\n      stored_at: ~/.clawdchat/credentials.json\n      obtained_via: interactive `uno login` command (delegates to ClawdChat OAuth, see https://clawdchat.cn)\n      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.\"\n    config_paths:\n      - ~/.clawdchat/credentials.json (read-only, owned by uno-cli)\n    network_endpoints:\n      - \"ClawdChat tool gateway (HTTPS, via uno-cli) — receives the prompt and reference-image URLs\"\n    write_actions:\n      - \"Submits paid image-generation jobs (300 credits per submit). Each call deducts ClawdChat credits from the logged-in account.\"\n      - \"Writes no local files. Generated image URLs are returned in the response; the agent decides whether to download them.\"\n    cost:\n      gpt_image2_submit: \"300 credits per call\"\n      gpt_image2_result: \"0 credits per call\"\n  openclaw:\n    requires:\n      bins: [\"uno\"]\n    skills: [\"uno-cli\"]\n---\n\n# GPT Image 2 — High-quality AI image generation\n\n> Powered by ClawdChat — calls OpenAI `gpt-image-2` through the Uno tool gateway.\n\n## What this skill does\n\nTwo thin command-line invocations against the public ClawdChat tool gateway:\n\n| Tool slug | Purpose | Cost |\n|---|---|---|\n| `gpt-image-2.gpt_image2_submit` | Submit a generation job, returns `job_id` immediately (async) | **300 credits / call** |\n| `gpt-image-2.gpt_image2_result` | Poll job status / fetch image URL when ready | 0 credits |\n\nThis skill ships **no local Python code**. It defers all credential, transport and rate-limit handling to the `uno-cli` companion skill.\n\n## Credentials & permissions (please read before first use)\n\n- **Credential type**: ClawdChat API key (Bearer token).\n- **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.\n- **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.\n- **What it authorises**: calling the ClawdChat tool gateway as the logged-in user. Each `gpt_image2_submit"},{"path":"_meta.json","content":"{\n  \"ownerId\": \"kn77e6kfs6str7h1kk3zmxkmmd80b4bb\",\n  \"slug\": \"gpt-image2\",\n  \"version\": \"0.5.0\",\n  \"publishedAt\": 1777645944929\n}"},{"path":"skill-card.md","content":"## Description:\n\nGenerate images with OpenAI gpt-image-2 through the ClawdChat gateway, including text-heavy designs, multi-element prompts, image-to-image workflows, and preset visual styles.\n\nThis skill is ready for commercial/non-commercial use.\n\n## Publisher:\n\n[lxyd-ai](https://clawhub.ai/user/lxyd-ai)\n\n### License/Terms of Use:\n\nMIT-0\n\n## Use Case:\n\nExternal users and developers use this skill to ask an agent to submit and poll paid image-generation jobs through ClawdChat, then return generated image URLs and status details.\n\n### Deployment Geography for Use:\n\nGlobal\n\n## Known Risks and Mitigations:\n\nRisk: Image-generation submissions spend 300 ClawdChat credits per call.\n\nMitigation: Confirm the prompt, size, style, image count, and expected credit cost before each paid submit call.\n\nRisk: Prompts and reference-image URLs are sent to the external ClawdChat gateway.\n\nMitigation: Do not submit confidential prompts, personal data, or sensitive signed reference-image URLs unless the user accepts that external processing.\n\nRisk: The uno-cli dependency is part of the trust boundary and is not pinned to an exact package version in the release evidence.\n\nMitigation: Review and approve the installed uno-cli version before using the skill in controlled environments.\n\n## Reference(s):\n\n- [Gpt Image2 Skill Page](https://clawhub.ai/lxyd-ai/skills/gpt-image2)\n- [ClawdChat](https://clawdchat.cn)\n\n## Skill Output:\n\n**Output Type(s):** [Text, Markdown, Shell commands, Configuration, Guidance]\n\n**Output Format:** [Markdown guidance with inline shell commands and JSON response examples]\n\n**Output Parameters:** [1D]\n\n**Other Properties Related to Output:** [Returns job status, job IDs, generated image URLs, errors, and cost metadata from the gateway.]\n\n## Skill Version(s):\n\n0.5.0 (source: server release metadata; artifact frontmatter lists 0.1.0)\n\n## Ethical Considerations:\n\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment."}],"languages":[],"docsSourceLabel":"CLAWHUB","editorialOverview":"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... Skill: Gpt Image2 Owner: lxyd-ai Summary: 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... Tags: latest:0.5.0 Version history: v0.5.0 | 2026-05-01T14:32:24.929Z | user Refactor bin/uno.py into a 56-line launcher that delegates to the new uno-cli>=1.0.0 PyPI package. The launcher pins UNO_OAUTH_SCOPE=mcp:gpt","editorialQuality":{"score":100,"threshold":65,"status":"ready","wordCount":1320,"uniquenessScore":48,"reasons":[]}},"media":{"evidence":{"source":"no-media","verified":false,"confidence":"low","updatedAt":"2026-10-11T19:42:31.579Z","emptyReason":"No screenshots, media assets, or demo links are available."},"primaryImageUrl":null,"mediaAssetCount":0,"assets":[],"demoUrl":null},"ownerResources":{"evidence":{"source":"unclaimed","verified":false,"confidence":"low","updatedAt":"2026-10-11T19:42:31.579Z","emptyReason":"This page has not been claimed by the agent owner."},"hasCustomPage":false,"customPageUpdatedAt":null,"customLinks":[],"structuredLinks":{"docsUrl":null,"demoUrl":null,"supportUrl":null,"pricingUrl":null,"statusUrl":null},"customPage":null},"relatedAgents":{"evidence":{"source":"protocol-neighbors","verified":false,"confidence":"medium","updatedAt":"2026-10-12T13:02:53.522Z","emptyReason":null},"items":[{"id":"8ebccd8e-3863-4187-8355-c3f14e1f9edf","entityType":"agent","canonicalPath":"/agent/iofficeai-aionui","slug":"iofficeai-aionui","name":"AionUi","description":"Free, local, open-source 24/7 Cowork app and OpenClaw for Gemini CLI, Claude Code, Codex, OpenCode, Qwen Code, Goose CLI, Auggie, and more | 🌟 Star if you like it!","url":"https://github.com/iOfficeAI/AionUi","homepage":"https://www.aionui.com","source":"GITHUB_REPOS","protocols":["MCP","OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-10-09T19:11:12.944Z","createdAt":"2026-02-25T03:38:16.584Z","downloads":null},{"id":"b917f68a-ebff-438e-84f8-3f4b2494c0bc","entityType":"agent","canonicalPath":"/agent/activepieces-activepieces","slug":"activepieces-activepieces","name":"activepieces","description":"AI Agents & MCPs & AI Workflow Automation • (~400 MCP servers for AI agents) • AI Automation / AI Agent with MCPs • AI Workflows & AI Agents • MCPs for AI Agents","url":"https://github.com/activepieces/activepieces","homepage":"https://www.activepieces.com","source":"GITHUB_REPOS","protocols":["OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-04-15T02:22:12.426Z","createdAt":"2026-02-25T03:38:12.412Z","downloads":null},{"id":"5cb26759-3a39-483f-94cf-276a98c13bb8","entityType":"agent","canonicalPath":"/agent/cherryhq-cherry-studio","slug":"cherryhq-cherry-studio","name":"cherry-studio","description":"AI productivity studio with smart chat, autonomous agents, and 300+ assistants. Unified access to frontier LLMs","url":"https://github.com/CherryHQ/cherry-studio","homepage":"https://cherry-ai.com","source":"GITHUB_REPOS","protocols":["MCP","OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-04-11T14:38:40.986Z","createdAt":"2026-02-25T03:38:19.379Z","downloads":null},{"id":"6f6582d0-5d76-4f0f-b81d-86520247950b","entityType":"agent","canonicalPath":"/agent/copilotkit-copilotkit","slug":"copilotkit-copilotkit","name":"CopilotKit","description":"The Frontend for Agents & Generative UI. React + Angular","url":"https://github.com/CopilotKit/CopilotKit","homepage":"https://docs.copilotkit.ai","source":"GITHUB_REPOS","protocols":["OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-03-25T09:50:57.846Z","createdAt":"2026-02-25T03:39:14.617Z","downloads":null}],"links":{"hub":"/agent","source":"/agent/source/clawhub","protocols":[{"label":"OpenClaw","href":"/agent/protocol/openclew"}]}}}