issue: Placeholder avatars interpolate undefined model IDs before model lookup resolves

该报错通常出现在 Open WebUI 聊天占位页加载或模型列表尚未返回期间:选中的模型 ID 还没解析成模型对象时,头像 URL 就被拼成了带 id=undefined 的请求。优先确认前端实现中传入的 selectedModels 是否为空字符串或已失效的模型 ID,而不是先排查推理服务。

快速结论:该报错通常出现在 Open WebUI 聊天占位页加载或模型列表尚未返回期间:选中的模型 ID 还没解析成模型对象时,头像 URL 就被拼成了带 id=undefined 的请求。优先确认前端实现中传入的 selectedModels 是否为空字符串或已失效的模型 ID,而不是先排查推理服务。

适用环境:Issue 中确认涉及 Open WebUI v0.12.0 与 v0.13.0 前端源码(v0.13.0 对应 tag commit c38885a1a737da4968f157092f304f3b5481d0bf),相关文件为 Placeholder.svelte、ChatPlaceholder.svelte,v0.13.0 还涉及 CallOverlay.svelte。Issue 未确认具体操作系统、Python、CUDA、显卡或后端依赖版本。

最快修复方案:暂无确认的一步修复方案。维护者已关闭该 Issue,并说明服务端对无法解析的模型 ID 会返回默认 logo,页面同样回退到默认图,未观察到可见异常、失败或推理受影响。

注意事项:当前讨论是源码表达式复现,未提供完整浏览器跟踪,也没有证明渲染时序或推理请求异常。建议修复方向(使用内置回退图、保持选择索引稳定)属于建议,未经合并验证;若实际出现可见异常,需要按维护者要求提供截图、复现步骤和版本号后另开新 Issue。

问题场景

在 Open WebUI 中打开聊天页或切换到占位状态时,聊天占位组件里的头像会使用当前选中模型去拼接模型头像地址。当模型列表还没加载完成、所选模型已被移除,或者 selectedModels 中存在空字符串 '' 时,模型查找结果为空,模板中的 model?.id 就变成 undefined,从而向 /api/v1/models/model/profile/image 发出带 id=undefined 的请求。

报错原文

issue: Placeholder avatars interpolate undefined model IDs before model lookup resolves
/api/v1/models/model/profile/image?id=undefined&lang=en-US

原因分析

最可能的原因是占位组件的头像 URL 直接对模型查找结果做可选链取值,而未先判断模型是否解析成功。Issue 给出的最小复现覆盖四种状态:空选择([''])、过期模型 ID(['retired-model'])、模型加载中(['ready-model'] 但 $_models 为空)以及解析完成;前三种都会生成 id=undefined,只有解析完成才得到正确 ID。v0.12.0 的 Chat.svelte 还会把 selectedModels 初始化为 [''],并在没有可用模型时保留该值,这可能放大空 ID 触发概率。

需要区分的是:Issue 仅证明 URL 构造会产生畸形地址,并未证明 Svelte 实际渲染时序、浏览器请求为何中止,或推理请求失败。维护者反馈服务端对此请求返回默认 logo,页面也回退到同一默认图,因此是否构成用户可见故障尚无证据。

环境排查

  • 确认 Open WebUI 版本是否为 v0.12.0 或 v0.13.0,并记录具体 commit;Issue 的源码定位基于这两个版本。
  • 检查浏览器网络面板中是否真的出现 /api/v1/models/model/profile/image?id=undefined&lang=... 请求,以及该请求的响应状态与返回图片。
  • 确认问题发生时模型列表是否为空、模型是否尚未加载完成,或当前选中的模型是否已被删除/改名。
  • 检查 selectedModels 是否可能包含空字符串 '',或保留已失效的模型 ID。
  • 若在通话界面出现类似问题,可同时检查 v0.13.0 CallOverlay.svelte 中同类的背景图 URL 拼接位置;Issue 未复现该运行时状态。

解决步骤

  1. 按 Issue 的最小复现思路,在前端代码中定位模型查找表达式:确认先执行 selectedModels.map((id) => $_models.find((m) => m.id === id)),再取 models[0],且头像模板使用 model?.id。
  2. 在模型查找结果为空时,不拼接模型 profile 图片地址,直接使用组件现有的内置回退图;Issue 建议与现有图片加载失败处理器使用同一回退资源。
  3. 调整时不要通过过滤 $_models 来规避空 ID,以免改变 selectedModelIdx 与选中 ID 之间的对应关系。
  4. 若沿用建议方案,可优先尝试:在图片源表达式中增加条件,只有 model?.id 存在时才请求 profile 图片,否则使用回退图。
  5. 如同步检查 CallOverlay.svelte 的同模式写法,需单独验证其可达运行时状态,Issue 中并未确认该路径实际触发。
  6. 若只是看到网络面板中的 id=undefined 请求、页面头像正常显示默认图,则按维护者结论可视为已知的无害回退行为;若出现可见异常,整理截图、精确复现步骤和版本号后另开新 Issue。

验证方法

在模型列表为空、模型加载中、选中失效模型 ID 以及模型正常解析四种状态下分别打开聊天占位页,观察网络面板:按建议修复后,前三种状态不应再出现 id=undefined 的 profile 图片请求,模型正常解析后仍能加载对应头像。页面头像在未解析时应显示内置回退图,且不出现可见布局或功能异常。由于该 Issue 未提供已验证补丁,上述验证结果需以实际修改后的版本为准。

参考来源

open-webui/open-webui #33720

GamsGo AI

AI 工具推荐

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

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

了解 GamsGo AI

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

这个方案解决了吗?

celebrityanime
celebrityanime
文章: 32456

发表回复

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