TypeError: object of type ‘NoneType’ has no len() — canvas writes unset strategy params as {variable

在 Dify 画布中保存 Agent 节点后,未被填写的可选策略参数会被写成 {type: variable, value: null} ,运行时 build_parameters 把 null 当作变量选择器传给 variable_pool.get ,于是抛出 TypeError: object

快速结论:在 Dify 画布中保存 Agent 节点后,未被填写的可选策略参数会被写成 {type: variable, value: null},运行时 build_parameters 把 null 当作变量选择器传给 variable_pool.get,于是抛出 TypeError: object of type ‘NoneType’ has no len() — canvas writes unset strategy params as {variable。优先排查已发布工作流里 Agent 节点是否残留这类空值参数。

适用环境:Dify 1.18.0,自托管 Docker 部署;故障复现涉及 langgenius/agent(function_calling)插件;Issue 中本地验证使用插件 langgenius/agent:0.0.51、经 volcengine 插件调用的模型 doubao-seed-2-1-lite-260915。Python、CUDA、显卡等版本未在 Issue 中给出。

最快修复方案:暂无确认的一步修复方案(对应后端 PR #45904 尚未合并)。短期可优先尝试:删除并重建 Agent 节点,或重新保存该节点,使画布不再写入 {type: variable, value: null};Issue 报告者验证过的代码级修复是在 VariableResolver 的 case "variable" 分支中增加 if agent_input.value is None: result[parameter_name] = None; continue 空值守卫。

注意事项:#44748 只阻断画布新写入空值,不修复已保存的旧图;#45904、#44655 在 2026-11-09 时仍未合并,升级前不要假定已修复。#44655 同时覆盖 AgentNode._extract_variable_selector_to_variable_mapping() 这条单节点执行路径,而空值守卫只改 build_parameters 一处,不能覆盖全部入口。在 graphon 的 variable_pool.get 里加 len() 兜底可暂时避免崩溃,但会掩盖真正的选择器配置错误,不建议作为正式修复。

问题场景

用户在 Dify 1.18.0 控制台中直接新建 workflow/chatflow 应用(不经过 DSL 导入),添加 Agent 节点并配置模型,然后保持 files / allowed_tools 等可选参数不填,保存并发布。之后任何聊天请求走到该 Agent 节点都会稳定失败。

Issue 报告者另做了一次反向复现:通过 DSL 导入的 Agent 节点(不含 files / allowed_tools 条目)先发布了一个干净版本,只有在画布中编辑该节点之后问题才出现,说明是画布保存路径写入了这些条目。

报错原文

Node 1800000000009 failed to run
Traceback (most recent call last):
  File ".../graphon/nodes/base/node.py", line 664, in run
    yield from self._run_events()
  File ".../api/core/workflow/nodes/agent/agent_node.py", line 123, in _run
    parameters = self._runtime_support.build_parameters(...)
  File ".../api/core/workflow/nodes/agent/runtime_support.py", line 58, in build_parameters
    variable = variable_pool.get(agent_input.value)
  File ".../graphon/runtime/variable_pool.py", line 211, in get
    if len(selector) < SELECTORS_LENGTH:
TypeError: object of type 'NoneType' has no len()

同时 workflow_node_executions.status = failed,error = "object of type 'NoneType' has no len()",节点无任何输出;在 chatflow 应用中,用户只能看到该轮对话失败。

原因分析

保存后的工作流图里,未设置的可选策略参数被画布写成了空值变量引用:

"files":         {"type": "variable", "value": null}
"allowed_tools": {"type": "variable", "value": null}

运行时 AgentRuntimeSupport.build_parameters 遇到 type == "variable" 的输入,直接把 agent_input.value(此时为 None)作为选择器传给 variable_pool.get;后者对选择器执行 len(),于是抛出上述 TypeError。

按 Issue 的预期,#44748 已在画布序列化一侧过滤 null / 空字符串 / 空数组选择器,但它不修复已保存的图。#45904 增加空值守卫,但当时处于未合并状态。此外 AgentNode._extract_variable_selector_to_variable_mapping() 也会在不检查 null 的情况下产出变量选择器,属于另一条需要覆盖的执行路径。

插件侧本身对 None 有处理(fc_params.files or [],filter_allowed_tools(None) 表示不限制),因此把空值以 None 传给策略即可正常工作。

环境排查

  • Dify 版本是否为 1.18.0,以及是通过 Docker 自托管还是云版本。
  • Agent 节点使用的插件版本(Issue 验证环境为 langgenius/agent:0.0.51)。
  • 工作流导出或查看节点数据,确认 Agent 节点是否包含 "value": null 的 files / allowed_tools 条目。
  • 该节点是原生创建还是 DSL 导入,之后是否在画布中编辑并重新保存、发布。
  • 模型接入所用插件与模型(Issue 为 volcengine 插件 + doubao-seed-2-1-lite-260915),用于区分问题是否与模型侧有关。

解决步骤

  1. 确认当前 Dify 版本为 1.18.0,并导出或在节点数据中检查 Agent 节点是否已被写入 {"type": "variable", "value": null}。
  2. 若已确认存在该空值条目:删除该 Agent 节点后重新添加并配置,或按 Issue 验证过的做法重新保存节点,然后发布;可优先尝试,但 Issue 未对每条重建路径逐一验证。
  3. 若使用已包含 #44748 中画布过滤逻辑的版本,画布新保存时不再写入这类条目,但需重新保存节点以覆盖旧图。
  4. 如需代码级修复,在 build_parameters 对应实现的 case "variable" 分支中加入空值守卫:agent_input.value is None 时把 result[parameter_name] = None 并 continue,不再调用 variable_pool.get。可优先尝试,注意这属于报告者本地验证,非官方合并修复。
  5. 关注 #44655,确认 _extract_variable_selector_to_variable_mapping() 这一单节点执行路径也被覆盖。
  6. 不建议仅在 graphon 的 variable_pool.get 中加 len() 兜底后就结束处理——它只掩盖症状。

验证方法

修复或重建后重新发布应用,发起一次会经过 Agent 节点的聊天请求,确认 intent routing → agent strategy → MCP 工具调用 → 回答整条链路正常完成,节点有输出、workflow_node_executions.status 不再为 failed,且 error 中不再出现 object of type 'NoneType' has no len()。同时再次导出或查看节点数据,确认不再存在 "value": null 的 files / allowed_tools 条目。

参考来源

langgenius/dify #45900

GamsGo AI

AI 工具推荐

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

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

了解 GamsGo AI

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

这个方案解决了吗?

celebrityanime
celebrityanime
文章: 33814

发表回复

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