Skip to content
AI & Agents
Skill

/gpt-image

Generate or edit images via GPT Image 2.5 Flare or Sunburst through DroidProxy Codex OAuth (no OPENAI_API_KEY). Use when the user asks to generate, create, draw, or edit an image with GPT, OpenAI, Codex, gpt-image, or DALL-E, including transparent PNGs, and DroidProxy Codex

BOOST
From plugin
droidproxy
1233 skills
Install
$ npx -y skills add nikships/droidproxy --skill gpt-image --agent claude-code

How it fires

How this skill gets triggered: by you, by Claude, or both.

  • Fires itselfAuto-invocation. Claude auto-loads it when your prompt matches the work.Auto-invocation is when the right skill fires by itself at the right moment, driven by a FLOW.md router and a hook, instead of you invoking it by name. It is the difference between a skill being installed and a skill actually getting used.Read the full definition →
  • You can call itInvoke it directly when you want it.
  • Slash command/gpt-image

Context preview

The summary Claude sees to decide when to auto-load this skill.

Generate or edit images via GPT Image 2.5 Flare or Sunburst through DroidProxy Codex OAuth (no OPENAI_API_KEY). Use when the user asks to generate, create, draw, or edit an image with GPT, OpenAI, Codex, gpt-image, or DALL-E, including transparent PNGs, and DroidProxy Codex

SKILL.md

gpt-image.SKILL.md
name: gpt-image
version: 2.0.0
description: |
  Generate or edit images via GPT Image 2.5 Flare or Sunburst through
  DroidProxy Codex OAuth (no OPENAI_API_KEY). Use when the user asks to
  generate, create, draw, or edit an image with GPT, OpenAI, Codex,
  gpt-image, or DALL-E, including transparent PNGs, and DroidProxy Codex
  OAuth is available. Prefer this over inventing image URLs or base64. If
  they name Grok or Imagine, use grok-imagine instead.

GPT Image 2.5 (via DroidProxy Codex)

POST `http://localhost:8317/v1/images/generations` (or `/edits`) with `Authorization: Bearer dummy-not-used`. Send only `gpt-image-2.5-flare` or `gpt-image-2.5-sunburst`. Never send an older image model, a dated snapshot, or a chat id (`gpt-*` without `image`). Never use an `OPENAI_API_KEY`. Chat models on `:8317` do not generate images.

Default to **Flare** for fast, high-quality everyday generation. Use **Sunburst** when the user prioritizes demanding quality, editing precision, or subject preservation over latency. If Sunburst meets the requirements, prefer Flare only after it produces acceptable results on the same prompt, references, dimensions, and quality setting.

Use this for generating or editing visual assets, not for understanding an image the user already attached.

Generate

Requests often take 15–70s. Use `--max-time 180`. Default `quality` to `auto`; select a higher explicit setting only to meet a quality requirement.

RESP=$(curl -sS --max-time 180 http://localhost:8317/v1/images/generations \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer dummy-not-used" \
  -d "$(jq -n --arg p "A red balloon on a wooden table, soft natural light" \
    '{model:"gpt-image-2.5-flare", prompt:$p, size:"1024x1024",
      quality:"auto"}')")

if B64=$(printf '%s' "$RESP" | jq -er '.data[0].b64_json' 2>/dev/null); then
  printf '%s' "$B64" | base64 -d > out.png
else
  printf '%s\n' "$RESP" >&2
  exit 1
fi

Check `.data[0].b64_json` before decoding. On failure print the raw body — Codex errors are JSON (`usage_limit_reached`, `auth_not_found`, `moderation_blocked`).

Edit

Same auth. JSON with a data URL — no upload step, no `file_id`. Do **not** pass the data URL through `jq --arg`: a typical generated PNG is larger than `ARG_MAX` (~1MB on macOS) and `jq` dies with `Argument list too long`. Write the data URL to a file and use `--rawfile`, then POST with `--data-binary`. Decode the same way as Generate.

