Files
cmshoppe/docs/tasks/T-594.md
T

3.4 KiB
Raw Blame History

id, title, phase, deps, status, created
id title phase deps status created
T-594 AI工场 cmhub 托管生图故障恢复、计费一致性与运行回归 7
T-590
T-591
DONE 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:完成 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,全部通过。