一句话结论:API易 所有图片模型均为同步调用——发出请求后保持连接等待,生成结果直接在响应里返回。没有异步任务 ID、没有轮询接口;客户端提前断开,这次的结果就拿不回来了,但请求仍会计费。因此,留足 timeout 是图片 API 开发的第一原则。
三个必须先知道的事实
全部同步调用
一次 HTTP 请求全程阻塞等待,与官方接口形态一致,没有「提交任务 → 轮询结果」模式。部分上游本身是异步的(如 FLUX),也已被网关封装成同步,无需自己写轮询。
没有任务 ID
不存在 task_id 查询接口,也无法凭 request_id 事后找回图片。API易 原厂透传、不存储生成结果,断开连接后结果不可恢复。
断连仍计费
客户端超时主动断开后,服务端与上游的生成仍会跑完,该次请求照常计费。timeout 设得太小 = 花了钱却拿不到图。
模型系列速查表
各图片模型系列的推荐 timeout、输出格式与 URL 支持一览:计费与价格影响
新手最常问的计费问题:「参考图是每张定量,还是图片越大消耗 token 越多?」先建立三个直觉:成本大头是输出
以 gpt-image-2 为例:文本输入 $5/M、图片输入 $8/M、输出 $30/M。影响价格最大的永远是输出的尺寸和画质(quality × size),其次才是参考图张数。
输入图不是每张定量
GPT 系输入图按尺寸/宽高比映射成 tokens(越大越多,但有下限也有封顶),张数严格线性累加。Gemini 系则相反——输出图按分辨率档固定 token/张。
以接口返回的 usage 为准
输入/输出 token 都在响应里:GPT 系看
usage.input_tokens_details.image_tokens,Gemini 系看 usageMetadata.promptTokensDetails。对账、核价都以此为准,不要按张数估。两大体系的 token 口径对照
多图输入的费用直觉
- 单张参考图约 800-1600 image tokens ≈ $0.008-0.012(gpt-image-2 实测,含尺寸/宽高比浮动);
- 张数线性累加:16 张 ≈ $0.13,与一张
high输出(≈$0.21)同量级——多图融合场景输入成本不可忽略; - token 由像素尺寸决定、与文件体积无关:压缩体积是为上传稳定,不省 token;省 token 靠减少张数(超大图有封顶,不必担心费用爆炸)。
timeout 配置建议
为什么默认 timeout 会误伤
主流 HTTP 客户端的默认超时普遍在 30-60 秒(requests 甚至默认不限时但常被框架包一层 30 秒),而图片生成是真正的「长请求」:
- GPT-Image-2 在
high画质 + 2K/4K 分辨率下,实测整体耗时 3-5 分钟; - Nano Banana 系列 4K 出图约 50 秒起步,高峰期更久;
- 多图融合、图片编辑类请求普遍比文生图更慢。
按模型分档设置
重试策略
不是所有失败都值得重试,先分清计费口径:内容审核拦截的计费分情况:按 token 计费的模型(gpt-image-2 官转等)触发审核通常直接返回 400 错误,不计费;仅按次计费的 Nano Banana Pro 会遇到「HTTP 200 但出图失败」的谷歌侧拦截,该次会计费——API易 对此类非主观失败提供 出图失败包补计划,按条数核算后补发额度。
base64 数据处理要点
前缀差异对照
不同系列返回的 base64 字段格式并不统一,这是新接入时最常见的坑:
前缀行为随渠道版本变化过,写代码时务必先做
startsWith("data:") 检测:有前缀的剥掉前缀再解码(或直接用作 img src),无前缀的直接解码,避免「双重拼接」或「带前缀解码」产出损坏的图片。
解码写文件
Playground 渲染限制
base64 模式的响应往往有数 MB,浏览器 Playground 可能弹出请求时发生错误: unable to complete request——这不代表请求失败,实际请求已成功并已计费,只是浏览器无法渲染这么长的字符串。验证效果请用代码调用,或改用支持 url 输出的模型/参数。
输入图片格式预处理
图片编辑 / 参考图类接口(如 gpt-image-2 的/v1/images/edits)对输入图片只接受 png / jpg / webp 三种标准格式。「用户上传实拍图」类业务最容易踩一个隐蔽的坑:手机原拍照片经常不是标准 JPEG。
典型症状:400 invalid_image_file
.jpg 内嵌 HDR 增益图副帧,实为 MPO。这类文件的隐蔽性在于——文件头同为 FFD8,扩展名、HTTP Content-Type、file 命令全都显示 JPEG,只有按帧解析才能识别:
建议:服务端统一重编码
与其逐张排查,不如在上传链路统一做一次重编码,顺带兼容 HEIC、CMYK 等其它非标准输入:需要 URL 输出怎么办
一共三条路径,按可靠程度排序:- 原厂默认就是 URL:FLUX(仅约 10 分钟有效且无 CORS 头,必须服务端立即下载转存)和 Seedream(BytePlus TOS,约 24 小时)的原厂输出格式本身就是 URL,无需任何配置。
- OSS 分组(确定性 URL 输出,推荐生产使用):
image2_OSS分组:适用于 GPT-Image-2-All / VIP(1x 倍率、不加价),令牌分组切换后稳定输出 URL、不降级为 base64;官转 GPT-Image-2 暂不支持。NB_OSS内测分组:适用于 Nano Banana 系列,图片 URL 出现在text字段中,详见 NB-OSS 分组说明。
- 显式传
response_format: "url":仅 GPT-Image-2-All / VIP(R2 CDN,约 24 小时)和 Seedream 支持,适用面窄——官转 GPT-Image-2 传了直接 400。默认分组下这是逐请求切换,强依赖 URL 的业务建议直接用 OSS 分组。
超时与断连排查
如果你已经把 SDK timeout 调大了却仍然频繁「超时」,按这个顺序排查:1
确认客户端 SDK 的真实 timeout
有些框架会在 HTTP 客户端外再包一层超时(如任务队列的 worker 超时、Serverless 函数的执行上限),任何一层小于模型生成时间都会掐断请求。
2
排查中间层:nginx / 负载均衡 / CDN
自建反向代理的
proxy_read_timeout、云负载均衡的空闲连接超时、CDN 的回源超时默认值普遍是 60 秒,会先于你的客户端断开连接。长请求链路上的每一跳都要放宽。3
启用 keep-alive,避免连接被中间设备回收
长时间无字节传输的连接可能被 NAT / 防火墙静默回收,开启 TCP keep-alive 或 HTTP keep-alive 可显著降低概率。
4
用请求 ID 与后台日志确认是否已计费
记录响应头中的
x-request-id,再到 API易 后台的调用日志中核对:如果日志里能查到这次调用,说明服务端已完成生成并计费,问题出在你这一侧的连接被提前断开。想做异步任务管理?
平台不提供异步接口,但你完全可以在同步接口之上自建异步外壳:为什么没有异步接口
FAQ:图片生成有异步接口吗?支持任务 ID 查询结果吗?
自实现异步队列
工程实践:把同步调用包进任务队列,自己生成 task_id、落库、重试
NB-OSS URL 输出分组
Nano Banana 系列改为 URL 输出,减轻 base64 传输压力