diff --git a/docs/tasks/T-637.md b/docs/tasks/T-637.md index f87d5d5..50a1309 100644 --- a/docs/tasks/T-637.md +++ b/docs/tasks/T-637.md @@ -13,11 +13,12 @@ created: 2026-07-16 ⑥「商品套图」当前在「商品卖点与要求」标题行右侧放置「AI 帮写」和运行时「取消」按钮,套图最终提示词则由 `app/product_suite.py::build_suite_prompt()` 硬编码。用户只能填写商品卖点,无法查看或调整平台、分类、比例、参考图及商品一致性等上下文最终如何组合,也无法确认实际提交给 cmhub 的完整提示词。 -现有硬编码还存在三个明确缺口: +现有硬编码还存在两个明确缺口: 1. 界面显示的「白底主图,多角度呈现商品细节」等分类说明没有进入生成提示词; -2. 同一分类生成多张时没有把分类内序号、总数或差异化要求写进提示词,同源同类任务可能使用完全相同的文本; -3. 提示词预览若在 GUI 内另写一套拼接逻辑,后续容易与真实生成内容漂移。 +2. 提示词预览若在 GUI 内另写一套拼接逻辑,后续容易与真实生成内容漂移。 + +(源项目「同一分类多张不做序号与差异化区分、依赖模型随机性」的现象,第一版按用户决定沿用,暂不引入分类内序号、总数和差异化占位符。) 需求是在标题同行调整按钮布局,并增加一个可编辑、可恢复默认、支持占位符插入和实时最终预览的套图提示词设置弹窗。用户原提议入口名为「提示词列表」,但第一版没有多个命名模板或列表选择;为避免名称误导,入口统一使用「提示词设置」。本任务只管理一份全局套图基础模板,不实现多模板 CRUD。 @@ -55,13 +56,8 @@ created: 2026-07-16 - 「保存」:校验通过后原子写入用户模板,并显示轻量中文成功提示; - 「恢复默认」:二次确认后读取安装包内置模板,写盘前先执行与「保存」完全相同的占位符和结构校验——校验失败(打包缺陷、资源损坏)时显示中文错误、不写盘、不改动用户模板和编辑区;校验通过后调用与「保存」完全相同的原子写入服务立即覆盖用户套图模板,成功后同步更新编辑区、预览区和已保存基线,不要求再次点击「保存」。确认弹窗需明示会丢弃编辑区当前未保存修改;恢复或写盘失败时保留原用户模板和当前编辑内容; - 右侧「预览分类」下拉框:默认选中「白底图」,可切换当前固定分类和当前项目已有自定义分类。 -- 在「预览分类」右侧增加紧凑的「预览第 X 张」步进器: - - 范围为 `1..max(1, 当前预览分类配置数量)`,默认值为 1; - - 分类数量为 0 或 1 时固定为 1 并禁用,禁止出现 `第 1/0 张`; - - 分类数量大于 1 时允许切换序号,用于核对 `{分类序号}`和 `{差异化要求}`的真实变化; - - 切换分类时重置为第 1 张,不修改项目内真实生成数量。 - 左侧编辑区顶部提供「插入变量」菜单或按钮菜单。用户选择变量后,在当前光标位置插入,不要求手工记忆占位符。 -- 右侧预览区不可编辑、不可获得保存语义;内容使用当前商品任务的真实平台、地区、语言、比例、商品 ID、分类、参考图序号和卖点。预览默认使用 `{主参考图序号}`=1、`{分类序号}`=步进器当前值、`{分类总数}`=`max(1, 当前预览分类配置数量)`;当前值为空时使用明确的中文示例值,内部 `draft_` 标识不得出现在预览中。 +- 右侧预览区不可编辑、不可获得保存语义;内容使用当前商品任务的真实平台、地区、语言、比例、分类、参考图序号、商品 ID 和卖点。预览默认使用 `{主参考图序号}`=1;当前值为空时使用明确的中文示例值,内部 `draft_` 标识不得出现在预览中。 - 编辑内容变化后使用约 `200ms` 单次防抖刷新,连续输入不得触发大量重复渲染或造成界面卡顿。 - 关闭存在未保存修改的弹窗时,提供「保存」「不保存」「取消」三种中文选择;保存校验失败时保持弹窗打开。 @@ -70,17 +66,14 @@ created: 2026-07-16 - 第一版只允许以下单层中文占位符,沿用项目现有 `{变量名}` 风格: ```text - {分类要求} - {套图分类} + {套图名称} + {补充描述} {平台} {国家地区} {输出语言} {图片比例} {商品ID} {主参考图序号} - {分类序号} - {分类总数} - {差异化要求} {参考图规则} {商品卖点与要求} {尺寸与长图规则} @@ -89,43 +82,36 @@ created: 2026-07-16 {尺码信息规则} ``` -- `{分类要求}`、`{套图分类}`、`{图片比例}`、`{分类序号}`、`{分类总数}`、`{差异化要求}`、`{参考图规则}`、`{商品卖点与要求}`、`{尺寸与长图规则}`、`{禁用内容规则}`、`{价格信息规则}`、`{尺码信息规则}`为必需占位符;缺失时预览区显示中文校验结果,「保存」禁用。 -- `{套图分类}`列为必需是因为固定分类的说明文案不保证包含分类名,删掉后最终提示词可能丢失分类信息。 -- `{分类序号}`、`{分类总数}`和 `{差异化要求}`列为必需,用于保证同一分类配置多张时最终提示词具有明确序号和差异化约束;分类总数为 1 时 `{差异化要求}`可以渲染为空,但模板中仍必须保留该占位符,防止以后把数量调大时退化为完全相同的提示词。 -- `{差异化要求}`每一次出现都必须独占一行(所在行去除首尾空白后只剩该占位符),否则校验失败、「保存」禁用。重复出现时必须逐个校验,不能只检查第一次。这保证渲染为空时可整行定点删除,不会产生「要求:。」之类的内联残句。 -- `{尺寸与长图规则}`、`{禁用内容规则}`、`{价格信息规则}`、`{尺码信息规则}`为**只读规则占位符**:渲染文本由业务常量提供且可能为多行,同样必须独占一行;用户可在模板中调整其位置,但不能修改渲染内容。 +- `{套图名称}`、`{补充描述}`、`{图片比例}`、`{参考图规则}`、`{商品卖点与要求}`、`{尺寸与长图规则}`、`{禁用内容规则}`、`{价格信息规则}`、`{尺码信息规则}`为必需占位符;缺失时预览区显示中文校验结果,「保存」禁用。 +- `{套图名称}`为必需,渲染为当前分类名称(固定分类名或自定义分类名),保证分类信息一定进入提示词。 +- `{补充描述}`为必需,渲染为该分类的固定说明文本:白底图、场景图、卖点图有对应说明,其他自定义分类渲染为空字符串。它跟随 `{套图名称}` 位于同一行,为空时不产生空行,因此不要求独占一行。 +- `{商品ID}`、`{主参考图序号}`为可选占位符:默认模板不含,用户可从「插入变量」菜单插回;不插入不影响保存。 +- `{尺寸与长图规则}`、`{禁用内容规则}`、`{价格信息规则}`、`{尺码信息规则}`为**只读规则占位符**:渲染文本由业务常量提供且可能为多行,必须独占一行;用户可在模板中调整其位置,但不能修改渲染内容。 - 未知占位符、未闭合花括号和渲染后仍残留的占位符都视为错误,不得静默原样发送给模型。 - 重复使用合法占位符允许保存;第一版模板**不支持字面花括号**,任何非合法占位符形式的花括号一律校验报错,不定义转义规则,也不做字符串猜测。 - 占位符替换必须使用结构化上下文字典和统一 renderer,不允许在 GUI 中连续手写 `.replace()` 拼接另一套规则。 -### 4. 默认模板和分类要求 +### 4. 默认模板和分类说明 -- 新增安装包内置默认模板,例如 `app/default_prompts/product_suite/base.txt`。行序对齐调研笔记《虾皮圈电商图生成器提示词组装分析》第三节的组装顺序(分类目标 → 分类序号与差异化 → 平台上下文 → 尺寸/禁用/价格/尺码规则 → 参考图规则 → 商品ID → 用户需求 → 末行比例强调),该结构已被用户验证接受;同时按 cmshopee 当前字段和单参考图事实收口: +- 新增安装包内置默认模板,例如 `app/default_prompts/product_suite/base.txt`。行序对齐调研笔记《虾皮圈电商图生成器提示词组装分析》第三节的组装顺序(分类目标 → 平台上下文 → 尺寸/禁用/价格/尺码规则 → 参考图规则 → 用户需求 → 末行比例强调),该结构已被用户验证接受;同时按 cmshopee 当前字段和单参考图事实收口: ```text - {分类要求} - 套图分类:{套图分类};当前为本分类第 {分类序号}/{分类总数} 张。 - {差异化要求} + 套图名称:{套图名称}{补充描述} 平台:{平台};国家地区:{国家地区};输出语言:{输出语言}。 {尺寸与长图规则} {禁用内容规则} {价格信息规则} {尺码信息规则} {参考图规则} - 商品ID:{商品ID} 商品卖点与要求: {商品卖点与要求} 本次生成比例:{图片比例}。请严格按此比例输出,不能改成其他长宽比。 ``` - 与调研笔记源结构一致,比例强调保留在末行(源项目由 worker 二次追加,本版直接写进默认模板,`{图片比例}`为必需占位符保证不丢)。 -- `{主参考图序号}`保留为合法可插入变量,但默认模板不再单列一行;参考图序号信息由 `{参考图规则}` 渲染文本带出。 - -- 将当前仅存在于 GUI 的固定分类说明迁移或集中到业务层,渲染为 `{分类要求}`;GUI 通过同一来源显示说明,不能复制另一份字典。 -- 自定义分类的 `{分类要求}`必须明确包含自定义分类名称,例如「生成商品套图中的『使用方法图』,按照该分类名称表达用途」,不能使用不含分类名的泛化文案。 -- `{差异化要求}`至少包含分类内序号和“与本分类其他图片采用不同构图、角度或场景”的约束。若第一版没有可靠的商品语义,不自动编造具体卖点、参数或使用场景。 -- 退化规则:分类总数为 1 时 `{差异化要求}`渲染为空,最终提示词不得出现“与本分类其他图片不同”这类无意义残句。 -- 空行清理必须是定点操作:仅当 `{差异化要求}`渲染为空时,删除模板中每一个该占位符所在行及其行尾(校验已保证每次出现都独占一行);不得只删除第一次,也不得全局压缩连续空行、修改用户主动保留的段落间距或顺带清理其他空白。 +- `{套图名称}`渲染为当前分类名称;`{补充描述}`渲染为该分类的固定说明,二者位于同一行,例如白底图渲染为「套图名称:白底图,白底主图,多角度呈现商品细节」。`{补充描述}`非空时自带前导分隔符(如「,」)与套图名称衔接,为空时为纯空串。 +- 将当前仅存在于 GUI 的固定分类说明迁移或集中到业务层,渲染为 `{补充描述}`;GUI 通过同一来源显示说明,不能复制另一份字典。白底图、场景图、卖点图有对应说明文本,其他自定义分类 `{补充描述}`渲染为空——自定义分类名本身由 `{套图名称}` 带入提示词,不再要求补充描述含名称。 +- `{商品ID}`、`{主参考图序号}`保留为合法可插入变量,但默认模板不再单列一行;参考图序号信息由 `{参考图规则}` 渲染文本带出。 - `{参考图规则}`必须与当前实际请求一致。每个 `image_studio_job` 只有一个 `source_asset_id` 时,应明确表述当前图片是本任务唯一主参考图,不得声称未提交的其他图片也参与参考。 ### 5. 强制保护规则 @@ -179,16 +165,13 @@ created: 2026-07-16 - [ ] 点击「提示词设置」打开左右等宽弹窗,左侧可编辑、右侧只读,默认预览白底图最终提示词。 - [ ] 预览分类下拉可以切换固定分类和当前自定义分类;切换只刷新预览,不修改项目配置。 - [ ] 从「插入变量」菜单选择每个合法变量,都会插入到当前光标位置并在约 200ms 后刷新预览。 -- [ ] 当前商品数据完整时,预览正确替换平台、地区、语言、比例、商品 ID 和商品卖点;主参考图序号默认为 1,分类序号使用步进器值,分类总数使用 `max(1, 当前分类配置数量)`。 -- [ ] 当前预览分类数量为 0 或 1 时显示第 1/1 张且步进器禁用,不出现第 1/0 张;数量大于 1 时可切换预览第 1 至第 N 张。 +- [ ] 当前商品数据完整时,预览正确替换套图名称、补充描述、平台、地区、语言、比例和商品卖点;主参考图序号默认为 1。 - [ ] 临时草稿预览使用 `未绑定商品` 或等价中文值,不显示内部 `draft_` 标识。 -- [ ] 删除任一必需占位符(含分类序号、分类总数、差异化要求和四个规则占位符)、输入未知变量、花括号未闭合、`{差异化要求}`或规则占位符未独占一行、渲染残留变量时不能保存,并显示中文校验错误。 -- [ ] 固定分类说明实际进入提示词;自定义分类提示词明确包含自定义分类名称。 -- [ ] 同一分类多张任务的最终提示词包含各自序号/总数和差异化要求,不再完全相同。 -- [ ] 分类总数为 1 时,该分类最终提示词不含差异化残句;仅删除空的差异化占位符所在行,用户主动保留的其他段落空行不变。 +- [ ] 删除任一必需占位符(含套图名称、补充描述和四个规则占位符)、输入未知变量、花括号未闭合、规则占位符未独占一行、渲染残留变量时不能保存,并显示中文校验错误。 +- [ ] 固定分类(白底图/场景图/卖点图)的补充描述实际进入提示词;自定义分类补充描述渲染为空,但套图名称行仍带出自定义分类名。 - [ ] 参考图规则与实际单个 `source_asset_id` 一致,不声称未提交图片参与参考。 - [ ] 尺寸与长图(禁多宫格拼接)、禁用内容(政治符号)、价格、尺码四条规则和参考图规则携带的商品一致性/不编造约束始终出现在最终预览和真实请求中;规则占位符内容不可编辑,删除任一都无法保存。 -- [ ] 默认模板行序与《虾皮圈电商图生成器提示词组装分析》第三节组装顺序一致:分类目标在首行,规则内联在平台行与参考图规则之间,末行为比例强调。 +- [ ] 默认模板行序与《虾皮圈电商图生成器提示词组装分析》第三节组装顺序一致:套图名称在首行,规则内联在平台行与参考图规则之间,末行为比例强调。 - [ ] 保存后关闭并重启程序仍加载用户模板;已有用户模板不会被启动初始化或软件升级覆盖。 - [ ] 「恢复默认」经确认后通过统一原子写入服务立即落盘,并刷新编辑区和预览;关闭弹窗不再提示该次恢复为未保存修改,且只影响商品套图模板。 - [ ] 「恢复默认」写盘前校验内置模板;内置模板无效时显示中文错误、不写盘、不改动用户模板和编辑区。 @@ -203,14 +186,13 @@ created: 2026-07-16 ## 测试要求 -- 新增纯逻辑测试覆盖全部合法占位符、必需变量(含 `{套图分类}`、`{分类序号}`、`{分类总数}`、`{差异化要求}`和四个规则占位符)、未知变量、未闭合/字面花括号报错、任一 `{差异化要求}`或规则占位符未独占一行报错、重复变量、规则占位符只读渲染和 Unicode 文本。 +- 新增纯逻辑测试覆盖全部合法占位符、必需变量(含 `{套图名称}`、`{补充描述}`和四个规则占位符)、未知变量、未闭合/字面花括号报错、任一规则占位符未独占一行报错、重复变量、规则占位符只读渲染和 Unicode 文本。 - 断言最终 prompt 包含禁政治符号与禁多宫格拼接文本,且默认模板渲染结果的行序与调研笔记组装顺序一致、末行为比例强调。 -- 覆盖白底图、其他固定分类、自定义分类、正式商品、临时草稿、分类多张、分类数量为 0/1 的预览退化、分类总数为 1 的差异化退化与定点空行删除,以及单参考图 context。 +- 覆盖白底图/场景图/卖点图补充描述非空、自定义分类补充描述为空但套图名称带出分类名、正式商品、临时草稿,以及单参考图 context。 - 覆盖用户模板首次初始化、不覆盖已有文件、原子保存失败保持原文件、保存和恢复默认共用写入服务、恢复成功更新已保存基线、内置模板无效时恢复默认报错且不写盘。 - 覆盖首次初始化时内置模板缺失、不可读、缺少必需变量或包含非法占位符,断言不创建用户文件、显示中文错误且生成前中止。 -- 覆盖 `{差异化要求}`重复出现时每次都必须独占一行;分类总数为 1 时删除全部对应行,同时保留其他用户空行。 - 覆盖用户文件被外部改成无效模板时的加载校验、弹窗修复入口和生成前中止,断言无 job、worker、cmhub 或文件覆盖副作用。 -- `tests/test_product_suite_gui.py` 覆盖标题行按钮顺序、AI 帮写运行时取消按钮、弹窗初始分栏、默认白底图、分类切换、预览序号步进器、变量插入、防抖刷新、只读预览、保存校验和未保存关闭三选项。 +- `tests/test_product_suite_gui.py` 覆盖标题行按钮顺序、AI 帮写运行时取消按钮、弹窗初始分栏、默认白底图、分类切换、变量插入、防抖刷新、只读预览、保存校验和未保存关闭三选项。 - 覆盖预览 renderer 与 `build_job_specs()` 最终 prompt 相等,以及生成运行中模板变更不污染本轮 job。 - 更新构建测试或脚本断言,确认内置套图模板进入 PyInstaller 数据文件。 @@ -248,4 +230,4 @@ git diff --check - 2026-07-16 补:封堵两处剩余小洞——「恢复默认」写盘前先校验内置模板,校验失败报错不写盘(防打包缺陷/资源损坏写入坏模板);`{差异化要求}`必须独占一行,校验层强制,杜绝渲染为空时的内联残句。 - 2026-07-16 补:按用户要求把默认模板行序对齐 obsidian《虾皮圈电商图生成器提示词组装分析》第三节的组装顺序(用户接受的结构)——强制规则从「文末代码追加」改为四个必需只读占位符(尺寸与长图/禁用内容/价格/尺码)内联在平台行与参考图规则之间;比例强调移至末行;商品一致性与不编造并入 `{参考图规则}` 渲染文本;占位符总数 13→17,必需 8→12。 - 2026-07-16 补:补齐首次初始化和重复占位符语义——内置模板首次复制前同样必须校验,失败时不创建用户文件并阻断生成;重复 `{差异化要求}`的每次出现都必须独占一行,总数为 1 时定点删除全部对应行;历史执行记录标注已被后续结论覆盖。 -- 待实现。 +- 2026-07-16 简:按用户要求简化模板结构——删除 `{分类要求}`、`{差异化要求}`、`{分类序号}`、`{分类总数}`四个占位符及默认模板中的「商品ID:{商品ID}」行;`{套图分类}`改名为 `{套图名称}`并新增 `{补充描述}`(白底图/场景图/卖点图有说明、自定义分类为空);连带去掉弹窗「预览第 X 张」步进器和同类多张差异化机制(第一版沿用源项目依赖模型随机性区分同类多张);占位符 17→14、必需 12→9;`{商品ID}`、`{主参考图序号}`降为可选可插入变量。 diff --git a/docs/ui/README.md b/docs/ui/README.md index 63f7844..56d7283 100644 --- a/docs/ui/README.md +++ b/docs/ui/README.md @@ -15,6 +15,6 @@ | [tab6-image-studio-v2.svg](tab6-image-studio-v2.svg) | ⑥ 图片精修(提案·重排):细图标轨、照片池放大、提示词中心整列、全宽出片盘 | | [tab6-ai-studio-v3.svg](tab6-ai-studio-v3.svg) | ⑥ AI工场(需求定稿·v3):合并提示词、完整模板 CRUD、异步任务照片池、部分导出与终选排序 | | [tab6-suite-package-v1.svg](tab6-suite-package-v1.svg) | ⑥ 商品套图(T-622 已实现):从「虾皮圈电商图生成器」商品套餐交互迁移并替换主界面 AI工场入口;单一套图类型,多任务标签,商品原图,平台/国家/语言/比例,AI 帮写,白底/场景/卖点及自定义分类,结果历史、重试、删除撤销与生成进度 | -| [tab6-suite-prompt-dialog-T637.svg](tab6-suite-prompt-dialog-T637.svg) | ⑥ 商品套图(T-637 提案):标题行「AI帮写/取消」紧随 label、最右新增「提示词设置」;提示词设置弹窗——左编辑基础模板(行序对齐调研笔记组装顺序,插入变量菜单、占位符校验、只读规则占位符内联)、右只读实时最终预览(预览分类下拉+分类内序号步进器)、保存/恢复默认共用原子写盘 | +| [tab6-suite-prompt-dialog-T637.svg](tab6-suite-prompt-dialog-T637.svg) | ⑥ 商品套图(T-637 提案):标题行「AI帮写/取消」紧随 label、最右新增「提示词设置」;提示词设置弹窗——左编辑基础模板(行序对齐调研笔记组装顺序,套图名称+补充描述、插入变量菜单、占位符校验、只读规则占位符内联)、右只读实时最终预览(预览分类下拉)、保存/恢复默认共用原子写盘;第一版不做同类多张序号/差异化 | > 仅为线框效果图,最终样式以实现为准。带 `-T584`/`-v2` 等后缀的为**改版提案**,未定稿。界面职责与流程见 [../routes.md](../routes.md)。 diff --git a/docs/ui/tab6-suite-prompt-dialog-T637.svg b/docs/ui/tab6-suite-prompt-dialog-T637.svg index 880ee21..d34e245 100644 --- a/docs/ui/tab6-suite-prompt-dialog-T637.svg +++ b/docs/ui/tab6-suite-prompt-dialog-T637.svg @@ -1,5 +1,5 @@ - +