Files

46 lines
3.4 KiB
Markdown
Raw Permalink Normal View History

---
id: T-594
title: AI工场 cmhub 托管生图故障恢复、计费一致性与运行回归
phase: 7
deps: [T-590, T-591]
2026-07-11 14:29:58 +08:00
status: DONE
created: 2026-07-11
---
## 问题 / 背景
AI工场会同时持有多张 cmhub 异步生图任务。基础编排和 GUI 接通后,还需要集中验证超时、停止、重启续查、下载失败和部分成功等运行场景,确保不会重复提交、重复扣点、丢失 task_id 或阻塞界面。本任务只处理 cmhub 托管模型,不接入自定义 Provider。
## 方案
- 基于 T-590 的 job 生命周期和 T-591 的界面事件,补齐 submitted/running/succeeded/failed/expired/cancelled 的状态映射和中文反馈。
- 覆盖程序停止、强退、重启后的续查:已有 task_id 只 poll,不再次 submit;下载失败只重试下载。
- 对点数不足、submit 超时但服务端已受理、poll 超时、结果 URL 失效、图片校验失败和单张失败做可恢复处理。
- 核对每个 job 的预计点数、实际扣点、余额和 call_id 展示,不把一张失败扩大为整轮失败。
- 增加服务层与 GUI 状态测试,使用 mock/fake cmhub,不在自动测试中产生真实费用。
## 验收要点
- N 张任务部分成功时,成功图片正常进入照片池,失败图片有独立中文状态,可单张重试。
- submit 响应丢失后可用稳定 task key 恢复,不重复创建或扣费;已有 task_id 的任务重启后不再次 POST。
- 停止与关闭程序不会删除已提交任务信息;再次打开项目可以继续查询。
- 下载超时、非图片响应和本地保存失败不重新提交生图;恢复后仍关联原 job/task_id。
- 点数、余额、call_id 和失败退点口径与现有 cmhub 客户端一致,日志不暴露接口路径、密钥或内部响应。
- GUI 主线程不执行网络等待;全量 unittest、ruff、compileall 和 `git diff --check` 通过。
## 边界(不改什么)
- 不实现 BYOK、自定义 Provider、API Key、来源切换或客户端直连。
- 不实现终选拖放、导出或蝦皮写操作。
- 不用真实收费请求作为自动化测试前提,不改变 cmhub 服务端计费契约。
## 执行记录
2026-07-11 14:29:58 +08:00
- 2026-07-11:完成 AI工场 cmhub 托管生图恢复与状态收口。
- `image_studio.list_resumable_jobs(..., include_failed_downloads=True)` 支持把 failed 但已有 `task_id` 且无输出 asset 的任务纳入恢复队列,用于下载失败/本地保存失败后的继续查询。
- `image_studio_generation.resume_image_jobs()` 改用恢复队列:已有 `task_id` 的任务只 poll/download,不再 POST submit,不重复创建 job 或重复扣点。
- 新增 `ImageStudioResumeJobsWorker` 和 ⑥ AI工场「继续查询任务」按钮;无可续查任务时中文提示,有任务时复用现有进度/日志/刷新逻辑。
- 照片池任务行显示 submitted/running/failed/expired/cancelled 中文状态,并补充扣点、余额、`call_id`,便于计费和失败排障。
- 更新 `docs/routes.md`,明确继续查询不重复 submit、不重复扣点以及任务状态展示口径。
- 验证:主工作区 targeted 测试通过;因无关默认提示词脏文件仍会影响全量 unittest,已在干净 worktree 仅套用 T-594 diff 后运行 `python -m ruff check app tests main.py`、`py -3.10 -m compileall app main.py`、`py -3.10 -m unittest discover -s tests`(369 tests)和 `git diff --check`,全部通过。