想试试 OpenAI 最新的图片生成模型 gpt-image-2,结果一上来就被组织认证挡在门外。折腾了一圈,最后通过 OpenRouter 绕道成功,顺便把整个 OpenAI 图片生成的模型家族、定价和踩坑全部梳理了一遍。
OpenAI 图片生成模型全家桶
截至 2026 年 4 月,OpenAI 一共有两代图片生成模型:
| 模型 ID | 定位 | API 状态 |
|---|---|---|
| gpt-image-2 | 最新旗舰,2026-04-21 发布,文字渲染最强 | 需组织认证 |
| gpt-image-1.5 | 中间代,比 1.0 便宜 20% | 可用 |
| gpt-image-1 | 初代 GPT-4o 图片生成 | 可用 |
| gpt-image-1-mini | 轻量版,更快更便宜 | 可用 |
| dall-e-3 | 上一代,仍保留 | 可用 |
| dall-e-2 | 初代,仍保留 | 可用 |
GPT-Image 系列是 DALL-E 的继任者。最大的改进是文字渲染——以前 DALL-E 生成的图片里文字基本是乱码,现在 gpt-image-2 已经能准确渲染多语言文字了。
gpt-image-2 定价
gpt-image-2 采用 token 制计费,不再是按张收费:
| 类型 | 价格(每百万 token) | Batch 价格(5 折) |
|---|---|---|
| Text input | $5 | $2.50 |
| Image input | $8 | $4 |
| Cached image input | $2 | $1 |
| Text output | $10 | $5 |
| Image output | $30 | $15 |
换算成单张图片的估算成本:
| 分辨率 | Low | Medium | High |
|---|---|---|---|
| 1024x1024 | ~$0.006 | ~$0.053 | ~$0.211 |
| 1536x1024 | ~$0.005 | ~$0.041 | ~$0.165 |
Low 质量每张不到一分钱,批量生成非常划算。High 质量大约两毛一张,比 DALL-E 3 HD 的 $0.08 贵了不少,但质量也是另一个级别。
第一次尝试:直连 OpenAI
写了个 Python 脚本,用 OpenAI SDK 直接调 gpt-image-2,让它生成一张关于自己的 infographic:
from openai import OpenAI
client = OpenAI()
response = client.images.generate( model="gpt-image-2", prompt="Create a clean, modern infographic titled 'GPT-Image-2'...", n=1, size="1024x1024", quality="medium",)结果直接 403:
openai.PermissionDeniedError: Error code: 403Your organization must be verified to use the model `gpt-image-2`.Please go to: https://platform.openai.com/settings/organization/general组织认证。行吧。
降级到 gpt-image-1
既然 gpt-image-2 不让用,先拿 gpt-image-1 跑一下看看效果。把 model 参数改成 gpt-image-1,其他不变。
这次成功了。28 秒出图,用 medium 质量生成了一张 1024x1024 的 infographic。
API 返回了详细的 token 用量:
{ "input_tokens": 140, "input_tokens_details": { "text_tokens": 140, "image_tokens": 0 }, "output_tokens": 1056, "output_tokens_details": { "text_tokens": 0, "image_tokens": 1056 }, "total_tokens": 1196}成本计算:140 个 text input token × 30/M = $0.032。三分钱一张图。
不过图片质量一般——文字渲染有明显错误,比如把 “quality tiers” 写成了 “duality tiers”,价格数字也对不上。这正是 gpt-image-2 要解决的问题。
寻找第三方代理
既然 OpenAI 直连要认证,那就找第三方。搜了一圈,几个能用 gpt-image-2 的渠道:
| 提供商 | 特点 |
|---|---|
| OpenRouter | 最成熟,OpenAI 兼容 API 格式 |
| fal.ai | 企业级,速度优化 |
| APIYI | 最便宜,~$0.03/次 |
决定用 OpenRouter——API 格式兼容 OpenAI,改个 base_url 就行。
OpenRouter 踩坑记
坑一:endpoint 不对
第一反应是直接把 OpenAI SDK 的 base_url 换成 OpenRouter:
client = OpenAI( base_url="https://openrouter.ai/api/v1", api_key=os.environ["OPENROUTER_API_KEY"],)
response = client.images.generate( model="openai/gpt-image-2", ...)404。OpenRouter 根本没有 /images/generations 这个 endpoint。它的图片生成走的是 /chat/completions,图片作为 message 的一部分返回。
坑二:模型名不对
改成 chat completions 接口后,用 openai/gpt-image-1 这个模型名——400,invalid model ID。
只好老老实实列一下 OpenRouter 上的图片模型:
models = client.models.list()for m in models.data: if 'image' in m.id.lower(): print(m.id)输出:
openai/gpt-5.4-image-2google/gemini-3.1-flash-image-previewgoogle/gemini-3-pro-image-previewopenai/gpt-5-image-miniopenai/gpt-5-imagegoogle/gemini-2.5-flash-image原来 OpenRouter 上的模型名叫 openai/gpt-5.4-image-2——它把 GPT-5.4 的多模态推理能力和 gpt-image-2 的图片生成能力打包在了一起。这不是纯图片模型,而是一个能推理 + 能画图的组合体。
坑三:图片没存下来
用正确的模型名跑通了,HTTP 200,但图片没保存。原因是 OpenRouter 返回图片的格式和 OpenAI 不同:
- OpenAI 直连:图片在
response.data[0].b64_json - OpenRouter chat completions:图片在
response.choices[0].message.images[]
我的脚本只处理了 OpenAI 格式,OpenRouter 的 message.images 字段压根没碰。更惨的是,为了 debug 我 dump 了 raw response,但在脚本里加了 3000 字符的截断:
if len(raw_str) > 3000: log.info(raw_str[:3000] + "\n... [truncated]")1.5MB 的 base64 图片数据被截成了 3KB。图片数据彻底丢了。
白花了 $0.23。
正确的做法:先存中间产物
这个教训很简单但很重要——调 API 时,永远先把原始响应存下来,再做解析。解析可以失败、可以重跑,但原始数据丢了就得重新花钱调一次。
重写后的脚本核心逻辑:
def main() -> None: raw_path = OUT_DIR / "openrouter_response.json"
# 如果已有缓存,直接从缓存提取 if raw_path.exists() and "--force" not in sys.argv: log.info("Found existing response, extracting images...") data = json.loads(raw_path.read_text()) extract_images(data, "gpt_image_2_openrouter") log_cost(data) return
# 调 API resp = httpx.post(url, headers=headers, json=payload, timeout=300)
# 先存原始响应,再做任何解析 data = resp.json() save_raw_response(data, raw_path)
# 然后才提取图片 resp.raise_for_status() extract_images(data, "gpt_image_2_openrouter") log_cost(data)图片提取兼容两种格式:
def extract_images(data: dict, prefix: str) -> list[Path]: msg = data["choices"][0]["message"]
for i, img in enumerate(msg.get("images", [])): url = img.get("image_url", {}).get("url", "") _save_b64_url(url, OUT_DIR / f"{prefix}_{i}.png")
# OpenAI 格式:message.content[] with type=image_url content = msg.get("content") if isinstance(content, list): for i, part in enumerate(content): if part.get("type") == "image_url": url = part["image_url"]["url"] _save_b64_url(url, OUT_DIR / f"{prefix}_{i}.png")再跑一次,这次完美:
Raw response saved to openrouter_response.json (1577013 bytes)Saved image: gpt_image_2_openrouter_0.png (1181802 bytes)--- Usage --- Input tokens: 2012 Output tokens: 7319 (image: 7024)--- Cost --- Input cost: $0.016 Output cost: $0.215 TOTAL COST: $0.231最终效果对比

