Repository navigation
Description
问题描述
使用 POST /v1/images/generations 调用 gemini-3.1-flash-image 生成单张 4K 图片,等待约 290.801 秒后返回:
HTTP 502
No images generated
对齐容器日志后发现,这个 502 由 Manager 生成:最后一次 Sandbox 上游返回 HTTP 200,紧接着 Manager 报没有生成图片。在此之前还经历了明确的 429 配额耗尽和多次每端点 15 秒的响应头超时。
想请维护者核实两点:
- v5.0.0 将非流式
generateContent生图请求与轻量请求共用短响应头看门狗,是否可能过早中断正常但耗时较长的生图? - 上游 200 却没有可提取图片时,目前只返回通用 502,缺少
finishReason、promptFeedback、候选数量/类型等信息,无法判断是未生成、拒绝生成,还是格式未正确处理。
尚未在相同账号、提示词和网络条件下做 4.9.8/5.0.0 对照测试,因此这里报告的是已观察到的行为和回归嫌疑,不把所有失败直接归因于新版。
环境
- Manager:5.0.0,
/health确认。 - 部署:fnOS NAS / Linux,Docker,
lbjlaq/antigravity-manager:latest。 - 镜像 ID:
sha256:a841e72ecfdc3189701fac64513072e8735c18412f80ea8e4ccabaf2e5808a87。 - 上游通过 HTTP 代理访问;存在网络或服务端抖动的可能。
- 账号池:6 个账号,启用轮换。
- 配置:
request_timeout=360;image_scheduler.per_account_concurrency=4。 - 日志存储模式:
simple;debug_logging.enabled=false。
请求参数
实际容器日志确认:
model="gemini-3.1-flash-image"
image_count=0
n=1
size="3312x2480"
quality="high"
style="vivid"
此版本将 quality=high 映射为 imageSize=4K。未提供参考图。原始提示词和凭据不公开。
复现入口是向上述接口发送单张、quality=high 的生图请求,观察端点响应头超时、重试和最终图片提取结果。问题具有间歇性;以上参数不构成保证复现的最小用例。
已观察到的时间线
2026-10-26,以下表格为 UTC+8;流量记录时间为 19:28:33,对应返回阶段,实际请求约在 19:23:42 开始。
| 时间 | 事件 |
|---|---|
| 19:23:42.440 | 收到上述生图请求。 |
| 19:23:42.927 | 账号 A 返回 429,QUOTA_EXHAUSTED,quotaResetDelay=4h54m43.158780521s;记录固定等待 30 秒后重试。 |
| 19:24~19:26 | 多次 generateContent 响应头超时:Daily 15 秒,Sandbox 再等 15 秒,一轮约 30 秒。 |
| 19:27:09.857 | 账号 B 返回 429,QUOTA_EXHAUSTED,日志为 attempt=8/12, delay=30000ms。 |
| 19:28:09.866 | 又一轮端点调用超时,body_len=7584, total_elapsed=30.0s。 |
| 19:28:24.899 | Daily 响应头等待 15 秒超时,回退 Sandbox。 |
| 19:28:33.240 | Sandbox 返回 200 OK。 |
| 19:28:33.241 | Manager 立即报 All 1 requests failed. Errors: No images generated,最终返回 502。 |
关键日志节选(原始 UTC;账号和 UUID 已隐去):
2026-10-26T11:23:42.440665181+00:00 INFO [Images] Received generation request model="gemini-3.1-flash-image" image_count=0 n=1 size="3312x2480" quality="high" style="vivid"
2026-10-26T11:23:42.928328460+00:00 INFO [image_generation] Retry with fixed delay: status=429, attempt=1/12, delay=30000ms
2026-10-26T11:24:27.941600223+00:00 WARN Upstream candidate endpoint timed out, fast falling back to next endpoint err_msg=HTTP request timed out after 15s waiting for response headers at https://daily-cloudcode-pa.googleapis.com/v1internal (method=generateContent, body_len=7584, total_elapsed=15.0s)
2026-10-26T11:24:42.943278916+00:00 WARN Terminal upstream endpoint timed out err_msg=HTTP request timed out after 15s waiting for response headers at https://daily-cloudcode-pa.sandbox.googleapis.com/v1internal (method=generateContent, body_len=7584, total_elapsed=30.0s)
2026-10-26T11:27:09.859094354+00:00 INFO [image_generation] Retry with fixed delay: status=429, attempt=8/12, delay=30000ms
2026-10-26T11:28:33.240323611+00:00 INFO Upstream fallback succeeded | Endpoint: https://daily-cloudcode-pa.sandbox.googleapis.com/v1internal | Status: 200 OK | Next endpoints available: 0
2026-10-26T11:28:33.240752392+00:00 ERROR [Images] All 1 requests failed. Errors: No images generated
流量数据库记录:status=502、duration=290801、error="No images generated"。未保存转出请求;响应正文只有这句错误,原始上游 200 的候选/拒绝信息也没有保留。因此不能确认最后一次 200 的具体内容,更不能据此断言是安全拦截或额度耗尽造成空图。
另外,simple 模式下这条请求正文只剩 model;实际尺寸、质量等已由接收日志确认,不能将简化记录理解为客户端真的没有发送 prompt。
4.9.8 与 5.0.0 源码对比
生图响应头超时策略发生变化
- 4.9.8 upstream/client.rs:短看门狗仅在
has_next时生效;最后端点走send_future.await,不受这一层短看门狗约束。 - 5.0.0 upstream/client.rs:
calculate_total_upstream_budget_secs/calculate_endpoint_watchdog_secs对非流式请求按 body 长度计算短预算;约 7.6 KB 的请求落入首端点 15 秒、备用端点 15 秒的分支,最后端点也被包装进tokio::time::timeout。
这里按请求字节数区分耗时,可能无法反映 4K 生图的计算时长。是否需要将 requestType=image_gen 或图片模型纳入独立超时策略?
空图 502 是原有逻辑,不是已证实的新回归
对比后,这段结果收集逻辑相同。成功解析上游 JSON 后,即使没有有效图片,内部任务仍返回 Ok;外层只读取首个候选的 inlineData.data,提取结果为空且没有任务错误时,最终统一返回 No images generated。这会掩盖真实原因。
期望行为
- 为慢生图设置合理、可配置的响应头等待预算,避免直接套用轻量控制接口的短超时;仍保留有界等待,避免无限挂起。
- 区分“HTTP 200”和“成功提取图片”,为无图结果给出明确错误分类及有界重试策略。
- 对无图响应保留经过脱敏的诊断摘要,例如
finishReason、promptFeedback、候选数、part 类型和图片数据是否为空,避免记录完整图片或隐私提示词。 - 保留先前端点超时/429的摘要,方便解释最终 502 与总耗时。
本次仅进行了日志读取和源码对比,没有修改服务配置、重启容器或回退版本。
Activity
fix(proxy): accept the wrapped body in Web-mode save_update_settings …
fix(proxy): 放宽生图看门狗与预算至 90s/135s,收拢流水线空图诊断与多协议对齐 (Fixes #3756)
jeikl commentedon Oct 27, 2026
已经做了针对性的加强修复 为生图模型加大了看门狗延迟 下个beta版本体验一下
fix(proxy): 修复生图看门狗改造中的 token_manager 签名与诊断类型编译缺陷 (Ref #3756)
fix(proxy): 修复 claude handler 中 get_image_token 错误元组解构类型不一致缺陷 (Ref #3756
chore(release): bump version to 5.0.1-beta.3 and update changelog (PR #…
cubelikeplayDaniel commentedon Nov 3, 2026
已在 PR #3759 / v5.0.1-beta.3 中完成修复:调整了生图端点与首字超时预算,消除虚假超时 502 错误。
chore(release): bump version to 5.0.3 and update changelog