[Bug] Code node: extractFunctionParams mis-parses destructured JavaScript params (the node’s own default template) and multi-line signatures

在 Dify 代码节点面板中“应用”AI 生成或 AI 修改的代码后,输入变量列表出现异常(例如 JS 解构参数被识别成 {arg1, arg2} ,或 Python/JS 多行签名解析为空),通常与 extractFunctionParams 的正则解析有关。优先排查参数签名写法,并避免通过 AI

快速结论:在 Dify 代码节点面板中“应用”AI 生成或 AI 修改的代码后,输入变量列表出现异常(例如 JS 解构参数被识别成 {arg1, arg2},或 Python/JS 多行签名解析为空),通常与 extractFunctionParams 的正则解析有关。优先排查参数签名写法,并避免通过 AI 生成流程覆盖已配置的输入输出。

适用环境:Dify 1.17.1(web/package.json),在 main @ c64d906 上可复现;Cloud 与 Self Hosted(源码)均涉及。Issue 中复现脚本使用 Node 22。未提及其他操作系统、Python、CUDA 或显卡信息。

最快修复方案:暂无确认的一步修复方案。可优先尝试的规避方式是:不要通过 AI 生成/修改流程应用代码,而是直接在代码编辑器中编辑或粘贴代码,这样只更新 draft.code,不会重建输入变量列表;若输入已被替换,需在输入变量列表中恢复变量名和上游选择器。

注意事项:上述规避方式来自 Issue 讨论中的临时建议,并非已验证的代码修复。JavaScript 代码节点必须保留对象参数形式 function main({...}),因为运行时以 main(inputs_obj) 调用,改成位置参数会导致运行不匹配。另外,即使参数解析正确,应用 AI 代码也会把输入重置为 value_selector: [],原有上游绑定不会自动保留。

问题场景

用户在 Dify 工作流的“代码”节点中使用 AI 生成或 AI 修改代码,并通过弹窗应用结果(CodeEditor → Base → CodeGeneratorButton → GetCodeGeneratorResModal.onFinished → onGenerated(res.modified))。该回调会调用 extractFunctionParams,根据返回的代码重新推导输入变量列表,并同时重建输出定义。当代码使用 JavaScript 解构参数,或使用多行参数签名时,参数解析错误,导致输入变量名异常或为空。

报错原文

FAIL  JS default template (destructured)
      expected: [arg1, arg2]
      actual  : [{arg1, arg2}]
PASS  Python default template
PASS  JS single-line, plain params
FAIL  Python multi-line signature
      expected: [arg1, arg2]
      actual  : []
FAIL  JS multi-line signature
      expected: [arg1, arg2]
      actual  : []

3 failing case(s)

原因分析

根因位于 web/app/components/workflow/nodes/code/code-parser.ts。参数提取使用以下正则:

const patterns: Record<Exclude<CodeLanguage, typeof CodeLanguage.json>, RegExp> = {
  [CodeLanguage.python3]: /def\s+main\s*\((.*?)\)/,
  [CodeLanguage.javascript]: /function\s+main\s*\((.*?)\)/,
}

该正则以非贪婪方式匹配括号内内容,并不能正确处理:

  • JavaScript 解构参数:Dify JavaScript 代码节点的默认模板本身就是 function main({arg1, arg2}),且运行时以单个对象参数调用 main(inputs_obj),解构是必需写法。解析结果却把整个 {arg1, arg2} 当成一个参数名。
  • 多行参数列表:格式化后的 Python 或 JavaScript 签名换行书写时,正则无法跨行提取参数,返回空列表。

此外,Issue 讨论指出,应用 AI 代码时 panel.tsx 会以 value_selector: [] 重建所有输入,并替换输入列表与输出定义,因此即使参数名解析正确,原有上游绑定也不会保留。这是同一流程中的另一个独立问题。

环境排查

  • 确认 Dify 版本是否为 1.17.1,或在 main @ c64d906 附近版本上复现。
  • 确认触发路径是否为“代码节点 → AI 生成/修改代码 → 应用结果”,而非直接在编辑器中修改。
  • 检查代码签名是否为 JavaScript 解构参数(function main({...}))或多行参数列表。
  • 确认输入变量列表是否已被重建为 value_selector: [],上游节点绑定是否丢失。
  • Issue 未提供 Python、CUDA、PyTorch、显卡或依赖版本信息,无需据此排查。

解决步骤

  1. 先停止通过 AI 生成/修改弹窗应用代码,改为直接在代码编辑器内编辑或粘贴代码。普通编辑走 handleCodeChange,只更新 draft.code,不会重建输入和输出配置。
  2. 保持 JavaScript 代码节点的对象参数签名,例如 function main({arg1, arg2}),不要为了绕过解析器改成位置参数,否则与运行时 main(inputs_obj) 不匹配。
  3. 若输入列表已被替换,在输入变量列表中手动恢复变量名,并重新选择对应的上游变量(value_selector)。
  4. 如条件允许,等待官方修复 code-parser.ts 中的参数解析逻辑(支持解构与多行签名),并关注 Issue 关闭状态与后续提交。

验证方法

在代码节点中直接编辑代码后,确认输入变量列表未被自动清空或改写,原有上游绑定保持不变;运行工作流,确认 main 能收到预期的输入对象并正常返回结果。若使用 AI 生成流程,应用后需检查输入变量名是否正确、value_selector 是否仍有上游绑定。

参考来源

langgenius/dify #44045

GamsGo AI

AI 工具推荐

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

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

了解 GamsGo AI

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

这个方案解决了吗?

celebrityanime
celebrityanime
文章: 29431

发表回复

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