解决 Codex 使用中转站生图时,分辨率、比例、提示词记录和输出记录不容易稳定控制的问题。
使用中转站时还在抱怨 Codex 对话内置生图图片比例不对?要求它 16:9,结果它还是输出 1:1?要求它输出 4K,结果输出的还是低分辨率?那你可以试试这个 Skill。
配置和使用极速版:
给 Codex 发:
Codex,帮我安装一下这个 Skill:https://github.com/AwakeFantasy/relay-imagegen
使用:
$relay-imagegen 跑一张 16:9、4K 的风景图看看效果
效果:
为什么会有对话内置生成效果不稳定的问题呢?因为对话里的原生生图更偏“让模型按自然语言理解你的要求”,Codex 不一定会把“4K、16:9、横图”稳定地转换成底层命令参数。它可能只是把这些要求写进 prompt,让模型尽量遵守,但这不等于真的传了 --size 3840x2160。结果就可能被默认尺寸、工具策略或模型理解偏差带歪,跑出低分辨率、方图、比例不准的图。
极简的介绍就到此结束了,下面是这个 Skill 详细的介绍:
Relay Imagegen 是一个 Codex Skill,用于通过兼容 OpenAI 接口的中转站或代理生成、编辑图片,并自动保存提示词和不含密钥的出图记录。
它的目标是让中转站出图流程尽可能简单、可复用、可追溯:
- 默认优先读取 Codex 当前生效的中转站配置
- 也可以读取当前 ccswitch 的 Codex 供应商配置
- 没有 ccswitch 时,也支持私有 JSON 配置文件
- 推荐使用
prompts/*.txt保存和复用提示词 - 每次成功生成后自动写入不含密钥的
.meta.json记录文件 .meta.json会保存当次提示词快照,方便复盘和复现- 默认分辨率:
2560x1440 - 默认模型:
gpt-image-2 - 默认质量:
high - 默认输出到当前目录下的
generated/ - 支持上传前自动缩小参考图,减少传图耗时和失败概率
当你遇到这些情况时,可以使用这个 Skill:
- 你使用中转站生成图片,而不是 OpenAI 官方 endpoint
- 你希望把提示词保存成文件并复用
- 你希望每次出图都自动保存提示词快照、模型、尺寸、输入图和输出路径
- 你不希望设置系统级
OPENAI_API_KEY - 你当前 Codex 已经通过中转站工作,希望直接复用 Codex 配置
- 你使用 ccswitch 切换 Codex 中转站,希望在需要时复用其中的 key 和 endpoint
- 你想用本地参考图进行角色、构图或风格编辑
- 你希望默认生成较高分辨率图片,例如
2560x1440
Relay Imagegen 当前是 Codex 自带图片生成脚本的包装层:
~/.codex/skills/.system/imagegen/scripts/image_gen.py
它负责:
- 从 Codex 当前配置、ccswitch 或私有配置文件读取中转站信息。
- 只在当前子进程运行期间注入
OPENAI_API_KEY和OPENAI_BASE_URL。 - 调用 Codex 自带的 imagegen 脚本生成或编辑图片。
- 验证输出图片尺寸。
- 写入不包含密钥的 sidecar 记录文件,并保存当次提示词快照。
真实 key 不会出现在命令行参数、输出日志或 sidecar 中。
- 已安装 Codex,并且带有系统
imagegenSkill - Python 3.10 或更高版本
- 一个支持图片生成模型的 OpenAI 兼容中转站
- 可选:ccswitch,用于在 Codex 配置不可用时自动读取当前 Codex provider
- 可选:Pillow,用于参考图预处理和输出尺寸检查
将整个仓库放到 Codex Skill 目录:
~/.codex/skills/relay-imagegen
Windows 通常为:
C:\Users\<你的用户名>\.codex\skills\relay-imagegen
也可以从 GitHub 克隆:
git clone https://github.com/AwakeFantasy/relay-imagegen.git "$HOME/.codex/skills/relay-imagegen"安装后,当你在 Codex 中提到中转站出图、保存提示词、出图记录、ccswitch、api_key.json 或 $relay-imagegen 时,Codex 就可以使用这个 Skill。
如果你的 Codex 已经通过中转站工作,那么通常不需要额外写入 key。
$setup = "$HOME/.codex/skills/relay-imagegen/scripts/setup.py"
python $setup --check成功时会看到类似输出:
CODEX_CONFIG=C:\Users\you\.codex\config.toml
CODEX_AUTH=C:\Users\you\.codex\auth.json
CODEX_PROVIDER=your-provider
API_KEY=sk-...xxxx
BASE_URL=https://relay.example/v1
MODEL=gpt-image-2
密钥只会脱敏显示。
在当前项目下创建:
prompts/test.txt
将你的出图提示词写进去。
$skill = "$HOME/.codex/skills/relay-imagegen/scripts/relay_imagegen.py"
python $skill generate --prompt-file prompts/test.txt --name test --dry-run--dry-run 不会请求中转站,也不会产生费用,只会显示将要执行的非敏感参数和输出位置。
python $skill generate --prompt-file prompts/test.txt --name test --force默认输出:
generated/test-YYYYMMDD-HHMMSS-2k.png
generated/test-YYYYMMDD-HHMMSS-2k.meta.json
Relay Imagegen 支持三种方式:
- 自动读取 Codex 当前配置,推荐给已经用 Codex 中转站的用户。
- 自动读取 ccswitch 当前 Codex provider,适合依赖 ccswitch 切换中转站的用户。
- 使用私有 JSON 文件,适合需要单独配置图片中转站的用户。
如果没有显式提供 --config,脚本按下列顺序读取配置:
- Codex 当前配置:
~/.codex/config.toml和~/.codex/auth.json - 当前 ccswitch 的
codexprovider:~/.cc-switch/cc-switch.db - 环境变量
RELAY_IMAGEGEN_CONFIG指向的 JSON 文件 - 当前项目下的
photo/api_key.json - 当前项目下的
.secrets/image_api.json - 当前项目下的
.secrets/relay_imagegen.json - 当前 Skill 下的
.secrets/config.json - Windows 下的
%APPDATA%/relay-imagegen/config.json ~/.config/relay-imagegen/config.json~/.relay-imagegen.json
如果你传入:
--config C:/path/to/config.json则会直接使用该配置,不尝试 Codex 或 ccswitch。
这是默认优先级最高的自动配置来源。
脚本会读取:
~/.codex/config.toml
~/.codex/auth.json
其中:
base_url -> config.toml 里的当前 model_provider 对应配置
api_key -> auth.json 里的 OPENAI_API_KEY
model -> image_model 字段;如果没有,则默认 gpt-image-2
显式检查 Codex 配置:
python ~/.codex/skills/relay-imagegen/scripts/setup.py --check-codex强制使用 Codex 配置,失败不回退:
python $skill generate --from-codex --prompt-file prompts/test.txt --name test --force跳过 Codex 配置:
python $skill generate --no-codex --prompt-file prompts/test.txt --name test --force指定其他 Codex 配置路径:
python $skill generate --codex-config C:/path/to/config.toml --codex-auth C:/path/to/auth.json --prompt-file prompts/test.txt --name test --force默认数据库路径是:
~/.cc-switch/cc-switch.db
Windows 上通常是:
C:\Users\<你的用户名>\.cc-switch\cc-switch.db
脚本会在数据库中读取当前启用的 Codex provider:
providers where app_type = "codex" and is_current = 1
然后读取:
key -> providers.settings_config.auth.OPENAI_API_KEY
base_url -> 优先读取 providers.settings_config.config 里的 base_url
fallback -> 如果 config 里没有 base_url,再读取 provider_endpoints 的第一个 url
model -> 默认使用 gpt-image-2
注意:ccswitch 的 endpoint 列表可能包含多个节点,最后一个节点不一定是当前可用节点。Relay Imagegen 不会再简单读取最后一个 endpoint,以免误选到失败节点。
如果 ccswitch 中保存的 endpoint 是:
https://relay.example
脚本会自动规范化为:
https://relay.example/v1
普通检查默认会先尝试 Codex 配置,再尝试 ccswitch:
python ~/.codex/skills/relay-imagegen/scripts/setup.py --check也可以显式只检查 ccswitch:
python ~/.codex/skills/relay-imagegen/scripts/setup.py --check-ccswitch正常情况下不需要写额外参数,因为脚本会先尝试 Codex 当前配置,再尝试 ccswitch。
如果你希望“ccswitch 读取失败就直接报错,不要回退到 JSON 配置”,使用:
python $skill generate --from-ccswitch --prompt-file prompts/test.txt --name test --force如果你不想使用当前 ccswitch provider,而是想使用 JSON 配置:
python $skill generate --no-ccswitch --prompt-file prompts/test.txt --name test --forcepython $setup --check-ccswitch --ccswitch-db C:/path/to/cc-switch.db
python $skill generate --ccswitch-db C:/path/to/cc-switch.db --prompt-file prompts/test.txt --name test --force如果你不想复用 Codex 或 ccswitch 的当前配置,或者图片中转站与 Codex 中转站不同,可以使用独立 JSON 配置。
运行:
python ~/.codex/skills/relay-imagegen/scripts/setup.py config --scope userWindows 下会写入:
%APPDATA%\relay-imagegen\config.json
这种方式适合长期使用,而且不会把密钥放进 Skill 仓库中。
如果你只在本机自己使用,也可以写入 Skill 私有目录:
python ~/.codex/skills/relay-imagegen/scripts/setup.py config --scope skill文件位置为:
~/.codex/skills/relay-imagegen/.secrets/config.json
.secrets/ 已在仓库的 .gitignore 中忽略,不应上传到 GitHub。
配置文件结构如下:
{
"api_key": "sk-...",
"base_url": "https://relay.example/v1",
"model": "gpt-image-2"
}支持的 key 字段名:
api_key, apiKey, key, token, openai_api_key, OPENAI_API_KEY
支持的 endpoint 字段名:
base_url, baseUrl, baseURL, api_base, endpoint, openai_base_url, OPENAI_BASE_URL
$skill = "$HOME/.codex/skills/relay-imagegen/scripts/relay_imagegen.py"
python $skill generate `
--prompt-file prompts/test.txt `
--name test `
--force默认等价于:
model = gpt-image-2
size = 2560x1440
quality = high
output = generated/
python $skill generate `
--prompt "A quiet cinematic room with warm soft lighting." `
--name room `
--force长提示词、中文提示词或希望保留复用的提示词,建议使用 --prompt-file。成功出图后,提示词内容也会写入 .meta.json 的 prompt_snapshot 字段。
python $skill edit `
--image C:/path/to/reference.jpg `
--prompt-file prompts/edit.txt `
--name edit-test `
--prepare-image `
--forcepython $skill edit `
--image C:/path/to/composition.png `
--image C:/path/to/character.jpg `
--prompt-file prompts/edit.txt `
--name final `
--prepare-image `
--force适合:
- 一张图作为场景或构图参考
- 一张图作为人物设定或服装参考
- 生成“现实照片环境中出现二次元角色”之类的合成画面
高分辨率参考图可能上传慢、占用更高,或者增加中转站请求失败概率。
使用:
--prepare-image会在上传前将参考图最长边压缩到默认 2048 像素。
也可以自行指定最大边长:
python $skill edit `
--image C:/path/to/large-reference.jpg `
--prompt-file prompts/edit.txt `
--max-input-edge 1536 `
--name prepared-edit `
--force默认情况下,处理后的上传副本只保存在临时目录中,运行结束后会自动删除,不会污染当前项目。
如果你想保留这些副本用于调试,可以加:
--keep-prepared此时副本会保存在:
generated/relay_prepared/
原始图片不会被修改。
如果没有指定 --out,图片默认输出为:
generated/<名称>-YYYYMMDD-HHMMSS-2k.png
例如:
generated/character-chair-20260527-183000-2k.png
每次成功生成后,会自动写入同名记录文件:
generated/character-chair-20260527-183000-2k.meta.json
记录内容包括:
- 使用的是
generate还是edit - 模型
- 请求尺寸和输出尺寸
- 图片质量
- 提示词文件位置
- 当次提示词快照
- 输入参考图位置
- 预处理图片尺寸;默认不保留临时预处理图片路径
- 耗时
- 配置来源
- 使用 ccswitch 时的 provider 名称
- 不含查询参数的 base URL
记录文件不会包含 API key。
| 参数 | 说明 | 默认值 |
|---|---|---|
generate / edit |
生成新图或使用参考图编辑 | 必填 |
--prompt-file |
从文本文件读取提示词,推荐使用 | 无 |
--prompt |
直接传入简短提示词 | 无 |
--image |
edit 模式的参考图,可重复传入 |
无 |
--name |
自动输出文件名的名称部分 | 根据模式或 prompt 文件生成 |
--out |
指定完整输出路径 | 自动命名 |
--output-dir |
自动命名输出目录 | generated |
--size |
输出分辨率 | 2560x1440 |
--quality |
输出质量 | high |
--timeout |
超时时间,单位为秒 | 600 |
--prepare-image |
上传前压缩参考图 | 关闭 |
--max-input-edge |
指定参考图最大边长,同时开启预处理 | 2048 |
--keep-prepared |
保留预处理上传副本到 generated/relay_prepared/ |
关闭 |
--dry-run |
只检查命令和输出位置,不实际请求 | 关闭 |
--force |
允许覆盖目标输出 | 关闭 |
--config |
显式指定 JSON 配置 | 自动读取 |
--from-codex |
强制使用 Codex 当前配置,失败不回退 | 关闭 |
--no-codex |
不读取 Codex 当前配置 | 关闭 |
--codex-config |
指定 Codex config.toml 位置 |
~/.codex/config.toml |
--codex-auth |
指定 Codex auth.json 位置 |
~/.codex/auth.json |
--from-ccswitch |
强制使用 ccswitch,失败不回退 | 关闭 |
--no-ccswitch |
不读取 ccswitch | 关闭 |
--ccswitch-db |
指定 ccswitch 数据库位置 | ~/.cc-switch/cc-switch.db |
- 不要把真实 API key 作为命令行参数传入。
- 不要把真实配置文件提交到 GitHub。
- 不需要把
OPENAI_API_KEY永久写入用户或系统环境变量。 - Codex 模式只读取当前
config.toml和auth.json,不会复制 key 到 Skill 目录。 - ccswitch 模式只读取当前 provider,不会复制 key 到 Skill 目录。
- JSON 配置模式只在运行时读取 key。
- key 只会临时注入子进程环境。
- 控制台只会显示脱敏后的 key。
.meta.json运行记录不会包含 key。
运行:
python ~/.codex/skills/relay-imagegen/scripts/setup.py --check如果 Codex 和 ccswitch 都不可用,创建用户级配置:
python ~/.codex/skills/relay-imagegen/scripts/setup.py config --scope user运行时增加:
--no-ccswitch然后提供 JSON 配置,或者让脚本自动发现私有配置文件。
如果读取到的是根地址,例如:
https://relay.example
脚本会自动转换为:
https://relay.example/v1
如果你的中转站使用不同 API 路径,请改用 JSON 配置,明确写入完整 base_url。
默认请求尺寸是:
2560x1440
如果中转站或模型不支持该尺寸,生成请求可能失败,或者尺寸验证不通过。此时需要检查你所用中转站对模型和尺寸的支持情况。
可以提高超时时间:
python $skill generate --prompt-file prompts/test.txt --timeout 900 --name test --forcerelay-imagegen/
README.md
README_EN.md
README/
SKILL.md
LICENSE
agents/
openai.yaml
scripts/
relay_imagegen.py
setup.py
以下内容不会包含在公开仓库中:
.secrets/config.json
generated/
*.meta.json
