Image-2 任务轮询怎么写:2–3 秒间隔、终态判断和超时回收
POST 已经返回 code: 200,页面却一直转圈;刷新以后不知道该查哪一笔;网络抖了一下,程序又提交了一次;本地超时了,远端任务过几秒却成功了——这些症状看起来不同,根因常常是同一个:把“提交任务”和“等待任务完成”写成了一步。
图注:提交成功只拿到 taskId,最终图片要靠轮询取得。
截至 2026 年 7 月 18 日,图叮 Image-2 开放平台官方文档给出的标准接入路径是异步提交后轮询,没有给出 webhook 回调接口。提交后拿到字符串 taskId,再查询任务详情。官方建议轮询间隔为 2–3 秒,并要求客户端设置最大等待时长。下面不讨论提示词好不好,也不重复 2K 与 4K 适用场景;只把服务端轮询写成一套能观测、能止损、能恢复的 SOP。
Step 1:先把提交成功和出图成功拆开
调用 POST /open/api/v1/gptImage2/generations 后,先检查响应体里的 code === 200。不要只看 HTTP 状态码,也不要拿 message 文案做程序判断。成功响应的 data 是 taskId,而且必须按字符串保存;它不是安全的 JavaScript Number。这一点如果还没处理,可以先看 2K 与 4K 怎么选 里的任务配置思路,再回到本文收紧任务生命周期。
本地至少要保存这些字段:
{
"localJobId": "order-20260718-001",
"taskId": "1902345678901234567",
"state": "POLLING",
"submittedAt": "2026-07-18T18:00:00+08:00",
"lastPolledAt": null,
"pollCount": 0,
"resultUrl": null,
"failureReason": null
}
这里的 POLLING 是你自己的状态,不是服务端枚举。它只表示“本地准备继续查询”。服务端仍可能处于 INIT 或 RUNNING。把两套状态分开,后面才能解释“客户端已经停止等待,但任务仍在远端运行”这种情况。
另外,API Key 只放在服务端。开放平台文档明确要求请求带非空 User-Agent,生产网关缺少该请求头时可能返回非 JSON 的 403 页面。轮询器如果部署在浏览器里,不仅会碰到跨域,还会把账户额度暴露给前端;这条路从架构上就不该走。
Step 2:用五种状态写轮询决策树
任务详情接口是 GET /open/api/v1/gptImage2/tasks/{taskId}。每轮先检查外层 code,再读取 data.status。当前公开状态共有五种:
图注:INIT、RUNNING 继续等,三种终态立即停止轮询。
| 服务端状态 | 本地动作 | 是否终态 |
|---|---|---|
INIT | 记录仍在排队,等待下一轮 | 否 |
RUNNING | 记录正在出图,等待下一轮 | 否 |
SUCCESS | 保存并下载 resultUrl,停止轮询 | 是 |
FAILED | 保存 failureReason 与可用的 errorCode,停止轮询 | 是 |
VIOLATION | 按内容违规终态处理,记录 errorCode=10077,停止轮询 | 是 |
官方文档建议 2–3 秒查询一次。一个容易维护的基线是 2500 毫秒固定间隔,再给同一进程内的不同任务加少量随机偏移,避免一批任务在同一毫秒同时发请求。随机偏移属于客户端工程策略,不是平台强制口径;真正不能破的是 2–3 秒建议区间和终态判断。
下面是伪代码,重点看分支,不要照抄成前端脚本:
while (Date.now() < deadline) {
const envelope = await getTask(taskId)
if (envelope.code !== 200) {
await retryQueryOrEscalate(envelope.code)
continue
}
const task = envelope.data
if (task.status === 'SUCCESS') return download(task.resultUrl)
if (task.status === 'FAILED') return fail(task.failureReason, task.errorCode)
if (task.status === 'VIOLATION') return rejectForPolicy(task.errorCode)
if (task.status !== 'INIT' && task.status !== 'RUNNING') {
return quarantineUnknownStatus(task.status)
}
await wait(nextIntervalBetween2And3Seconds())
}
return markLocalPollTimeout(taskId)
未知状态不要当成功,也不要继续无限循环。最稳的处理是把它隔离到人工或告警通道,因为这通常意味着接口枚举升级了,而你的客户端还没跟上。
Step 3:把查询重试和重复提交分成两条路
轮询失败分两类。第一类是“任务已经存在,但这次 GET 没查到结果”,例如临时网络失败、非 JSON 网关页或外层错误码。此时重试查询,不要重新 POST。第二类是“POST 的响应在网络中断时丢了,不知道服务端是否已经受理”。这时才需要提交重试,但必须带同一个 Idempotency-Key 和完全相同的请求体。
官方文档列出的幂等结果很具体:同 Key、同请求体且上次已完成,会返回同一 taskId;仍在处理中可能返回 100044;上次失败可能返回 100045;同 Key 却换了请求体会返回 100043;Key 超过 128 个字符会返回 100047。所以幂等键要在第一次提交前生成并持久化,不能每次重试临时换一个。
这里有一条简单规则:
- 已拿到
taskId:只重试 GET。 - 没拿到
taskId,但 POST 可能已送达:用原幂等键和原请求体重试 POST。 - 想修改 prompt、比例或参考图:新建业务尝试,换新的幂等键,不覆盖旧任务。
图叮侧当前文档说明不会主动替调用方限流,所以并发、查询节奏和重试上限都要由调用方负责。没有上限的 retry 不是可靠性,它只是把一次故障放大成持续请求和积分风险。
Step 4:超时后停止等待,不替服务端判失败
最大等待时长是客户端自己的运营选择,官方没有给出统一秒数。假设你的接口层只愿意同步等 180 秒,可以把 180 秒设为示意 deadline;这不是 Image-2 的固定超时,也不代表服务端会在第 181 秒失败。
本地超时后,建议写 POLL_TIMEOUT 或 WAIT_EXPIRED,保留 taskId、最近一次状态、已轮询次数和最近错误。不要把远端状态伪造为 FAILED,更不要立刻用新幂等键再提交一次。随后由后台回收任务继续做两件事:
图注:本地超时后保留 taskId,再由后台回收远端终态。
- 用原
taskId再查详情,确认是否已经进入SUCCESS、FAILED或VIOLATION。 - 必要时按时间窗读取任务列表,核对本 Key 下是否有仍在运行或已经结束的任务。
回收流程和在线请求要共用同一套终态判断。否则在线轮询认识 VIOLATION,后台对账只认识 SUCCESS/FAILED,违规任务就会永久挂在“处理中”。这类问题比单次报错更难查,因为接口没有坏,坏的是两套状态机不一致。
拿到 SUCCESS 后再下载 resultUrl,并对成图做业务验收。生成成功只说明任务完成,不说明商品结构一定正确。遇到产品轮廓变化,可以沿用 五步判定商品几何失真 的检查法,把任务成功和图片可交付继续分开。
Step 5:按验收表确认轮询器真的可上线
上线前至少做下面 10 项。这里的目标不是写一个“能跑”的 while,而是确认每条异常路径都能停、能查、能恢复。
- 提交成功时,
taskId原样按字符串落库。 - 外层响应只用
code === 200判成功。 INIT与RUNNING会继续轮询,间隔保持在 2–3 秒。SUCCESS会保存结果地址并停止轮询。FAILED会保存failureReason,有errorCode时一并记录。VIOLATION被当成独立终态,而不是继续等待。- 未知状态会告警或隔离,不会被吞掉。
- 查询失败只重试 GET;提交重试复用原幂等键与原请求体。
- 超时只结束本地等待,后台仍能用
taskId对账。 - API Key 只在服务端,日志会脱敏,所有请求都有非空
User-Agent。
上线前再做三组故障注入:让一次 GET 返回非 JSON,让一个任务停在 RUNNING 直到本地超时,再让一个提交响应丢失但服务端实际已受理。三组都没有死循环、重复提交和状态丢失,才算把轮询链路闭合。
防复发规则可以压成一句:taskId 是任务身份,服务端状态是事实,本地 deadline 只是等待策略。三者不要混成一个字段。要开始接入时,可先登录图叮开放平台控制台确认访问资格并创建 API Key;如果控制台未开放给当前账号,就先按页面引导处理,不要在浏览器里绕过鉴权。
需要 AI 的步骤,可用图叮AI 的网页工具按张处理
Image-2 生图和 Nano Banana 改图都在网页里使用;两边积分包不通用,各自按张扣积分,注册不送试用张数。
相关文章
潮玩手办创意背景怎么做?AI 生图打造赛博与波普风
想让潮玩手办在社交平台脱颖而出?本文讲清用 AI 生图打造赛博朋克与波普艺术背景的实操思路,包含拍摄准备、提示词写法与边缘融合技巧,帮你掌握潮玩手办 AI 生图与盲盒背景生成。
AI生成商品图指南:手办工作室如何统一盲盒系列风格与光影
针对手办工作室与盲盒设计师,本文讲清如何用图叮AI 等工具做盲盒手办生图,提供白底图处理、统一风格光影、批量场景生成的具体步骤与避坑指南,解决系列感割裂与光影穿帮问题。
3C 数码包装盒多角度穿帮,用 PS 精修怎么救回来
3C 数码包装多角度拍摄常出现透视变形、光影错乱、接缝穿帮。本文拆解用 Photoshop 精修逐项修复的实操步骤,并说明 AI 辅助能把哪一段提速。 3C 数码无论线上详情页还是线下展示,包装的视觉呈现直接影响第一印象。但多角度拍摄时,包装盒「穿帮」是常见尴尬:透视变形、光影错乱、接缝外露。
朋友圈九宫格排版指南:用AI扩图补齐边缘,告别裁切变形
发朋友圈九宫格总被裁掉边缘、构图变形?本文梳理微信的1:1裁切规则,讲清楚用AI扩图补齐替代加白边的思路,并附一套从比例调整到九宫格切图的实操流程,帮你排出连贯整齐的朋友圈。
推荐阅读
公考证件照底色要求与换底色实操:白底蓝底红底怎么准备才合规
报考公务员或事业单位,证件照底色必须符合官方规定。本文讲清白底蓝底红底的适用规则、换底色容易踩的坑、用图叮AI在线换底色的实操步骤,以及政审照片的常见误区。
详情页图片模糊怎么变清晰:常搜问题里能补和补不出的真实边界
详情页产品图糊糊的看不清,买家看两眼就走?这篇按大家常搜的问题逐条讲怎么用图叮AI的高清放大和材质高清修复把模糊的产品图变清晰,同时说清糊焦拍坏的救不回、图叮补的是推测细节不是真实还原,也不做详情页排版,效果以图叮官网为准。
花纹提取和直接抠图有什么不一样:图叮里这两个功能到底该怎么选
花纹提取和一键抠图听着像,其实干的不是一件事。这篇把两者的差别、各自适合的活、能不能互相替代、发糊怎么修、商用版权这些常被搜的问题一次说清,帮你在图叮里别选错功能。
照片灰蒙蒙、没通透感怎么处理?把黑白场和质感找回来
照片发灰、像蒙了层雾,多半是没有明确的黑白场、材质细节也糊了。这篇讲清用图叮自定义打光重新立黑白场、拉出层次,再用材质高清修复把质感找回来的做法,以及一味加对比度为什么会把画面调脏,帮你把灰片调通透。
更多推荐(8 篇)
餐桌椅修图常见问题:木纹发灰、玻璃反光、金属发暗怎么救
餐桌椅修图常卡在木纹发灰、玻璃桌面反光、金属椅框发暗、一套桌椅抠白底这几件事上。这篇按大家常搜的问题逐条拆,讲清用图叮AI材质高清修复、一键抠图和产品溶图打光分别怎么补,以及哪些划痕反光救不回要重拍。
彩色宝石怎么修?发灰不够浓、刻面杂反光一步步修出通透
彩色宝石拍出来发灰不够浓、刻面映着补光灯白光、内部光彩糊住,是彩宝店主常卡的坎。这篇一步步讲用图叮修彩宝:一键抠图,选区消除压掉刻面杂映,材质高清修复理清刻面色彩,产品溶图打光透光出彩,也说清颜色净度克拉不能靠修图误导,效果以官网为准。
防静电屏蔽袋商品图 AI 修图返检:封口、警示标识和透明窗口别修错
防静电屏蔽袋商品图不能只修得银亮干净。本文按 FAQ 拆解封口压痕、ESD 警示标识、批号贴、透明窗口和成套图一致性,避免 AI 把工业品证据修没。
印刷级输出:如何将低分辨率图片放大到印刷品质
学习使用图叮AI的高清放大V2功能,将网络低分辨率图片放大至印刷级品质,适用于海报、展架、画册制作。
透明玻璃和水瓶抠图发白吃边的排查与修法
透明玻璃、塑料瓶、水瓶抠图最常见三个症状:抠完变实心白块、边缘吃掉一圈、换背景后发灰起白边。这篇按原因分支排查,讲清图叮一键抠图只切外轮廓的边界,以及怎么用选区消除和局部重绘把边缘修回来。
图片高清放大不失真:电商海报与壁纸的无损放大思路
想让图片高清放大又不失真?本文讲清传统插值放大翻车的原因,以及用图叮AI做低清图变高清的实战思路,覆盖电商海报与壁纸场景的参数取舍、印刷DPI与色彩空间要点。
水龙头随手拍变精修图:AI去锈迹还原金属光泽实测
用图叮AI全能渲染精修处理随手拍摄的水龙头照片,一分钟去除接口锈迹和表面脏污,还原金属光泽输出干净产品图。
旅游博主必备:风景照一键消除路人工具与实操指南(拯救废片构图)
旅游拍照总是避不开路人?本文讲清如何用图叮AI等工具消除路人,包含涂抹技巧、失败原因分析及适用场景,帮旅游博主把废片构图救回来。 在京都清水寺的悬造舞台,或是重庆洪崖洞的千厮门大桥上,你好不容易等到了完美的光线,模特情绪也到位,但按下快门的瞬间,