快速结论:在 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),用于区分问题是否与模型侧有关。
解决步骤
- 确认当前 Dify 版本为 1.18.0,并导出或在节点数据中检查 Agent 节点是否已被写入
{"type": "variable", "value": null}。 - 若已确认存在该空值条目:删除该 Agent 节点后重新添加并配置,或按 Issue 验证过的做法重新保存节点,然后发布;可优先尝试,但 Issue 未对每条重建路径逐一验证。
- 若使用已包含 #44748 中画布过滤逻辑的版本,画布新保存时不再写入这类条目,但需重新保存节点以覆盖旧图。
- 如需代码级修复,在
build_parameters对应实现的case "variable"分支中加入空值守卫:agent_input.value is None时把result[parameter_name] = None并continue,不再调用variable_pool.get。可优先尝试,注意这属于报告者本地验证,非官方合并修复。 - 关注 #44655,确认
_extract_variable_selector_to_variable_mapping()这一单节点执行路径也被覆盖。 - 不建议仅在 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 条目。
参考来源
AI 工具推荐
想把多个 AI 模型放在一个入口?
GamsGo AI 集成 ChatGPT、DeepSeek、Gemini、Claude、Midjourney、Veo 等常用模型,适合写作、绘图、视频和日常 AI 工作流。
推广链接:通过此链接购买,我可能获得佣金,不影响你的价格。
这个方案解决了吗?
可以继续搜索完整报错,或查看同一工具的其他排查指南。