上面是 OpenRouter 通过 gpt-5.4-image-2 生成的 infographic。文字渲染清晰,信息准确,深色背景 + 霓虹配色,完成度很高。
两次生成的对比:
| gpt-image-1(OpenAI 直连) | gpt-5.4-image-2(OpenRouter) | |
|---|---|---|
| 耗时 | 28s | 190s |
| 费用 | $0.032 | $0.231 |
| 文字渲染 | 有明显错别字 | 准确清晰 |
| 图片质量 | 一般 | 优秀 |
| Token 消耗 | 1,196 | 9,331 |
OpenRouter 的 gpt-5.4-image-2 贵了 7 倍,慢了 7 倍,但质量确实好很多。贵的原因是它走的 GPT-5.4 多模态推理——2012 个 input token 说明模型先”思考”了怎么画,而不是像纯图片模型那样直接生成。
经验总结
几个值得记住的点:
-
gpt-image-2 需要组织认证。去 platform.openai.com → Settings → Organization → General 做认证,据说几分钟就能通过。认证后直连是最便宜的。
-
OpenRouter 可以绕过认证,但模型名不是
openai/gpt-image-2,而是openai/gpt-5.4-image-2。而且走的是 chat completions 接口,不是 images 接口。 -
调 API 先存原始响应。base64 图片数据动辄 1-2MB,解析逻辑出错就全丢了。先
json.dumps存文件,再慢慢提取。加个缓存判断,重跑脚本时直接从本地 JSON 提取,零成本。 -
不同提供商的响应格式不同。OpenAI 直连用
response.data[0].b64_json,OpenRouter 用message.images[]。写代码时要兼容多种格式,或者至少有 fallback。 -
Low 质量够用就用 Low。gpt-image-2 的 Low 质量每张只要 $0.006,适合原型验证和批量生成。正式出图再用 Medium 或 High。