diff --git a/docs/tasks/T-596.md b/docs/tasks/T-596.md index 9d2784a..01a5284 100644 --- a/docs/tasks/T-596.md +++ b/docs/tasks/T-596.md @@ -1,49 +1,55 @@ --- id: T-596 -title: AI工场自定义模型(BYOK)授权代理与异步生图接入 +title: AI工场自定义模型(BYOK)总设计与启动门禁 phase: 8 -deps: [T-595] +deps: [T-598] status: TODO created: 2026-07-11 --- ## 问题 / 背景 -自定义模型是 AI工场 cmhub 托管链路完成后的后续增强,不属于 T-586~T-595 的当前交付范围。只有这些任务全部完成并验收后才能启动本任务,不能让 BYOK 契约反向阻塞 cmhub 托管模式发布。 +自定义模型是 AI工场 cmhub 托管链路完成后的后续增强,不属于 T-586~T-595 的当前交付范围。只有这些任务全部完成并验收后,再完成 T-597/T-598 的托管 GPT 模型评测与默认档位收口,才能启动 BYOK。 + +BYOK 不能再做成一个大任务直接编码。它涉及设备授权、套餐、密钥本地保护、服务端 Provider 白名单、异步 submit/poll、日志脱敏和零点数账本,必须先冻结契约,再按 T-599~T-602 小步落地。 后续实现时,自定义 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 生命周期、终态清理、幂等键和计费字段。 +- T-597/T-598 已完成,产品默认仍是 cmhub 托管模型,普通用户不被迫配置自定义 Key。 +- cmhub 完成《卡密设备绑定与套餐授权方案》V1.5 所定义的 device credential、BYOK Provider 白名单、加密 task secret、零点数使用记录和 submit/poll 契约。 +- cmhub 提供版本化 API 文档、错误码、至少一个受支持 Provider(第一期优先 OpenAI)、测试凭证和 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 后端。 +- 本任务只做启动门禁和总设计冻结:核对 cmhub V1.5 契约、OpenAI Provider 白名单、客户端保存/传输边界、错误码和任务拆分。 +- 若任何解除阻塞条件缺失,把本任务改为 `BLOCKED` 并在执行记录写明缺口;不得猜字段、不得先写临时兼容代码。 +- 通过后再按子任务实现: + - T-599:BYOK OpenAI Provider 契约、白名单与套餐校验对齐。 + - T-600:BYOK Key 本地 DPAPI 存储与设置 UI。 + - T-601:BYOK 异步 submit/poll 接入 AI工场 job 生命周期。 + - T-602:BYOK 安全日志、零点数账本与端到端回归。 +- 正式发行版继续禁用普通用户通过旧 `direct` 后端绕过 cmhub 授权代理。 ## 验收要点 -- 无有效套餐/设备时 BYOK submit 被服务端拒绝;普通 API Key/direct 配置不能绕过。 -- Key 不出现在 DB 普通字段、任务快照、日志、命令行、错误或导出;DPAPI 文件复制到另一用户/设备不可直接解密。 -- 托管失败不静默用 BYOK,BYOK 失败不扣 cmhub 点数。 -- 自定义生图可重启续查、下载失败不重 submit;Provider/域名/参数严格白名单。 -- 全部测试使用占位 Key,不提交真实密钥。 +- 形成一份可执行的 BYOK 启动检查记录:已满足 / 未满足 / 证据来源 / 后续 owner。 +- 明确第一期是否只支持 OpenAI Provider,以及允许的模型档位、能力范围、图片编辑接口和最大超时。 +- T-599~T-602 的依赖、边界、验收点能独立执行,不再把 BYOK 当一个巨型编码任务。 +- 若转 `BLOCKED`,后续子任务不得开工;若保持 `TODO/DONE`,必须说明接口契约已足够实现。 +- 不提交真实 Key、测试凭证、账号、Cookie、业务图片或 data 目录。 ## 边界(不改什么) - 启动前提或接口契约未满足时不实现临时兼容接口。 - 不允许任意上游 URL,不做客户端直连,不同步长等待。 - 不改 cmhub 托管预扣/退点账本。 +- 不改 T-586~T-595 已完成的 cmhub 托管 AI工场主线。 ## 执行记录 -TODO:后置到 T-595 完成后;领取时再核验 cmhub V1.5 授权与 BYOK 异步契约,未满足则标记 BLOCKED。 +TODO:领取时先核验 T-595/T-598 与 cmhub V1.5 授权、BYOK 异步契约;未满足则标记 BLOCKED,不编码。 diff --git a/docs/tasks/T-597.md b/docs/tasks/T-597.md new file mode 100644 index 0000000..3b3cf26 --- /dev/null +++ b/docs/tasks/T-597.md @@ -0,0 +1,51 @@ +--- +id: T-597 +title: AI工场 GPT / OpenAI 托管模型选型评测与默认档位策略 +phase: 8 +deps: [T-595] +status: TODO +created: 2026-07-11 +--- + +## 问题 / 背景 + +T-586~T-595 固定使用 cmhub 托管生图模型,不接入自定义 Provider。AI工场主线完成后,如果要让 cmhub 后台切到 OpenAI / GPT 系列模型,不能只凭模型名直接上线,需要先建立运营可理解的质量、速度、成本评测口径。 + +当前官方模型指导中,GPT-5.6 家族分为偏旗舰能力的 `gpt-5.6-sol`、平衡能力与成本的 `gpt-5.6-terra`、成本敏感高频任务的 `gpt-5.6-luna`;图片生成/编辑方向以 `gpt-image-2` 作为当前高质量图像模型参考。落地到本项目时仍必须通过 cmhub 能力别名调用,不在 cmshopee 客户端直连 OpenAI。 + +## 方案 + +- 建立 AI工场模型评测样本集:至少覆盖 20~30 个真实商品,包含服饰/生活用品/美妆/小物、白底主图、场景图、细节图和文字较多的旧图。 +- 评测拆成两类: + - 文本/提示词辅助:商品图精修提示词改写、标题/卖点辅助、失败原因解释,优先评估 `gpt-5.6-terra`;高质量复核评估 `gpt-5.6-sol`;大批量低成本辅助评估 `gpt-5.6-luna`。 + - 图片生成/编辑:主图/详情图候选生成,优先评估 cmhub 提供的 `gpt-image-2` 或等价托管图像别名;保留当前 cmhub 默认图像模型作为对照组。 +- 评估指标用运营能理解的口径:商品主体保真、可商用感、少幻觉、文字不乱写、背景干净、主图合规、详情图信息清晰、一次通过率、平均耗时、单图成本。 +- 输出推荐档位: + - 默认:平衡档,用于日常批量。 + - 高质量:用于重点商品或失败重试。 + - 省点:用于低价值 SKU 或大批量初稿。 +- 推荐结果只写成 cmhub 别名策略,不把 OpenAI API Key 或直连 Provider 写进 cmshopee 配置。 + +## 验收要点 + +- 形成 `docs/` 下的评测记录或选型说明,列出样本、模型档位、质量结论、耗时、成本和最终推荐。 +- 明确普通产品默认仍走 cmhub 托管别名;cmshopee 只保存 `title_alias/image_alias`,不保存 OpenAI 模型 slug 作为执行事实。 +- 能回答运营问题:什么时候用默认档、什么时候用高质量档、什么时候用省点档,以及失败重试是否值得换档。 +- 不需要真实接入 BYOK,不改 ⑤设置页,不改 AI工场代码;本任务可以只做评测与文档。 +- 自动化验证只需 `git diff --check`;若评测脚本另建,必须使用假 Key 或外部环境变量,不提交凭证。 + +## 边界(不改什么) + +- 不实现 BYOK、自定义 Provider、API Key UI 或 direct 直连。 +- 不修改 T-586~T-595 的 cmhub 托管主线。 +- 不把模型定价写死进代码;价格以 cmhub `/models` 返回和实际扣点为准。 +- 不用单个商品样本直接决定默认模型。 + +## 参考资料 + +- OpenAI 模型选择指导:`https://developers.openai.com/api/docs/guides/latest-model` +- OpenAI 图片生成指导:`https://developers.openai.com/api/docs/guides/image-generation` + +## 执行记录 + +(完成后记录评测样本、推荐档位、采用的 cmhub 别名和验证方式。) diff --git a/docs/tasks/T-598.md b/docs/tasks/T-598.md new file mode 100644 index 0000000..7979465 --- /dev/null +++ b/docs/tasks/T-598.md @@ -0,0 +1,40 @@ +--- +id: T-598 +title: AI工场托管模型档位展示、默认别名与日志口径收口 +phase: 8 +deps: [T-597] +status: TODO +created: 2026-07-11 +--- + +## 问题 / 背景 + +T-597 选出 GPT / OpenAI 托管模型档位后,用户仍不应该看到一堆难理解的 Provider、模型 slug 或接口路径。cmshopee 的产品口径应保持“cmhub 托管模型 + 用途档位 + 点数成本”,执行层仍只保存 cmhub 能力别名。 + +如果直接把 `gpt-5.6-sol`、`gpt-image-2` 等模型名暴露到普通用户界面,会把服务端可调整的模型实现细节固化到客户端,也容易让用户误以为可以本地直连或自填 OpenAI Key。 + +## 方案 + +- 基于 T-597 的推荐结果,为 AI工场定义托管档位文案:默认/高质量/省点,文案说明只讲用途、质量和成本倾向,不展示 API Key 或内部接口。 +- ⑤设置与 AI工场生成区继续从 cmhub `/api/v1/models` 读取别名、价格和能力;如 cmhub 返回 `display_name/tags/recommended_for` 等字段则优先展示,否则用本地文档定义的中文用途说明补充。 +- 持久化仍只保存 `ai.cmhub.title_alias` / `ai.cmhub.image_alias` 或 AI工场项目级别选择的 cmhub 别名;不新增 OpenAI 直连配置。 +- 运行日志、状态栏、弹窗统一用用户可读中文:例如“使用 cmhub 托管高质量档,预计扣点 X”,避免暴露完整接口路径、Provider 请求体、上游错误堆栈。 +- 文档同步 `docs/04-architecture.md`、`docs/routes.md`、`docs/api.md` 中 AI工场模型展示与日志口径。 + +## 验收要点 + +- AI工场和⑤设置页没有 OpenAI Key、Provider URL、direct backend 或“自定义模型”入口;这些仍由 T-596 之后单独实现。 +- 别名下拉或档位提示能让运营理解默认/高质量/省点的差异,并能看到点数或价格提示。 +- DB/config 保存的是 cmhub alias 和必要的档位标识,不保存 OpenAI 原始密钥或直连 URL。 +- 运行日志不出现 cmhub 内部接口路径、OpenAI API 路径、Authorization、Key、完整请求体或超长 prompt。 +- GUI/offscreen 测试覆盖档位文案、别名持久化、日志脱敏;运行 ruff、compileall、unittest、`git diff --check`。 + +## 边界(不改什么) + +- 不接入 BYOK,不新增自定义 Provider,不恢复 direct 普通入口。 +- 不改 cmhub 计费契约,不在客户端写死价格。 +- 不影响② AI生成现有 cmhub 别名配置;AI工场如需项目级别选择,必须与现有配置兼容。 + +## 执行记录 + +(完成后记录 UI 改动、文档同步和验证命令。) diff --git a/docs/tasks/T-599.md b/docs/tasks/T-599.md new file mode 100644 index 0000000..3b3904e --- /dev/null +++ b/docs/tasks/T-599.md @@ -0,0 +1,40 @@ +--- +id: T-599 +title: AI工场 BYOK OpenAI Provider 契约、白名单与套餐校验对齐 +phase: 8 +deps: [T-596] +status: TODO +created: 2026-07-11 +--- + +## 问题 / 背景 + +BYOK 第一期开 OpenAI Provider 时,最大的风险不是 UI,而是绕过 cmhub 授权、把用户 Key 泄露到日志,或让客户端恢复任意 URL 直连。必须先和 cmhub 固化 Provider 白名单、设备授权、套餐校验、错误码和异步任务契约,再写客户端代码。 + +## 方案 + +- 核对 cmhub BYOK V1.5 API:device credential、product、provider、model_alias、task secret、submit/poll、download、错误码、零点数使用记录和幂等键。 +- 第一阶段只允许 OpenAI Provider;允许的模型能力由服务端白名单提供,不允许客户端填写任意 URL 或任意模型名。 +- 明确 OpenAI 模型档位: + - 文本/提示词辅助默认用 T-597 推荐的平衡档,允许高质量/省点档。 + - 图像生成/编辑优先使用服务端白名单中的 GPT Image 2 等图像能力别名。 +- 无有效套餐/设备授权时,服务端必须拒绝 submit;客户端只展示中文原因,不本地绕过。 +- 明确 BYOK `points_cost=0` 的账本语义:不扣 cmhub 点数,但仍记录使用次数、provider、call_id/task_id 和“费用由模型服务商收取”。 + +## 验收要点 + +- 有版本化契约文档或接口样例,覆盖成功、无套餐、设备不匹配、Provider 禁用、模型不允许、Key 无效、内容被拒、上游失败、任务超时。 +- 明确 Key 不出现在 request_payload、CallRecord 明文字段、队列日志、遥测、异常监控或导出文件。 +- 明确 submit 之后的任务状态与 T-590/T-594 的 image_studio_jobs 生命周期兼容。 +- 若 cmhub 契约缺失,任务转 `BLOCKED`,不进入 T-600/T-601。 +- 本任务不写生产代码;可补文档和 mock 契约。验证至少运行 `git diff --check`。 + +## 边界(不改什么) + +- 不实现 UI、不保存 Key、不发真实 OpenAI 请求。 +- 不支持任意 Provider、任意 URL、客户端 direct 或同步长等待。 +- 不改变 cmhub 托管模型默认路径。 + +## 执行记录 + +(完成后记录契约来源、白名单结论和是否解除后续实现阻塞。) diff --git a/docs/tasks/T-600.md b/docs/tasks/T-600.md new file mode 100644 index 0000000..8d0be0e --- /dev/null +++ b/docs/tasks/T-600.md @@ -0,0 +1,38 @@ +--- +id: T-600 +title: AI工场 BYOK Key 本地 DPAPI 存储与设置 UI +phase: 8 +deps: [T-599] +status: TODO +created: 2026-07-11 +--- + +## 问题 / 背景 + +自定义 OpenAI Key 属于高敏感信息。既不能写进 `data/config.json` 明文,也不能沿用旧 `data/config/ai_models.json` 的普通 direct 模型清单给用户暴露。Windows 桌面版需要用当前用户/设备绑定的本地加密保存,并且 UI 只允许录入、替换、清除和测试,不回显明文。 + +## 方案 + +- 新增 BYOK secret 存储模块,Windows 使用 DPAPI 保护 Key;非 Windows 开发环境可用测试替身,但正式打包只面向 Windows。 +- 存储文件放 `data/config/byok_secrets.json` 或同级专用文件,必须 gitignore;文件复制到另一 Windows 用户/设备不能直接解密。 +- ⑤设置或 AI工场设置区新增“自定义模型”配置入口,但默认仍是 cmhub 托管;只有用户显式选择自定义才显示 OpenAI Key 输入、替换、清除、测试连接。 +- UI 只显示掩码和保存状态;保存/替换时弹中文提示“密钥仅本机加密保存,模型费用由服务商收取”。 +- 所有日志、状态栏、弹窗、run_logs 和本地诊断日志都不得包含 Key、Key 片段、完整请求头或 DPAPI 原始密文。 + +## 验收要点 + +- 保存、加载、替换、清除、错误密文、跨用户不可解密均有纯逻辑测试或可控平台测试。 +- UI 不回显明文;离开未保存确认与现有 T-531 设置脏状态兼容。 +- 未配置 Key 时自定义来源不可提交任务,提示用户先配置;cmhub 托管来源不受影响。 +- 打包校验确认不会把本地 Key 文件打进 release。 +- 运行 ruff、compileall、unittest、`git diff --check`。 + +## 边界(不改什么) + +- 不实现 submit/poll 生图,不调用 OpenAI,不改 cmhub 托管默认来源。 +- 不把 Key 存 SQLite 普通字段,不支持云同步 Key。 +- 不支持用户填写任意 Provider URL。 + +## 执行记录 + +(完成后记录存储文件、DPAPI 兼容性和 GUI 验证。) diff --git a/docs/tasks/T-601.md b/docs/tasks/T-601.md new file mode 100644 index 0000000..6596465 --- /dev/null +++ b/docs/tasks/T-601.md @@ -0,0 +1,38 @@ +--- +id: T-601 +title: AI工场 BYOK 异步 submit/poll 接入 image_studio_jobs +phase: 8 +deps: [T-600] +status: TODO +created: 2026-07-11 +--- + +## 问题 / 背景 + +BYOK 生图不能回到客户端直连 OpenAI、同步等待几百秒的旧路径。即使用用户自己的 Key,也必须经 cmhub 授权代理提交任务,并复用 AI工场的 job 持久化、重启续查、下载失败不重提交流程。 + +## 方案 + +- 在 AI工场生成来源显式选择“cmhub 托管 / 自定义模型”;默认仍是 cmhub 托管。 +- 自定义来源 submit 请求带 device credential、product、provider、模型档位、加密 task secret 引用和 image_studio_job key;不把明文 Key 写入 DB 或日志。 +- 复用 T-590/T-594 的 job 生命周期:pending/submitted/running/succeeded/failed/expired/cancelled;已有 task_id 只 poll,不重新 submit。 +- poll 成功后走同一下载与图片校验管线,生成 asset、比例、父图、提示词、provider 和使用记录。 +- BYOK `points_cost=0`,但日志和 UI 显示“费用由模型服务商收取”,并保留 provider/task_id/call_id 便于排障。 + +## 验收要点 + +- 自定义来源 N 张生成产生 N 个 job/key/task;停止、重启、下载失败、单张失败语义与 cmhub 托管一致。 +- 无套餐/设备、Key 无效、Provider 不允许、模型不允许、上游失败、内容拒绝都有中文错误和可恢复状态。 +- BYOK 失败不扣 cmhub 点数;cmhub 托管失败不静默切到 BYOK。 +- 旧② AI生成、AI工场 cmhub 托管和 T-590/T-594 测试不回归。 +- 运行 ruff、compileall、unittest、`git diff --check`;不使用真实 Key 作为自动化测试前提。 + +## 边界(不改什么) + +- 不实现自动上传蝦皮,不改变终选/导出行为。 +- 不支持同步长等待,不支持客户端 direct,不支持任意 URL。 +- 不在本任务做完整安全审计收口,集中到 T-602。 + +## 执行记录 + +(完成后记录接口字段、job 状态映射和回归结果。) diff --git a/docs/tasks/T-602.md b/docs/tasks/T-602.md new file mode 100644 index 0000000..ae59660 --- /dev/null +++ b/docs/tasks/T-602.md @@ -0,0 +1,38 @@ +--- +id: T-602 +title: AI工场 BYOK 安全日志、零点数账本与端到端回归验收 +phase: 8 +deps: [T-601] +status: TODO +created: 2026-07-11 +--- + +## 问题 / 背景 + +BYOK 接入后,风险集中在密钥泄露、账本误导、失败重试重复提交、托管/自定义来源串用,以及打包发布夹带本地敏感文件。必须在发布前做独立回归,不把实现任务的通过当成最终验收。 + +## 方案 + +- 做安全日志矩阵:状态栏、弹窗、GUI运行日志、run_logs、data/logs、本地导出、异常 traceback、打包目录,逐项确认不含 API Key、Authorization、Cookie、真实账号或完整请求体。 +- 做账本矩阵:cmhub 托管扣点/退点;BYOK 零点数使用记录;两种来源的余额显示和提示文案不混淆。 +- 做恢复矩阵:submit 成功后断网、程序强退、poll 超时、下载失败、图片非图、用户停止、任务 expired。 +- 做来源隔离:托管失败不自动切自定义,自定义失败不自动切托管;项目切换不串 provider/key/task。 +- 做打包发布检查:release 不包含 data、byok secrets、真实图片、真实 DB 或诊断日志。 + +## 验收要点 + +- 形成 BYOK 验收记录,列出每个矩阵项、预期、实际结果和证据。 +- 全量测试通过:ruff、compileall、unittest、`git diff --check`;必要时补 GUI/offscreen 测试。 +- 使用占位 Key/mock 环境完成自动化;真实 Key 只允许人工本地小样本验证且不写入仓库。 +- 用户可理解费用差异:托管扣 cmhub 点数,自定义由模型服务商收费。 +- 若发现密钥泄露或来源串用,必须修复后才能标 DONE。 + +## 边界(不改什么) + +- 不新增功能入口,不调整 AI工场主流程,不扩大 Provider 范围。 +- 不提交测试数据、真实 Key、真实商品图片或 data 目录。 +- 不以删除日志作为修复手段;必须从源头脱敏。 + +## 执行记录 + +(完成后记录安全矩阵、账本矩阵、端到端验证和 release 检查结果。)