diff --git a/docs/tasks/T-678.md b/docs/tasks/T-678.md index 9fa0c14..c69711f 100644 --- a/docs/tasks/T-678.md +++ b/docs/tasks/T-678.md @@ -39,6 +39,8 @@ T-677 恢复了⑤的自定义网关(`ai.backend=direct`)。图片模型的 ### 3. 配置、预检与回归 - 使用图片模型前,预检同时检查启用状态、`images_edits` 接口类型、URL、模型名、密钥和超时;错误只给中文可操作说明,不暴露密钥、完整上游 URL 或原始响应体。 +- 图片模型的⑤「测试」入口改为「检查图片配置」:只执行本地字段、接口类型、URL 格式和超时校验,**不**向 `/images/edits` 发送没有 `image[]` 的 JSON `ping` 请求,也不伪造成功。原因是图片编辑端点要求 multipart 图片,真实请求可能产生服务商费用。 +- 用户需要验证图片模型实际可用性时,必须通过②或⑥的正常生成确认流程完成;确认框继续如实提示「自定义网关不计点数,实际费用以服务商为准」。不得在“检查图片配置”中隐式发起可能计费的生成请求。 - ②已有的重试、并发、日志、“自定义网关不计点数”口径不变;本任务不改变默认网关及其 cmhub 生图路径。 - 在执行记录中记录 OpenAI 官方文档核实日期、`image[]` 字段、标准响应字段和支持的尺寸范围;外部兼容服务若不满足该契约,第一版明确不支持,不做自动探测或私有适配。 @@ -48,6 +50,7 @@ T-677 恢复了⑤的自定义网关(`ai.backend=direct`)。图片模型的 - [ ] `category=image` 仅在 `api_type=images_edits` 时可提交图片生成;存量 `chat` / `auto` 图片模型保留且不被静默改写。 - [ ] multipart 使用有序重复 `image[]` 字段;单图与多图均有字段、顺序与首图主体的单元测试。 - [ ] 图片响应仅接受 `data[].b64_json` / `data[].url`;非标准响应有可读中文错误,非法 URL 不会下载。 +- [ ] ⑤图片模型的「检查图片配置」不发送网络生图请求,旧 `test_ai_model()` 的 JSON ping 不会被用于 `images_edits` 模型;文字模型既有测试行为不回归。 - [ ] ②单图生成的结果、重试、并发、日志和不计点数口径不回归。 - [ ] ⑤的图片模型限制和②预检均为中文,不泄露密钥、完整上游 URL 或原始响应体。 - [ ] 默认网关的生文、生图、图片理解、异步 submit/poll、幂等键、计费与③更新蝦皮不受影响。 @@ -56,7 +59,7 @@ T-677 恢复了⑤的自定义网关(`ai.backend=direct`)。图片模型的 - `tests/test_ai.py`:文字 `chat` / `auto` 回归、图片 `images_edits` 单图与多图 `image[]` 请求、`n=1`、标准响应和非法/非标准响应错误路径。 - `tests/test_appconfig.py`:按类别的可用性校验、存量 `chat` / `auto` 图片模型不被改写、文字模型保存与加载不回归。 -- `tests/test_gui.py`:⑤按类别显示接口类型、②预检拦截不可用图片模型且文案中文。 +- `tests/test_gui.py`:⑤按类别显示接口类型、图片模型检查不发网络请求、②预检拦截不可用图片模型且文案中文。 - 更新 `docs/cmhub-integration-design.md`、`docs/routes.md`、`docs/api.md`,标明图片编辑的固定契约和 T-679 的依赖关系。 ## 验证 diff --git a/docs/tasks/T-679.md b/docs/tasks/T-679.md index d33be94..e33520e 100644 --- a/docs/tasks/T-679.md +++ b/docs/tasks/T-679.md @@ -13,6 +13,8 @@ created: 2026-07-20 商品套图从只支持默认网关扩展为支持自定义网关,涉及持久化 job 来源、同步请求、停止与失败语义、生成确认、历史与已提交默认网关任务恢复。原任务同时修改这些层次,风险和验收面过大,现拆为 T-679a、T-679b、T-679c;本任务只负责三项完成后的跨层集成验收。 +**发布门禁:T-679a、T-679b、T-679c 与本任务 T-679 均为 `DONE` 前不得发布。** 前三项保证实现完整,本任务保证两来源混合、切换⑤设置和恢复旧默认网关任务的跨层回归已经实际验证;任一项缺失都不是可发布的中间态。 + ## 集成要求 - 默认网关任务继续使用 `generation_source="cmhub"`、`provider="cmhub"`、异步 task ID、轮询、幂等键和点数账本。 diff --git a/docs/tasks/T-679a.md b/docs/tasks/T-679a.md index 5554c93..444cd9e 100644 --- a/docs/tasks/T-679a.md +++ b/docs/tasks/T-679a.md @@ -13,7 +13,7 @@ created: 2026-07-20 **本任务组有意放宽 T-677 的既定边界。** T-677 明确写了「不给商品套图和图片理解新增自定义网关路径,本任务只做入口拦截与提示」。放宽的理由是:来源切换后,商品套图是唯一完全断链的模块——②生文生图在自定义网关下可用,只有⑥不可用,用户切走后套图功能整体消失。图片理解(AI 帮写)不在放宽范围内,继续保持默认网关独占。记录这一点是为了避免后续回看时误判 T-677 与本任务组互相矛盾。 -**发布门禁:T-679a、T-679b、T-679c 未全部完成前不得发布。** 三者拆分只为控制单次改动面,不构成可独立发布的中间态。重复计费的二次确认提示定义在 T-679c,若 T-679a/T-679b 先上线,用户已能创建并失败 direct 任务,却会在没有"可能重复收费"提示的情况下重试——这是资金口径缺口,不是体验缺陷。 +**发布门禁:T-679a、T-679b、T-679c 与集成验收 T-679 未全部完成前不得发布。** 拆分只为控制单次改动面,不构成可独立发布的中间态。重复计费的二次确认提示定义在 T-679c,而两来源混合回归定义在 T-679;任一缺失都会形成资金或恢复语义缺口。 `app/image_studio_generation.py` 当前把运行时、提交、轮询和 job 来源硬编码为 cmhub。自定义网关是无 task ID 的同步图片编辑请求,不能复用 cmhub 的异步恢复模型;若只在现有分支上打补丁,停止、超时或程序中断时会出现已扣费图片丢失、误轮询或重复生成。 @@ -36,13 +36,16 @@ created: 2026-07-20 - 停止只取消尚未发起的 job。已发出的同步请求不可强杀;如果已收到图片字节,必须先保存资产并标成功,停止只阻止后续 job。 - 直连请求提交后发生读超时、连接中断或进程退出时,客户端无法确认服务商是否已受理或计费:不自动重试,不自动恢复,不把该 job 放入“继续查询”。标失败并提供后续手动“重新生成”入口。 -- 程序启动或进入项目时,遗留 `running` 的 direct job 统一标为失败,中文原因说明“程序中断,无法确认生成结果,请手动重新生成”;不得自动补发。 +- 只在**程序启动后的单次陈旧任务恢复流程**处理遗留 `running` 的 direct job,绝不能在“进入项目”、切换任务或刷新结果时清理;用户可在生成中切换任务,误清理会把仍在运行的 worker 标为失败。 +- direct job 进入 `running` 时持久化本次运行会话标识;恢复流程只能处理不属于当前活动会话的 job。若应用未建立可靠的单实例锁或本地运行租约,恢复流程必须跳过状态修改并记录诊断,不能猜测另一实例是否仍在运行。 +- 被确认陈旧的 direct job 标为失败,中文原因说明“程序中断,无法确认生成结果,请手动重新生成”;不得自动补发。 - 直连超时取冻结模型的 `connect_timeout_seconds` 和 `timeout_seconds`;若后者未设置,使用项目已有的受限默认值。不得使用 cmhub submit/poll/read timeout 常量。 ### 4. 比例与参考图 - 套图比例固定映射:`1:1 -> 1024x1024`;`3:4`、`9:16 -> 1024x1536`;`4:3`、`16:9 -> 1536x1024`。映射覆盖 `product_suite.RATIOS` 的全部五个取值;后四种为近似映射。 -- **资产必须同时记录用户选择的比例与实际输出尺寸。** 只保存原始比例会让 DB 记着 `9:16` 而文件实际是 1024×1536(2:3)。当前 `image_studio.add_asset()` 的 `aspect_ratio` 只写入、无下游消费者(`app/image_studio.py:707-731`),所以暂不产生可见故障;但一旦历史展示、导出或后续上传开始信任该字段就会出错。补充实际尺寸字段属于本任务范围,不留给以后修。 +- `image_studio_assets.aspect_ratio` 继续表示用户选择的比例,禁止改变其历史语义。新增可空的 `requested_output_size TEXT`、`rendered_width INTEGER`、`rendered_height INTEGER`:前者记录比例映射出的请求尺寸,后两者在文件保存后从真实图片读取。 +- 新生成资产无论来源均写入这三项字段;存量资产保持 `NULL`,不回填、不阻塞预览、历史、导出或上传。迁移必须附加式、幂等,并同步更新 `ImageStudioAsset`、`add_asset()` 与读取映射。 - 任务层向调用方返回“是否近似比例”的结构化结果,T-679b 负责在确认框中告知用户;不得静默伪造精确比例。 - 首图主体与其余参考图的规则必须使用已冻结、已持久化的 job prompt;不能在 HTTP 调用层临时拼接,避免确认预览、历史 prompt 与实际请求不一致。 @@ -51,15 +54,15 @@ created: 2026-07-20 - [ ] 可创建并执行 direct job,字段值精确为 `direct` / `openai_images_edits` / 空 `task_id`。 - [ ] direct 请求不调用 cmhub 提交、轮询、余额、价格或下载路径;cmhub job 行为不变。 - [ ] 已返回字节的 direct job 即使用户点击停止也会保存成功;未开始 job 才会取消。 -- [ ] direct 不发生自动重试;遗留 `running` direct job 不会自动重发或进入继续查询。 +- [ ] direct 不发生自动重试;仅启动期确认陈旧的 `running` direct job 会失败,当前活动 worker、切换项目和刷新结果均不会被误清理,也不会进入继续查询。 - [ ] 比例映射、近似标记、`n=1`、多图顺序和 prompt 一致性有纯逻辑测试。 -- [ ] 生成资产同时记录用户选择的比例与实际输出尺寸;新增字段的迁移为附加式且幂等,存量资产缺该字段时不报错、不阻塞历史展示。 +- [ ] 生成资产保留用户比例,并分别记录请求尺寸和文件真实像素尺寸;新增字段的迁移为附加式且幂等,存量资产缺该字段时不报错、不阻塞历史展示。 - [ ] 直连模型 URL、密钥与原始响应不进入 SQLite、事件日志或异常面向用户的文案。 ## 测试与文档 -- `tests/test_image_studio_generation.py`:来源分派、状态转移、停止边界、超时、遗留运行任务、比例映射、混合 job 防串路与无自动重试。 -- `tests/test_image_studio.py`:来源字段和中断恢复的数据访问。 +- `tests/test_image_studio_generation.py`:来源分派、状态转移、停止边界、超时、启动期陈旧任务恢复、生成中切换/刷新不误清理、比例映射、混合 job 防串路与无自动重试。 +- `tests/test_image_studio.py`:来源字段、运行会话标识、请求/真实尺寸字段迁移与中断恢复的数据访问。 - 更新 `docs/04-architecture.md`、`docs/api.md`:记录两种来源 job 生命周期。 ## 验证 diff --git a/docs/tasks/T-679b.md b/docs/tasks/T-679b.md index bdf2f94..e35495b 100644 --- a/docs/tasks/T-679b.md +++ b/docs/tasks/T-679b.md @@ -11,7 +11,7 @@ created: 2026-07-20 ## 问题 / 背景 -**发布门禁:T-679a、T-679b、T-679c 未全部完成前不得发布**(理由见 T-679a 背景:重复计费提示定义在 T-679c,缺它会形成资金口径缺口)。 +**发布门禁:T-679a、T-679b、T-679c 与集成验收 T-679 未全部完成前不得发布**(理由见 T-679a 背景:重复计费提示定义在 T-679c,而跨来源回归由 T-679 覆盖)。 T-677 按安全边界禁用了自定义网关下⑥的新建套图、重试和价格流程。T-679a 提供来源正确的同步执行能力后,GUI 必须只在配置可用时开放入口,并用清晰中文说明主体一致性、比例近似、费用和停止边界。 @@ -23,6 +23,7 @@ T-677 按安全边界禁用了自定义网关下⑥的新建套图、重试和 - 生成确认框以实际 job specs 展示:生成数量、主图/参考图规则、逐图模式、所选比例;若 T-679a 返回近似比例,明确显示实际输出尺寸和“接近比例生成”。 - 自定义网关确认框说明“首图作为主要商品参考,参考图效果取决于模型,主体一致性可能弱于默认网关”;该文案不承诺模型必然保留主体。 - 点击停止后,显示“正在停止,等待当前图片返回后结束”;禁用新的提交入口但不冻结整个 GUI,完成后恢复正常状态。 +- 生成期间允许切换其他任务、查看日志、历史和已完成图片;当前任务的原图、提示词、比例、分类和生成设置继续锁定,避免用户误以为修改会影响已冻结的 job 快照。 - 结果日志、失败提示只显示中文业务信息和来源名“自定义网关”,不显示完整 URL、模型名、密钥或原始上游正文。 - 「AI 帮写」继续只支持默认网关;自定义网关下置灰并提示中文原因。 @@ -31,7 +32,7 @@ T-677 按安全边界禁用了自定义网关下⑥的新建套图、重试和 - [ ] 自定义网关配置合格时可创建、确认并启动套图生成;不合格时在提交前阻止。 - [ ] 自定义网关流程不访问 cmhub 价格/余额/模型接口,且不显示“0 点”或过期余额。 - [ ] 确认框完整提示数量、主参考图、参考图、逐图模式、比例映射、费用与主体一致性差异。 -- [ ] 停止中的视觉与按钮状态准确,GUI 其余非破坏性操作不被整窗冻结。 +- [ ] 停止中的视觉与按钮状态准确;可切换任务、查看日志/历史,但当前任务输入不可编辑,GUI 不会整窗冻结。 - [ ] 默认网关确认、价格、余额、AI 帮写和原有套图生成不回归。 ## 测试与文档 diff --git a/docs/tasks/T-679c.md b/docs/tasks/T-679c.md index c20424a..6835a3b 100644 --- a/docs/tasks/T-679c.md +++ b/docs/tasks/T-679c.md @@ -11,7 +11,7 @@ created: 2026-07-20 ## 问题 / 背景 -**发布门禁:T-679a、T-679b、T-679c 未全部完成前不得发布。** 本任务承载 direct 重试的重复计费二次确认,是该门禁的主要原因——缺它则用户可在无提示的情况下重复付费重试(详见 T-679a 背景)。 +**发布门禁:T-679a、T-679b、T-679c 与集成验收 T-679 未全部完成前不得发布。** 本任务承载 direct 重试的重复计费二次确认,而 T-679 负责跨来源回归;缺任一项都可能让用户在无提示下重复付费或错误恢复任务。 默认网关异步任务可凭 `task_id` 继续查询;自定义网关同步请求无法在程序中断后确认远端状态。两类 job 在同一项目中并存时,错误的“恢复”或自动重试会造成重复计费、错误轮询或用户误判结果。