refactor(ai-outfit): 标题模型改为「配置定名」、去掉下拉 (§19.19)
标题模型是「配一次就固定」的,不像分辨率/话术需每次选;左栏 ~360px 已叠两个 提示词组,去掉下拉更干净,还消掉「误选图片模型」的坑。模型名放 app_config.title_model (默认 GPT-5.5 文本),运行时按名字查 ai_models.json —— 换模型只改配置不改代码(docs/11 §17.3/§17.6)。 - ai_outfit_panel.py:_build_title_group 去掉标题模型下拉;apply_config 改记 title_model 名字、_emit_config 不再写(UI 不覆盖);_selected_title_model_config → 纯函数 _find_title_model(按 name 查 + 校验,返回 (config, error))+ UI 包装 _resolve_title_model_config;找不到/未配置/图片接口时明确报错 - config_service:DEFAULT_CONFIG.title_model 默认改为 "GPT-5.5 文本" - docs/ai_models.sample.json:补一条 name=「GPT-5.5 文本」的 chat 文本模型样板(占位 key) - 测试:面板断言无标题模型下拉;_find_title_model 命中/缺失/无模型三例;全套 py37 通过 - 冒烟:seeded ai_models.json + apply_config → title_model 名字解析到 gpt-5.5(chat),缺失→报错 Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
+24
-8
@@ -250,7 +250,7 @@ Excel 行 → `OutfitTask` 列表的转换由 `excel_service` 完成;核心只
|
||||
|
||||
三栏布局:
|
||||
|
||||
- **左栏(数据源 + 标题/话术创作,~360px)**:`Excel` / `输出` 各为**行内一行**(标签 + 路径 + 浏览,省纵向空间);数据源概览(共 N 行 / 完成 / 待处理 / 失败);**「标题生成」组(§17)在上**:标题生成提示词编辑 +「标题模型」下拉 +「保存」+「生成标题」;**「穿搭生成话术」组在下**:话术编辑 +「保存话术」+「插入标题」+ 多套模板下拉(§7.2)。**最终提示词预览已移除(§17)**。图片 AI 模型下拉不在此(见右栏);标题模型下拉在本栏标题组内。
|
||||
- **左栏(数据源 + 标题/话术创作,~360px)**:`Excel` / `输出` 各为**行内一行**(标签 + 路径 + 浏览,省纵向空间);数据源概览(共 N 行 / 完成 / 待处理 / 失败);**「标题生成」组(§17)在上**:标题生成提示词编辑 +「保存」+「生成标题」(**无标题模型下拉**,模型由 `title_model` 配置定名,§17.3);**「穿搭生成话术」组在下**:话术编辑 +「保存话术」+「插入标题」+ 多套模板下拉(§7.2)。**最终提示词预览已移除(§17)**。图片 AI 模型下拉在右栏;标题模型不放界面。
|
||||
- **中栏(结果 + 明细)**:顶部「最近结果」缩略图条——**只展示已完成的人物效果图**,新图自动加到最左、首图标「最新」,单击看大图、右键开所在文件夹;下方「处理明细」表(行 / 标题 / 货号 / 衣服图 / 状态 / 结果或原因),按 Excel 行顺序,状态用 完成 / 失败 / 生成中 / 待处理 / 跳过 徽章。
|
||||
- **右栏(设置 + 运行,~400px)**:生成设置标题与「重试上次失败的行」同排;图片并发数 / 新请求间隔 / 单任务冷却 / 失败重试 / 分辨率 / JPG 质量保持 **3 列 × 2 行**;`AI 模型` 标签与下拉框同排;本次进度 + 统计(完成 / 失败 / 待处理);开始生成 / 停止生成同排;导出失败清单 / 打开输出目录同排;节省的纵向空间给实时日志(含 §8 心跳行)。
|
||||
|
||||
@@ -262,7 +262,7 @@ Excel 行 → `OutfitTask` 列表的转换由 `excel_service` 完成;核心只
|
||||
|
||||
### 10.1 已知问题:左栏内容被中间面板裁掉(下拉框撑宽)
|
||||
|
||||
> **§17 更新:已作废。** 撑宽元凶「样本行下拉」随预览一并移除(§17);保留本节仅作历史记录。新「标题模型」下拉仍套用下方「修复方向」的 elide 策略,防止再撑宽。
|
||||
> **§17 更新:已作废。** 撑宽元凶「样本行下拉」随预览一并移除(§17);保留本节仅作历史记录。标题模型改为「配置定名」、不放界面(§17.3),左栏也不再有新下拉。
|
||||
|
||||
**现象**:「2 AI 穿搭」左栏组件右侧显示不完整,像被中间面板遮挡了一部分。
|
||||
|
||||
@@ -419,20 +419,36 @@ Excel 行 → `OutfitTask` 列表的转换由 `excel_service` 完成;核心只
|
||||
|
||||
### 17.3 模型与提示词
|
||||
|
||||
- **标题模型独立下拉**:图片/文本模型类型不同(图片模型返回图、不返回文字),左栏标题组内单独放「标题模型」下拉,与图片模型同源(`load_ai_models()`)但**独立记忆**所选(`app_config` 新键 `title_model`)。
|
||||
- **标题模型「配置定名」,不放下拉**(§17.6 决策):图片/文本模型类型不同(图片模型返回图、不返回文字),且标题模型是「配一次就固定」的东西,不像分辨率/话术需要每次选。因此**去掉「标题模型」下拉**,改由配置决定用哪条:
|
||||
- `app_config.json` 的 `title_model` 记**模型名字**(对应 `ai_models.json` 某条的 `name`),默认 `"GPT-5.5 文本"`。
|
||||
- 运行时按该名字在 `load_ai_models()` 里**查**对应模型来用;界面上没有下拉,效果等于"固定用 gpt-5.5"。
|
||||
- **换模型只改配置、不改代码**:管理员在 `ai_models.json` 加/换文本模型条目,再把 `title_model` 改成它的 `name` 即可,无需重新打包。
|
||||
- **找不到/未配置时明确报错**(不静默猜测):「未找到标题模型『{名字}』,请在 ai_models.json 添加可生成文字的模型(chat/gemini),并在 app_config 的 title_model 指定其 name」。
|
||||
- 选到的模型若是纯图片接口(images/images_edits),由 `AiTextClient` 在调用时明确报错提示换文本模型。
|
||||
- **`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`,仿旧式单份,标题侧不做多套模板);默认文案面向电商女装(结合款式/版型/颜色/印花,输出一行中文标题,不加引号/表情/促销词)。
|
||||
|
||||
### 17.4 界面与运行
|
||||
|
||||
- **左栏布局**(§10 已同步):「标题生成」组在上、「穿搭生成话术」组在下;预览块移除。标题组含:标题提示词编辑、`标题模型`下拉、「保存」、「生成标题」。
|
||||
- **运行**:`_TitleWorker(QObject)` 跑在 `QThread`(仿 `_OutfitWorker`),按行顺序逐行生成、立即回填、刷新该行 GUI;失败记日志、跳过该行、继续;用右栏「新请求间隔」做行间节流;温和停止。
|
||||
- **左栏布局**(§10 已同步):「标题生成」组在上、「穿搭生成话术」组在下;预览块移除。标题组含:标题提示词编辑、「保存」、「生成标题」(**无标题模型下拉**,模型由 `title_model` 配置定名,§17.3)。
|
||||
- **运行**:`_TitleWorker(QObject)` 跑在 `QThread`(仿 `_OutfitWorker`),按行顺序逐行生成、立即回填、刷新该行 GUI;失败记日志、跳过该行、继续;用右栏「新请求间隔」做行间节流;温和停止。模型用 `_resolve_title_model_config()`(按 `title_model` 名字查 `ai_models.json`)。
|
||||
- **互斥**:「生成标题」与「开始生成」运行时互斥(避免同表并发写)。
|
||||
- 进度/结果走中栏「处理明细」表与右栏日志(不写 Excel 状态列)。
|
||||
|
||||
### 17.5 验收要点(标题生成)
|
||||
|
||||
- 左栏有「标题生成」组(提示词 + 标题模型下拉 + 生成标题按钮),无预览块。
|
||||
- 左栏有「标题生成」组(提示词 + 保存 + 生成标题按钮),**无标题模型下拉**、无预览块。
|
||||
- `app_config.title_model` 指向的模型在 `ai_models.json` 存在 → 生成走该模型;改 `title_model` 名字即换模型,无需改代码。
|
||||
- 选印花生成的 Excel(A=印花名、C=目录),点「生成标题」→ 每行 A 被改写为 AI 标题、明细表标题列实时刷新、D/E/F 未动。
|
||||
- 标题模型选到纯图片接口(images/images_edits)时明确报错提示换模型。
|
||||
- `title_model` 找不到对应模型 / 指向纯图片接口(images/images_edits)时明确报错提示。
|
||||
- 生成完重载 Excel,紧接「开始生成」跑图用的是新标题。
|
||||
- 文本解析、`generate_title`(单文件/目录取首图/无图失败/客户端异常)、`write_title_result`(只改 A)单测通过,Python 3.7。
|
||||
- 文本解析、`generate_title`(单文件/目录取首图/无图失败/客户端异常)、`write_title_result`(只改 A)、`_resolve_title_model_config`(命中/缺失报错)单测通过,Python 3.7。
|
||||
|
||||
### 17.6 决策:标题模型「配置定名」而非下拉
|
||||
|
||||
最初实现(§19.18)给标题模型放了独立下拉。落地后复盘改为**配置定名、去下拉**:
|
||||
|
||||
- **去下拉的理由**:标题模型是「配一次就固定」的(一个店铺/平台通常固定一个文本模型),不像分辨率/话术需要每次切换;左栏仅 ~360px、已叠两个提示词组,少一个下拉更干净;还消掉「误选图片模型导致报错」的坑。
|
||||
- **为什么不把模型名写死在代码里**:写死后换模型/升级要改 `.py` 重新打包分发。改放 `app_config.title_model`(默认 `GPT-5.5 文本`)后,换模型只改配置一行、重启生效,对非技术管理员友好。
|
||||
- **界面效果一致**:两种做法用户都看不到下拉、都固定一个模型;差别只在「换模型」的代价(改配置 vs 改代码)。
|
||||
- 标题提示词暂不做多套模板(同 §17 决策;真有多套切换需求再按 §7.2 范式补)。
|
||||
|
||||
@@ -1,6 +1,17 @@
|
||||
{
|
||||
"_说明": "复制此文件到 ~/.cmbot/config/ai_models.json(Windows: %USERPROFILE%\\.cmbot\\config\\ai_models.json),把 api_key/url/model 换成真实值。含真实 key 的 ai_models.json 不要提交 git。界面「AI 模型」下拉显示每项的 name;下面列了 4 种 api_type 示例,按你的中转接口选一种保留即可,其余可删。",
|
||||
"_说明": "复制此文件到 ~/.cmbot/config/ai_models.json(Windows: %USERPROFILE%\\.cmbot\\config\\ai_models.json),把 api_key/url/model 换成真实值。含真实 key 的 ai_models.json 不要提交 git。界面「AI 模型」下拉显示每项的 name;下面列了图片用的 4 种 api_type 示例(按你的中转接口选一种保留即可)+ 1 个标题生成用的文本模型。",
|
||||
"_标题模型说明": "AI 穿搭页「生成标题」用文本模型(返回文字、不返回图)。把下面 name=「GPT-5.5 文本」这条的 url/model/api_key 换成你的真实文本模型,并让 app_config.json 的 title_model 与它的 name 一致(默认即「GPT-5.5 文本」)。详见 docs/11-ai-outfit.md §17.3。",
|
||||
"models": [
|
||||
{
|
||||
"name": "GPT-5.5 文本",
|
||||
"url": "https://your-relay.example.com/v1/chat/completions",
|
||||
"model": "gpt-5.5",
|
||||
"api_key": "sk-REPLACE_WITH_YOUR_KEY",
|
||||
"api_type": "chat",
|
||||
"timeout_seconds": 0,
|
||||
"connect_timeout_seconds": 30,
|
||||
"extra_body": {}
|
||||
},
|
||||
{
|
||||
"name": "Nano Banana · 中转(chat)",
|
||||
"url": "https://your-relay.example.com/v1/chat/completions",
|
||||
|
||||
Reference in New Issue
Block a user