
Language: 中文 | English
一个 Rust core 跑四种入口的 GPT Image 2 工具链。CLI、桌面 App、自托管 Docker Web、可安装 Skill 共用同一份 provider 适配层、透明 PNG 流水线、配置与本地历史,统一以 agent-first 的 JSON stdout + JSONL stderr 协议输出结果。
graph TB
subgraph Surfaces["四种入口"]
direction LR
CLI["CLI
gpt-image-2-skill"]
APP["Desktop App
Tauri + React"]
WEB["Self-hosted Web
Axum + React"]
SKILL["Anthropic Skill
Node wrapper"]
end
CORE["<b>gpt-image-2-core</b>
provider 适配 · 透明 PNG · 配置 · history · keyring · OAuth refresh"]
subgraph Providers["三种 provider"]
direction LR
OAI["OpenAI
gpt-image-2"]
OAC["OpenAI-compatible
--openai-api-base"]
CDX["Codex
~/.codex/auth.json"]
end
LEGACY[("$CODEX_HOME/gpt-image-2-skill/
config.json · history.sqlite · legacy jobs/")]
PRODUCT[("Product result library
App data / Docker /data/gpt-image-2/jobs")]
SKILL --> CLI
CLI --> CORE
APP --> CORE
APP -. "HTTP transport" .-> WEB
WEB --> CORE
CORE --> OAI
CORE --> OAC
CORE --> CDX
CLI --> LEGACY
SKILL --> LEGACY
APP --> PRODUCT
WEB --> PRODUCT
PRODUCT -. "read old outputs" .-> LEGACY
gpt-image-2-core 是单一权威实现:provider 路由、/images/generations 与 /images/edits multipart、Codex image_generation SSE、401 触发的 OAuth refresh、retry、config.json 解析、Keychain/file/env 三源凭据解析、SQLite history、结果存储上传、本地透明 PNG chroma + dual-background 抠图与多 profile 验证全部住在 core 里。CLI 是其薄壳,Tauri sidecar 直接复用同版本二进制,Docker Web 把 core 包成 Axum HTTP 服务,Skill 通过 Node wrapper 调到 CLI。CLI/Skill 继续使用 $CODEX_HOME/gpt-image-2-skill/;桌面 App 和 Docker Web 的新生成结果进入产品结果库,旧 jobs 目录仅作为兼容读取来源。
ok / error.code / data),进度事件以 JSONL 形式走 stderr,错误码可机读。包括 request create raw 转发出口,允许 agent 在协议没覆盖的场景下直接打 OpenAI 或 Codex 上游。OPENAI_API_KEY / OpenAI-compatible base URL / Codex auth.json 走完全相同的命令面;切 provider 不改命令形状,只换 --provider,Codex 401 自动 refresh 一次再重试。transparent generate / transparent extract / transparent verify 把 controlled-matte 生成、本地 chroma 与 dual-background 抠图、9 种 profile 化质量门绑成完整流水线;不依赖 provider native --background transparent。$CODEX_HOME/gpt-image-2-skill/jobs 的兼容读取。服务端运行时还可以把生成结果异步上传到多个存储目标,再带着 outputs[].uploads[] 触发通知。挑跟你身份相符的一条路径开始,其余命令在下面的核心能力里就近展示。
cargo install gpt-image-2-skill --locked
# 或 brew install wangnov/tap/gpt-image-2-skill
# 或 npm install --global gpt-image-2-skill
OPENAI_API_KEY=sk-... gpt-image-2-skill --json --json-events \
images generate \
--prompt "A studio product photo of a red apple on transparent background" \
--out ./apple.png \
--background transparent --format png --size 2K
--json 打印结构化结果到 stdout,--json-events 把进度事件以 JSONL 形式打到 stderr。两者独立,可单独使用。
brew install --cask wangnov/tap/gpt-image-2
或从 GitHub Releases 下载对应平台安装包。macOS DMG 通过 Developer ID 签名并完成 Apple notarization,App 内置 Tauri 自动更新器。详见桌面 App。
# 把 Skill 装到 Anthropic skills CLI / Claude Code
npx skills add https://github.com/Wangnov/gpt-image-2-skill --skill gpt-image-2-skill
# 或者起一个本地 Docker Web 服务
docker build -t gpt-image-2-web .
mkdir -p "$HOME/.local/share/gpt-image-2" \
"$HOME/.local/share/gpt-image-2-codex/gpt-image-2-skill" \
"$HOME/.codex/gpt-image-2-skill/jobs"
docker run --rm -p 8787:8787 \
-v "$HOME/.local/share/gpt-image-2:/data/gpt-image-2" \
-v "$HOME/.local/share/gpt-image-2-codex:/data/codex" \
-v "$HOME/.codex/gpt-image-2-skill/jobs:/data/codex/gpt-image-2-skill/jobs:ro" \
-v "$HOME/.codex/auth.json:/data/codex/auth.json:ro" \
gpt-image-2-web
详见 Skill 集成 和 Docker Web 自托管。
| 入口 | 安装命令 | 配置 / 数据位置 | 适用场景 |
|---|---|---|---|
| CLI (Rust binary) | cargo install gpt-image-2-skill --locked |
brew install wangnov/tap/gpt-image-2-skill
npm install -g gpt-image-2-skill
cargo binstall gpt-image-2-skill | $CODEX_HOME/gpt-image-2-skill/ | agent 直调、CI、脚本编排 |
| 桌面 App (Tauri) | brew install --cask wangnov/tap/gpt-image-2
或 GitHub Releases DMG / NSIS / AppImage / deb / rpm | 配置/历史暂用 $CODEX_HOME/gpt-image-2-skill/;新结果默认进系统 App 数据目录;导出默认到 ~/Downloads/GPT Image 2 | 桌面用户;sidecar 调本地 CLI,可切换 HTTP 后端模式 |
| Docker Web (Axum) | docker build -t gpt-image-2-web . | 新结果默认 /data/gpt-image-2/jobs;旧 /data/codex/gpt-image-2-skill/jobs 可只读兼容 | 自托管、远程访问、内网共享 |
| Skill | npx skills add https://github.com/Wangnov/gpt-image-2-skill --skill gpt-image-2-skill | 复用调到的 CLI 的 $CODEX_HOME | Claude Code、Anthropic skills CLI |
| Rust crate | gpt-image-2-core = "0.4" | 调用方决定 | 嵌入第三方 Rust 工程,自定义 surface |
$CODEX_HOME 默认为 ~/.codex/,可由环境变量覆盖。CLI/Skill 继续按命令参数输出;桌面 App 和 Docker Web 把“结果库”和“导出文件夹”分开,避免把内部 jobs 目录误当作用户下载目录。
桌面 App(Tauri sidecar)和 Docker Web 会在生图成功后先写入产品结果库,再异步上传结果文件,最后派发通知/webhook。上传状态写入 history.sqlite,任务历史会返回 storage_status 以及每个输出的 uploads[] 记录;在 cloud_primary 下,历史预览、复制、导出和编辑引用会优先用本地缓存,缺失时从 Origin 回读,显式 fallback 时才读 Archive。通知/webhook 的 job.storage 会区分 origin 与 archives。静态 Web 只保存当前浏览器数据,不会保存远端存储密钥,也不会执行服务端上传。
支持的目标类型:
| 类型 | 用途 | 关键配置 |
|---|---|---|
local |
本地目录与默认 fallback | directory,可选 public_base_url |
s3 |
AWS S3 / S3-compatible PUT | bucket,region,endpoint,prefix,access_key_id,secret_access_key,session_token,public_base_url |
webdav |
WebDAV PUT,自动 MKCOL 父目录 | url,username,password,public_base_url |
http |
自定义 HTTP multipart 上传 | url,method,headers,public_url_json_pointer |
sftp |
SFTP 上传 | host,port,host_key_sha256,username,password 或 private_key,remote_dir,public_base_url |
全局配置通过 storage.pipeline 选择四种归档策略,把"原图位置(Origin)"和"异步归档目标(Archives)"分开:
pipeline.mode |
行为 |
|---|---|
local_only |
原图只保存在本机结果库,不复制到任何 archives(默认值) |
mirror |
本地为原图,同时异步复制到一个或多个云端 archives — 双保险 |
cloud_primary |
云端 backend 是原图(pipeline.origin 必须支持回读,如 S3/WebDAV/SFTP/local),本地 jobs/ 退化成上传缓冲 |
cloud_archive_only |
本地为原图,archives 只接收推送(适合 webhook 等不可回读 backend) |
任务请求仍可独立传 storage_targets 和 fallback_targets,这两份列表会被并入当次任务的 archives(去重,不影响 Origin)。
托管部署如果只是想提供默认值,应设置 storage.policy.managed = true 且 allow_user_overrides = true;UI 会显示"管理员默认值",但用户仍可调整模式、Origin 和 Archive。删除本地历史/缓存只影响本地 result library、trash 和 SQLite 记录,不会删除远端 Origin/Archive 对象。
老 config(storage.default_targets / storage.fallback_targets / storage.fallback_policy)在加载时会自动迁移到 pipeline,无需手工修改。注意一项行为变化:旧 fallback_policy = on_failure 同时配置 default_targets + fallback_targets 的用户,迁移后两个列表会全部成为 archives 并每次都跑(不再是"主失败才跑 fallback"),这是一次性多上传一份。
输出级/目标级并发由 upload_concurrency 和 target_concurrency 控制。cloud_primary 可用 cleanup.mode = after_archive_success | by_age | by_size 清理本地缓存;清理只删除本地 cache,不会隐式删除远端对象。远端 HTTP/S3/WebDAV 上传默认拒绝 loopback/private/link-local 等非公网地址并禁用重定向;SFTP 必须配置服务器 SHA256 host key 指纹。
| Provider | 默认模型 | 端点 | 凭据来源 | 支持 edit | 支持 mask | 备注 |
|---|---|---|---|---|---|---|
openai |
gpt-image-2 |
https://api.openai.com/v1 |
OPENAI_API_KEY env / --api-key |
✓ | ✓ | OpenAI-only flags: --n / --moderation / --mask / --input-fidelity |
openai(自定义 base) |
gpt-image-2(可改) |
--openai-api-base https://... 或 config |
同上 | ✓ | ✓ | OpenAI-compatible,需要实现 /images/generations 与 /images/edits |
codex |
gpt-5.4 |
https://chatgpt.com/backend-api/codex/responses |
~/.codex/auth.json 或 $CODEX_HOME/auth.json |
✗ | ✗ | 通过 image_generation 工具委派给 gpt-image-2;401 自动 OAuth refresh 一次再重试 |
| 命名 provider | 由配置决定 | 由配置决定 | 由配置决定(file / env / keychain) | 视类型 | 视类型 | 在 config.json 中以任意名称注册 openai-compatible 或 codex 类型 |
选择策略 (--provider <value>):
openai / codex — 强制走对应 provider。auto(默认)— 优先用配置中的 default_provider,否则按 OpenAI → Codex 自动 fallback。<name> — 解析配置中已注册的命名 provider。实际命中的 provider 会在 doctor 输出的 provider_selection.resolved 里报告。
# 用 OpenAI-compatible base
OPENAI_API_KEY=sk-... gpt-image-2-skill --json \
--provider openai --openai-api-base https://api.duckcoding.ai/v1 \
images generate \
--prompt "A polished geometric app logo on transparent background" \
--out ./logo.png --background transparent --format png --size 2K
# 用 Codex auth.json
gpt-image-2-skill --json --json-events \
--provider codex \
images generate \
--prompt "A glossy red apple sticker on transparent background" \
--out ./apple.png
# 参考图编辑(OpenAI multipart)
gpt-image-2-skill --json --json-events \
images edit \
--prompt "Refine this logo, keep transparency, and improve visibility on dark backgrounds" \
--ref-image ./logo.png \
--out ./logo-edit.png \
--background transparent --format png --size 1024x1024
支持的输入 / 输出参数:
--format png|jpeg|webp,--quality high|medium|low|auto,--compression,--input-fidelity(OpenAI only)--ref-image 最多 16 张,--mask(OpenAI only)--size:2K → 2048x2048,4K → 3840x2160,4K 竖版 → 2160x3840,方图高分辨率上限 2880x2880,自定义 WIDTHxHEIGHT 须满足:边都是 16 的倍数、最大边长 3840、最大总像素 8294400、最大长宽比 3:1401 自动 refresh 一次后重试;--retries、--retry-delay-seconds、--request-timeout-seconds 可调不依赖 provider native --background transparent(Codex 尤其不可靠)。流水线分三步:生成 controlled matte 源图 → 本地抠图 → profile 化质量门验证。
# 端到端:从 prompt 生成最终透明 PNG(默认 chroma)
gpt-image-2-skill --json --json-events \
--provider codex \
transparent generate \
--prompt "A glossy red apple sticker, centered, no text, no frame" \
--out ./apple-transparent.png --size 2K --quality high
# Chroma:已知颜色单背景源图,自动采样 matte
gpt-image-2-skill --json \
transparent extract --method chroma \
--input ./source-magenta.png --matte-color auto \
--out ./asset.png --strict
# Dual-background:玻璃 / 流光 / 烟雾等半透明素材
gpt-image-2-skill --json \
transparent extract --method dual \
--dark-image ./glow-black.png --light-image ./glow-white.png \
--out ./glow-transparent.png --profile glow --strict
# 交付前的最终质量门
gpt-image-2-skill --json \
transparent verify \
--input ./apple-transparent.png \
--expected-matte-color '#00ff00' \
--profile product --strict
Profile(--profile,验证用)— 决定质量门严格度:
| Profile | 适用 | 额外严格项 |
|---|---|---|
generic |
未知或不规则素材 | PNG alpha、真实透明区、棋盘格拒绝 |
icon |
干净的单主体 icon、道具 | 干净不透明核心、足够边距、低杂散像素 |
product |
产品 / 物体抠图 | 干净不透明核心、足够边距、低残留 |
sticker |
贴纸、徽章、多组件道具 | 比 icon 更宽容多组件 |
seal |
印章、徽章、含内嵌符号的 logo | 允许圆环 + 中心符号这类分裂组件 |
translucent |
玻璃、液体、晶体 | 要求 partial alpha;alpha max 不必 255 |
glow |
光带、火焰、烟雾、粒子 | 要求 partial alpha 与透明边距 |
shadow |
软阴影 | 要求 partial alpha 与透明边距 |
effect |
硬 alpha 粒子、爆发、UI 特效 | 要求透明边距,但不强制 partial alpha |
Material preset(--material,chroma extract 用)— 调 chroma threshold / softness / spill_suppression:standard / soft-3d / flat-icon / sticker / glow,手动 flag 可继续覆盖。
Verify 输出关键字段:passed、alpha_min/alpha_max、transparent_ratio、partial_pixels、checkerboard_detected、touches_edge、stray_pixel_count、matte_residue_score、halo_score、transparent_rgb_scrubbed、alpha_health_score、residue_score、quality_score、failure_reasons、warnings。完整字段表见 skills/gpt-image-2-skill/references/transparent-png.md。
统一 JSON envelope — 每条命令成功返回结构化结果,失败返回:
{
"ok": false,
"error": {
"code": "transparent_verification_failed",
"message": "...",
"detail": { "...": "optional" }
}
}
主要错误码:runtime_unavailable / invalid_command / invalid_argument / unsupported_option / auth_missing / auth_parse_failed / refresh_failed / network_error / http_error / invalid_body_json / transparent_verification_failed / transparent_input_mismatch。
JSONL 进度事件(--json-events,stderr)— multipart_prepared、retry_started、Codex SSE 增量等,详见 skills/gpt-image-2-skill/references/json-events.md。
控制台命令:
```bash
gpt-image-2-skill --json doctor
gpt-image-2-skill --json auth ins
$ claude mcp add gpt-image-2-skill \
-- python -m otcore.mcp_server <graph>