|
| 1 | +--- |
| 2 | +name: codex-imagegen |
| 3 | +description: Generate an image and write it to a local file by delegating to the Codex CLI agent, which calls OpenAI's images API (gpt-image-1) and saves the result. Use when the user asks for an image to be created/drawn/generated AND saved to a path (e.g. "幫我生一張戴墨鏡的柴犬,存成 tmp/shiba.png", "draw me X and save to images/y.png", "用 codex 生圖"). Requires `codex login` AND `$OPENAI_API_KEY` set in the environment. |
| 4 | +--- |
| 5 | + |
| 6 | +# codex-imagegen |
| 7 | + |
| 8 | +## Overview |
| 9 | + |
| 10 | +This skill drives the Codex CLI agent (`codex exec`) and asks it to produce a PNG at a path the caller chooses. On this machine the agent does **not** invoke a built-in `image_generation` tool — instead it shells out to `https://api.openai.com/v1/images/generations` with model `gpt-image-1`, base64-decodes the response, and writes the PNG. The wrapper handles the friction: companion-env interception, sandbox/network confinement, path resolution, output verification. |
| 11 | + |
| 12 | +## When to use |
| 13 | + |
| 14 | +Trigger when the user's request has both: |
| 15 | +1. An image-generation intent — "生圖 / 畫一張 / generate / draw / create an image of …", and |
| 16 | +2. A target file path — "存成 X.png", "save to X.png", or an output directory. |
| 17 | + |
| 18 | +If only (1) is present, ask for the path before proceeding. |
| 19 | + |
| 20 | +## How to use |
| 21 | + |
| 22 | +Run the bundled script. It takes the output path as the first argument and the description as the rest: |
| 23 | + |
| 24 | +```bash |
| 25 | +bash {SKILL_DIR}/scripts/imagegen.sh <output-path> <description...> |
| 26 | +``` |
| 27 | + |
| 28 | +`{SKILL_DIR}` is this skill's folder. From inside Claude Code use the absolute path |
| 29 | +`/Users/htlin/.claude/skills/codex-imagegen/scripts/imagegen.sh` (or the dotfiles |
| 30 | +source `/Users/htlin/.dotfiles/claude.symlink/skills/codex-imagegen/scripts/imagegen.sh`). |
| 31 | + |
| 32 | +The script: |
| 33 | +- Errors out if `codex` is missing or `codex login status` does not say "Logged in". |
| 34 | +- Resolves a relative output path against the current working directory and `mkdir -p` the parent. |
| 35 | +- Calls `codex exec -C "$(pwd)" -s workspace-write --skip-git-repo-check` with a Chinese prompt that instructs codex to use the image generation tool and save to the absolute output path. |
| 36 | +- Fails (exit 1) if no file was written, otherwise prints `wrote <path> (<bytes> bytes)`. |
| 37 | + |
| 38 | +## Smoke test |
| 39 | + |
| 40 | +The canonical smoke test from the article: |
| 41 | + |
| 42 | +```bash |
| 43 | +bash /Users/htlin/.claude/skills/codex-imagegen/scripts/imagegen.sh tmp/shiba.png 戴墨鏡的柴犬 |
| 44 | +``` |
| 45 | + |
| 46 | +Expected: a PNG (~1–3 MB, ~1024px square or larger) at `tmp/shiba.png` and a final line `wrote /…/tmp/shiba.png (<bytes> bytes)`. |
| 47 | + |
| 48 | +## Notes |
| 49 | + |
| 50 | +Things the wrapper does that aren't obvious from the article: |
| 51 | + |
| 52 | +- **Strips `CODEX_COMPANION_SESSION_ID` and `CLAUDE_PLUGIN_DATA`.** When this skill runs from inside Claude Code, those env vars are inherited from the Codex Companion plugin. Left alone, the companion intercepts `codex exec` and pipes the existing companion-session prompt into it (you'll see `user / reply with ok` in the codex log). Unsetting both forces a fresh exec. |
| 53 | +- **Uses `--dangerously-bypass-approvals-and-sandbox`.** The article uses `-s workspace-write`, but on this machine the codex agent does not have a built-in image_generation tool and instead `curl`s `https://api.openai.com/v1/images/generations` itself. `workspace-write` blocks that egress, so the agent gives up after exploration. Full bypass lets it through. |
| 54 | +- **Requires `$OPENAI_API_KEY`.** Despite the article's "ChatGPT login is enough" claim, the agent on this machine reads `$OPENAI_API_KEY` directly. The wrapper warns (does not abort) when missing, in case the user is running in a session where ChatGPT auth does work. |
| 55 | +- **Verifies the file landed.** Codex sometimes claims success without writing — the wrapper exits non-zero unless the target file exists and is non-empty. |
| 56 | +- First image-gen run can take 30–60 s; later runs are faster. |
0 commit comments