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 @@ + + + + +自动化工具 — AI 穿搭页签 + + + +
+ + +
+
穿
自动化工具
v1.0.0
+
⚙️配置
+
—
▢
✕
+
+ + +
+
1添加印花
+
2AI 穿搭
+
3导出上架
+
+ + +
+ + +
+
+
数据源(Excel)
+
+
D:\\电商\\2026春\\商品表.xlsx…
+
+
+ 共 60 行 + 已完成 12 + 待处理 45 + 失败 3 +
+
+ +
输出
+
+
D:\\CMBot\\合并后的图片…
+
+
+
Nano Banana 2 · 中转▼
+
+
+ +
通用话术
+
为商品「{title}」(货号 {product_id})生成人物上身实穿效果图:真人模特正面穿着这件衣服,完整保留款式、版型、颜色与印花图案,自然光、纯色棚拍背景,电商主图风格,不加文字与促销标签。
+
+ 插入{title} + 插入{product_id} + ⤢ 预览最终提示词 +
+
+ 💾 保存话术 +
+
+ +
生成设置
+
重试上次失败的行(失败 3)
+
+
+
秒
+
秒
+
次
+
1K▼
+
均衡 85▼
+
+
+
+
+ + +
+ +
+
+ 最近结果 + 已完成 12 张 · 新图自动加到最左 + 单击看大图 · 右键打开所在文件夹 +
+
+
+
最新 +
+
+
TY0281.8 MB
+
+
+
+
TY0271.6 MB
+
+
+
+
TY0261.9 MB
+
+
+
+
TY0251.5 MB
+
+
+
+
TY0242.0 MB
+
+
+
+
TY0231.7 MB
+
+
+
+
TY0221.6 MB
+
+
+
待生成
+
TY031—
+
+
+
+ +
+
+ 处理明细 + 按 Excel 行顺序 · 每完成一行即写回并保存 +
+ 全部 60 + 失败 3 + 跳过 0 +
+
+
+ + + + + + + + + + + + + + + + +
行标题货号衣服图状态结果 / 原因
2纯棉宽松短袖T恤TY027TY027_白底.png完成合并后的图片\\TY027.jpg
3美式复古印花卫衣TY028TY028_白底.png完成合并后的图片\\TY028.jpg
4高腰显瘦牛仔裤TY029TY029_白底.png失败衣服图打不开:文件不存在
13碎花连衣裙夏季新款TY030TY030_白底.png生成中第 1 次尝试 · 78%
14设计感小众衬衫TY031TY031_白底.png待处理—
15——(标题/货号为空)跳过字段不完整,安全跳过
16休闲百搭运动短裤TY033TY033_白底.png待处理—
17法式茶歇方领上衣TY034TY034_白底.png待处理—
18oversize 落肩外套TY035TY035_白底.png待处理—
19冰丝防晒空调衫TY036TY036_白底.png待处理—
+
+
+
+ + +
+
+
本次进度
+
+
15/60
+
+
12
完成
+
1
失败
+ +
45
待处理
+
+
+
+ +
+
■ 停止生成
+
+
⬇ 导出失败清单
+
📂 打开输出目录
+
+
+ +
+
实时日志自动滚动
+
+
15:42:01读取 商品表.xlsx:60 行,待处理 47
+
15:42:01跳过第 9 行:标题/货号为空
+
15:42:02开始生成,并发 1,分辨率 1K
+
15:42:18✓ TY027 完成 → TY027.jpg(1.6 MB)
+
15:42:40✓ TY028 完成 → TY028.jpg(1.8 MB)
+
15:43:02✕ TY029 失败:衣服图打不开(文件不存在)
+
15:43:03已写回 Excel E/F 列并保存
+
15:43:20↻ TY030 生成中…(已用 14s,请求进行中)
+
15:43:34· TY030 等待中转响应(心跳)
+
+
+
+ +
+ + +
+
数据源:商品表.xlsx
+
模型:Nano Banana 2
+
输出:合并后的图片
+
+
生成中 15/60
+
1 项失败
+
✓ 已写回 TY028.jpg
+
+ +
+ + diff --git a/docs/ui-ai-outfit.png b/docs/ui-ai-outfit.png new file mode 100644 index 0000000..48f0dcd Binary files /dev/null and b/docs/ui-ai-outfit.png differ