扣子平台工作流需严格遵循输入契约、安全重试、显式变量传递、子工作流封装及错误降级五项规范。首步定义必需变量并约束类型;次步用loop+condition实现三次限时时重试;三步所有变量必须{{}}显式引用;四步高频逻辑封装为子工作流统一调用;五步每个llm/image节点后接condition做空值或失败降级,确保生产稳定性。
☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 多模态理解力帮你轻松跨越从0到1的创作门槛☜☜☜

你需要在扣子平台搭建一个稳定、可维护、能应对真实业务压力的工作流,而不是堆砌节点后勉强跑通的半成品。真实项目里常遇到分支混乱、重试失控、变量传错、超时崩溃等问题,这些问题不会在测试环境暴露,只会在用户量上涨时集中爆发。
明确工作流边界与输入契约
第一步:在开始节点上定义且仅定义【必需变量】,如 user_id、query_text、timestamp,其余字段一律不声明。多声明一个变量,后续每个节点都要处理它的空值或默认值,徒增逻辑分支。
第二步:为每个输入变量写明类型和约束,例如 query_text 类型为 string,长度限制 500 字符,超出则截断并记录 warning 日志——这一步不做,LLM 节点可能因超长输入直接报错中断,且错误信息不提示具体哪一字段越界。
第三步:把所有非结构化输入(比如用户粘贴的一段网页 HTML、截图 OCR 文本)统一走 Code 节点做预清洗,剥离无关标签、合并换行、过滤控制字符。别指望 LLM 节点自己“理解”脏数据,它只会把噪声当语义一起消化。
用 Condition + Loop 组合实现安全重试
方法一:HTTP 节点调外部 API 失败时,必须搭配 Loop 节点做重试,且 Loop 的最大次数设为 3,超时时间设为 8 秒。扣子默认重试无上限,一次网络抖动就可能触发无限循环,token 和计费双双失控。
方法二:Condition 节点判断 HTTP 返回状态码是否为 2xx,不是则走失败分支;失败分支里必须包含一个 Code 节点,记录 error_code、retry_count、原始响应体到日志变量,再把该变量传给 Loop 节点作为继续条件。漏掉日志记录,故障排查时你将面对一片空白的运行记录。
这一步操作起来很简单,直接把 Loop 节点拖到 Condition 的“否”出口就行,但关键在于 Loop 的“继续条件”表达式要写成 {{log.retry_count
变量传递必须显式声明,禁止隐式引用
每个节点的输入框里,所有变量都必须写成 {{xxx}} 格式,哪怕只有一个变量。扣子允许省略双大括号直接写变量名,但一旦某节点输出字段改名,所有未加 {{}} 的下游节点会静默失效,不报错、不警告、输出为空字符串。
特别注意:LLM 节点的 prompt 字段里如果要插入变量,必须用 {{input}} 这种格式,不能写成 $input 或 {input}。其他写法会被当作纯文本传给模型,导致模型看到“$user_name”而不是张三的名字。
Code 节点返回 JSON 时,确保 key 名与下游节点期望的完全一致,大小写、下划线、空格都不能差。比如上游返回 {"product_name": "iPhone"},下游却用 {{productname}} 引用,结果就是空值穿透整条链路。
子工作流封装高频复用逻辑
第一步:识别重复模式——当你在三个以上工作流里都写了“提取手机号+校验格式+脱敏前四位”的 Code 节点,这就是封装信号。
第二步:新建一个独立工作流,只保留开始→Code→结束三个节点,Code 里写好完整逻辑,输出固定为 { "phone_masked": "138****1234", "is_valid": true }。
第三步:原工作流中删掉那堆 Code 节点,在对应位置插入 Plugin 节点,选择“调用工作流”,填入刚建好的子工作流 ID,并映射输入变量 {{raw_text}} → {{input}}。
第四步:所有调用该子工作流的地方,统一更新输出引用为 {{sub_workflow.phone_masked}}。以后只需改子工作流一次,全部生效。
注意:子工作流的开始节点变量名必须与调用方映射关系严格匹配,比如子工作流期待 input,你就不能传 text_content,否则整个子流程拿不到输入,静默返回空对象。
生产环境必须开启错误捕获与降级路径
在每个 LLM 节点后立即接一个 Condition 节点,判断 {{llm_node.output_text}} 是否为空字符串或包含关键词“抱歉”“无法回答”“内容受限”。是则走降级分支,返回预设的兜底话术,比如“当前问题较复杂,已转人工处理,请稍候”。
在每个 Image 节点后加一个 Condition,判断 {{image_node.image_url}} 是否以 https:// 开头,不是则说明生图失败,跳转至备用方案:返回一张通用占位图 URL,并附带文字说明“AI 正在优化画面,请稍后再试”。
所有降级分支最终必须汇聚到同一个结束节点,且该节点输出字段命名与主路径一致,例如都叫 final_response。否则前端解析时会因字段缺失而报错。











