在实际运行过程中,扣子工作流的某个节点可能由于网络波动、模型输出异常或空值引用而意外中断——下游节点会报错“The input data is incorrect as fields cannot be extracted from null values”。这并非流程设计存在缺陷,而是缺乏一条强制的备用输出通道。你不能指望所有外部服务永远稳定,也不能要求大模型每次输出都符合预期,因此必须提前设计好 fallback 的出口机制。

使用固定返回节点实现最简兜底方案
这是落地最快、无需编码、适用于90%单点故障的兜底方法。具体操作分为四个步骤:在出现问题的节点(例如 LLM 节点或 HTTP 节点)右侧,点击「错误分支」出口;拖入一个【固定返回节点】,双击进行编辑;在“返回内容”框中填写预设的返回内容,例如:{"status":"fallback","message":"当前服务暂不可用,请稍后重试"};最后,将该节点的输出线连接到下游必需的变量接收位置(比如下一个代码节点的输入口)。
操作本身非常直接,只需把文件拖入即可。但有一个必须警惕的细节:【固定返回节点的输出结构必须与原节点保持一致,否则下游的 JSON 解析仍然会失败】。例如,原 LLM 节点输出为 {"title": "xxx", "content": "yyy"},那么你的兜底内容也必须返回包含 title 和 content 字段的 JSON,即使是填充空字符串也行。
利用变量聚合节点收敛多路结果
当存在多个并行分支时——比如 A/B/C 三个插件同时查询天气——任意一路失败都不能切断整条链路,这时需要使用变量聚合节点来收敛结果。
方法一:插入变量聚合节点
将 A/B/C 三个插件节点的「成功分支」全部连接到同一个【变量聚合节点】;在该节点中设置统一的输出变量名称,例如【weather_data】;勾选“取第一个非空值”,这样只要有一路返回了有效数据,下游就能正常获取。
方法二:补充兜底路径
将每个插件节点的「错误分支」也都连接到同一个变量聚合节点;在变量聚合节点中为每条错误分支手动填入默认值,例如:{"temp": "25", "condition": "sunny"}。
【注意:错误分支必须显式连接进来,否则聚合节点只识别成功分支,空值依然会导致中断】
用代码节点动态生成 fallback 内容
如果兜底内容需要根据原始错误信息进行定制,比如返回具体的报错码、保留部分原始输入,那么固定返回节点就不再适用。此时可以在目标节点(如 HTTP 节点)的错误分支后面接入一个【代码节点】,粘贴以下 Python 脚本(适配扣子的 JS/Python 双引擎):
def main(input):
error_msg = input.get("error", "unknown")
original_input = input.get("original_input", {})
return {
"status": "fallback",
"error_code": "HTTP_503",
"fallback_data": { "prompt": original_input.get("prompt", ""), "hint": f"上游服务不可用: {error_msg[:50]}" }
}
请确保该代码节点的输出结构与上游节点完全保持一致——字段名、嵌套层级、数据类型都必须对齐。然后将代码节点的输出连接到下游,覆盖原中断路径。这一步的关键在于字段对齐:如果上游 LLM 返回的是 {"result": {"text": "xxx"}},那么兜底也必须返回同样结构的对象,不能简化为 {"text": "xxx"},否则下游解析依然会失败。
