
1. 为什么要在 Codex 里给图片能力单独写一个 skillCodex 默认擅长的是读写代码、跑命令、分析报错它本身并不会凭空生成一张图片。但 Codex 支持 skill 机制你可以把「怎么调接口、参数怎么填、结果存哪里」这套流程写成一个 skill之后在对话里用自然语言描述需求Codex 就会自动读取这个 skill 并执行。这篇要落地的就是给 Codex 写一个既能生成图片、又能修改图片的 skill并且把模型调用统一走 TaoToken 的 Key/API 通道避免在本地散落多个厂商密钥。适合谁看已经在用 Codex 做日常开发、想让它在对话里直接出图或改图的人手里有 TaoToken 账号、希望用一套 Key 管理多家模型的人以及被「环境变量配了半天还是 401」折腾过、想找个更省心接入方式的人。整条链路的目标很明确在config.toml里声明 skill 骨架接入 TaoToken 统一通道然后完成一次生成、一次修改的验证从配置一路跑到出图。我试过把生图和改图拆成两个独立脚本后来发现维护成本高索性合成一个 skill用子命令区分generate和edit配置只读一份。下面按这个思路展开。2. TaoToken 前置拿到统一 Key 和 API 地址TaoToken 在这里扮演的角色是「统一入口」你不需要为生图、改图分别去不同平台申请密钥而是用同一个 Key 走同一个 API 域名模型名在请求里指定即可。对 skill 来说这意味着配置项更少出错面更窄。你需要准备两样东西第一是 API Key。登录控制台后在 API Keys 页面创建形如sk-xxxxxxxx。创建后立刻复制保存页面通常只完整显示一次。第二是 API 基地址。TaoToken 的 API 入口是https://taotoken.net/api注意这个地址不带任何查询参数直接作为 base_url 使用。官网入口是https://taotoken.net/?utm_sourcetaotoken_aicg_blog_end注册、看文档、管理额度都从这里进。注意Key 不要写进代码仓库、不要贴到聊天截图、不要作为命令行参数明文传递。skill 里我们统一从本地配置文件读取配置文件权限设为仅当前用户可读。关于模型名图片生成和图片编辑通常走不同的能力端点具体可用模型以你账号下的文档为准。skill 里我会把模型名做成可配置项默认填一个图像模型改图时复用同一个端点、多传一张参考图。3. 可复制配置config.toml 骨架与 skill 目录结构Codex 的 skill 一般放在用户级 skill 目录下每个 skill 一个文件夹里面至少有一个描述文件约定叫SKILL.md和若干脚本。config.toml用来声明这个 skill 的元信息和默认参数。下面是我实测能跑通的骨架。先看目录结构~/.codex/skills/image-skill/ ├── SKILL.md ├── config.toml └── scripts/ └── image_tool.pyconfig.toml内容如下字段含义我写在注释里# skill 元信息 [skill] name image-skill description 生成图片与修改图片统一走 TaoToken 通道 entry scripts/image_tool.py # 模型通道配置 [provider] base_url https://taotoken.net/api api_key_env TAOTOKEN_API_KEY # 优先读环境变量 api_key_file ~/.config/image-skill/credentials.json # 其次读本地文件 timeout 120 # 默认生成参数 [defaults.generate] model gpt-image-1 size 1024x1024 n 1 # 默认改图参数 [defaults.edit] model gpt-image-1 size 1024x1024SKILL.md是给 Codex 看的「操作说明书」用自然语言写清楚什么时候触发、怎么调脚本。核心几行# image-skill 当用户要求生成图片或修改图片时使用本 skill。 ## 生成图片 执行python scripts/image_tool.py generate --prompt 描述 --size 1024x1024 ## 修改图片 执行python scripts/image_tool.py edit --image 路径 --prompt 修改要求 --size 1024x1024 首次使用若提示缺少 Key请引导用户提供 TaoToken API Key 并调用 python scripts/image_tool.py save-key --key key 安全保存。脚本本身用 Python 标准库即可核心是把base_url、Key、模型名、尺寸拼成一次 HTTP 请求。下面给出关键片段重点看 Key 的读取顺序和请求构造import json, os, urllib.request def load_key(cfg): key os.environ.get(cfg[provider][api_key_env]) if key: return key path os.path.expanduser(cfg[provider][api_key_file]) if os.path.exists(path): with open(path) as f: return json.load(f)[api_key] raise SystemExit(No API key saved. Run: image_tool.py save-key --key key) def build_request(cfg, prompt, size, imageNone): url cfg[provider][base_url].rstrip(/) /images/generations payload { model: cfg[defaults][generate][model], prompt: prompt, size: size, n: 1, } if image: payload[image] image # 改图时带上参考图 url cfg[provider][base_url].rstrip(/) /images/edits req urllib.request.Request( url, datajson.dumps(payload).encode(), headers{ Authorization: fBearer {load_key(cfg)}, Content-Type: application/json, }, ) return reqsave-key子命令负责把 Key 写到~/.config/image-skill/credentials.json并chmod 600。这样 Codex 首次会提示你输入 Key之后直接读取不用每次配环境变量。4. 验证请求一次生成、一次修改跑通配置就绪后先做生成验证。在 Codex 对话里直接说用 image-skill 生成一张图 一只戴牛仔帽的机械猫浅灰纯色背景正面全身电影感体积光1024x1024。Codex 会读取SKILL.md执行generate子命令。如果本地还没存 Key它会提示你提供 TaoToken API Key你贴进去后脚本保存并继续。成功时终端会打印类似[ok] image saved: ./outputs/20240612_153012.png [info] modelgpt-image-1 size1024x1024打开这个路径能看到图片说明生成链路通了。这里的关键是请求确实打到了https://taotoken.net/api而不是某个本地 mock。再做修改验证。把刚才生成的图作为参考图描述修改要求注意把「不变」和「要变」分开写用 image-skill 修改 ./outputs/20240612_153012.png 保持机械猫主体、帽子、姿态和镜头角度不变 只把浅灰背景换成黄昏沙漠远处加山脉和落日地面少量风沙 输出 1024x1024。脚本走edit分支把参考图和提示词一起提交。成功后会另存一张新图原图不动。两次都跑通说明从config.toml声明到实际出图的完整链路已经闭环。提示改图时「保持什么不变」和「修改什么」同样重要。只写「帮我改好看点」模型会自由发挥主体容易跑偏。5. 本篇常见错排查提示 No API key saved。说明本地配置文件不存在或路径不对。检查~/.config/image-skill/credentials.json是否存在或重新执行save-key。如果你更习惯环境变量确认TAOTOKEN_API_KEY已导出且当前 shell 能读到。HTTP 401。Key 缺失或无效。核对是否复制完整、有没有多余空格必要时在控制台重新创建一个 Key。注意 Key 只在创建时完整显示一次。HTTP 403。常见原因是 Key 所在分组没有图像模型权限或账号额度不足。到控制台确认分组和余额。如果错误里带error code: 1010通常是请求在到达应用前被边缘防护拦了检查请求头是否完整不要随意删掉脚本里预设的 User-Agent。HTTP 429。请求频率过高。把n降到 1或加个几秒的间隔重试。批量出图时尤其容易触发。返回尺寸和要求不一致。不要提交任意宽高优先用标准尺寸。竖版用1024x1536横版用1536x1024方形用1024x1024。非标准比例模型会自动映射到最接近的档位结果可能和你预期有偏差。改了 config.toml 但没生效。Codex 可能缓存了 skill 元信息。新建一个对话或重启 Codex 让它重新读取。6. 把通道固定下来后面就省心了skill 写一次后面基本不用再动。真正需要维护的只有两处config.toml里的模型名和默认尺寸以及本地那份 Key 文件。把模型调用统一收敛到 TaoToken 的https://taotoken.net/api之后你换模型、调额度、查用量都在一个控制台里完成不用在多个平台之间来回切。如果你还想在对话里直接对比不同模型的出图效果可以到模型对话页面手动试几次找到合适的模型名再写回config.toml。长期用 Codex 做编码和 Agent 任务的话Coding Plan 能把额度管理得更清楚。Key 的创建和管理都在 API Keys 页面接入细节看接入文档遇到配置问题先翻文档再排查能省不少时间。最后留一个实用习惯每次改完config.toml先跑一次最小生成请求确认通道没坏再去写复杂的改图提示词。这样出问题时你能立刻判断是配置层还是提示词层排查范围小很多。