diff --git a/docs/tasks/T-586.md b/docs/tasks/T-586.md index 2188691..5f23c58 100644 --- a/docs/tasks/T-586.md +++ b/docs/tasks/T-586.md @@ -16,7 +16,7 @@ created: 2026-07-11 - `app/db.py` 增加 ad-hoc 兼容迁移和数据对象: - `image_studio_projects`:账号、商品 ID、目标主图数/详情数、草稿提示词、项目状态、软删除/时间字段;同一账号+商品唯一。 - `image_studio_assets`:项目、类别(原图/生成主图/生成详情图)、远程 URL、本地路径、比例、父资产、生成提示词、可用/缺失状态。 - - `image_studio_jobs`:资产候选、生成来源、task key/id、Provider、类型、状态、错误、重试和时间字段。 + - `image_studio_jobs`:资产候选、生成来源、task key/id、Provider、类型、状态、错误、重试和时间字段;当前阶段 `provider` 固定为 `cmhub`,字段仅用于状态自描述和后续兼容。 - `image_studio_selections`:项目、`main/detail`、连续 position、asset;类别+位置唯一,同一资产在同类别唯一。 - 新增独立 service 模块(命名按实现确定)封装 CRUD、事务排序、路径计算和状态转换,GUI 不直接写 SQL。 - 图片目录固定在 `data/images/pool///{originals,generated,exports}/`,所有路径继续通过 `appconfig` 从 `data/` 解析。 @@ -34,6 +34,7 @@ created: 2026-07-11 ## 边界(不改什么) - 不做 GUI、CDP、网络下载、AI 请求、导出或蝦皮写操作。 +- 不实现自定义 Provider、API Key 或生成来源切换。 - 不把图片 BLOB 写 SQLite,不采用目录扫描猜状态。 - 不提供本地图片导入,不物理删除项目历史。 diff --git a/docs/tasks/T-590.md b/docs/tasks/T-590.md index bed2f4e..a317710 100644 --- a/docs/tasks/T-590.md +++ b/docs/tasks/T-590.md @@ -18,7 +18,7 @@ AI工场一次可生成 N 张,且每张都要独立计费、失败、重试、 - 每条 job 在 submit 前落稳定 key,202 后立即落 task_id;poll 成功下载校验后创建 generated asset,记录 main/detail、比例、父 asset、提示词和计费元数据。 - 并发沿用当前最大 5 的 submit+poll/下载双池保护;逐条事件回调供 GUI 显示。 - 停止不删除已提交任务:未开始 job 取消,已提交 job 停止等待并保留 task_id,下次继续查询。 -- 本任务只实现 cmhub 托管来源;数据结构预留 `generation_source/provider`,自定义模型由 T-594 解锁。 +- 本任务只实现 cmhub 托管来源;`generation_source/provider` 固定写入 `cmhub`,只作为状态自描述和后续兼容字段。本轮不展示或实现来源切换,自定义模型后置到 T-596。 ## 验收要点 @@ -31,7 +31,7 @@ AI工场一次可生成 N 张,且每张都要独立计费、失败、重试、 ## 边界(不改什么) -- 不做 BYOK、自定义 Provider、自动去重或自动重生成。 +- 不做 BYOK、自定义 Provider、API Key、来源切换、自动去重或自动重生成。 - 不做 GUI、终选、导出、CDP 或蝦皮写操作。 - 不改变 cmhub 单次调用一张、预扣/失败退点契约。 diff --git a/docs/tasks/T-591.md b/docs/tasks/T-591.md index b63c572..f9459c4 100644 --- a/docs/tasks/T-591.md +++ b/docs/tasks/T-591.md @@ -18,7 +18,7 @@ created: 2026-07-11 - 原主图抽屉异步显示;单击加入池,双击大图。 - 照片池显示原/主/详角标、比例、排队/生成/失败状态;单击设源图、双击大图、右键移除(引用中/任务中禁用并说明)。 - 右侧使用单一提示词框和较窄模板下拉,按钮为新建/重命名/保存/删除;程序不显示“主提示词/每张动作词”label。 -- 类型、数量、比例、生成来源和计费区域按 v3;T-594 前自定义来源隐藏或明确禁用,不伪装可用。 +- 类型、数量、比例和 cmhub 计费区域按 v3;当前阶段固定使用 cmhub 托管模型,不显示自定义来源、Provider 或 API Key 控件,也不保留可点击的禁用占位。 - 所有网络/CDP/AI/图片解码走 worker/QThread 或异步 Qt API,主线程只更新 UI。 ## 验收要点 @@ -26,13 +26,14 @@ created: 2026-07-11 - 六个 Tab 顺序和中文文案正确,在 1180×760、960×640 及 Windows 缩放下无重叠/截断。 - 任意原图/池图双击打开大图;单击仍执行区域业务动作,不冲突。 - 合并提示词、模板 CRUD、源图选择、N 张生成、停止、进度和逐图失败可用。 +- 生成设置只呈现 cmhub 托管模型的点数、余额和实际扣点,不出现生成来源选择。 - 切项目不会串图片/任务/提示词;运行中关键控件禁用并可安全恢复。 - 不存在“导入本地图片”按钮或隐藏入口。 - GUI offscreen 测试覆盖 objectName、布局结构、信号和状态;人工截图与 SVG 对照。 ## 边界(不改什么) -- 不实现终选拖放排序(T-592)、导出(T-593)或 BYOK(T-594)。 +- 不实现终选拖放排序(T-592)、导出(T-593)、BYOK、自定义 Provider 或 API Key;自定义模型后置到 T-596。 - 不自动上传蝦皮,不增加本地图片导入。 - 不在 widget 槽函数直接写 SQL 或做网络请求。 diff --git a/docs/tasks/T-594.md b/docs/tasks/T-594.md index beeeeda..ce5f4d9 100644 --- a/docs/tasks/T-594.md +++ b/docs/tasks/T-594.md @@ -1,46 +1,39 @@ --- id: T-594 -title: AI工场自定义模型(BYOK)授权代理与异步生图接入 +title: AI工场 cmhub 托管生图故障恢复、计费一致性与运行回归 phase: 7 -deps: [T-590] -status: BLOCKED +deps: [T-590, T-591] +status: TODO created: 2026-07-11 --- ## 问题 / 背景 -cmhub 托管生图上游存在稳定性风险,AI工场正式发布前需要“自定义模型”逃生口。但自定义 Key 仍必须经过软件套餐/设备授权和 cmhub 异步任务代理,不能恢复客户端 direct 直连或同步长等待。 - -当前阻塞:cmhub 尚未完成《卡密设备绑定与套餐授权方案》V1.5 所定义的 device credential、BYOK Provider 白名单、加密 task secret、零点数使用记录和 submit/poll 契约。契约和测试环境落地前,本任务不编码、不猜字段。 - -## 解除阻塞条件 - -- cmhub 提供版本化 API 文档、错误码、至少一个受支持 Provider、测试凭证和 mock/测试环境。 -- 明确 BYOK title/image 请求、task secret 生命周期、终态清理、幂等键和计费字段。 -- 服务端确认 Key 不进入 request_payload、CallRecord、队列日志、遥测或异常监控。 +AI工场会同时持有多张 cmhub 异步生图任务。基础编排和 GUI 接通后,还需要集中验证超时、停止、重启续查、下载失败和部分成功等运行场景,确保不会重复提交、重复扣点、丢失 task_id 或阻塞界面。本任务只处理 cmhub 托管模型,不接入自定义 Provider。 ## 方案 -- ⑤/AI工场增加显式“cmhub托管/自定义模型”来源;不自动切换。 -- 自定义 Key 本地使用 Windows DPAPI 保存,UI 仅掩码、替换、清除;不回显明文。 -- 所有请求带 device credential/product,服务端先校验套餐和设备;BYOK `points_cost=0`,显示“费用由模型服务商收取”。 -- 生图仍 submit→poll→下载,job task_id 持久化续查;不走同步长等待。 -- 正式发行版禁用普通用户通过 config 开启 direct 后端。 +- 基于 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,不在自动测试中产生真实费用。 ## 验收要点 -- 无有效套餐/设备时 BYOK submit 被服务端拒绝;普通 API Key/direct 配置不能绕过。 -- Key 不出现在 DB 普通字段、任务快照、日志、命令行、错误或导出;DPAPI 文件复制到另一用户/设备不可直接解密。 -- 托管失败不静默用 BYOK,BYOK 失败不扣 cmhub 点数。 -- 自定义生图可重启续查、下载失败不重 submit;Provider/域名/参数严格白名单。 -- 全部测试使用占位 Key,不提交真实密钥。 +- N 张任务部分成功时,成功图片正常进入照片池,失败图片有独立中文状态,可单张重试。 +- submit 响应丢失后可用稳定 task key 恢复,不重复创建或扣费;已有 task_id 的任务重启后不再次 POST。 +- 停止与关闭程序不会删除已提交任务信息;再次打开项目可以继续查询。 +- 下载超时、非图片响应和本地保存失败不重新提交生图;恢复后仍关联原 job/task_id。 +- 点数、余额、call_id 和失败退点口径与现有 cmhub 客户端一致,日志不暴露接口路径、密钥或内部响应。 +- GUI 主线程不执行网络等待;全量 unittest、ruff、compileall 和 `git diff --check` 通过。 ## 边界(不改什么) -- 阻塞解除前不实现临时兼容接口。 -- 不允许任意上游 URL,不做客户端直连,不同步长等待。 -- 不改 cmhub 托管预扣/退点账本。 +- 不实现 BYOK、自定义 Provider、API Key、来源切换或客户端直连。 +- 不实现终选拖放、导出或蝦皮写操作。 +- 不用真实收费请求作为自动化测试前提,不改变 cmhub 服务端计费契约。 ## 执行记录 -BLOCKED:等待 cmhub V1.5 授权与 BYOK 异步契约。 +(完成后记录故障矩阵、状态决策与验证结果。) diff --git a/docs/tasks/T-595.md b/docs/tasks/T-595.md index 4291511..54d78c8 100644 --- a/docs/tasks/T-595.md +++ b/docs/tasks/T-595.md @@ -9,23 +9,24 @@ created: 2026-07-11 ## 问题 / 背景 -AI工场横跨 DB、CDP、远程图片、cmhub 异步生成、GUI 拖放和本地导出。各子任务通过后仍需端到端验收,确认跨模块状态恢复、两种生成来源、部分导出和打包环境一致,并将提案文档升级为当前产品事实。 +AI工场横跨 DB、CDP、远程图片、cmhub 异步生成、GUI 拖放和本地导出。各子任务通过后仍需端到端验收,确认跨模块状态恢复、cmhub 托管生成、部分导出和打包环境一致,并将提案文档升级为当前产品事实。自定义大模型后置到 T-596,不作为本轮依赖或验收条件。 ## 方案 - 串起:新增/恢复项目 → 只读拉原图 → 单击进池 → 设源图 → 同提示词 N 张生成 → 重启续查 → 拖入终选排序 → 部分导出 → 打开目录。 -- 托管与自定义来源分别做 mock 全链和成本可控实测;只读 CDP 实跑不点击更新、不上传蝦皮。 +- cmhub 托管来源完成 mock 全链和成本可控实测;只读 CDP 实跑不点击更新、不上传蝦皮。 - 验证程序强退/重启时 submitted/running job、下载中间态、终选和草稿提示词恢复。 - 核对 1180×760、960×640 和 Windows 缩放,生成 Playwright/Qt 截图与 `tab6-ai-studio-v3.svg` 对照。 - 更新 `docs/04-architecture.md`、`docs/routes.md`、`docs/api.md`、UI README、用户排障和打包说明;Obsidian 方案标记实现状态。 - 确认公开发行包不包含 data、真实 Key、测试图片或 direct 普通入口。 +- 确认界面没有自定义 Provider、API Key 或生成来源切换入口;相关能力由后续 T-596 单独实现。 ## 验收要点 - 完整闭环可由运营独立完成,所有失败均为中文且能继续/重试,不需要改 DB。 - 同项目多轮生成、多个项目切换和重启不串图、不重复扣费、不丢 task_id。 - 终选顺序与导出文件顺序一致;部分导出和已存在目录三选实测通过。 -- 托管/BYOK 计费提示和授权边界准确,不静默切换。 +- cmhub 托管计费提示和授权边界准确;不存在 BYOK 或其他生成来源的可见入口。 - 现有五个 Tab、②生成、③更新、账号、设置、打包和全量单测不回归。 - 真实操作仅只读商品页和本地导出;CDP 自动回传不在本任务验收。 @@ -33,6 +34,7 @@ AI工场横跨 DB、CDP、远程图片、cmhub 异步生成、GUI 拖放和本 - 不实现主图9张/详情图多媒体框自动回传蝦皮。 - 不加入本地图片导入、自动去重重生或自动动作词。 +- 不实现 BYOK、自定义 Provider、API Key 或生成来源切换;这些内容后置到 T-596。 - 不以人工改 SQLite 作为验收步骤。 ## 执行记录 diff --git a/docs/tasks/T-596.md b/docs/tasks/T-596.md new file mode 100644 index 0000000..9d2784a --- /dev/null +++ b/docs/tasks/T-596.md @@ -0,0 +1,49 @@ +--- +id: T-596 +title: AI工场自定义模型(BYOK)授权代理与异步生图接入 +phase: 8 +deps: [T-595] +status: TODO +created: 2026-07-11 +--- + +## 问题 / 背景 + +自定义模型是 AI工场 cmhub 托管链路完成后的后续增强,不属于 T-586~T-595 的当前交付范围。只有这些任务全部完成并验收后才能启动本任务,不能让 BYOK 契约反向阻塞 cmhub 托管模式发布。 + +后续实现时,自定义 Key 仍必须经过软件套餐/设备授权和 cmhub 异步任务代理,不能恢复客户端 direct 直连或同步长等待。 + +当前启动前提:先完成 T-595;同时 cmhub 需完成《卡密设备绑定与套餐授权方案》V1.5 所定义的 device credential、BYOK Provider 白名单、加密 task secret、零点数使用记录和 submit/poll 契约。任一条件未满足时,本任务转为 `BLOCKED`,不编码、不猜字段。 + +## 解除阻塞条件 + +- T-586~T-595 已全部完成,cmhub 托管链路已独立发布和验收。 +- cmhub 提供版本化 API 文档、错误码、至少一个受支持 Provider、测试凭证和 mock/测试环境。 +- 明确 BYOK title/image 请求、task secret 生命周期、终态清理、幂等键和计费字段。 +- 服务端确认 Key 不进入 request_payload、CallRecord、队列日志、遥测或异常监控。 + +## 方案 + +- ⑤/AI工场增加显式“cmhub托管/自定义模型”来源;不自动切换。 +- 自定义 Key 本地使用 Windows DPAPI 保存,UI 仅掩码、替换、清除;不回显明文。 +- 所有请求带 device credential/product,服务端先校验套餐和设备;BYOK `points_cost=0`,显示“费用由模型服务商收取”。 +- 生图仍 submit→poll→下载,job task_id 持久化续查;不走同步长等待。 +- 正式发行版禁用普通用户通过 config 开启 direct 后端。 + +## 验收要点 + +- 无有效套餐/设备时 BYOK submit 被服务端拒绝;普通 API Key/direct 配置不能绕过。 +- Key 不出现在 DB 普通字段、任务快照、日志、命令行、错误或导出;DPAPI 文件复制到另一用户/设备不可直接解密。 +- 托管失败不静默用 BYOK,BYOK 失败不扣 cmhub 点数。 +- 自定义生图可重启续查、下载失败不重 submit;Provider/域名/参数严格白名单。 +- 全部测试使用占位 Key,不提交真实密钥。 + +## 边界(不改什么) + +- 启动前提或接口契约未满足时不实现临时兼容接口。 +- 不允许任意上游 URL,不做客户端直连,不同步长等待。 +- 不改 cmhub 托管预扣/退点账本。 + +## 执行记录 + +TODO:后置到 T-595 完成后;领取时再核验 cmhub V1.5 授权与 BYOK 异步契约,未满足则标记 BLOCKED。