docs: filter title model from outfit model picker

This commit is contained in:
2026-06-24 08:55:05 +08:00
parent f033943db0
commit e4b691b22a
2 changed files with 22 additions and 0 deletions
+2
View File
@@ -291,6 +291,7 @@ Excel 行 → `OutfitTask` 列表的转换由 `excel_service` 完成;核心只
- **中栏(结果 + 明细)**:顶部「最近结果」缩略图条——**只展示已完成的人物效果图**,新图自动加到最左、首图标「最新」,单击看大图、右键开所在文件夹;下方「处理明细」表(行 / 标题 / 货号 / 衣服图 / 状态 / 结果或原因),按 Excel 行顺序,状态用 完成 / 失败 / 生成中 / 待处理 / 跳过 徽章。
- **列宽(§19.25 / §19.26)**:「行 / 货号 / 状态」是**窄固定列**(`QHeaderView.Fixed`,约 46 / 88 / 76px);「衣服图 / 结果·原因」也收窄为可手拖的小初值(`Interactive`,约 90 / 130px,§19.26 再缩);省下的横向空间全部让给**标题**——「标题」列设 `QHeaderView.Stretch` 吃满剩余宽度(其余列越窄,标题越宽)。由 `_configure_detail_table_columns()` 统一设置。
- **右栏(设置 + 运行,~400px)**:生成设置标题与「重试上次失败的行」同排;图片并发数 / 新请求间隔 / 单任务冷却 / 失败重试 / 分辨率 / JPG 质量保持 **3 列 × 2 行**;`AI 模型` 标签与下拉框同排;本次进度 + 统计(完成 / 失败 / 待处理);开始生成 / 停止生成同排;导出失败清单 / 打开输出目录同排;节省的纵向空间给实时日志(含 §8 心跳行)。
- **图片 AI 模型下拉过滤**:右栏 `AI 模型` 只用于「开始生成」的人物穿搭图片生成,应在填充下拉时跳过 `name == app_config.title_model` 的模型(即 `self._title_model_name`)。标题模型继续由 §17.3 的配置定名机制使用,不出现在图片模型下拉中,避免用户误选文本模型导致图片生成失败。除这条按名过滤外,暂不引入 `usage` 字段或更复杂的配置结构。
> **设计取舍:不做"实时单图大预览"。** 这是"开了走人、回头抽查"的批量工具;单图实时预览在并发时会产生"该显示哪一行"的歧义。改为「最近结果缩略图条」——只展示已落地成品,既保留"早发现话术/模型不对、及时停掉改话术"的价值,又因只显示成品而消除并发歧义。
@@ -473,6 +474,7 @@ Excel 行 → `OutfitTask` 列表的转换由 `excel_service` 完成;核心只
- **找不到/未配置时明确报错**(不静默猜测):「未找到标题模型『{名字}』,请在 ai_models.json 添加可生成文字的模型(chat/gemini),并在 app_config 的 title_model 指定其 name」。
- **命中的模型是纯图片接口(images/images_edits)时,开跑前就拦截(§19.21)**:`_find_title_model` 检出 `api_type ∈ {images, images_edits}` → 返回错误「『{名字}』是图片模型({api_type}),不能生成文字标题,请改选 chat/gemini 文本模型」→ `_resolve_title_model_config` 弹窗 + 中止,不逐行失败。
- 边界:`api_type=chat` 但实际返回图片的模型(如 Nano Banana)类型上无法预判,仍在运行时由 `AiTextClient`/「未找到文字标题」逐行暴露——这是固有限制。
- **图片模型下拉与标题模型隔离**:图片生成的右栏 `AI 模型` 下拉在 `_fill_model_combo()` 填充时,应跳过 `name == title_model` 的模型;标题模型仍留在 `self._models` 里供 `_resolve_title_model_config()` 查找,不应从总模型列表删除。这样既保留标题生成能力,又避免默认 `GPT-5.5 文本` 出现在图片模型下拉里被误选。
- **`ai_models.json` 需有一条文本/视觉模型**(管理员维护,含真实 key,不入库):`api_type` 设 `chat`、`model` 填中转的真实 id(如 `gpt-5.5`)、`name` 与 `title_model` 一致(默认 `GPT-5.5 文本`)。`docs/ai_models.sample.json` 已含 chat 示例可参照。
- **标题提示词**:单份,存 `~/.cmbot/config/title_prompt.txt`(`load_title_prompt`/`save_title_prompt`,仿旧式单份,标题侧不做多套模板)。发布包应带 `app\config\title_prompt.txt`;用户目录缺失时首次播种/运行时兜底复制,已有不覆盖;出厂文件缺失时才退回代码内置 `DEFAULT_TITLE_PROMPT`。默认文案为**批量风格 + 逗号分隔**——让模型生成**多条**电商女装标题、**标题之间用逗号分隔**、**不要表格/换行/序号/引号/表情**,数量由用户在提示词里写(默认示例可写「生成 10 条」)。与 §17.1 的逗号拆分配套。
+20
View File
@@ -1521,3 +1521,23 @@
- [x] `config_service`:`load_ai_models` 在用户文件存在但缺 `app_config.title_model` 时,从 factory `ai_models.json` 追加同名模型;不覆盖同名模型、不改 `api_key`;factory 无同名只记录日志
- [x] 测试:缺 prompt 文件时从 factory 复制;已有 prompt 不覆盖;已有 `ai_models.json` 缺标题模型时追加;已有同名标题模型不重复;factory 无同名不报错
- [x] 验证:`py_compile`、`test_config_service.py`、`test_launcher.py`、全套 `python -m unittest discover -s tests`、离屏启动主窗口并切到 AI 穿搭页通过
### 19.29 AI 模型下拉过滤标题模型 — docs/11 §10 / §17.3
前置阅读:
- `docs/11-ai-outfit.md`(§10 右栏、§17.3 模型与提示词)
- `src/app/widgets/ai_outfit_panel.py`(`apply_config` / `_fill_model_combo` / `_resolve_title_model_config`)
- `tests/test_ai_outfit_panel.py`(模型下拉与标题模型查找用例)
背景:
§19.28 后出厂 `ai_models.json` 同时包含图片模型和标题文本模型。右栏「AI 模型」下拉用于图片生成,但当前会显示 `app_config.title_model` 对应的标题模型(默认 `GPT-5.5 文本`),用户可能误选文本模型去生成图片,导致开始生成后失败。
任务:
- [x] 文档更新:`docs/11-ai-outfit.md` 已明确右栏图片 `AI 模型` 下拉填充时跳过 `name == app_config.title_model` 的模型;不新增 `usage` 字段
- [ ] `ai_outfit_panel.py`:`_fill_model_combo()` 按 `self._title_model_name` 过滤图片模型下拉;标题模型仍保留在 `self._models` 中供 `_resolve_title_model_config()` 使用
- [ ] 行为:如果过滤后没有可选图片模型,显示「未配置可用图片模型」类占位并保持开始生成前校验提示
- [ ] 测试:标题模型不出现在图片 AI 模型下拉;图片模型仍显示;标题生成仍能按 `title_model` 找到同名模型;只有标题模型时下拉为空/占位
- [ ] 验证:`test_ai_outfit_panel.py`、全套测试、离屏启动 AI 穿搭页