issue: Native function calling: search_web and tool-server results never produce citations

当 Open WebUI 使用 native function calling(原生函数调用)时, search_web 以及 OpenAPI/MCP 工具服务器的返回结果不会生成引用来源(source chips),即使搜索结果里已经包含 title/link/snippet。根因是 utils/

快速结论:当 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_web citations unmappable)、#25174(MCP 工具在 native 模式下生成引用)、#29627(让 native tool-call 的 source 标签自描述)。
  • Issue 未提供 Ollama 版本、Python、PyTorch、CUDA、显卡或节点依赖信息,这些项目无法据此核对。

解决步骤

  1. 先确认触发路径:使用 function_calling: native 的模型,开启 web search 和 citations,提问一个必然触发 search_web 的问题,观察返回消息的 message.sources 是否为 null。
  2. 可优先尝试的修复方向一:在 utils/middleware.py 的引用构建逻辑中把 search_web 加入白名单,并把每个搜索结果映射为 source——source.id = link,metadata = [{source: link, name: title, url: link}],document = [snippet]。
  3. 可优先尝试的修复方向二:为工具服务器增加显式的引用返回约定,例如在 JSON 结果顶层返回 sources: [{url, title, content?}] 数组,或返回 x-openwebui-sources 响应头,由中间件将其转成 source 事件。这种方式比从任意结果结构中猜测更明确。
  4. 如果采用补丁方式,Issue 作者使用的本地补丁为 compose/openwebui-patched/patches/0002-tool-sources-and-download-links.patch;其中 download-link 部分是该用户的定制内容,不要照搬。
  5. 如果你的场景同时涉及工具服务器,最好等待或跟进 sources 约定是否被上游接受,避免依赖非正式约定。

验证方法

按上述步骤 1 的场景重新提问,确认回答消息中出现 source chips,或直接检查 message.sources 不再为 null,并且其中的 source 对应搜索结果里的 link 与 title。对工具服务器场景,确认返回结果中的 sources 数组或 x-openwebui-sources 头能在消息里还原成引用来源。

参考来源

open-webui/open-webui #31599

GamsGo AI

AI 工具推荐

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

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

了解 GamsGo AI

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

这个方案解决了吗?

celebrityanime
celebrityanime
文章: 26262

发表回复

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