快速结论:这个报错通常出现在 Open WebUI 处理模型返回的工具调用(tool call)时——当某个工具调用的 arguments 被 parse_tool_params 解析成非字典的 JSON 标量(如 "foo"、123),后续 execute_tool_call 仍对其调用 params.items(),导致整个聊天响应崩溃。优先排查模型是否在并行工具调用中产生了拼接/不规范的 JSON 参数。
适用环境:Open WebUI v0.11.3(Docker Compose 部署,镜像 ghcr.io/open-webui/open-webui:main);模型通过 OpenAI 兼容网关(LiteLLM)提供,失败模型为 GPT-5.4 级推理模型;工具由 MCP tool server(streamable HTTP)提供,使用原生 function calling。本地 llama.cpp(Qwen 系列)模型未触发该问题。
最快修复方案:暂无确认的一步修复方案。Issue 中用户在生产环境验证的做法是:在 parse_tool_params 中对非字典解析结果做类型收窄(coerce),即若 params 不是 dict,记录 warning 并置为空字典 {},从而避免崩溃。
注意事项:该修复目前是 Issue 报告者自行在生产环境使用的临时补丁,尚未被官方合并确认;它只保证崩溃不再发生,但被跳过的工具调用不会执行,模型可能得不到参数缺失的反馈。此外,报错是否复现依赖模型行为,端到端路径不稳定,难以按需触发。
问题场景
用户在 Open WebUI v0.11.3 中,通过 OpenAI 兼容网关(LiteLLM)调用 GPT-5.4 级推理模型,模型具备并行工具调用能力,工具来自 MCP tool server。当模型在单轮中 fan out 多个并行工具调用(例如 1 次 search_accounts + 3 次 sales_catalog,且聊天附带 PDF),拼接的 arguments 被 _split_tool_calls 拆分后,某个片段被解析为 JSON 标量(如裸字符串)而非对象,随即触发崩溃,导致整个聊天响应丢失。
报错原文
ERROR | open_webui.main:process_chat:1659 - Error processing chat payload: 'str' object has no attribute 'items'
Traceback (most recent call last):
> File "/app/backend/open_webui/main.py", line 1643, in process_chat
return await process_chat_response(response, ctx)
File "/app/backend/open_webui/utils/middleware.py", line 6400, in process_chat_response
return await streaming_chat_response_handler(response, ctx)
File "/app/backend/open_webui/utils/middleware.py", line 6315, in streaming_chat_response_handler
return await response_handler(response, events)
File "/app/backend/open_webui/utils/middleware.py", line 5719, in response_handler
tool_results[id(tool_call)] = await execute_tool_call(tool_call)
File "/app/backend/open_webui/utils/middleware.py", line 5683, in execute_tool_call
params = {key: value for key, value in params.items() if key in allowed_params}
AttributeError: 'str' object has no attribute 'items'
原因分析
根据 Issue 中的 traceback,问题出在 utils/middleware.py 的工具调用参数解析链路。parse_tool_params 直接接受 JSONCodec.loads(tool_args) 的返回值,但未校验其类型。任何合法的 JSON 标量("foo"、123、[...])都会原样流向 execute_tool_call,随后执行 params.items() 时触发 AttributeError,并沿调用栈向上传播,终止整个响应。该路径与模型产生拼接/不完整 arguments 的行为相关,_split_tool_calls 的 docstring 已承认某些模型(如 GPT-5.4)会发出拼接的参数载荷。
环境排查
- 确认 Open WebUI 版本:Issue 中为 v0.11.3(
ghcr.io/open-webui/open-webui:main)。 - 确认模型来源:是否通过 OpenAI 兼容网关(如 LiteLLM)接入推理模型,且该模型是否倾向发出并行工具调用。
- 确认工具配置:是否使用 MCP tool server(streamable HTTP)及原生 function calling。
- 确认复现条件:是否在单轮中出现多个并行工具调用、且 arguments 可能被
_split_tool_calls拆分。 - Issue 中未提供 Python、CUDA、显卡、PyTorch 等具体版本,这些项目无法从现有证据确认。
解决步骤
- 按 Issue 描述,先定位
utils/middleware.py中的parse_tool_params,确认其未对JSONCodec.loads的结果做isinstance(params, dict)校验。 - 可优先尝试报告者在生产环境验证的补丁:在
parse_tool_params中,当解析结果不是字典时记录 warning 并将其置为{}:if not isinstance(params, dict): log.warning('Tool arguments parsed to %s (not dict); coercing to empty params', type(params).__name__) params = {} - 将该补丁应用到实际运行的镜像或代码路径后,重启 Open WebUI 使改动生效。
- 如需临时诊断更多上下文,可将
process_chat中吞掉 traceback 的log.error临时改为log.exception,以获取完整调用栈(报告者建议永久保留该改动)。
验证方法
在应用补丁后,使用相同的模型、工具配置和触发条件(并行工具调用 + 附件场景)重试。若设置正确,单个参数解析异常的 tool call 应被降级处理(跳过或以空参数执行),聊天其余响应不再整体崩溃,且日志中会出现对应的 warning。也可参考 Issue 中给出的确定性验证方式:在容器内执行 Python 片段,将 JSONCodec.loads('"foo"') 结果直接传入 params.items(),补丁前会复现 AttributeError,补丁后该路径应被类型校验拦截。
参考来源
AI 工具推荐
想把多个 AI 模型放在一个入口?
GamsGo AI 集成 ChatGPT、DeepSeek、Gemini、Claude、Midjourney、Veo 等常用模型,适合写作、绘图、视频和日常 AI 工作流。
推广链接:通过此链接购买,我可能获得佣金,不影响你的价格。
这个方案解决了吗?
可以继续搜索完整报错,或查看同一工具的其他排查指南。
![[Bug][ROCm]: DeepSeek V4 accuracy drops with MRV2 on MI350/MI355 when FULL_DECODE_ONLY graph](https://www.chat-gpts.plus/wp-content/uploads/2026/09/52644-e5cd4f06-768x403.jpg)

