AttributeError: ‘str’ object has no attribute ‘items’

这个报错通常出现在 Open WebUI 处理模型返回的工具调用(tool call)时——当某个工具调用的 arguments 被 parse_tool_params 解析成非字典的 JSON 标量(如 "foo" 、 123 ),后续 execute_tool_call 仍对其调用 params

快速结论:这个报错通常出现在 Open WebUI 处理模型返回的工具调用(tool call)时——当某个工具调用的 argumentsparse_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 等具体版本,这些项目无法从现有证据确认。

解决步骤

  1. 按 Issue 描述,先定位 utils/middleware.py 中的 parse_tool_params,确认其未对 JSONCodec.loads 的结果做 isinstance(params, dict) 校验。
  2. 可优先尝试报告者在生产环境验证的补丁:在 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 = {}
  3. 将该补丁应用到实际运行的镜像或代码路径后,重启 Open WebUI 使改动生效。
  4. 如需临时诊断更多上下文,可将 process_chat 中吞掉 traceback 的 log.error 临时改为 log.exception,以获取完整调用栈(报告者建议永久保留该改动)。

验证方法

在应用补丁后,使用相同的模型、工具配置和触发条件(并行工具调用 + 附件场景)重试。若设置正确,单个参数解析异常的 tool call 应被降级处理(跳过或以空参数执行),聊天其余响应不再整体崩溃,且日志中会出现对应的 warning。也可参考 Issue 中给出的确定性验证方式:在容器内执行 Python 片段,将 JSONCodec.loads('"foo"') 结果直接传入 params.items(),补丁前会复现 AttributeError,补丁后该路径应被类型校验拦截。

参考来源

open-webui/open-webui #29323

GamsGo AI

AI 工具推荐

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

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

了解 GamsGo AI

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

这个方案解决了吗?

celebrityanime
celebrityanime
文章: 23167

发表回复

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