fix: align cmhub image timeout display

This commit is contained in:
chengma
2026-07-07 19:13:00 +08:00
parent 95b180e9cf
commit 2928624019
13 changed files with 67 additions and 29 deletions
+4 -4
View File
@@ -30,7 +30,7 @@
| 生图请求 | `images_edits` multipart 或 vision chat | `{prompt, model:别名, image_base64?/image_url?, resolution?, aspect_ratio?, parameters?}` |
| 生图响应 | 直接返回 image bytes | `{image_url, ...}` → 需再下载 |
| 错误 | HTTP error 文本 | `{error:{code,message}}`:`insufficient_points`(402)/`upstream_error`(502)/`rate_limited`(429)/`unauthorized`(401)/`account_disabled`(403)/`bad_request`(400)/`model_not_allowed`/`no_pricing_rule` |
| 超时 | 按 `resolution_timeouts` | 生图同步且慢,读超时按分辨率 512≈180s/1K≈240s/2K≈360s/4K≈600s,客户端取上限 600s |
| 超时 | 按 `resolution_timeouts` | 生图同步且慢;当前 cmshopee 生图请求和图片下载读取等待统一固定 650s,不再按分辨率变化;生图读超时仍不自动重发 |
| 幂等 | 直连一次成功一次 | **非幂等、无幂等键**:客户端超时 ≠ 未扣点,读超时后不可无脑重发 |
关键差异(决定改造点):
@@ -96,7 +96,7 @@
旧封面必传(改图类),复用现有 `_image_data_url(old_cover_path)` 生成 base64。
- `resolution` 归一为**大写** `512/1K/2K/4K`(cmshopee 内部用小写 `1k`,发请求前转 `1K`);`aspect_ratio` 默认 `1:1`(Shopee 封面)。
- **响应**:拿 `image_url` → **新增一步下载**该图字节(cmhub 自家对象存储公网 URL)→ 交给现有 `_save_jpeg(image_bytes, out_path, resolution, quality)` 落盘。下载 helper 必须校验 URL scheme 只允许 `http/https`,拒绝内网/回环/本机地址,并校验域名解析后的 IP 仍不属于内网/回环/本机地址,设置超时和大小上限;生成后**立即下载**(对象存储 URL 可能有有效期)。`points_cost`/`points_balance`/`call_id` 同样通过事件回调传播,不改变 `gen_cover` 返回值。
- **超时(关键)**:生图同步且慢,cmhub 内部读超时 512≈180s/1K≈240s/2K≈360s/4K≈600s。cmshopee 的**读超时按分辨率取对应上限、统一封顶并默认 600s**,绝不用 30s/60s 调生图——否则客户端超时但服务端仍在算并扣点(见 §4.4 幂等)。
- **超时(关键)**:生图同步且慢。当前 cmshopee 的 cmhub 生图请求和随后 `image_url` 下载读取等待统一固定 650 秒,不再按分辨率变化,绝不用 30s/60s 调生图——否则客户端超时但服务端仍在算并扣点(见 §4.4 幂等)。
### 4.4 错误映射与重试策略
@@ -114,7 +114,7 @@ cmhub 返回结构化 `{error:{code}}`。映射层**按 `code` 优先分支**(
**幂等与超时——生图重试必须特别处理(会亏钱)**:cmhub 生成接口**非幂等、无幂等键**,客户端超时 ≠ 未扣点。
- **生图(`gen_cover`)**:**读超时后绝不自动重发**——服务端可能已算完并扣点,重发 = 重复扣点。首选办法是把读超时设够大(§4.3,默认 600s)从源头避免歧义;只对**连接超时**(请求根本没送达服务端)安全重试。
- **生图(`gen_cover`)**:**读超时后绝不自动重发**——服务端可能已算完并扣点,重发 = 重复扣点。首选办法是把读超时设够大(§4.3,当前固定 650s)从源头避免歧义;只对**连接超时**(请求根本没送达服务端)安全重试。
- **生文(`gen_title`)**:秒级返回、点数低,读超时重试风险小,但仍建议同样区分连接超时/读超时;重试次数可小。
- 只对 `502`/`429`/**连接**超时重试;`402/401/403/400`/读超时立即失败。现状 `_call_with_retry` 是**一刀切重试**,cmhub 模式必须替换为这套区分策略。
- `insufficient_points` 是新的用户可见态:② 生成页应弹明确提示并引导去网页端充值,不当普通失败淹没在计数里。
@@ -175,7 +175,7 @@ cmhub 返回结构化 `{error:{code}}`。映射层**按 `code` 优先分支**(
3. ~~`resolution` 取值~~ **已解决**:`512/1K/2K/4K`(大写 K),默认 `1K`;cmshopee 小写值发请求前归一。
4. ~~`aspect_ratio`~~ **已解决**:默认 `1:1`,Shopee 封面用 `1:1`。
5. **`image_url` 有效期(按最坏处理)**:对象存储 URL 可能过期——本设计已是**生成后立即下载落盘**,无需长期持有。
6. ~~超时上限~~ **已解决**:512≈180s/1K≈240s/2K≈360s/4K≈600s,客户端封顶 600s。
6. ~~超时上限~~ **已解决**:当前 cmshopee 生图请求和图片下载读取等待统一固定 650s。
7. **Base URL / API Key 形态**:域名待部署方提供;Key 形如 `sk_cmhub_xxx`,仅网页端生成时显示一次——⑤设置需提示用户从网页端复制粘贴,本地保存。
## 10. 落地拆分与任务顺序