--- id: T-594 title: AI工场 cmhub 托管生图故障恢复、计费一致性与运行回归 phase: 7 deps: [T-590, T-591] status: TODO 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 服务端计费契约。 ## 执行记录 (完成后记录故障矩阵、状态决策与验证结果。)