Model workspace overrides silently skipped when base_model_id equals model id

此报错发生在 Open WebUI 管理面板中模型自定义设置(如系统提示词、内置工具开关、工具服务器分配)保存成功但运行时完全不生效的场景。优先检查模型数据中 base_model_id 是否与 id 相同,以及 backend/open_webui/utils/models.py 中 get_al

快速结论:此报错发生在 Open WebUI 管理面板中模型自定义设置(如系统提示词、内置工具开关、工具服务器分配)保存成功但运行时完全不生效的场景。优先检查模型数据中 base_model_id 是否与 id 相同,以及 backend/open_webui/utils/models.pyget_all_models() 函数的合并逻辑。

适用环境:Open WebUI 0.11.0(Issue 确认版本);OpenAI 兼容 API 提供商(如 Ollama、vLLM、vLLM-MLX);浏览器为 Safari(iOS/macOS)。操作系统、Python、CUDA、显卡等未在 Issue 中提供证据,不做补充。

最快修复方案:修改 backend/open_webui/utils/models.py 第 158 行,将合并分支条件从 if custom_model.base_model_id is None: 改为 if custom_model.base_model_id is None or custom_model.base_model_id == custom_model.id:。该单行修复已在 Issue 评论中通过 py_compileruff format --diff 验证,但尚未合并到官方分支。

注意事项:Issue 评论指出 base_model_id == id 本身不应是合法状态——正常管理面板编辑路径会强制 base_model_id: null,克隆路径会改写 id${model.id}-clone。因此该修复是运行时兜底方案,根本治理应将此类脏数据规范化(写入/导入时强制置为 None),但该规范化方案仅为评论推测,未经验证。

问题场景

用户在 Open WebUI 管理面板中点击已有模型(如 qwen3.6gpt-4o),修改任意设置(系统提示词、启用/禁用内置工具、分配工具服务器、切换 function calling 等),保存后新建聊天时发现自定义设置完全没有生效。检查 /api/models 响应,info.meta 中缺少已保存的字段。

报错原文

Model workspace overrides silently skipped when base_model_id equals model id

In get_all_models(), the merge logic has two branches:
1. if custom_model.base_model_id is None: — treats it as a direct override of a base model
2. elif custom_model.is_active: — treats it as a separate custom model

When base_model_id == id (e.g., both are "gpt-4o" or "qwen3.6-uncensored"),
the first branch doesn't match (base_model_id is not None),
and the second branch skips it (id in existing_ids). The DB overrides are never applied.

原因分析

可能原因:get_all_models() 函数中合并数据库自定义配置的逻辑存在分支缺陷。当某个模型的 base_model_idid 值相同(例如都是 "gpt-4o")时:

  • 第一个分支要求 base_model_id is None,此情况不满足,不会走“直接覆盖基础模型”的路径;
  • 第二个分支会先执行 if custom_model.id in existing_ids: continue,由于该 ID 已经被 API 提供商的基线模型占用,会被直接跳过。

结果是:数据库中的自定义覆盖(builtinToolstoolIdsdefaultFeatureIdssystemfunction_calling 等)在运行时完全丢失,用户界面看起来保存成功但实际没有任何效果。base_model_id == id 这种自引用状态可能来自导入、API、历史遗留数据或边缘创建流程,而非正常管理面板操作产生。

环境排查

  • 确认 Open WebUI 版本是否为 0.11.0(或其他存在同样逻辑的版本)
  • 在管理面板中检查目标模型的 base_model_id 是否与 id 完全相同
  • 确认模型来自 API 提供商(OpenAI 兼容接口、Ollama、vLLM 等),而非本地直接加载
  • 通过 /api/models 接口检查响应中 info.meta 是否包含已保存的自定义字段
  • 查看 backend/open_webui/utils/models.pyget_all_models() 函数的合并分支逻辑

解决步骤

  1. 打开 backend/open_webui/utils/models.py,定位到 get_all_models() 函数中处理自定义模型的合并逻辑(Issue 描述为第 158 行附近)。
  2. 将合并分支条件从 if custom_model.base_model_id is None: 修改为:
    if custom_model.base_model_id is None or custom_model.base_model_id == custom_model.id:
  3. 执行语法检查确认修改无误:py_compileruff format --diff(Issue 评论已用此方式验证,无其他格式变更)。
  4. 重启 Open WebUI 服务,使修改后的 Python 代码生效。
  5. 若您不打算修改代码,可优先尝试在管理面板中重新编辑该模型,检查保存时 base_model_id 是否被置为 null(Issue 评论指出正常 UI 编辑路径会提交 base_model_id: null),或通过 API/数据库手动将异常的 base_model_id 修正为 null——但此方法未在 Issue 中验证,仅作为替代方案。
  6. 如需彻底修复脏数据,可考虑在写库/导入时规范化 base_model_id,将自引用值强制置为 None(此建议仅为评论推测,未经实测)。

验证方法

修改代码并重启服务后,回到管理面板编辑该模型,修改一个易观察的设置(如系统提示词或内置工具开关),保存后新建聊天验证自定义是否生效。同时检查 /api/models 响应中 info.meta 是否包含刚保存的字段。若字段出现且运行时行为符合预期,说明修复生效。若仍有问题,请继续检查是否存在其他数据源导致的 base_model_id == id 状态。

参考来源

open-webui/open-webui #28952

GamsGo AI

AI 工具推荐

想把多个 AI 模型放在一个入口?

GamsGo AI 集成 ChatGPT、DeepSeek、Gemini、Claude、Midjourney、Veo 等常用模型,适合写作、绘图、视频和日常 AI 工作流。

了解 GamsGo AI

推广链接:通过此链接购买,我可能获得佣金,不影响你的价格。

这个方案解决了吗?

celebrityanime
celebrityanime
文章: 20234

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注