SRC_FILE=$(mktemp)
REQ=$(mktemp)
printf 'data:image/png;base64,%s' "$(base64 -i ./photo.png)" > "$SRC_FILE"
jq -n --arg p "Make it blue-tinted studio lighting" --rawfile u "$SRC_FILE" \
  '{model:"gpt-image-2.5-sunburst", prompt:$p, images:[{image_url:$u}],
    quality:"auto"}' > "$REQ"

RESP=$(curl -sS --max-time 180 http://localhost:8317/v1/images/edits \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer dummy-not-used" \
  --data-binary @"$REQ")
rm -f "$SRC_FILE" "$REQ"

if B64=$(printf '%s' "$RESP" | jq -er '.data[0].b64_json' 2>/dev/null); then
  printf '%s' "$B64" | base64 -d > out.png
else
  printf '%s\n' "$RESP" >&2
  exit 1
fi

Pick the data-URL mime from the source (`image/jpeg`, `image/png`, `image/webp`). Optional `mask.image_url` (PNG with alpha) marks the region to replace. Chain edits by feeding each output back as the next `images[0].image_url`.

Prompting

If the user gives a detailed prompt or asks you to use theirs, use it verbatim. Otherwise define the intended result, then describe the subject, action/pose, setting, style, composition, lighting/mood, visible details, and constraints. For complex work, use labeled sections. Keep requirements easy to read rather than relying on special prompt syntax.

Quote required text exactly, specify its placement and typography, ask for no extra text, and verify spelling and legibility. For edits, say “change only X” and explicitly list what must stay the same. Identify each reference image by number and role (subject, style, clothing, or background). Make one change per edit and restate critical preservation constraints on every turn.

Ground named people, brands, places, and “current/latest” facts with a web search first. For a named real person, edit from a real reference photo — do not generate the likeness from text alone.

Parameters

| Field | Values | Notes | |---|---|---| | `model` | `gpt-image-2.5-flare`, `gpt-image-2.5-sunburst` | Flare by default; Sunburst for demanding quality or precise edits. No other model ids. | | `prompt` | string | Required on generate and edit. | | `size` | `auto` or `WIDTHxHEIGHT` | Each edge ≤3840 and divisible by 16; aspect ratio ≤3:1; 655,360–8,294,400 total pixels. Above 2560×1440 is experimental. | | `quality` | `auto`, `low`, `medium`, `high`, `xhigh`, `max` | Default `auto`. Compare one setting at a time; use `xhigh`/`max` only for an unmet quality requirement. Never send `hd` or `standard`. | | `n` | 1–10 | Default 1. Same-prompt variations use `n`, not parallel calls. | | `background` | `auto`, `opaque`, `transparent` | `transparent` needs `output_format` `png` or `webp`. | | `output_format` | `png`, `jpeg`, `webp` | Send `png` for transparency. | | `output_compression` | 0–100 | JPEG/WebP only. Omit unless asked. | | `images` | `[{image_url}]` | Edits only. Data URL or https URL. | | `mask` | `{image_url}` | Edits only. PNG with alpha. |

Response

{"created": 0, "background": "opaque", "data": [{"b64_json": "..."}],
 "output_format": "png", "quality": "low", "size": "1536x1024", "usage": {}}

GPT Image 2.5 always returns base64, so do not send `response_format`. `.data[0]` is only `b64_json` — no `url`, no `mime_type`. Pick the file extension from top-level `output_format` when present, otherwise from the decoded magic bytes (`PNG` / `JFIF` / `RIFF…WEBP`).

Codex OAuth often ignores `size` and sometimes `quality`. A `1024x1024` / `low` request may come back `1536x1024` / `low`, or an off-enum size li

Read more
Ships withdroidproxy

A native macOS menu bar app that proxies Claude Code, Codex, Gemini, Kimi, GitHub Copilot, Junie, and Grok authentication for use with Droids. Built on CLIProxyAPI.

Get the whole plugin
Stats
123
Stars
21
Forks
Active
Maintenance
Swift
Language
MIT
License
14h ago
Last commit
7mo ago
Created
3h ago
Added

Repo: nikships/droidproxy

Other skills on droidproxy.