扣子工作流需三重容错:①多分支空值用变量聚合节点取首个非空值;②大模型输出通过Prompt格式约束、代码节点JSON校验、分支重试兜底;③外部API按错误码分级处理,401可刷新token重试,403权限类错误不可重试。
☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 多模态理解力帮你轻松跨越从0到1的创作门槛☜☜☜

扣子工作流运行中突然中断、节点报错、输出为空、分支不执行就失败——这些问题不是配置错了,而是缺少明确的异常拦截路径和可控的重试节奏。没有容错设计的工作流,一次网络抖动或模型输出波动就会导致整条链路崩溃。
识别三类典型异常源头
先确认你遇到的是哪一类问题,再针对性处理:
① 变量引用失败:比如报 The input data is incorrect as fields cannot be extracted from null values,本质是多分支中某路未执行,下游节点却强行读取该分支变量;
② 大模型节点不稳定:同一 prompt 有时返回 JSON,有时返回“好的,我明白了”,有时直接超时;
③ 外部 API 调用失败:如微信 access_token 过期、万物识别服务临时不可达、扣子平台返回 401/403 鉴权错误。
这三类问题必须用不同机制应对,混用方案会放大故障面。
多分支空值问题:用变量聚合节点兜底
方法一:插入变量聚合节点(推荐)
把所有分支输出线全部连接到一个【变量聚合节点】上;
在该节点中设置统一输出变量名,例如 【output_result】;
勾选“取第一个非空值”,这样无论哪条分支实际执行,下游都只认这个变量,不会因读空值而中断。
注意:变量聚合节点不能替代逻辑判断,它只是让数据流“不断链”,业务含义仍需在后续节点中校验。
大模型节点输出不可控:三重保险强制校验
方法一:Prompt 层加格式铁律
在大模型节点的 system prompt 末尾硬性声明:
“你只能输出严格符合以下 JSON 格式的字符串,禁止任何额外说明、换行、Markdown 符号或中文解释:{ \"status\":\"success\",\"data\":{\"title\":\"xxx\",\"tags\":[\"a\",\"b\"]} }”;
方法二:接代码节点做结构校验
在大模型节点后立即添加【代码节点】,粘贴如下脚本:
try { const d = JSON.parse(llm_output); if (d.status !== "success" || !d.data) throw new Error("格式或字段缺失"); return { valid: true, payload: d }; } catch(e) { return { valid: false, error: e.message, raw: llm_output }; }
方法三:用分支节点分发结果
将代码节点的 【valid】 字段作为条件输入到【分支节点】;
valid = true → 走正常业务流;
valid = false → 进入重试分支,最多触发 2 次;
第 2 次仍失败 → 走兜底分支,填默认值继续,不中断流程。
外部 API 调用失败:按错误码分级重试
第一步:区分错误类型
看到 401 + code=10001 → token 过期,可刷新重试;
看到 403 + code=20003 → scope 权限不足,必须人工补权限,【不可重试】;
看到 403 + code=20005 → 签名算法错配,密钥不一致,【不可重试】;
第二步:配置重试策略
在调用节点设置「重试次数」为 2,间隔分别设为 1s、2s;
第三步:重试前插入鉴权刷新节点
对 401 场景,在重试分支开头接入【HTTP 节点】调用 /token/refresh 接口,并用【变量设置节点】原子更新全局凭证变量;
刷新成功后再重试原请求,避免重复刷出无效 token。


















