[Bug] LLM 配置保存后 agents.defaults 中 model 与 provider 丢失
报告人:ELE-Clouds
报告日期:2026-04-30
测试版本:blockcell v0.1.5(Docker)
标签:bug config regression
问题描述
在 高级功能 → LLM 配置 页面修改任意配置项并点击「保存」后,config.json5 中 agents.defaults 下的 model 字段被重置为空字符串 "",provider 字段被重置为 null,导致 Agent 默认无可用模型。
复现步骤
- 部署 blockcell v0.1.5(Docker),确保
config.json5 中 agents.defaults 配置正常:
"defaults": {
"workspace": "~/.blockcell/workspace",
"model": "deepseek-chat",
"provider": "deepseek",
"maxTokens": 8192,
"temperature": 0.7,
...
}
- 进入 Web UI:高级功能 → LLM 配置
- 修改任意一项配置(如调整
temperature 从 0.7 改为 0.8)
- 点击「保存」按钮
- 进入 高级功能 → 设置 → 配置 → 编辑配置 查看
实际结果
保存后 agents.defaults 中 model 和 provider 丢失:
"defaults": {
"workspace": "~/.blockcell/workspace",
- "model": "deepseek-chat",
+ "model": "",
"maxTokens": 8192,
"temperature": 0.7,
...
- "provider": "deepseek",
+ "provider": null,
"evolutionModel": null,
"evolutionProvider": null,
}
预期结果
保存后 model 和 provider 应保持原有值不变,仅更新用户实际修改的字段。
影响范围
- 严重程度:🔴 P1 高
- 影响说明:
agents.defaults.model 和 agents.defaults.provider 是 Agent 运行时的默认模型与供应商配置。一旦丢失,Agent 在未配置 modelPool 或未显式指定模型时将无法调用 LLM,表现为「无可用模型」错误。
- 触发条件:必现 — 只要在 LLM 配置页面点击保存,无论修改哪一项,都会触发。
根因分析
推断:前端 LLM 配置页面提交保存时,仅携带了 UI 上可编辑的字段(如 temperature、maxTokens、maxContextTokens),未包含 model 和 provider 字段。后端收到部分字段后,直接全量覆盖 agents.defaults 对象,导致未提交的字段被重置为 Go 类型的零值(string → "",*string → nil)。
待验证:
建议修复方案
方案一(推荐)— 后端深度合并
后端在保存 agents.defaults 时采用深度合并(deep merge),仅更新请求中携带的字段,未携带字段保持原值。
伪代码示例:
func mergeDefaults(existing, incoming map[string]interface{}) map[string]interface{} {
for k, v := range incoming {
existing[k] = v
}
return existing
}
方案二 — 前端补全字段
前端表单提交时,确保始终携带 model 和 provider 字段(从当前配置中读取原值填充)。
方案三 — 后端空值校验
后端在写入前做防御性校验:若 model 或 provider 为空字符串/null,且原配置中存在有效值,则保留原值。
临时规避
在保存后手动编辑 config.json5,将 model 和 provider 恢复为正确值,然后重启 blockcell 或重新加载配置。
规范参考
本报告遵循以下 Issue 提交规范,供后续提交者参照:
| 规范项 |
要求 |
本报告示例 |
| 标题格式 |
[类型] 简述问题,20~50 字,中文 |
[Bug] LLM 配置保存后 agents.defaults 中 model 与 provider 丢失 |
| 类型标签 |
bug / regression / feature / enhancement / config / ui / docs / duplicate |
bug、config、regression |
| 正文结构 |
7 段式:问题描述 → 复现步骤 → 实际结果 → 预期结果 → 影响范围 → 根因分析 → 修复建议 |
✅ 完整覆盖 |
| 配置变更标注 |
使用 diff 代码块,- 标注删除行,+ 标注新增行 |
✅ model 和 provider 变更以 diff 展示 |
| 严重程度分级 |
P0(紧急)、P1(高)、P2(中)、P3(低) |
🔴 P1 高 |
| 根因区分 |
明确标注【事实】/【推断】/【待验证】 |
✅ 推断与待验证项分开列出 |
| 复现步骤 |
编号列表,每一步可独立执行 |
✅ 5 步,从初始状态到验证 |
| 修复方案 |
列出至少一个方案,推荐方案标注「推荐」 |
✅ 方案一(推荐)+ 方案二 + 方案三 |
以上规范参考自:本项目 Issue 历史提交惯例 + GitHub 开源社区最佳实践,旨在提升问题沟通效率与修复精准度。
[Bug] LLM 配置保存后
agents.defaults中model与provider丢失问题描述
在 高级功能 → LLM 配置 页面修改任意配置项并点击「保存」后,
config.json5中agents.defaults下的model字段被重置为空字符串"",provider字段被重置为null,导致 Agent 默认无可用模型。复现步骤
config.json5中agents.defaults配置正常:temperature从 0.7 改为 0.8)实际结果
保存后
agents.defaults中model和provider丢失:"defaults": { "workspace": "~/.blockcell/workspace", - "model": "deepseek-chat", + "model": "", "maxTokens": 8192, "temperature": 0.7, ... - "provider": "deepseek", + "provider": null, "evolutionModel": null, "evolutionProvider": null, }预期结果
保存后
model和provider应保持原有值不变,仅更新用户实际修改的字段。影响范围
agents.defaults.model和agents.defaults.provider是 Agent 运行时的默认模型与供应商配置。一旦丢失,Agent 在未配置modelPool或未显式指定模型时将无法调用 LLM,表现为「无可用模型」错误。根因分析
推断:前端 LLM 配置页面提交保存时,仅携带了 UI 上可编辑的字段(如
temperature、maxTokens、maxContextTokens),未包含model和provider字段。后端收到部分字段后,直接全量覆盖agents.defaults对象,导致未提交的字段被重置为 Go 类型的零值(string→"",*string→nil)。待验证:
model/provider字段建议修复方案
方案一(推荐)— 后端深度合并
后端在保存
agents.defaults时采用深度合并(deep merge),仅更新请求中携带的字段,未携带字段保持原值。伪代码示例:
方案二 — 前端补全字段
前端表单提交时,确保始终携带
model和provider字段(从当前配置中读取原值填充)。方案三 — 后端空值校验
后端在写入前做防御性校验:若
model或provider为空字符串/null,且原配置中存在有效值,则保留原值。临时规避
在保存后手动编辑
config.json5,将model和provider恢复为正确值,然后重启 blockcell 或重新加载配置。规范参考
本报告遵循以下 Issue 提交规范,供后续提交者参照:
[类型] 简述问题,20~50 字,中文[Bug] LLM 配置保存后 agents.defaults 中 model 与 provider 丢失bug/regression/feature/enhancement/config/ui/docs/duplicatebug、config、regressiondiff代码块,-标注删除行,+标注新增行model和provider变更以 diff 展示