在Dify工作流中配置代码执行节点时,很多人习惯直接编写Python脚本,结果流程运行到一半就卡住了。其实核心要点只有一个:你的代码必须适应沙箱环境,并且最终返回的必须是一个标准的Python字典。听起来简单,但实际踩坑的人可不少。

先明确一个前提:Dify的代码节点并非让你随意编写Python脚本。它运行在沙箱中,拥有诸多限制。但这并非坏事,恰恰保证了流程的稳定性与安全性。关键在于把规则理解透彻。
先弄清楚上游究竟传递了什么数据
打开工作流编辑器,点击你要配置的那个Code节点。右侧的「Inputs」面板会清晰显示上游传入的变量名和类型。例如,user_input是一个字符串,files是一个文件列表,每个文件又包含url和name字段。
这里有个常见的翻车场景:如果上游连接的是「知识库检索」节点,它传递过来的实际上是一个documents数组,其中每个元素都包含content和metadata。你不经过检查就直接写input['text']?等着KeyError吧。所以第一步,老老实实查看Inputs面板,确认数据类型。
沙箱中写代码,这些红线不能碰
把Python代码粘贴进编辑器之前,先记住几个硬性条件:只支持Python 3.11,os.system、subprocess、open读写本地文件等操作统统不允许。第三方库也只开放了numpy、pandas、requests这几个,其他的一律报错。
回到正题,怎么写才安全?这里有最常用的两种场景。
场景一:直接处理文本,返回加工后的结果。
直接上手:result = {"summary": input['user_input'][:50] + "...", "length": len(input['user_input'])}。注意,最后一行的变量名必须叫result,不要写print或return,沙箱不认这些。
场景二:上游传入一段JSON字符串,你需要解析它。
比如{"score": 87, "tags": ["A", "B"]}。那就先import json,再data = json.loads(input['user_input']),最后拼出result = {"level": "high" if data["score"] > 80 else "low"}。这里必须强调一句:一定要用try-except把json.loads包裹起来,否则上游提供的JSON稍微不规范,整个节点就会直接崩溃,后续流程什么都拿不到。
调试这一步,帮你省掉八成的返工
代码写完后不要急着连接下游,先自己测试一遍。
第一步:点击右上角的「Test」按钮,手动填入一组测试数据,比如{"user_input": "hello world"}。然后查看右侧的「Output」面板,确认它返回的是一个合法的JSON对象。
第二步:仔细检查返回值,必须是纯字典——不能是None,不能是嵌套的类实例,不能包含函数对象。因为下游无论是「LLM」节点还是「条件分支」节点,只认dict类型,其他类型统统不兼容。
第三步:如果你打算向下游传递多个字段,那就全部塞进result字典里。例如result = {"answer": "yes", "confidence": 0.92, "source": "rule_based"}。少写一个key,下游节点就无法获取对应值,到时候排查起来可够你费一番功夫的。
