快速结论:当 Open WebUI 使用 native function calling(原生函数调用)时,search_web 以及 OpenAPI/MCP 工具服务器的返回结果不会生成引用来源(source chips),即使搜索结果里已经包含 title/link/snippet。根因是 utils/middleware.py 里只对一份硬编码的白名单工具生成引用,search_web 和工具服务器都不在其中。
适用环境:Open WebUI v0.11.4,Docker 安装,Ubuntu 24.04.2 LTS;同时在最新 release 和 dev 分支上复现。Issue 中未提供 Ollama 版本、Python、CUDA 或显卡信息。
最快修复方案:暂无确认的一步修复方案。Issue 中给出的方向是:把 search_web 加入白名单并映射为 source,同时为工具服务器设计显式的 sources 返回约定;作者使用本地补丁(0002-tool-sources-and-download-links.patch)验证可行,但该方案尚未合入上游。
注意事项:补丁中的 download-link 部分是该用户的定制内容,不具通用性;sources 返回约定属于新增约定,不是现有正式配置项,使用前需确认是否与你的工具服务器兼容。
问题场景
在 Open WebUI 中把模型配置为 function_calling: native,启用 web search 和 citations 能力后,向模型提问触发 search_web。模型回答确实基于搜索结果,但消息里没有任何来源(message.sources 为 null),不会出现 source chips。同样的问题也出现在 OpenAPI 工具服务器和 MCP 工具上——这些工具服务器没有途径发出 source 事件,因此返回自己 URL 的研究类工具永远无法显示引用,除非模型自己把 URL 抄进答案里,而模型往往不会这么做。0.10.x 的旧版本可以正常引用 search_web 结果。
报错原文
issue: Native function calling: search_web and tool-server results never produce citations
tool_function_name in ['fetch_url', 'view_file', 'view_knowledge_file',
'query_knowledge_files', 'query_chat_files']
search_web results do NOT appear as source chips, like fetch_url results do.
message.sources is null
原因分析
问题出在 native function calling 的引用生成路径上。utils/middleware.py 只对一份硬编码的工具名单构建 citation,包括 fetch_url、view_file、view_knowledge_file、query_knowledge_files、query_chat_files。search_web 不在这个名单里,所以即使它的返回结果已经按每条命中包含 title / link / snippet,中间件也不会把它转成 source,最终 message.sources 为空。
工具服务器(OpenAPI、MCP)的问题更彻底:这类工具的返回结果没有任何被中间件识别为引用的结构,也没有让工具主动声明来源的约定,因此无法生成 source 事件。可优先尝试的修复方向有两个:把 search_web 加入白名单并按 source.id = link、metadata = [{source: link, name: title, url: link}]、document = [snippet] 映射;以及给工具服务器增加一个显式返回引用的约定,例如结果 JSON 顶层带 sources: [{url, title, content?}] 数组,或使用 x-openwebui-sources 响应头,由中间件转成 source 事件。
环境排查
- 确认 Open WebUI 版本:Issue 在 v0.11.4、最新 release 和
dev分支上均能复现。 - 确认安装方式为 Docker,宿主机系统为 Ubuntu 24.04.2 LTS。
- 确认模型配置里
function_calling为native。 - 确认 web search 已启用、citations 能力已打开。
- 检查是否命中同类的既有 Issue:#29569(native
search_webcitations unmappable)、#25174(MCP 工具在 native 模式下生成引用)、#29627(让 native tool-call 的 source 标签自描述)。 - Issue 未提供 Ollama 版本、Python、PyTorch、CUDA、显卡或节点依赖信息,这些项目无法据此核对。
解决步骤
- 先确认触发路径:使用
function_calling: native的模型,开启 web search 和 citations,提问一个必然触发search_web的问题,观察返回消息的message.sources是否为 null。 - 可优先尝试的修复方向一:在
utils/middleware.py的引用构建逻辑中把search_web加入白名单,并把每个搜索结果映射为 source——source.id = link,metadata = [{source: link, name: title, url: link}],document = [snippet]。 - 可优先尝试的修复方向二:为工具服务器增加显式的引用返回约定,例如在 JSON 结果顶层返回
sources: [{url, title, content?}]数组,或返回x-openwebui-sources响应头,由中间件将其转成 source 事件。这种方式比从任意结果结构中猜测更明确。 - 如果采用补丁方式,Issue 作者使用的本地补丁为
compose/openwebui-patched/patches/0002-tool-sources-and-download-links.patch;其中 download-link 部分是该用户的定制内容,不要照搬。 - 如果你的场景同时涉及工具服务器,最好等待或跟进
sources约定是否被上游接受,避免依赖非正式约定。
验证方法
按上述步骤 1 的场景重新提问,确认回答消息中出现 source chips,或直接检查 message.sources 不再为 null,并且其中的 source 对应搜索结果里的 link 与 title。对工具服务器场景,确认返回结果中的 sources 数组或 x-openwebui-sources 头能在消息里还原成引用来源。
参考来源
AI 工具推荐
想把多个 AI 模型放在一个入口?
GamsGo AI 集成 ChatGPT、DeepSeek、Gemini、Claude、Midjourney、Veo 等常用模型,适合写作、绘图、视频和日常 AI 工作流。
推广链接:通过此链接购买,我可能获得佣金,不影响你的价格。
这个方案解决了吗?
可以继续搜索完整报错,或查看同一工具的其他排查指南。
![[Bug]: Rust frontend chat-template rendering fails with 500 "unknown function: raise_exception" for templates that legally use it (e.g. Qwen](https://www.chat-gpts.plus/wp-content/uploads/2026/09/59009-5c4e83a4-768x403.jpg)
![[Bug]: Host memory is not reducing after the model is loaded into Intel XPU](https://www.chat-gpts.plus/wp-content/uploads/2026/09/50269-2f2deaf5-768x403.jpg)
![[Bug]: GLM-5.3 reasoning leaks into content when clients pass enable_thinking/thinking=false — parser gates on kwargs the GLM-5.3 template n](https://www.chat-gpts.plus/wp-content/uploads/2026/09/54744-b3553957-768x403.jpg)