Skip to content

[Bug] LLM 配置保存后 agents.defaults 中 model 与 provider 丢失 #72

Description

@ELE-Clouds

[Bug] LLM 配置保存后 agents.defaultsmodelprovider 丢失

报告人:ELE-Clouds
报告日期:2026-04-30
测试版本:blockcell v0.1.5(Docker)
标签bug config regression


问题描述

高级功能 → LLM 配置 页面修改任意配置项并点击「保存」后,config.json5agents.defaults 下的 model 字段被重置为空字符串 ""provider 字段被重置为 null,导致 Agent 默认无可用模型。


复现步骤

  1. 部署 blockcell v0.1.5(Docker),确保 config.json5agents.defaults 配置正常:
    "defaults": {
        "workspace": "~/.blockcell/workspace",
        "model": "deepseek-chat",
        "provider": "deepseek",
        "maxTokens": 8192,
        "temperature": 0.7,
        ...
    }
  2. 进入 Web UI:高级功能 → LLM 配置
  3. 修改任意一项配置(如调整 temperature 从 0.7 改为 0.8)
  4. 点击「保存」按钮
  5. 进入 高级功能 → 设置 → 配置 → 编辑配置 查看

实际结果

保存后 agents.defaultsmodelprovider 丢失:

  "defaults": {
      "workspace": "~/.blockcell/workspace",
-     "model": "deepseek-chat",
+     "model": "",
      "maxTokens": 8192,
      "temperature": 0.7,
      ...
-     "provider": "deepseek",
+     "provider": null,
      "evolutionModel": null,
      "evolutionProvider": null,
  }

预期结果

保存后 modelprovider 应保持原有值不变,仅更新用户实际修改的字段。


影响范围

  • 严重程度:🔴 P1 高
  • 影响说明agents.defaults.modelagents.defaults.provider 是 Agent 运行时的默认模型与供应商配置。一旦丢失,Agent 在未配置 modelPool 或未显式指定模型时将无法调用 LLM,表现为「无可用模型」错误。
  • 触发条件必现 — 只要在 LLM 配置页面点击保存,无论修改哪一项,都会触发。

根因分析

推断:前端 LLM 配置页面提交保存时,仅携带了 UI 上可编辑的字段(如 temperaturemaxTokensmaxContextTokens),未包含 modelprovider 字段。后端收到部分字段后,直接全量覆盖 agents.defaults 对象,导致未提交的字段被重置为 Go 类型的零值(string""*stringnil)。

待验证

  • 确认后端保存接口是 PUT(全量替换)还是 PATCH(部分更新)
  • 确认前端表单是否渲染了 model / provider 字段

建议修复方案

方案一(推荐)— 后端深度合并
后端在保存 agents.defaults 时采用深度合并(deep merge),仅更新请求中携带的字段,未携带字段保持原值。

伪代码示例:

func mergeDefaults(existing, incoming map[string]interface{}) map[string]interface{} {
    for k, v := range incoming {
        existing[k] = v
    }
    return existing
}

方案二 — 前端补全字段
前端表单提交时,确保始终携带 modelprovider 字段(从当前配置中读取原值填充)。

方案三 — 后端空值校验
后端在写入前做防御性校验:若 modelprovider 为空字符串/null,且原配置中存在有效值,则保留原值。


临时规避

在保存后手动编辑 config.json5,将 modelprovider 恢复为正确值,然后重启 blockcell 或重新加载配置。


规范参考

本报告遵循以下 Issue 提交规范,供后续提交者参照:

规范项 要求 本报告示例
标题格式 [类型] 简述问题,20~50 字,中文 [Bug] LLM 配置保存后 agents.defaults 中 model 与 provider 丢失
类型标签 bug / regression / feature / enhancement / config / ui / docs / duplicate bugconfigregression
正文结构 7 段式:问题描述 → 复现步骤 → 实际结果 → 预期结果 → 影响范围 → 根因分析 → 修复建议 ✅ 完整覆盖
配置变更标注 使用 diff 代码块,- 标注删除行,+ 标注新增行 modelprovider 变更以 diff 展示
严重程度分级 P0(紧急)、P1(高)、P2(中)、P3(低) 🔴 P1 高
根因区分 明确标注【事实】/【推断】/【待验证】 ✅ 推断与待验证项分开列出
复现步骤 编号列表,每一步可独立执行 ✅ 5 步,从初始状态到验证
修复方案 列出至少一个方案,推荐方案标注「推荐」 ✅ 方案一(推荐)+ 方案二 + 方案三

以上规范参考自:本项目 Issue 历史提交惯例 + GitHub 开源社区最佳实践,旨在提升问题沟通效率与修复精准度。

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions