docs(ai-outfit): inline prompt preview + settings on right (layout A)

- Replace the prompt-preview dialog with an inline, live preview pinned at
  the bottom of the left column (sample-row dropdown, title substituted).
- Move 生成设置 from the left into the right run column (2-col), so left
  becomes a focused 数据源 + 话术 + 预览 authoring column.
- Update §7 (inline preview) and §10 (left/right column contents) + re-render
  the mockup.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
2026-06-22 09:35:52 +08:00
co-authored by Claude Opus 4.8
parent 572c2cf6dd
commit d79f881ec7
3 changed files with 31 additions and 19 deletions
+3 -3
View File
@@ -101,7 +101,7 @@ Excel 行 → `OutfitTask` 列表的转换由 `excel_service` 完成;核心只
- 提示词模板存 `~/.cmbot/config/outfit_prompt.txt`,界面可查看/编辑/保存;点「开始」前自动保存一次。 - 提示词模板存 `~/.cmbot/config/outfit_prompt.txt`,界面可查看/编辑/保存;点「开始」前自动保存一次。
- 占位符:仅 `{title}`(标题);界面只提供「插入标题」按钮,把占位符插入光标处。货号(`product_id`)不进提示词——它只用于 Excel B 列读取与输出文件命名(`货号.jpg`),不影响 AI 生成内容。(`render_prompt` 仍会替换偶然出现的 `{product_id}`,保持兼容,但界面不再引导插入。) - 占位符:仅 `{title}`(标题);界面只提供「插入标题」按钮,把占位符插入光标处。货号(`product_id`)不进提示词——它只用于 Excel B 列读取与输出文件命名(`货号.jpg`),不影响 AI 生成内容。(`render_prompt` 仍会替换偶然出现的 `{product_id}`,保持兼容,但界面不再引导插入。)
- **「保存话术」按钮**:把当前编辑的模板原文(占位符原样保留,**不**存替换后的结果)经 `config_service` 写入 `outfit_prompt.txt`。用途是"改完先存、暂不开跑"并给用户明确反馈;与"开始前自动保存"并存、互为兜底(保留按钮是有意为之,对非技术用户更安心)。 - **「保存话术」按钮**:把当前编辑的模板原文(占位符原样保留,**不**存替换后的结果)经 `config_service` 写入 `outfit_prompt.txt`。用途是"改完先存、暂不开跑"并给用户明确反馈;与"开始前自动保存"并存、互为兜底(保留按钮是有意为之,对非技术用户更安心)。
- **「预览最终提示词」是按钮,点击弹只读预览窗(`QDialog`)**:取一条样本行把占位符替换成真值,显示最终要发送给 AI 的完整提示词。样本行默认取明细表当前选中行、没选则取第一条待处理行;窗内可切换样本行、可复制;缺 `{title}` 占位符时在窗内提示。预览只读,不改话术本身。 - **最终提示词预览(内嵌、不弹窗)**:左栏话术编辑下方常驻一块只读预览区,编辑话术时实时把占位符替换成样本行真值,显示最终要发送给 AI 的完整文字。样本行下拉默认取明细表当前选中行、没选则取第一条待处理行;未选 Excel / 无可预览行时显示带高亮占位符的模板原文 + 提示;缺 `{title}` 占位符时在预览区提示。预览只读,不改话术本身。(早期设计为弹窗 `QDialog`,因调话术需"边改边看"改为内嵌。)
- 缺标题占位符时开始前弹窗询问是否继续。 - 缺标题占位符时开始前弹窗询问是否继续。
- 默认话术方向(穿搭/上身,区别于旧项目的主图场景,需另调):人物上身实穿、保留衣服款式/版型/颜色/印花、合适身材与场景、电商可用、默认纯净不加促销牛皮癣。 - 默认话术方向(穿搭/上身,区别于旧项目的主图场景,需另调):人物上身实穿、保留衣服款式/版型/颜色/印花、合适身材与场景、电商可用、默认纯净不加促销牛皮癣。
@@ -128,9 +128,9 @@ Excel 行 → `OutfitTask` 列表的转换由 `excel_service` 完成;核心只
三栏布局: 三栏布局:
- **左栏(较宽,设置区)**:选择 Excel 文件、输出目录(记住上次,存 `app_config.json`);数据源概览(共 N 行 / 完成 / 待处理 / 失败);AI 模型下拉(来自 AI 模型配置);通用话术编辑 +「保存话术」+「插入标题」+「预览最终提示词」(均见 §7);生成设置 **3 列**(重试失败行、并发数、新请求间隔、单任务冷却、失败重试、分辨率、JPG 质量)。 - **左栏(数据源 + 话术创作)**:选择 Excel 文件、输出目录(记住上次,存 `app_config.json`);数据源概览(共 N 行 / 完成 / 待处理 / 失败);AI 模型下拉(来自 AI 模型配置);通用话术编辑 +「保存话术」+「插入标题」;下方常驻**最终提示词预览**(内嵌、实时、带样本行下拉,见 §7)。
- **中栏(结果 + 明细)**:顶部「最近结果」缩略图条——**只展示已完成的人物效果图**,新图自动加到最左、首图标「最新」,单击看大图、右键开所在文件夹;下方「处理明细」表(行 / 标题 / 货号 / 衣服图 / 状态 / 结果或原因),按 Excel 行顺序,状态用 完成 / 失败 / 生成中 / 待处理 / 跳过 徽章。 - **中栏(结果 + 明细)**:顶部「最近结果」缩略图条——**只展示已完成的人物效果图**,新图自动加到最左、首图标「最新」,单击看大图、右键开所在文件夹;下方「处理明细」表(行 / 标题 / 货号 / 衣服图 / 状态 / 结果或原因),按 Excel 行顺序,状态用 完成 / 失败 / 生成中 / 待处理 / 跳过 徽章。
- **右栏(运行区)**:本次进度环 + 统计(完成 / 失败 / 跳过 / 待处理);开始生成 / 停止生成;导出失败清单 / 打开输出目录;实时日志(含 §8 心跳行)。 - **右栏(设置 + 运行)**:生成设置(重试失败行、并发数、新请求间隔、单任务冷却、失败重试、分辨率、JPG 质量;窄栏 2 列);本次进度 + 统计(完成 / 失败 / 待处理);开始生成 / 停止生成;导出失败清单 / 打开输出目录;实时日志(含 §8 心跳行)。
> **设计取舍:不做"实时单图大预览"。** 这是"开了走人、回头抽查"的批量工具;单图实时预览在并发时会产生"该显示哪一行"的歧义。改为「最近结果缩略图条」——只展示已落地成品,既保留"早发现话术/模型不对、及时停掉改话术"的价值,又因只显示成品而消除并发歧义。 > **设计取舍:不做"实时单图大预览"。** 这是"开了走人、回头抽查"的批量工具;单图实时预览在并发时会产生"该显示哪一行"的歧义。改为「最近结果缩略图条」——只展示已落地成品,既保留"早发现话术/模型不对、及时停掉改话术"的价值,又因只显示成品而消除并发歧义。
+28 -16
View File
@@ -42,7 +42,7 @@
.tab:not(.on):hover{background:#ececec} .tab:not(.on):hover{background:#ececec}
/* ---- BODY GRID ---- */ /* ---- BODY GRID ---- */
.body{display:grid;grid-template-columns:558px 1fr 300px;min-height:0} .body{display:grid;grid-template-columns:426px 1fr 344px;min-height:0}
/* ---- LEFT : data source + settings ---- */ /* ---- LEFT : data source + settings ---- */
.left{background:var(--panel);border-right:1px solid var(--line);display:flex;flex-direction:column;min-height:0} .left{background:var(--panel);border-right:1px solid var(--line);display:flex;flex-direction:column;min-height:0}
@@ -81,10 +81,17 @@
.pchip:hover{background:#f3f8fd;border-color:var(--accent-soft)} .pchip:hover{background:#f3f8fd;border-color:var(--accent-soft)}
.pchip.act{margin-left:auto;border-color:var(--accent-soft);color:var(--accent)} .pchip.act{margin-left:auto;border-color:var(--accent-soft);color:var(--accent)}
/* compact settings grid */ /* compact settings grid (now in the right run column) */
.sgrid{display:grid;grid-template-columns:1fr 1fr 1fr;gap:8px 10px} .sgrid{display:grid;grid-template-columns:1fr 1fr;gap:8px 10px}
.sgrid .fl{margin:0} .sgrid .fl{margin:0}
/* inline final-prompt preview (replaces the dialog) */
.prevrow{display:flex;align-items:center;gap:8px;margin-bottom:8px}
.prevrow .prevlbl{font-size:11px;color:var(--txt-2);flex:none}
.preview{border:1px solid var(--line);border-radius:var(--r);background:#f7f9fc;
padding:8px 9px;font:12px/1.7 var(--font);color:var(--txt);min-height:150px}
.preview b{color:var(--accent);font-weight:600;background:#eaf3fc;border-radius:2px;padding:0 2px}
/* ---- CENTER : the transformation thesis + batch table ---- */ /* ---- CENTER : the transformation thesis + batch table ---- */
.center{background:var(--panel-2);display:grid;grid-template-rows:auto 1fr;min-height:0} .center{background:var(--panel-2);display:grid;grid-template-rows:auto 1fr;min-height:0}
@@ -232,23 +239,16 @@
<div class="ta">为商品「<span class="ph">{title}</span>」生成人物上身实穿效果图:真人模特正面穿着这件衣服,完整保留款式、版型、颜色与印花图案,自然光、纯色棚拍背景,电商主图风格,不加文字与促销标签。</div> <div class="ta">为商品「<span class="ph">{title}</span>」生成人物上身实穿效果图:真人模特正面穿着这件衣服,完整保留款式、版型、颜色与印花图案,自然光、纯色棚拍背景,电商主图风格,不加文字与促销标签。</div>
<div class="promptbar"> <div class="promptbar">
<span class="pchip">插入<span class="pp">{title}</span></span> <span class="pchip">插入<span class="pp">{title}</span></span>
<span class="pchip act">⤢ 预览最终提示词</span>
</div>
<div class="promptbar" style="margin-top:8px">
<span class="pchip" style="flex:1;justify-content:center;color:var(--accent);border-color:var(--accent-soft)">💾 保存话术</span> <span class="pchip" style="flex:1;justify-content:center;color:var(--accent);border-color:var(--accent-soft)">💾 保存话术</span>
</div> </div>
</div> </div>
<div class="grp"><div class="grp-t">生成设置</div> <div class="grp"><div class="grp-t">最终提示词预览</div>
<div class="ckline" style="margin-bottom:12px"><span class="cbox on"></span>重试上次失败的行(失败 3)</div> <div class="prevrow">
<div class="sgrid"> <span class="prevlbl">样本行</span>
<div class="fl"><label>并发数</label><div class="inp"><input value="1"></div></div> <div class="sel" style="flex:1"><span>第 13 行 · TY030 · 碎花连衣裙夏季新款</span><span class="car">▼</span></div>
<div class="fl"><label>新请求间隔</label><div class="inp"><input value="2"><span class="u">秒</span></div></div>
<div class="fl"><label>单任务冷却</label><div class="inp"><input value="1"><span class="u">秒</span></div></div>
<div class="fl"><label>失败重试</label><div class="inp"><input value="2"><span class="u">次</span></div></div>
<div class="fl"><label>分辨率</label><div class="sel"><span>1K</span><span class="car">▼</span></div></div>
<div class="fl"><label>JPG 质量</label><div class="sel"><span>均衡 85</span><span class="car">▼</span></div></div>
</div> </div>
<div class="preview">为商品「<b>碎花连衣裙夏季新款</b>」生成人物上身实穿效果图:真人模特正面穿着这件衣服,完整保留款式、版型、颜色与印花图案,自然光、纯色棚拍背景,电商主图风格,不加文字与促销标签。</div>
</div> </div>
</div> </div>
</div> </div>
@@ -332,8 +332,20 @@
</div> </div>
</div> </div>
<!-- RIGHT : run + log --> <!-- RIGHT : settings + run + log -->
<div class="right"> <div class="right">
<div class="runtop">
<div class="rt">生成设置</div>
<div class="ckline" style="margin-bottom:10px"><span class="cbox on"></span>重试上次失败的行(失败 3)</div>
<div class="sgrid">
<div class="fl"><label>并发数</label><div class="inp"><input value="1"></div></div>
<div class="fl"><label>新请求间隔</label><div class="inp"><input value="2"><span class="u">秒</span></div></div>
<div class="fl"><label>单任务冷却</label><div class="inp"><input value="1"><span class="u">秒</span></div></div>
<div class="fl"><label>失败重试</label><div class="inp"><input value="2"><span class="u">次</span></div></div>
<div class="fl"><label>分辨率</label><div class="sel"><span>1K</span><span class="car">▼</span></div></div>
<div class="fl"><label>JPG 质量</label><div class="sel"><span>均衡 85</span><span class="car">▼</span></div></div>
</div>
</div>
<div class="runtop"> <div class="runtop">
<div class="rt">本次进度</div> <div class="rt">本次进度</div>
<div class="progwrap"> <div class="progwrap">
Binary file not shown.

Before

Width:  |  Height:  |  Size: 204 KiB

After

Width:  |  Height:  |  Size: 232 KiB