fix: seed AI model config at runtime
This commit is contained in:
@@ -1161,6 +1161,19 @@
|
||||
- [x] `tests/test_ai_outfit.py`:扇出/幂等跳过/空目录/部分失败/命名过滤等用例;既有单文件用例保持绿;全套 12 文件 py37 全绿
|
||||
- [x] 离屏冒烟:临时 Excel 的 C 指向含 3 张图的目录 + mock API,断言 `输出/<目录名>/` 下 3 个 jpg、D=子目录、E=完成、缩略图 3 张
|
||||
|
||||
### 19.13 AI 模型配置模板 — docs/11 §6.1 / docs/10 §5
|
||||
|
||||
前置阅读:`docs/11-ai-outfit.md`(§6.1、§11)、`docs/10-lan-update.md`(§4、§5)、`src/services/config_service.py`(`load_ai_models`)、`src/launcher.py`(首次播种)。
|
||||
|
||||
背景:当前 AI 模型配置只能由管理员手动创建 `~/.cmbot/config/ai_models.json`。需要提供出厂模板,使用现有 `api_config.json` 中的两个模型(GPT Image 2 / Nano Banana 2)转换为当前程序可直接读取的 `ai_models.json` 列表结构,但**不得提交真实 API key**。
|
||||
|
||||
- [x] 新增 `packaging/default_config/ai_models.json`,格式为 `{ "models": [...] }`;`display_name` → `name`;保留 `url/model/api_type/timeout_seconds/connect_timeout_seconds/extra_body`;`api_key` 留空或占位
|
||||
- [x] 更新 `packaging/default_config/app_config.json`,新增 `outfit_model: "Nano Banana 2"`,对应旧配置的 `last_selected_model=nano_banana_2`
|
||||
- [x] 更新 `src/launcher.py` 首次播种白名单,把 `ai_models.json` 与 `app_config.json`、`templates.json` 一起复制到 `~/.cmbot/config`;已有用户文件不得覆盖
|
||||
- [x] 补 `tests/test_launcher.py`:首次播种复制 `ai_models.json`,已有 `ai_models.json` 不覆盖
|
||||
- [x] 补配置读取验证:`load_ai_models()` 能读取出厂模板的两个模型名,且模板不含真实 key
|
||||
- [x] 验证:`python -m unittest discover -s tests` 通过;主窗口启动后 AI 模型下拉可显示模板模型(未填 key 时开始生成仍应提示缺 `api_key`)
|
||||
|
||||
### 19.14 货号(B列)改为可选 — docs/11 §4 / §9
|
||||
|
||||
前置阅读:`docs/11-ai-outfit.md`(§4、§9、§4.1)、`src/services/excel_service.py`(`load_outfit_tasks`/`read_all_rows` 完整性判定)、`src/core/ai_outfit.py`(`make_outfit_output_path`/`generate_outfit_image` 单文件分支)、`src/app/widgets/ai_outfit_panel.py`(`_fill_sample_combo`)
|
||||
@@ -1172,3 +1185,18 @@
|
||||
- [x] `ai_outfit_panel.py`:样本下拉标签货号为空时显示「(无货号)」,明细表货号列允许空
|
||||
- [x] `tests/test_excel_service.py` / `test_ai_outfit.py`:空货号行被 `read_all_rows`/`load_outfit_tasks` 收录;单文件空货号 → 输出按源图名命名;既有用例保持绿
|
||||
- [x] 离屏冒烟:用「标题填、货号空、C=目录」的表,断言预览下拉有行、生成产出到子目录、E=完成;全套 py37 全绿
|
||||
|
||||
### 19.15 `ai_models.json` 运行时兜底补种 — docs/11 §6.1 / docs/10 §5
|
||||
|
||||
前置阅读:`docs/11-ai-outfit.md`(§6.1)、`docs/10-lan-update.md`(§5)、`src/services/config_service.py`(`load_ai_models`)、`src/services/file_service.py`(`get_app_dir`/`get_config_path`)。
|
||||
|
||||
背景:19.13 已把 `ai_models.json` 加入出厂模板和新启动器播种白名单。但用户通过自更新升级时,启动器播种发生在应用新版 `app` 之前,读取的是旧版 `app\config`;且旧 `Launcher.exe` 不自更新,可能根本不知道 `ai_models.json`。结果新版 `app\config\ai_models.json` 已存在,但 `~/.cmbot/config/ai_models.json` 仍缺失。
|
||||
|
||||
设计取舍:由主程序运行时兜底补种新增配置文件。`load_ai_models()` 读取用户配置前,如果 `get_config_path("ai_models.json")` 不存在,则尝试从当前程序根 `get_app_dir()/config/ai_models.json` 复制到用户配置目录;已有用户文件永不覆盖。模板 key 为空,管理员仍需在 `~/.cmbot/config/ai_models.json` 填真实 key。
|
||||
|
||||
- [x] `config_service.py` 增加私有 helper(如 `_seed_factory_config_if_missing(filename)`),只负责「目标不存在时,从当前 `app\config` 复制」
|
||||
- [x] `load_ai_models()` 在读取前调用该 helper,确保旧 Launcher/自更新场景也能补出 `~/.cmbot/config/ai_models.json`
|
||||
- [x] helper 只在源文件存在且目标不存在时复制;复制失败记录日志并继续返回空列表,不影响程序启动
|
||||
- [x] 不覆盖用户已有 `ai_models.json`,不合并、不重写真实 key
|
||||
- [x] 补 `tests/test_config_service.py`:缺用户文件 + 有出厂模板 → 自动复制并加载;已有用户文件 → 不覆盖;源模板不存在 → 返回空且不抛异常
|
||||
- [x] 验证:相关单测和全套 `python -m unittest discover -s tests` 通过;模拟旧 Launcher 场景(只放新版 `app\config\ai_models.json`,用户目录缺文件)时 AI 模型下拉能显示模板模型
|
||||
|
||||
Reference in New Issue
Block a user