1578 字
8 分钟
实测 GPT-Image-2 图片生成 API:直连翻车到 OpenRouter 绕道

想试试 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

换算成单张图片的估算成本:

分辨率LowMediumHigh
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:

test_gpt_image_2.py
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: 403
Your 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 × 5/M+1056imageoutputtoken×5/M + 1056 个 image output 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-2
google/gemini-3.1-flash-image-preview
google/gemini-3-pro-image-preview
openai/gpt-5-image-mini
openai/gpt-5-image
google/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 时,永远先把原始响应存下来,再做解析。解析可以失败、可以重跑,但原始数据丢了就得重新花钱调一次。

重写后的脚本核心逻辑:

test_openrouter_image.py
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)

图片提取兼容两种格式:

message.images[]
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

最终效果对比#

GPT-Image-2 Infographic

上面是 OpenRouter 通过 gpt-5.4-image-2 生成的 infographic。文字渲染清晰,信息准确,深色背景 + 霓虹配色,完成度很高。

两次生成的对比:

gpt-image-1(OpenAI 直连)gpt-5.4-image-2(OpenRouter)
耗时28s190s
费用$0.032$0.231
文字渲染有明显错别字准确清晰
图片质量一般优秀
Token 消耗1,1969,331

OpenRouter 的 gpt-5.4-image-2 贵了 7 倍,慢了 7 倍,但质量确实好很多。贵的原因是它走的 GPT-5.4 多模态推理——2012 个 input token 说明模型先”思考”了怎么画,而不是像纯图片模型那样直接生成。

经验总结#

几个值得记住的点:

  1. gpt-image-2 需要组织认证。去 platform.openai.com → Settings → Organization → General 做认证,据说几分钟就能通过。认证后直连是最便宜的。

  2. OpenRouter 可以绕过认证,但模型名不是 openai/gpt-image-2,而是 openai/gpt-5.4-image-2。而且走的是 chat completions 接口,不是 images 接口。

  3. 调 API 先存原始响应。base64 图片数据动辄 1-2MB,解析逻辑出错就全丢了。先 json.dumps 存文件,再慢慢提取。加个缓存判断,重跑脚本时直接从本地 JSON 提取,零成本。

  4. 不同提供商的响应格式不同。OpenAI 直连用 response.data[0].b64_json,OpenRouter 用 message.images[]。写代码时要兼容多种格式,或者至少有 fallback。

  5. Low 质量够用就用 Low。gpt-image-2 的 Low 质量每张只要 $0.006,适合原型验证和批量生成。正式出图再用 Medium 或 High。

实测 GPT-Image-2 图片生成 API:直连翻车到 OpenRouter 绕道
https://blog.lishuyu.top/posts/2026-04-23-gpt-image-2-api-test/
作者
猫猫魔女
发布于
2026-04-23
许可协议
CC BY-NC-SA 4.0