v89-v91 模板增强 + 图源映射 + 多模态提示词可配置化

- 图源映射统一:热点采集与 Pinterest 模式均走 config.product.mark_dirs 配置,按任务序号随机抽模特图/平铺图
- 商品产地固定:统一为「中国大陆」+「产地省份=广东省」(不再读站点/字典映射)
- 模板 SKU 字段检测:按建议售价同一套路检测 SKU分类/SKU数量/SKU数量单位,必填时填入单品/1/件
- 多模态分析提示词可配置:prompts/pinterest_analyze_system.md + user.md,支持国家覆盖,不丢文件回退内置
- 自定义图片模式:新增 pinterest_custom_load_node,图片数量硬校验,选品清单 ≤ 有效图片数
- 模板导出优化:写入前按货号末 3 位升序排序,不再产生空白 xlsx
- 修复 v90 project review 10 项(503 致命终止、线程安全、原子写入等)
This commit is contained in:
2026-08-28 16:24:50 +08:00
parent 2a96ec0870
commit 71a48e4ed5
40 changed files with 780 additions and 200 deletions
+59 -5
View File
@@ -64,7 +64,38 @@ START → pinterest_init → pinterest_search → pinterest_scrape → pinterest
`scrape_concurrency`(爬图并发,必须=1)、`err400_limit`400 超限放弃当前种子词)。
**每个节点都用 `graph/validate.with_fallback` 包裹**:任何未预料异常都被捕获、记入
`state['errors']`、返回最小更新,整图继续往下走,单点故障不中断流水线。
`state['errors']`、返回最小更新,整图继续往下走,单点故障不中断流水线。致命图像服务错误(503 /
"No available compatible accounts")除外——`with_fallback` 不再静默吞掉,会同步标记流水线终止,
让路由短路到 `pinterest_finalize → template_export` 提前收尾合成模板。
### 模式 B-2:自定义图片模式(Custom)
无需采集/搜索图片,把用户本地图片文件夹里的**有效图片**直接送进多模态分析,沿用 Pinterest
后续所有步骤(分析 → 设计稿 → 三合一 → OSS → 种草图 → 模板导出)。
```
START → pinterest_init → pinterest_custom_load → pinterest_analyze
→ [pinterest_custom_route 循环:图池有未消费图 → 继续分析;图池空/简报达标 → 结束]
→ pinterest_finalize → template_export → END
```
| 节点 | 职责 |
|---|---|
| `pinterest_custom_load` | 读取 `pinterest.custom_image_dir` 文件夹 → 统计有效图片 → **数量硬校验** → 每次重建图池 + 清空已消费拉黑 |
**启用方式**(两种任选):
- 配置 `config.yaml``pinterest.mode: "custom"` 并填 `pinterest.custom_image_dir: "<文件夹路径>"`
- 或直接在 UI 选择「**自定义图片**」流程 →「📁 选图片文件夹…」选择文件夹后运行(自动写入配置)。
**数量硬校验(必过)**
- 必须先选定上传的文件夹(UI 未选会弹窗报错,任务不启动);
- 文件夹内所有有效图片(`jpg/jpeg/png/webp`,递归)数量必须 `> 0`
- **选品清单总数(`product.spu_tasks` 展开后)不得大于有效图片数**。不满足则在
UI 弹窗 / `run_pinterest_ref` 提前抛错 / `custom_load` 节点记录错误,三重拦截,任务不进入分析。
**行为差异**:自定义模式每次运行把图池重建为该文件夹的图片集(唯一图源)并清空已消费 md5 拉黑,
保证用户每次重新上传/选择的所有有效图片都会被重新多模态分析;分析批上限按「选品清单总数」截断,
避免对多余图片浪费配额。`pinterest_custom_route` 只在 wait / analyze / done 间流转,从不 search。
## 目录结构
@@ -82,6 +113,8 @@ pod_trend_agent/
├── prompts/<country>/ # ★ 每个国家不同的提示词单独文件夹
│ ├── system_prompt.md # 该国 LLM 系统提示(补充段,叠加到默认规则)
│ └── aesthetics.yaml # 审美 hint + 风格-配色 extra 规则 + 额外黑名单
├── prompts/pinterest_analyze_system.md # 多模态分析系统提示词(Pinterest/自定义模式),可配置
├── prompts/pinterest_analyze_user.md # 多模态分析用户提示词,可配置
├── graph/
│ ├── state.py # AgentState(共享状态)
│ ├── validate.py # with_fallback 兜底 + 数据校验
@@ -134,6 +167,23 @@ pod_trend_agent/
每完成一个产品立即追加落盘到 `output/<country>/<ts>/products_pending.jsonl`(中断/崩溃也不丢已
完成产品),全部完成后统一合并写模板。
## 多模态分析提示词(可配置)
Pinterest 参考模式与自定义图片模式的多模态分析提示词已**外部化为配置**,无需改代码即可调优:
- `prompts/pinterest_analyze_system.md`——多模态分析**系统提示词**(POD T 恤设计分析师角色 +
禁止抄袭/违禁项/输出 JSON 结构等规则);
- `prompts/pinterest_analyze_user.md`——**用户提示词**"Analyze the attached image and produce
one ORIGINAL T-shirt print design brief...")。
**加载优先级**`graph/llms/openai_compat_backend.py`):
1. `prompts/<国家>/pinterest_analyze_*.md`(国家专属覆盖);
2. `prompts/pinterest_analyze_*.md`(全局配置,先查运行根 exe 旁再查内置);
3. 内置默认常量(兜底,向前兼容)。
直接编辑这两份文件即可自定义分析与生图引导规则;`pinterest_analyze_system.md` 里可调整
`image_prompt` 二段式结构 / `negative_prompt` / `suitable_for_print` 判定标准等约束。
## 生成可靠性 / 错误处理
- **致命 503(图像服务不可用,如 "No available compatible accounts"**:端到端识别
@@ -145,8 +195,11 @@ pod_trend_agent/
- **yunfei / 标准 OpenAI 网关适配**`compose.execution_mode``background` 参数默认不再传入——
yunfei 等网关不认识它们会返回空 body;`base_url` 需带 `/v1` 前缀(如
`https://img.yunfei.best/v1`),否则请求错误路径得到空响应。
- **模特分配**`material_library/<品类>` 内的合格模特图(3:4 比例过滤)按**任务序号**独立随机,
同一 SPU 的多款不再共用同一张模特。每张种草图随机取不同模特特征。
- **图源映射(可配置)**`config.product.mark_dirs` 定义 SPU.mark → `material_library` 下的
`model_dir`(模特图)/ `flat_dir`(平铺图)两个图源文件夹及对应合成提示词。热点采集与 Pinterest
两种模式统一走该映射:在「有图的文件夹」间按**任务序号**独立随机抽图,抽到模特图用模特三图提示词
(图1模特+图2印花+图3底图),抽到平铺图用平铺三图提示词(图1平铺实拍+图2印花+图3底图)。
同一 SPU 的多款不再共用同一张图;某类目录无图则只用另一类。每张种草图随机取不同模特特征。
## 模特性别分组
@@ -180,7 +233,8 @@ pod_trend_agent/
- **胸围识别**:识别「基码表-胸围(cm)」「胸围全围(cm)」等含「胸围」的列,全部填 `sku.bust` 值;
- **申报价格**:模糊匹配所有含「申报价格」的列,统一按加价后价格填写(`price × (1+markup_percent%)`);
- **款式来源**:SPU 行「款式来源」统一填「现货款」;
- **商品产地**国家简称映射正式名称(如「沙特」→「沙特阿拉伯」,`_COUNTRY_NAME_MAP` 可扩展);
- **商品产地**所有国家统一填「中国大陆」;新增「产地省份」精确匹配列,统一填「广东省」(不再读站点/做字典映射);
- **SKU 分类 / SKU 数量 / SKU 数量单位**:按「建议售价」同一套路检测——关键词模糊匹配定位列,读取列头下一行备注判断是否必填(含「非必填」才跳过),检测到且为必填时统一填固定值:`SKU分类=单品``SKU数量=1``SKU数量单位=件`
- **详情图文**:由全部主图 + 种草图组成(不再拼接 img_url_2);
- 规格类型2 = `{size}*{color}`;币种=CNY;发货仓1~N 取模板顶头按「、」分隔,库存均 200;
- 模板文件被占用(打开中)时自动换名 `<SKU>_已填写_N.xlsx`,不中断导出;
@@ -220,7 +274,7 @@ python ui_app.py
python ui_app.py --self-test
```
UI 功能:国家多选、**流程选择(热点采集 / Pinterest 参考模式)**、LLM 后端选择、种子上限、
UI 功能:国家多选、**流程选择(热点采集 / Pinterest 参考模式 / 自定义图片模式**、LLM 后端选择、种子上限、
**SPU/颜色选品**、运行(后台线程 + 实时日志)、结果表格(双击看完整提示词)、打开产物目录。
## 打包