issue: Repeated tool-call ids across rounds drop a function_call and leave an orphaned tool message, permanently breaking the chat

该报错发生在模型(如 Kimi K2/K3 经 vLLM 服务)在同一轮对话的多次工具调用中复用相同的 call_id (如 search_web:0 ),Open WebUI 的“去重”逻辑误删了新调用,导致持久化历史中出现孤立的 function_call_output ,后续消息发送到严格校验

快速结论:该报错发生在模型(如 Kimi K2/K3 经 vLLM 服务)在同一轮对话的多次工具调用中复用相同的 call_id(如 search_web:0),Open WebUI 的“去重”逻辑误删了新调用,导致持久化历史中出现孤立的 function_call_output,后续消息发送到严格校验的上游模型时返回 HTTP 400。优先排查存储的聊天记录中是否存在没有对应 function_callfunction_call_output

适用环境:Open WebUI;Kimi K2/K3(经 vLLM 提供)或 MiniMax-M3 等会跨轮次复用 call_id 的模型;启用原生/内置工具(如网页搜索)。GLM、Gemma、gpt-oss 等宽松模板的模型不会报错,但同样存在数据损坏问题。

最快修复方案:暂无确认的一步修复方案。可优先尝试删除或重新生成出问题的助手轮次——损坏条目只存在于该条消息内,删除后可恢复对话可用性。

注意事项:该修复方案是临时的,不能防止后续再次发生;根本修复依赖上游 PR(#28350、#28360)合入。同时注意:被丢弃的轮次也会覆盖上一轮相同 call_id 的参数,即使模型不报错,已保存的搜索查询也可能是错误的。

问题场景

用户在 Open WebUI 中连接 Kimi K2/K3(经 vLLM 服务)或 MiniMax-M3 等模型并启用原生工具(如网页搜索),在单次对话中要求模型连续执行多轮工具调用(每轮之间有评论文本)。对话正常完成后,再发送任意后续消息(即使是“thanks”),请求被上游模型拒绝并返回 HTTP 400。

报错原文

issue: Repeated tool-call ids across rounds drop a function_call and leave an orphaned tool message, permanently breaking the chat

Kimi K3: tool messages need a resolvable tool name: carry `tool`/`name`, or match a preceding assistant tool_call by order.
MiniMax-M3: Message has tool role, but there was no previous assistant message with a tool call!

原因分析

根因在两处:

1. 新调用被误删——middleware.py 中的 existing_call_ids 集合覆盖整个对话轮次而非单次往返。用于去重流式重传的集合,也把“恰好复用了上一轮 call_id 的新调用”当作重复而丢弃。

2. 之前的参数被覆盖——标记调用完成的循环只匹配第一个相同 id,导致上一轮已存储的调用被写入后一轮的参数,历史记录中显示错误的搜索查询。

除此之外,在 convert_output_to_messages() 之外还有一个“工具对净化器”校验,也是基于 call_id 集合成员判断,同样的原因导致孤立输出存活并透传到上游模型。

环境排查

  • 确认模型是否复用了跨轮次相同的 call_id(如 search_web:0get_current_timestamp:1,且每轮计数器从 0 重新开始)。
  • 确认是否启用了原生/内置工具(如网页搜索)。
  • 确认存储的聊天记录(通过 /api/v1/chats/{id} 获取)中是否存在“有 function_call_output 但没有匹配 function_call”的条目。

解决步骤

  1. 通过 API 获取损坏会话的存储内容,检查 output 列表中最后一个 function_call_output 是否缺少对应的 function_call 条目。
  2. 删除或重新生成包含孤立 function_call_output 的助手轮次。损坏条目只存在于这一条消息中,删除该消息即可恢复对话可用性。
  3. 上游修复 PR(#28350、#28360)合入后,升级 Open WebUI 到包含修复的版本。
  4. 如果模型支持,可考虑在系统提示中要求模型使用全局唯一的 call_id,避免跨轮次冲突。

验证方法

修复后向该对话发送任意后续消息(如“thanks”),确认不再返回 400 错误,且模型能正常回复。对于宽松模板模型,还需检查已保存的搜索调用参数是否与实际执行一致(避免上一轮参数被覆盖的错误)。

参考来源

open-webui/open-webui #28570

GamsGo AI

AI 工具推荐

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

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

了解 GamsGo AI

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

这个方案解决了吗?

celebrityanime
celebrityanime
文章: 18825

发表回复

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