快速结论:在 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、显卡或依赖版本信息,无需据此排查。
解决步骤
- 先停止通过 AI 生成/修改弹窗应用代码,改为直接在代码编辑器内编辑或粘贴代码。普通编辑走
handleCodeChange,只更新draft.code,不会重建输入和输出配置。 - 保持 JavaScript 代码节点的对象参数签名,例如
function main({arg1, arg2}),不要为了绕过解析器改成位置参数,否则与运行时main(inputs_obj)不匹配。 - 若输入列表已被替换,在输入变量列表中手动恢复变量名,并重新选择对应的上游变量(
value_selector)。 - 如条件允许,等待官方修复
code-parser.ts中的参数解析逻辑(支持解构与多行签名),并关注 Issue 关闭状态与后续提交。
验证方法
在代码节点中直接编辑代码后,确认输入变量列表未被自动清空或改写,原有上游绑定保持不变;运行工作流,确认 main 能收到预期的输入对象并正常返回结果。若使用 AI 生成流程,应用后需检查输入变量名是否正确、value_selector 是否仍有上游绑定。
参考来源
AI 工具推荐
想把多个 AI 模型放在一个入口?
GamsGo AI 集成 ChatGPT、DeepSeek、Gemini、Claude、Midjourney、Veo 等常用模型,适合写作、绘图、视频和日常 AI 工作流。
推广链接:通过此链接购买,我可能获得佣金,不影响你的价格。
这个方案解决了吗?
可以继续搜索完整报错,或查看同一工具的其他排查指南。


