|工作流容错 | 条件分支 | 降级回复 | 提升体验
你有没有遇到过这种情况:
天气机器人一直都好好的,突然有一天用户问“北京天气”,机器人直接弹出一行红色错误:“调用插件失败,请稍后再试”。用户一脸懵,以为机器人坏了。
或者你精心搭建的旅游规划工作流,墨迹天气插件偶尔返回空数据,导致整个工作流中断,用户收到一堆看不懂的技术报错。
为什么?
因为你的工作流没有做错误处理。插件调用失败时,工作流直接把底层的报错信息抛给了用户。
今天这篇文章,我就教你用选择器节点(Condition Node) 给工作流加上“容错机制”——当插件调用失败时,机器人能优雅地告诉用户“抱歉,暂时查不到天气”,而不是甩出一堆乱码。
📌 本文解决什么问题?
— ✅ 插件偶尔调用失败,工作流直接报错中断
— ✅ 用户看到红色错误提示,体验极差
— ✅ 想让机器人在失败时用“友好话术”替代技术报错
— ✅ 想实现“重试机制”或“降级方案”
看完这篇文章,你会掌握:
— 如何判断插件调用是否成功
— 如何用选择器节点分流(成功走正常流程,失败走备用流程)
— 如何设置降级回复(“暂时查不到,请稍后再试”)
— 进阶技巧:实现自动重试或切换备用插件
一、问题重现:一个没有错误处理的工作流
假设我们有一个简单的天气查询工作流:
```
开始节点 → 天气插件节点 → 结束节点
```
天气插件返回的数据大概是这样的(成功时):
```json
{
"code": 200,
"data": {
"city": "北京",
"temperature": 25,
"condition": "晴"
}
}
```
如果插件调用失败(网络问题、API配额用完、参数错误等),可能返回:
```json
{
"code": 500,
"message": "Internal Server Error",
"data": null
}
```
或者干脆不返回有效数据。这时候工作流直接把错误信息传给结束节点,用户看到的就是:
“调用插件失败,错误信息:500 Internal Server Error”
这样的回复不仅不友好,还可能泄露技术细节。
二、解决方案:用选择器节点做“成功/失败”分流
Coze工作流中的选择器节点(Condition Node) 可以根据条件选择不同的执行路径。我们可以这样设计:
```
开始节点 → 天气插件节点
↓
选择器节点(判断是否成功)
↙ ↘
成功分支 失败分支
↓ ↓
正常输出 友好提示
```
2.1 判断条件如何写?
关键是如何判断“插件调用成功”。不同插件的返回格式不同,但通常有以下几种方式:
— 有`code`字段:如`code == 200`表示成功。
— 有`data`字段且不为空:`data != null`。
— 没有错误字段:直接判断返回结果是否包含预期字段(如`temperature`)。
本例中,我们假设插件返回包含`code`字段,`code == 200`表示成功。
三、分步实操:为天气工作流添加容错
3.1 拖入选择器节点
1. 在工作流编辑器中,从左侧拖拽一个 “选择器” 节点到画布上。
2. 放在插件节点之后、结束节点之前。
3. 连接插件节点 → 选择器节点。
3.2 配置“如果”分支(成功路径)
在条件配置中:
— 左值:选择插件节点的输出中的 `code` 字段(例如 `{{plugin.output.code}}`)。
— 判断符:选择 `==`(等于)。
— 右值:输入 `200`。
这样,当`code == 200`时,工作流走“如果”分支。
在“如果”分支下,你不需要添加任何新节点,直接连接一个结束节点(或继续后续处理节点),把插件返回的正常数据输出给用户。
3.3 配置“否则”分支(失败路径)
当`code != 200`时,工作流走“否则”分支。
你可以在这个分支下添加一个消息节点或大模型节点,输出友好的提示信息。
例如,拖拽一个大模型节点,提示词设置为:
```
用户问天气,但查询失败。请回复:“抱歉,当前天气服务暂时不可用,请稍后再试。”
```
然后把这个大模型节点的输出连接到结束节点。
3.4 完整节点连接图
```
开始节点 → 天气插件 → 选择器节点
├─(如果 code==200)→ 结束节点(输出天气数据)
└─(否则)→ 大模型节点(输出友好提示)→ 结束节点
```
四、进阶技巧:让失败分支更智能
4.1 显示具体错误原因(但不暴露技术细节)
你可以在失败分支的大模型提示词中,引用插件返回的错误信息,但让大模型“翻译”成用户能懂的话。
例如:
```
用户问天气,但查询失败。插件返回的错误码是 {{plugin.output.code}},错误信息是 {{plugin.output.message}}。
请用一句友好的话告诉用户“暂时查不到天气”,不要暴露技术细节。
```
这样用户看到的是“暂时查不到天气,请稍后再试”,而不是“500 Internal Server Error”。
4.2 实现自动重试
如果你想让工作流在失败时自动重试一次(比如网络抖动导致的临时失败),可以这样设计:
```
插件节点 → 选择器节点
├─ 成功 → 结束
└─ 失败 → 再调用一次插件节点(同样的参数)→ 再次判断
```
需要用到两个插件节点和一个选择器节点的嵌套。受篇幅限制,这里不展开,感兴趣的同学可以私信交流。
4.3 降级到备用方案
如果主插件失败,可以切换到备用插件。例如:墨迹天气插件失败,改用和风天气插件。
设计思路:失败分支下直接调用另一个天气插件,然后正常输出。
五、更多适用场景
选择器节点的容错机制,不仅能用于插件调用,还能用于:
| 场景 | 判断条件 | 失败分支处理 |
| 知识库查询无结果 | {{kb.output}} == null 或 length == 0 | 回复“未找到相关信息,请联系人工客服” |
| 大模型输出格式不符合预期 | 检查输出是否包含必要字段 | 重新调用大模型,或使用默认模板 |
| 外部API返回空数据 | {{api.data}} == [] | 回复“暂无数据”,或切换到其他数据源 |
| 用户输入缺少必要参数 | 用代码节点先验证,再分支 | 引导用户补充信息 |
核心思想:永远不要让工作流“裸奔”,任何可能失败的环节都要有备用计划。
六、避坑清单
| 问题 | 原因 | 解决方法 |
| 选择器节点判断总走失败分支 | 引用的字段名错误或不存在 | 先试运行插件节点,查看输出结构,确认字段名 |
| 判断条件写反了 | 把==写成!= | 仔细检查逻辑 |
| 两个分支都执行了 | 节点连线错误 | 确保“如果”和“否则”分别指向不同节点 |
| 失败分支没有结束节点 | 分支没有连接到结束节点 | 每个分支最终都必须连到结束节点 |
| 使用null判断时报错 | 插件返回的字段不是null而是undefined | 用{{变量}} == null或{{变量}} == ""双重判断 |
七、写在最后
今天这篇文章,我们只用一个选择器节点,就实现了工作流的“优雅降级”。看起来简单,但却是区分“玩具项目”和“生产级项目”的重要标志。
一个专业的智能体,不是永远不会出错,而是出错的时候,用户看不出来。
你的工作流里还有哪些“裸奔”的环节?欢迎评论区分享,我会继续写文章帮你排查。
下一篇预告:很多人问“怎么让机器人记住用户的偏好?比如记住‘我喜欢喝冰咖啡’。”——下一篇,我们讲数据库节点实战:实现用户个性化记忆。
如果觉得本文有帮助,点赞、收藏、关注,更新会第一时间推送。
柒柒




