Files

71 lines
5.2 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
---
id: T-687
title: 商品套图提示词花括号兼容与生成错误反馈
phase: 8
deps: [T-637]
status: DONE
created: 2026-07-22
---
# T-687 商品套图提示词花括号兼容与生成错误反馈
## 问题 / 背景
商品套图提示词模板在替换 `{商品卖点与要求}` 后,当前 renderer 继续以“最终文本不得包含任何 `{` 或 `}`”判断是否有残留变量。用户业务文字本身可以合法包含花括号,例如 `适合 {儿童} 使用`;该文字被替换进最终提示词后会被错误判为“提示词渲染后仍有未替换变量”。
点击「生成套图」时,`ProductSuiteTab.start_generation()` 没有捕获 `build_job_specs()` 抛出的 `ProductSuitePromptError`,Qt 点击事件只在控制台报异常,GUI 没有中文提示,表现为按钮点击无效。
## 方案
### 1. 模板与业务文本边界
- 保留替换前 `product_suite_prompt_errors()` 的完整模板校验:模板为空、未知变量、未闭合或字面花括号、缺少必需变量、只读规则变量结构错误仍须阻止保存和生成。
- `render_product_suite_prompt()` 只替换已通过校验的模板变量;替换值作为不可再次解析的业务文本,不得因为其中包含 `{}` 而失败。
- 删除或改造替换后的全局花括号扫描;不得用删除、转义或禁止用户输入 `{}` 的方式规避问题。
- `{商品卖点与要求}`、自定义分类名称及其他上下文值中出现的花括号应原样进入预览和最终 job prompt;模板内的未知变量仍必须在替换前明确报错。
### 2. 生成入口错误反馈
- 在 `ProductSuiteTab.start_generation()` 创建 specs 的位置捕获 `ProductSuitePromptError`,显示中文弹窗标题「无法生成商品套图」,正文使用「提示词渲染失败,请检查提示词设置中的变量格式。」;同步写入状态栏。
- 捕获后返回 `False`,不得创建 generation round、job、worker、价格查询或网关请求,不修改已有图片、历史和项目生成状态。
- `_generation_plan_is_current()` 等辅助重新构建 specs 的路径也应安全处理 `ProductSuitePromptError`,返回计划失效而不是让异步回调抛出未处理异常。
- 不在用户可见错误中暴露 Python 异常、模板绝对路径、API URL、Key 或内部变量值;开发诊断仍按现有脱敏规则保留必要上下文。
### 3. 测试与文档
- `tests/test_product_suite.py`:合法模板配合商品卖点 `适合 {儿童} 使用` 仍可渲染,且最终 prompt 保留该文本;模板包含未知变量或未闭合花括号仍失败。
- `tests/test_product_suite_gui.py`:商品卖点包含 `{}` 时,点击「生成套图」可进入原有确认流程;模拟 renderer 异常时显示上述中文提示,且不创建 worker/job/请求。
- 更新 `docs/04-architecture.md`、`docs/routes.md`,明确模板在替换前校验、业务上下文可原样包含花括号,以及生成失败的反馈与无副作用边界。
## 验收要点
- [ ] 商品卖点与要求包含 `{}` 时,提示词设置预览正常显示,保存模板和生成套图均不报“未替换变量”。
- [ ] 最终保存到 job 的 prompt 保留业务文本原有花括号。
- [ ] 模板中的 `{未知变量}`、未闭合花括号和缺少必需变量仍在保存/生成前给出中文错误。
- [ ] renderer 异常时,点击「生成套图」显示「无法生成商品套图」中文提示,不再静默无响应。
- [ ] 错误路径不创建 worker、generation round、job、价格查询或网关请求。
- [ ] 商品套图正常生成、历史、重试、导出、AI帮写、蝦皮采集与更新不回归。
## 边界(不改什么)
- 不改变现有提示词变量名称、默认模板文本、分类数量、网关选择、计费确认或图片生成流程。
- 不修改用户已有提示词文件内容,不自动清理商品卖点中的花括号。
- 不修改蝦皮 CDP 采集、上传、拖拽、更新逻辑或会员订阅临时绕过开关。
## 验证
```bash
py -3.10 -m unittest discover -s tests -p test_product_suite.py
py -3.10 -m unittest discover -s tests -p test_product_suite_gui.py
py -3.10 -m ruff check app tests main.py
py -3.10 -m compileall app main.py
py -3.10 -m unittest discover -s tests
git diff --check
```
## 执行记录
- 2026-07-22:任务创建。已确认当前落盘模板可正常渲染;问题来自 renderer 将替换后的业务文本 `{}` 误判为未替换模板变量,且生成入口没有把异常转换为 GUI 提示。
- 2026-07-22:完成 renderer 修复:模板在替换前仍严格校验,替换值不再二次按变量解析,商品卖点中的 `{}` 原样保留。生成入口和计划核对路径捕获 `ProductSuitePromptError`;入口异常显示「无法生成商品套图」及中文状态栏提示,不创建 worker、job、价格查询或网关请求。
- 2026-07-22:验证通过:`py -3.10 -m compileall app main.py`、`py -3.10 -m ruff check app tests main.py`、`py -3.10 -m unittest discover -s tests -p test_product_suite.py`(11 项)、`py -3.10 -m unittest discover -s tests -p test_product_suite_gui.py`(66 项)以及完整单测 `py -3.10 -m unittest discover -s tests`(668 项)。