issue: context compaction summary leaves out the tool calls of earlier replies

当 Open WebUI 对挂载了 filter 的模型触发上下文压缩(context compaction)时,摘要提示词只包含用户文本和助手最终文本,不包含已保存聊天中 assistant 消息 output 里的工具调用;优先排查摘要格式化逻辑是否处理了 function_call 项。

快速结论:当 Open WebUI 对挂载了 filter 的模型触发上下文压缩(context compaction)时,摘要提示词只包含用户文本和助手最终文本,不包含已保存聊天中 assistant 消息 output 里的工具调用;优先排查摘要格式化逻辑是否处理了 function_call 项。

适用环境:Open WebUI v0.13.3 与 dev 分支 3f26c03(ghcr.io/open-webui/open-webui:dev,构建于 2026-11-11);Docker Desktop;macOS 15.7;使用 OpenAI 兼容 provider,非 Ollama。问题发生在服务端,与浏览器无关。

最快修复方案:暂无确认的一步修复方案。该 Issue 未提供已合并修复,仅确认了成因:_generate_summary 与 get_content_from_message 未从 output 的 function_call 项中提取工具名和参数。

注意事项:该问题只在“模型挂载了 filter”的压缩路径上复现,普通路径是否受影响未被确认;相关讨论 #33966 只解释了为何 filter 路径走纯文本摘要,并不包含修复。

问题场景

在 Open WebUI 中对某个模型挂载 filter 后,当会话长度触发上下文压缩时,压缩会走纯文本摘要提示词路径(compact_messages_for_request(request, None, ...))。对于已保存的聊天记录,摘要模型收到的内容缺少此前回复中的工具调用。对于 SQL 之类的工具型会话,实际执行过的查询只存在于工具调用参数中,压缩后模型将无法得知已运行过哪些查询。

报错原文

issue: context compaction summary leaves out the tool calls of earlier replies

原因分析

已保存的 assistant 消息把工具调用保存在 output 数组的 function_call 项里,本身没有 tool_calls 字段。而 _generate_summary 中的格式化逻辑只为带 tool_calls 字段的消息追加 [TOOL CALLS],get_content_from_message 也只返回 message 类型的项。结果是摘要提示词中的 {{COMPACTED_MESSAGES}} 与 {{RECENT_MESSAGES}} 只有用户文本和助手最终文本,没有工具名与参数。Issue 作者已验证该行为发生在 filter 触发的压缩路径上(form_data=None)。

环境排查

  • 确认 Open WebUI 版本:Issue 在 v0.13.3 与 dev 3f26c03 上均复现。
  • 确认安装方式为 Docker,运行环境为 macOS 15.7 + Docker Desktop。
  • 确认模型是否挂载了 filter;该问题只在 filter 触发的压缩路径出现。
  • 确认 provider 类型:本例为 OpenAI 兼容 provider,Ollama 版本不适用。
  • 检查已保存会话的 assistant 消息是否使用 output 中的 function_call 存储工具调用,而非 tool_calls 字段。

解决步骤

  1. 在测试镜像内复现:按 Issue 提供的最小脚本,以 form_data=None 调用 _generate_summary,并传入一条含 function_call 与 function_call_output 的已保存工具回合。
  2. 捕获 form_data["messages"][-1]["content"],检查最终摘要提示词中是否出现工具名(如 query_db)与参数(如 SQL 语句)。
  3. 若未出现,定位 backend/open_webui/utils/context_compaction.py 中 _generate_summary 的格式化部分与 backend/open_webui/utils/misc.py 中的 get_content_from_message。
  4. 可优先尝试:在格式化逻辑中同时识别 output 内的 function_call 项,按现有 [TOOL CALLS] 格式输出工具名与参数(不包含结果),使保存聊天与带 tool_calls 的消息获得一致处理。该改动方向来自 Issue 的期望行为描述,尚未经官方验证。
  5. 修改后重新运行上述最小脚本复现,对比输出差异。

验证方法

用最小脚本再次调用 _generate_summary,确认生成的摘要提示词中 {{COMPACTED_MESSAGES}} 与 {{RECENT_MESSAGES}} 已包含先前回复的工具调用名称和参数;同时确认工具调用结果未被误写入摘要。若使用真实会话,可在触发压缩后检查摘要模型实际收到的请求内容。

参考来源

open-webui/open-webui #34139

GamsGo AI

AI 工具推荐

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

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

了解 GamsGo AI

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

这个方案解决了吗?

celebrityanime
celebrityanime
文章: 34547

发表回复

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