feat(ai-outfit): 话术按钮行微调 + 保留插入标题 + 最终提示词预览改弹窗 (§19.20)
话术组小改版(保留 {title} 占位符、不自动前置):
- 「保存话术」→「保存」,从编辑框下方上移到模板按钮行「重命名」之后
(行变 新建/另存为/重命名/保存/删除)
- 保留「插入标题」按钮 + {title} 占位符(用户自定标题位置,不与旧话术重复)
- 最终提示词预览改按需弹窗:编辑框下方「预览最终提示词」按钮 → 非模态
_OutfitPreviewDialog,含数据行下拉(read_all_rows,状态无关)+ 只读替换后
提示词(含 §7.1 输出要求);话术/分辨率/数据行变化时实时刷新
- 左栏空间理由:标题生成组 + 话术组并存,常驻预览会逼出滚动;弹窗零常驻高度
render_prompt 与 DEFAULT_OUTFIT_PROMPT 不改(纯面板改动)。
测试:面板断言按钮行含「保存」、保留「插入标题」+「预览最终提示词」、
预览弹窗按选中行替换 {title} 并附输出要求。全套 py37 通过
(test_config_service 的 ai_models.json 顺序失败属并行 §19.13,与本改动无关)。
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
+34
-12
@@ -162,9 +162,9 @@ Excel 行 → `OutfitTask` 列表的转换由 `excel_service` 完成;核心只
|
||||
## 7. 提示词
|
||||
|
||||
- 提示词模板存 `~/.cmbot/config/outfit_prompt.txt`,界面可查看/编辑/保存;点「开始」前自动保存一次。
|
||||
- 占位符:仅 `{title}`(标题);界面只提供「插入标题」按钮,把占位符插入光标处。货号(`product_id`)不进提示词——它只用于 Excel B 列读取与输出文件命名(`货号.jpg`),不影响 AI 生成内容。(`render_prompt` 仍会替换偶然出现的 `{product_id}`,保持兼容,但界面不再引导插入。)
|
||||
- **「保存话术」按钮**:把当前编辑的模板原文(占位符原样保留,**不**存替换后的结果)经 `config_service` 写入 `outfit_prompt.txt`。用途是"改完先存、暂不开跑"并给用户明确反馈;与"开始前自动保存"并存、互为兜底(保留按钮是有意为之,对非技术用户更安心)。
|
||||
- ~~**最终提示词预览(内嵌、不弹窗)**~~ **(§17 已移除)**:原左栏话术编辑下方的只读预览区 + 样本行下拉,为给左栏让出「标题生成」组(§17)已整体移除。相关历史问题(§10.1 下拉撑宽、§10.3 样本行为空、§10.4 不清空样本)随之作废。
|
||||
- 占位符:仅 `{title}`(标题);界面提供「插入标题」按钮,把占位符插入光标处。**标题由用户经 `{title}` 自行放置(可前、可中、可省),程序不自动前置**——这样标题不会被焊死在固定位置,也不会与旧话术里的 `{title}` 重复。货号(`product_id`)不进提示词——只用于 Excel B 列读取与输出文件命名(`货号.jpg`)。(`render_prompt` 仍替换偶现的 `{product_id}` 以兼容,但界面不引导插入。)
|
||||
- **「保存」按钮**(原「保存话术」改名、移到模板按钮行「重命名」之后):把当前编辑的模板原文(占位符原样保留,**不**存替换后的结果)经 `config_service` 写入当前模板。用途是"改完先存、暂不开跑";与"开始前自动保存"并存、互为兜底。
|
||||
- **最终提示词预览改为按需弹窗(§7.3)**:左栏要同时容纳「标题生成」组与「穿搭话术」组,纵向空间紧张(常驻预览会撑到 ~690px > 视口 ~664px、逼出滚动),故预览不做常驻面板,改成话术编辑框下方一个「预览最终提示词」按钮 → 弹**非模态**小窗,内含数据行下拉 + 只读的替换后提示词(含 §7.1 输出要求)。要"边改边看"就开着弹窗,话术/分辨率/数据行变化时刷新。
|
||||
- 缺标题占位符时开始前弹窗询问是否继续。
|
||||
- 默认话术方向(穿搭/上身,区别于旧项目的主图场景,需另调):人物上身实穿、保留衣服款式/版型/颜色/印花、合适身材与场景、电商可用、默认纯净不加促销牛皮癣。
|
||||
|
||||
@@ -182,8 +182,8 @@ Excel 行 → `OutfitTask` 列表的转换由 `excel_service` 完成;核心只
|
||||
|
||||
- 仅「参考解析度」动态(= 分辨率设置),其余 3 行固定;**简体文案**(与软件一致)。
|
||||
- **始终自动附加**(同旧项目,不做开关)。
|
||||
- 由 `core/ai_outfit.render_prompt(template, task, resolution)` 实现:`resolution` 为空时不附加(保持纯函数单测兼容);`generate_outfit_image` 生成时传入当前分辨率。
|
||||
- **左栏「最终提示词预览」必须包含这段**(带当前选中分辨率),否则预览与实际发送不一致;分辨率下拉变化时预览同步刷新。
|
||||
- 由 `core/ai_outfit.render_prompt(template, task, resolution)` 实现:`resolution` 为空时不附加(保持纯函数单测兼容);`generate_outfit_image` 生成时传入当前分辨率。**不做标题自动前置**——标题由话术里的 `{title}` 决定(§7)。
|
||||
- **预览弹窗必须包含这段**(带当前选中分辨率),否则预览与实际发送不一致;分辨率下拉变化时弹窗同步刷新(§7.3)。
|
||||
|
||||
### 7.2 话术模板(多套命名话术)
|
||||
|
||||
@@ -198,8 +198,8 @@ Excel 行 → `OutfitTask` 列表的转换由 `excel_service` 完成;核心只
|
||||
|
||||
**界面**(「穿搭生成话术」组,套印花页范式)
|
||||
|
||||
- 编辑框**上方一行**:「穿搭生成话术」标签 + 模板下拉;下一行放「新建」「另存为」「重命名」「删除」。
|
||||
- 编辑框**下方**:保留「插入标题」「保存」。
|
||||
- 编辑框**上方一行**:「穿搭生成话术」标签 + 模板下拉;下一行模板按钮 `新建 / 另存为 / 重命名 / 保存 / 删除`(**「保存」从原编辑框下方移到此行「重命名」之后、改名自「保存话术」**)。
|
||||
- 编辑框**下方一行**:「插入标题」+「预览最终提示词」(弹窗,§7.3)。
|
||||
- 左栏约 360px,5 个模板按钮偏多 → 实现时可排两行或用紧凑小按钮。
|
||||
|
||||
**行为**
|
||||
@@ -207,10 +207,32 @@ Excel 行 → `OutfitTask` 列表的转换由 `excel_service` 完成;核心只
|
||||
- **切换 / 重命名 / 删除 / 新建 / 另存为之前**:若编辑框与当前套已存文本不同(脏)→ 弹「是否保存当前修改?」(保存 / 不保存 / 取消;取消则下拉还原到原选项)。
|
||||
- 保存=覆盖当前套;另存为=存为新名并选中;重命名=改当前套名;删除=二次确认,删后选邻近,**不可删到 0**。
|
||||
- 名字**唯一**(重名拒绝或自动加序号)。
|
||||
- 记住上次所选;生成/预览用编辑框当前文本(`render_prompt` + §7.1 尾巴不变);「开始生成」前把当前编辑存回所选套(沿用现有自动存逻辑)。
|
||||
- 记住上次所选;生成用编辑框当前文本(`render_prompt(text, task, resolution)` + §7.1 尾巴不变);「开始生成」前把当前编辑存回所选套(沿用现有自动存逻辑)。
|
||||
|
||||
**解耦**:核心 `render_prompt(text, task, resolution)` 不动;"用哪段文本"由面板的模板选择决定。
|
||||
|
||||
### 7.3 最终提示词预览(按需弹窗)
|
||||
|
||||
左栏要同时放「标题生成」组与「穿搭话术」组,纵向吃紧(常驻预览 ~690px > 视口 ~664px → 逼出滚动)。故预览**不常驻**,改成话术编辑框下方一个「预览最终提示词」按钮 → 弹**非模态** `QDialog`:
|
||||
|
||||
```
|
||||
[预览最终提示词] ← 话术编辑框下方按钮
|
||||
↓ 点开
|
||||
┌─ 最终提示词预览 ─────────────┐
|
||||
│ 数据行: [第 2 行 · 纯棉短袖 ▾] │
|
||||
│ ┌─ 只读 ──────────────────┐ │
|
||||
│ │ 为 纯棉短袖 生成… │ │ ← {title} 换成选中行标题
|
||||
│ │ 批量生成输出要求: │ │ ← §7.1,随分辨率刷新
|
||||
│ │ - 参考解析度: 1K … │ │
|
||||
│ └────────────────────────┘ │
|
||||
└────────────────────────────┘
|
||||
```
|
||||
|
||||
- **非模态**:弹窗开着时仍可编辑左栏话术;话术文本 / 分辨率 / 数据行下拉任一变化 → 弹窗内只读预览实时刷新(`render_prompt(话术, 选中行, 分辨率)`)。要"边改边看"就开着它。
|
||||
- **数据行下拉在弹窗内**(不占左栏):复用 `excel_service.read_all_rows(excel)`(状态无关,整表完成后仍可选;§10.3 的 `read_all_rows` 因此保留)。未选 Excel / 无有效行 → 显示带占位符的话术原文 + 提示;缺 `{title}` 占位符时在预览顶部提示。
|
||||
- **零常驻高度**:左栏只剩两个编辑框、不滚动;想验证替换效果时才弹窗。
|
||||
- 预览只读,不改话术本身;标题仍由话术里的 `{title}` 决定(不自动前置,§7)。
|
||||
|
||||
## 8. 并发、限速、重试、停止
|
||||
|
||||
复用旧项目的限速、重试、心跳与温和停止策略(`docs/旧ai穿搭项目.md` §5.3),但并发语义改为更适合「一行一个目录」的模型:
|
||||
@@ -250,7 +272,7 @@ Excel 行 → `OutfitTask` 列表的转换由 `excel_service` 完成;核心只
|
||||
|
||||
三栏布局:
|
||||
|
||||
- **左栏(数据源 + 标题/话术创作,~360px)**:`Excel` / `输出` 各为**行内一行**(标签 + 路径 + 浏览,省纵向空间);数据源概览(共 N 行 / 完成 / 待处理 / 失败);**「标题生成」组(§17)在上**:标题生成提示词编辑 +「保存」+「生成标题」(**无标题模型下拉**,模型由 `title_model` 配置定名,§17.3);**「穿搭生成话术」组在下**:话术编辑 +「保存话术」+「插入标题」+ 多套模板下拉(§7.2)。**最终提示词预览已移除(§17)**。图片 AI 模型下拉在右栏;标题模型不放界面。
|
||||
- **左栏(数据源 + 标题/话术创作,~360px)**:`Excel` / `输出` 各为**行内一行**(标签 + 路径 + 浏览,省纵向空间);数据源概览(共 N 行 / 完成 / 待处理 / 失败);**「标题生成」组(§17)在上**:标题生成提示词编辑 +「保存」+「生成标题」(**无标题模型下拉**,模型由 `title_model` 配置定名,§17.3);**「穿搭生成话术」组在下**:模板下拉 + 按钮行 `新建/另存为/重命名/保存/删除` + 话术编辑框 + 下方「插入标题」「预览最终提示词」(预览为弹窗,数据行下拉在弹窗内,§7.3)。图片 AI 模型下拉在右栏;标题模型不放界面。
|
||||
- **中栏(结果 + 明细)**:顶部「最近结果」缩略图条——**只展示已完成的人物效果图**,新图自动加到最左、首图标「最新」,单击看大图、右键开所在文件夹;下方「处理明细」表(行 / 标题 / 货号 / 衣服图 / 状态 / 结果或原因),按 Excel 行顺序,状态用 完成 / 失败 / 生成中 / 待处理 / 跳过 徽章。
|
||||
- **右栏(设置 + 运行,~400px)**:生成设置标题与「重试上次失败的行」同排;图片并发数 / 新请求间隔 / 单任务冷却 / 失败重试 / 分辨率 / JPG 质量保持 **3 列 × 2 行**;`AI 模型` 标签与下拉框同排;本次进度 + 统计(完成 / 失败 / 待处理);开始生成 / 停止生成同排;导出失败清单 / 打开输出目录同排;节省的纵向空间给实时日志(含 §8 心跳行)。
|
||||
|
||||
@@ -262,7 +284,7 @@ Excel 行 → `OutfitTask` 列表的转换由 `excel_service` 完成;核心只
|
||||
|
||||
### 10.1 已知问题:左栏内容被中间面板裁掉(下拉框撑宽)
|
||||
|
||||
> **§17 更新:已作废。** 撑宽元凶「样本行下拉」随预览一并移除(§17);保留本节仅作历史记录。标题模型改为「配置定名」、不放界面(§17.3),左栏也不再有新下拉。
|
||||
> **§17/§7.3 更新。** 撑宽元凶「样本行下拉」随预览移除(§17);§7.3 把数据行下拉**收进预览弹窗**(不在左栏),故本节裁切问题在左栏不再出现。弹窗内的下拉仍建议套 `_compact_combo` 的 elide 策略以防长项撑宽弹窗。标题模型仍不放界面(§17.3 配置定名)。
|
||||
|
||||
**现象**:「2 AI 穿搭」左栏组件右侧显示不完整,像被中间面板遮挡了一部分。
|
||||
|
||||
@@ -296,7 +318,7 @@ Excel 行 → `OutfitTask` 列表的转换由 `excel_service` 完成;核心只
|
||||
|
||||
### 10.3 已知问题:全表生成完成后,预览样本行下拉为空
|
||||
|
||||
> **§17 更新:已作废。** 预览与样本行下拉已移除(§17),本问题不复存在。`read_all_rows` 仍保留——它现在是「标题生成」的行来源(§17)。保留本节作历史记录。
|
||||
> **§17/§7.3 更新。** 一度随预览移除(§17),§7.3 把「数据行下拉」请回**预览弹窗**。本节结论**重新生效**:弹窗内数据行下拉必须用 `read_all_rows`(状态无关)填,否则整表完成后又会变空。`read_all_rows` 同时是「标题生成」的行来源(§17)。
|
||||
|
||||
**现象**:选中的 Excel 整表生成成功后,再次选中该文件,「最终生成要求预览」的样本行下拉只显示「(选 Excel 后显示替换效果)」,无可选行。
|
||||
|
||||
@@ -310,7 +332,7 @@ Excel 行 → `OutfitTask` 列表的转换由 `excel_service` 完成;核心只
|
||||
|
||||
### 10.4 改进:整表无待处理行时的提示 + 生成不清空预览样本
|
||||
|
||||
> **§17 更新:改进 2 作废**(预览样本已移除,§17);**改进 1(无待处理行提示)继续有效**。
|
||||
> **§17/§7.3 更新。** 改进 1(无待处理行提示)一直有效;改进 2 一度作废,§7.3 把数据行下拉请回**预览弹窗**后**重新生效**:`_on_tasks_loaded` 不动弹窗的数据行下拉,下拉只由 `read_all_rows` 维护,与运行解耦。
|
||||
|
||||
承接 §10.3。整表都「完成」后点「开始生成」时当前体验不清晰,两项改进:
|
||||
|
||||
|
||||
Reference in New Issue
Block a user