diff --git a/docs/11-ai-outfit.md b/docs/11-ai-outfit.md index 5d3c4fe..e6af24e 100644 --- a/docs/11-ai-outfit.md +++ b/docs/11-ai-outfit.md @@ -99,7 +99,9 @@ Excel 行 → `OutfitTask` 列表的转换由 `excel_service` 完成;核心只 ## 7. 提示词 - 提示词模板存 `~/.cmbot/config/outfit_prompt.txt`,界面可查看/编辑/保存;点「开始」前自动保存一次。 -- 占位符:`{title}`(标题)、`{product_id}`(货号);界面提供「插入占位符」按钮与「最终提示词预览」。 +- 占位符:`{title}`(标题)、`{product_id}`(货号);界面提供「插入标题」「插入货号」按钮,把占位符插入光标处。 +- **「保存话术」按钮**:把当前编辑的模板原文(占位符原样保留,**不**存替换后的结果)经 `config_service` 写入 `outfit_prompt.txt`。用途是"改完先存、暂不开跑"并给用户明确反馈;与"开始前自动保存"并存、互为兜底(保留按钮是有意为之,对非技术用户更安心)。 +- **「预览最终提示词」是按钮,点击弹只读预览窗(`QDialog`)**:取一条样本行把占位符替换成真值,显示最终要发送给 AI 的完整提示词。样本行默认取明细表当前选中行、没选则取第一条待处理行;窗内可切换样本行、可复制;缺 `{title}` 占位符时在窗内提示。预览只读,不改话术本身。 - 缺标题占位符时开始前弹窗询问是否继续。 - 默认话术方向(穿搭/上身,区别于旧项目的主图场景,需另调):人物上身实穿、保留衣服款式/版型/颜色/印花、合适身材与场景、电商可用、默认纯净不加促销牛皮癣。 @@ -107,6 +109,7 @@ Excel 行 → `OutfitTask` 列表的转换由 `excel_service` 完成;核心只 复用旧项目策略(`docs/旧ai穿搭项目.md` §5.3): +- **并发由 Python 线程负责,PySide6 不参与**:`requests` 在等网络响应时释放 GIL,所以 `ThreadPoolExecutor` 起多线程跑行任务时多个 HTTP 请求是真并发。Qt 只负责把进度/结果通过 **signal 跨线程排队回主线程**刷新 UI——**子线程绝不直接操作控件**(违反会崩溃/随机出错)。默认并发 1 是迁就中转 API 限流(429),非框架限制,可在界面调高。 - `ThreadPoolExecutor(max_workers=并发数)` 调度行任务;`RateLimiter(新请求间隔)` 限制请求开始间隔;任务间 `单任务冷却`。 - 每行最多「首次 + 重试次数」尝试;限流/429 用短阶梯等待,普通错误短等待。 - 单次请求放子线程 + 主线程秒级检查,**等待 >30 秒持续打心跳日志**;超时按分辨率动态决定(512/1K/2K/4K → 180/240/360/600 秒,可被 `timeout_seconds` 覆盖)。 @@ -121,14 +124,17 @@ Excel 行 → `OutfitTask` 列表的转换由 `excel_service` 完成;核心只 ## 10. 界面(「2 AI 穿搭」页签) -把主窗口当前禁用的「2 AI 穿搭」页签启用,做成独立工作页(与「1 添加印花」并列、互不干扰)。控件: +界面效果图见 **`docs/ui-ai-outfit.html`**(浏览器打开)/ **`docs/ui-ai-outfit.png`**,完全沿用 cmbot 现有视觉、与「1 添加印花」严格统一(同 `docs/ui-v1`:浅灰底、`#0067c0` 蓝单一主色、12px 雅黑、3px 圆角、pill 状态徽章;不引入第二识别色)。「生成中」状态用蓝,与印花页「导出中」同色。把主窗口当前禁用的「2 AI 穿搭」页签启用,做成独立工作页(与「1 添加印花」并列、互不干扰)。 -- 选择 Excel 文件、选择输出目录(记住上次,存 `app_config.json`)。 -- 模型下拉(来自 AI 模型配置)。 -- 通用话术编辑 + 保存 + 插入占位符 + 最终提示词预览。 -- 设置:重试失败行、并发数、新请求间隔、单任务冷却、重试次数、分辨率、JPG 质量。 -- 开始生成 / 停止生成;实时日志;进度与统计(完成/失败/跳过);结束摘要弹窗;导出失败清单。 -- 后台用 `QThread` + `Worker(QObject)` + 信号回主线程(与 cmbot 更新检查/导出一致)。 +三栏布局: + +- **左栏(较宽,设置区)**:选择 Excel 文件、输出目录(记住上次,存 `app_config.json`);数据源概览(共 N 行 / 完成 / 待处理 / 失败);AI 模型下拉(来自 AI 模型配置);通用话术编辑 +「保存话术」+「插入标题/货号」+「预览最终提示词」(均见 §7);生成设置 **3 列**(重试失败行、并发数、新请求间隔、单任务冷却、失败重试、分辨率、JPG 质量)。 +- **中栏(结果 + 明细)**:顶部「最近结果」缩略图条——**只展示已完成的人物效果图**,新图自动加到最左、首图标「最新」,单击看大图、右键开所在文件夹;下方「处理明细」表(行 / 标题 / 货号 / 衣服图 / 状态 / 结果或原因),按 Excel 行顺序,状态用 完成 / 失败 / 生成中 / 待处理 / 跳过 徽章。 +- **右栏(运行区)**:本次进度环 + 统计(完成 / 失败 / 跳过 / 待处理);开始生成 / 停止生成;导出失败清单 / 打开输出目录;实时日志(含 §8 心跳行)。 + +> **设计取舍:不做"实时单图大预览"。** 这是"开了走人、回头抽查"的批量工具;单图实时预览在并发时会产生"该显示哪一行"的歧义。改为「最近结果缩略图条」——只展示已落地成品,既保留"早发现话术/模型不对、及时停掉改话术"的价值,又因只显示成品而消除并发歧义。 + +- 后台用 `QThread` + `Worker(QObject)` + 信号回主线程(与 cmbot 更新检查/导出一致;并发细节见 §8)。 > 页签内容切换:当前页签栏不切换内容面板(见 `docs/07` §4.2)。启用 AI 穿搭需要为页签接一个 `QStackedWidget`(「1 添加印花」=现有工作区,「2 AI 穿搭」=本面板);这部分在实现阶段一并补。 diff --git a/docs/ui-ai-outfit.html b/docs/ui-ai-outfit.html new file mode 100644 index 0000000..b196cf2 --- /dev/null +++ b/docs/ui-ai-outfit.html @@ -0,0 +1,390 @@ + + +
+ +| 行 | 标题 | 货号 | 衣服图 | 状态 | 结果 / 原因 | +
|---|---|---|---|---|---|
| 2 | 纯棉宽松短袖T恤 | TY027 | TY027_白底.png | 完成 | 合并后的图片\\TY027.jpg |
| 3 | 美式复古印花卫衣 | TY028 | TY028_白底.png | 完成 | 合并后的图片\\TY028.jpg |
| 4 | 高腰显瘦牛仔裤 | TY029 | TY029_白底.png | 失败 | 衣服图打不开:文件不存在 |
| 13 | 碎花连衣裙夏季新款 | TY030 | TY030_白底.png | 生成中 | 第 1 次尝试 · 78% |
| 14 | 设计感小众衬衫 | TY031 | TY031_白底.png | 待处理 | — |
| 15 | — | — | (标题/货号为空) | 跳过 | 字段不完整,安全跳过 |
| 16 | 休闲百搭运动短裤 | TY033 | TY033_白底.png | 待处理 | — |
| 17 | 法式茶歇方领上衣 | TY034 | TY034_白底.png | 待处理 | — |
| 18 | oversize 落肩外套 | TY035 | TY035_白底.png | 待处理 | — |
| 19 | 冰丝防晒空调衫 | TY036 | TY036_白底.png | 待处理 | — |