fix: seed AI model config at runtime
This commit is contained in:
@@ -108,6 +108,7 @@
|
||||
2. 打包态(`sys.frozen`)→ `~/.cmbot`(即 `%USERPROFILE%\.cmbot`)。**不依赖启动器注入环境变量**:即使用户绕过 `Launcher.exe` 直接双击 `app\CMBot.exe`,数据也落在 `~/.cmbot`。
|
||||
3. 开发态 → 项目根(不污染开发者主目录,保持现状)。
|
||||
- **首次运行播种**:`~/.cmbot/config/app_config.json`、`templates.json`、`ai_models.json` 不存在时,从程序包内 `app\config\` 拷贝对应出厂默认;缺省再退回内置默认(呼应 `docs/09` 第 6 节)。`ai_models.json` 出厂模板不得包含真实 API key,管理员在用户数据目录中填写。
|
||||
- **新增配置的更新兼容**:启动器当前先执行播种,再应用 `staging\app.new`。因此用户通过自更新换到新版时,播种阶段读取的仍可能是旧版 `app\config\`,新增的出厂配置文件(例如 `ai_models.json`)不会在这次启动被复制。且 `Launcher.exe` 本身不参与自更新,旧 Launcher 也可能不知道新增文件名。新增配置文件必须由**主程序运行时兜底补种**:新版 app 启动或加载配置时,如果 `~/.cmbot/config/<name>` 不存在,应从当前新版 `app\config\<name>` 复制一次,仍不得覆盖用户已有文件。
|
||||
- 写入配置/模板/日志/输出前按需创建多级目录(`parents=True`)。
|
||||
|
||||
数据目录分离与 `~/.cmbot` 约定后续需同步 `docs/05-project-architecture.md` 与 `docs/09` 第 5、6 节的目录说明。
|
||||
|
||||
@@ -106,6 +106,56 @@ Excel 行 → `OutfitTask` 列表的转换由 `excel_service` 完成;核心只
|
||||
- **取图**:递归遍历响应 JSON 找 base64 / data-url / 图片 URL(再下载),对中转 API 结构差异强兼容。
|
||||
- **URL 归一化**、`extra_body` 合并、字段校验(缺 `url/model/api_key` 时阻止开始)。
|
||||
|
||||
### 6.1 `ai_models.json` 出厂模板
|
||||
|
||||
为降低首次部署成本,发布包应在 `app\config\ai_models.json` 内带一份**模型配置模板**。
|
||||
用户数据仍以 `~/.cmbot/config/ai_models.json` 为准,程序不会直接把出厂模板当成用户配置使用。
|
||||
|
||||
播种/补种规则:
|
||||
|
||||
- 首次安装:启动器可从 `app\config\ai_models.json` 播种到 `~/.cmbot/config/ai_models.json`。
|
||||
- 自更新:不能只依赖启动器播种。启动器目前先播种旧 `app\config`,再应用新版 `app`;同时 `Launcher.exe` 本身不自更新,旧启动器也可能不知道 `ai_models.json`。因此新版 app 在启动或 `load_ai_models()` 时必须做运行时兜底:如果 `~/.cmbot/config/ai_models.json` 不存在,且当前 `app\config\ai_models.json` 存在,则复制一次。
|
||||
- 任何播种/补种都**不得覆盖**用户已有 `~/.cmbot/config/ai_models.json`。
|
||||
|
||||
模板格式采用当前程序可直接加载的结构:
|
||||
|
||||
```json
|
||||
{
|
||||
"models": [
|
||||
{
|
||||
"name": "GPT Image 2",
|
||||
"url": "https://api.vectorengine.ai/v1/images/edits",
|
||||
"model": "gpt-image-2",
|
||||
"api_key": "",
|
||||
"api_type": "images_edits",
|
||||
"timeout_seconds": 0,
|
||||
"connect_timeout_seconds": 30,
|
||||
"extra_body": {}
|
||||
},
|
||||
{
|
||||
"name": "Nano Banana 2",
|
||||
"url": "https://api.vectorengine.ai/v1/chat/completions",
|
||||
"model": "gemini-3.1-flash-image-preview",
|
||||
"api_key": "",
|
||||
"api_type": "auto",
|
||||
"timeout_seconds": 0,
|
||||
"connect_timeout_seconds": 30,
|
||||
"extra_body": {}
|
||||
}
|
||||
]
|
||||
}
|
||||
```
|
||||
|
||||
规则:
|
||||
|
||||
- `name` 是界面下拉框显示值,也是 `app_config.json` 中 `outfit_model` 的持久化值。
|
||||
- `timeout_seconds=0` 表示按分辨率自动取超时(见 §8),`connect_timeout_seconds=30` 只控制连接阶段。
|
||||
- 出厂模板**不得提交真实 `api_key`**;管理员在目标机器的 `~/.cmbot/config/ai_models.json`
|
||||
中填写真实 key。
|
||||
- 旧项目的 `api_config.json` 如为 `{last_selected_model, models:{id:{display_name,...}}}`
|
||||
结构,迁移时把 `models` 对象转成列表,并把 `display_name` 映射为 `name`。
|
||||
- 当前旧配置里的 `last_selected_model=nano_banana_2` 对应 `outfit_model="Nano Banana 2"`。
|
||||
|
||||
> Python 3.7 注意:旧项目用了 `dict[str, Any]` 等 PEP 585 写法,移植时需 `from __future__ import annotations` 或改用 `typing.Dict`,以兼容 cmbot 的 Python 3.7.9。
|
||||
|
||||
## 7. 提示词
|
||||
@@ -291,6 +341,7 @@ Excel 行 → `OutfitTask` 列表的转换由 `excel_service` 完成;核心只
|
||||
遵循 cmbot「配置集中、放数据目录、凭据不入库」约定:
|
||||
|
||||
- **AI 模型与密钥** → `~/.cmbot/config/ai_models.json`(管理员预置或界面填写,**含明文 key、不提交 git**;与更新源凭据同等对待,见 `docs/10` §14)。
|
||||
- 发布包可附带 `app\config\ai_models.json` 出厂模板(见 §6.1),用于首次播种;模板中的 `api_key` 必须为空或占位,真实 key 只写入用户数据目录。
|
||||
- **提示词** → `~/.cmbot/config/outfit_prompt.txt`。
|
||||
- **批量设置 + 上次 Excel/输出路径** → 并入 `app_config.json`(`config_service` 集中读写,UI 不直接读写配置文件,遵守 `docs/04` 第 6 节 / `docs/05` 4.12)。
|
||||
- 失败记录 / 日志沿用 `~/.cmbot/logs` 与现有日志服务。
|
||||
|
||||
Reference in New Issue
Block a user