docs: add AI outfit UI mockup, align style with print module
- New docs/ui-ai-outfit.html + ui-ai-outfit.png: 「2 AI 穿搭」page mockup, same chrome/palette/components as docs/ui-v1 (blue-only). - Center = recent-results thumbnail strip (finished outputs only) + detail table; dropped the live single-image preview to avoid the concurrent "which row" ambiguity. - §7: 保存话术 persists template via config_service; 预览最终提示词 is a button opening a read-only QDialog rendered from a sample row. - §8: concurrency is Python threads (ThreadPoolExecutor); Qt only signals back to the main thread to refresh UI; default 1 for API limit. - §10: three-column layout, results-strip rationale, settings 3-col. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
+14
-8
@@ -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 穿搭」=本面板);这部分在实现阶段一并补。
|
||||
|
||||
|
||||
Reference in New Issue
Block a user