生图API 怎么接 gpt-image-2?国内直连的完整写法
想在项目里用 gpt-image-2 出图,卡住的地方往往不是代码。官方接口国内直连不上,
注册要海外手机号,付款要国际信用卡,公司报销还拿不到发票。等这几关都过完,
项目排期早过了。
甜甜圈API(dashengfenshen.cn)把这一层做掉了:一个密钥,端点兼容 OpenAI 协议,model改个字符串就切换模型。这篇讲 gpt-image-2 具体怎么调、参数怎么给,
以及超时和重试该怎么设。
它适合什么场景
生图这边我们常用的是三个模型,分工不一样:
| 模型 ID | 用在哪 | 消耗 |
|---|---|---|
gpt-image-2 | 质感和细节要求高的终稿 | 按次计费 |
nano-banana-pro | 高清出图,支持超宽超高比例 | 10 积分/次 |
nano-banana2 | 跑量、草稿、批量试错 | 8 积分/次 |
gpt-image-2 的长处是对复杂描述的理解和成品质感,短板是相对慢、相对贵。
所以它不该用来跑量——跑量用 nano-banana2 出十几张挑一张,
挑中的那张再用 gpt-image-2 或 nano-banana-pro 出终稿,这样成本和效果都合适。
接进来的完整写法
端点和 OpenAI 的chat/completions一致,所以现有代码几乎不用改,
换掉 baseURL 和密钥就能跑,不用装任何 SDK。
文生图,content直接给一段描述:
asyncfunctiontextToImage(prompt,model='gpt-image-2'){constr=awaitfetch('https://API_HOST/v1/chat/completions',{method:'POST',headers:{Authorization:`Bearer${process.env.TTQ_API_KEY}`,'Content-Type':'application/json',},body:JSON.stringify({model,messages:[{role:'user',content:prompt}],}),// 生图比对话慢得多,别照抄对话那套 30 秒signal:AbortSignal.timeout(120_000),});if(!r.ok)thrownewError(`${model}HTTP${r.status}`);returnr.json();}图生图(改图、换背景、局部调整)把content换成数组,图和文字一起给:
asyncfunctionimageToImage(imageUrl,instruction,model='gpt-image-2'){returnfetch('https://API_HOST/v1/chat/completions',{method:'POST',headers:{Authorization:`Bearer${process.env.TTQ_API_KEY}`,'Content-Type':'application/json',},body:JSON.stringify({model,messages:[{role:'user',content:[{type:'image_url',image_url:{url:imageUrl}},{type:'text',text:instruction},],}],}),signal:AbortSignal.timeout(120_000),}).then((r)=>r.json());}两个函数的区别只有content一处,其余完全一样——封装一次就够,
不用为文生图和图生图各写一套。
失败要能重投。生图的失败率比对话高,描述触发了内容策略、上游偶发超时都会失败。
把 prompt、model、参考图 URL 落进任务表,失败的按 id 重投,
不要让人工重新填一遍描述。
为什么超时要给到两分钟
对话接口是流式的,首字节很快就回来,所以 30 秒超时够用。
生图不一样——它要等整张图生成完才返回,中间没有任何输出。
模型越重、分辨率越高,这个等待越长。
把超时设成 30 秒的直接后果是:服务端其实出图成功了,但你的客户端已经断开,
这次调用照样计费,图却拿不到。这是最冤的一种失败。
所以实操上有两条:超时按模型分档,跑量的快模型给 60 秒、终稿的重模型给 120 秒;
重试之前先确认上一次是真失败还是只是你超时了,否则会重复计费。
同理,前端不要直接调这个接口。让前端等两分钟不现实,
正确做法是后端收到请求先落一条任务记录返回 id,后台去跑,前端轮询自己的任务表。
顺带也避免了把密钥打进前端包。
常见问题
Q:出一张图要多久?
A:和模型、分辨率、描述复杂度都有关。跑量的快模型通常几秒到十几秒,
终稿模型会明显更久。上线前拿自己的真实描述跑一轮统计一下,别照抄别人的数字。
Q:一个密钥能不能同时调生视频?
A:可以,同一个端点换model就行。生视频的耗时是分钟级,
超时要单独放长,别和生图共用一套配置。
Q:图生图的参考图能用本地文件吗?
A:image_url收的是可访问的 URL,本地文件要先传到自己的对象存储或图床。
注意那个 URL 要能被服务端访问到,内网地址不行。
Q:返回的图片链接能直接存进数据库吗?
A:不建议。返回链接是有有效期的,过期就取不回来了。
拿到之后立刻转存到自己的存储,数据库里存自己的地址。
成本怎么控
关键是分级:跑量用便宜的快模型多出几版,挑中的才用贵的出终稿。
一上来就用最贵的模型试错,钱都花在废图上了。
再加一层结果缓存——同样的描述和参数如果已经出过图,直接返回旧结果,
不要重复调用。批量场景下这一层能省下的比换模型还多。
接口服务:甜甜圈API(dashengfenshen.cn)