news 2026/10/22 9:50:14

rp-engine条件边与表达式语言:内置6大函数实现分支、循环与错误路由

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
rp-engine条件边与表达式语言:内置6大函数实现分支、循环与错误路由

【免费下载链接】rp-engine

YAML-native agent workflow execution engine, written in Rust

项目地址:https://gitcode.com/gh_mirrors/rp/rp-engine
点击查看免费下载

rp-engine 是一款用 Rust 编写的 YAML 原生 agent 工作流执行引擎:你用 YAML 描述节点和边,引擎负责解析依赖并执行整个图。本文带你读懂它最有代表性的控制流能力——条件边(conditional edges)与表达式语言(expression language):仅靠边上的condition字段加 6 大内置函数,就能实现工作流分支、循环与错误路由,无需写一行代码。

条件边是什么:一条边上的 4 种"开关"

在 rp-engine 中,edges定义执行图。一条边本质上是一个路由器,引擎在源节点完成时评估它(核心逻辑见 src/engine/executor.rs):

边类型写法何时走这条边
无条件边只写from/to总是执行
条件边加condition: "表达式"表达式求值为 true 时执行
默认边加is_default: true无条件执行,作为兜底路径
错误边加on_error: true仅在源节点失败(_error: true)时激活

这些字段的完整定义在 src/schema/edge.rs 的YamlEdge结构中。一个关键细节:条件表达式求值出错时会被当作 false 处理(引擎记录 warning 而不是崩溃),这保证了容错性;而如果同一个源节点存在on_error边且节点失败了,普通边会被自动抑制——这正是"降级回退"模式的基础。

表达式语言速览:操作数、运算符与路径

条件写在condition字符串里,由独立的表达式引擎(分词 → 解析 → 求值,源码在 src/expression/)执行。

运算符:

  • 比较:==、!=、>、<、>=、<=
  • 逻辑:&&、||、!
  • 分组:(a == 1 || b == 2) && c == 3

路径(Path)是表达式读取工作流状态的方式:

node_id.field # 节点最近一次执行的输出 node_id[0].field # 第一次执行的输出 node_id[*].field # 全部执行(数组) input.field # 工作流入参

字面量:"math"、3.14、true、false、null。

内置 6 大函数:分支判断的主力

官方规范中的完整语法见 docs/FLOW_SPEC.md("Condition Expression Language" 一节)。函数实现位于 src/expression/evaluator.rs。

函数参数行为典型用法
empty(x)1为null、""、[]、{}时返回 trueempty(node.rows)
exists(x)1值不为 null 时返回 trueexists(node.user_id)
len(x)1返回长度(唯一可作为数字参与比较的函数)len(node.items) > 3
contains(h, n)2字符串查子串;数组查元素contains(node.text, "error")
not_contains(h, n)2contains的反义not_contains(node.status, "draft")
matches(s, r)2正则匹配(基于 regex_lite)matches(node.email, "^[^@]+@.+$")

几个实用小贴士:

  • len()特殊:它返回真实长度数值,所以len(node.messages) >= 5这种数值比较完全合法;其余函数在布尔上下文中使用
  • contains类型不匹配时返回 false 而非报错,方便在||链中组合
  • 裸路径本身是"真值判断":非空字符串、非零数字、非空数组/对象均为 true

场景一:用条件边实现工作流分支

官方测试用例 tests/fixtures/conditional.yaml 演示了最经典的"分类器分流":先让 LLM 判断问题类型,再走不同处理路径。

edges: - from: start to: classifier - from: classifier to: math_solver condition: "classifier.category == 'math'" - from: classifier to: general_answer condition: "classifier.category != 'math'"

两个分支最后汇聚回response节点。注意分支未执行的节点会被引擎标记为"死路径"(dead path)——如果response用default兜底引用另一分支的输出,就不会卡住:

- id: response config: output: result: from: math_solver.answer default: ""

死路径检测机制的详细规则见 docs/FLOW_SPEC.md 的 "Dead Path Detection" 章节,这是 rp-engine 无需"跳过节点"技巧就能干净收敛分支的关键设计。

场景二:用 max_iterations 实现受保护的循环

想让一个节点"思考→再思考"多轮迭代?把边连回自身,加上max_iterations即可。官方循环用例 tests/fixtures/loop.yaml:

edges: - from: start to: think - from: think to: think condition: "think.needs_more == true" max_iterations: 3 # 最多循环 3 轮,防止死循环 - from: think to: response is_default: true # 兜底:其余情况直接出结果

每一轮循环中,think节点通过think[*].thought读取所有历史轮次的输出作为上下文——路径表达式里的[*]选择器让"循环携带记忆"变得非常简单。max_iterations达到上限后该边自动失效,引擎会记录 debug 日志并跳过,工作流不会失控。

场景三:on_error 错误路由与降级回退

当某个节点(比如调用外部 API)不可靠时,组合error_handling与on_error边即可实现优雅降级:

nodes: - id: primary type: generate config: provider: openai model: gpt-4o template: my_prompt error_handling: retry: 2 timeout_ms: 15000 on_exhausted: continue # 重试耗尽不炸流程,输出 _error: true edges: - from: primary to: success_path # 成功时走这里 - from: primary to: fallback # 失败时自动改道 on_error: true

规则很直白:on_error: true的边只在源节点输出_error: true时激活,同时抑制同一源节点的普通边。这样降级节点(fallback)可以引用primary._error_message拿到失败原因,用备用模型或缓存策略继续服务,工作流无需终止。

另外,supervisor(多智能体规划节点)还有一类专属的exit 边:通过exit_reason(如todo_empty、timeout、max_iterations、default)按退出原因路由到不同收尾节点,适合"任务完成/超时/超限"走不同下游的复杂编排。

上手建议与延伸阅读

  • 分支尽量成对写condition并保留一条is_default兜底边,避免"条件全 false 导致流程卡死"(引擎会以Partial状态报告卡住的节点)
  • 判断"有没有数据"优先用empty()/exists()而不是== null,语义更清晰且覆盖空串/空数组
  • 表达式写错不会让引擎崩溃(按 false 处理),但请留意 warning 日志,排查条件为何未生效

想深入细节,推荐按顺序阅读:

  • 完整 YAML 规范:docs/FLOW_SPEC.md
  • 表达式语言三段式实现(lexer / parser / evaluator):src/expression/
  • 条件边数据结构:src/schema/edge.rs
  • 边评估执行逻辑:src/engine/executor.rs
  • 可直接运行的分支与循环样例:tests/fixtures/conditional.yaml、tests/fixtures/loop.yaml

掌握条件边 + 表达式语言这 6 大函数,你就拥有了 rp-engine 控制流的全部拼图:if交给condition,for交给max_iterations自环,catch交给on_error,剩下的交给引擎的依赖调度去并行执行。

【免费下载链接】rp-engine

YAML-native agent workflow execution engine, written in Rust

项目地址:https://gitcode.com/gh_mirrors/rp/rp-engine
点击查看免费下载

相关推荐

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/22 9:48:52

PS5折腾指南:手柄跨平台、局域网串流与素材归档全攻略

AnyPS5是我给自己一套折腾方案起的代号。说白了&#xff0c;就是让客厅里那台PS5不再被困在电视柜里&#xff1a;手柄能连PC、手机甚至别的掌机&#xff0c;画面能串流到任何一块屏幕&#xff0c;截图录像能自动归档进自己的资料库&#xff0c;存储扩容也不再是玄学。这套方案适…

作者头像 李华
网站建设 2026/10/19 1:55:31

微信小程序校园闲置物品平台:开题报告与开发全攻略

距离毕业季还有一段时间&#xff0c;但找我咨询“开题报告怎么写”的学弟学妹已经排起了队。这里面&#xff0c;“微信小程序的校园闲置物品处理平台”出镜率极高&#xff0c;几乎每隔几天就能看到一次。这个题目确实讨巧&#xff0c;既有微信小程序这个热门技术载体&#xff0…

作者头像 李华
网站建设 2026/10/19 12:16:19

移动端自动化崩了?用角色级模型拆分把LLM准确率从47%拉到81%

1. 为什么移动端自动化必须做角色级拆分&#xff1a;先说说 EventBot 翻车现场先说结论&#xff1a;我在这个系列第 05 篇里讲过一个移动端自动化 Demo&#xff0c;当时用的是"一个模型管到底"的方案——让同一个 LLM 既看截图、又读 UI 树、还要负责生成点击坐标、最…

作者头像 李华
网站建设 2026/10/21 12:43:29

遥感大模型落地实践:从算力选型到工程排障的完整指南

这两年遥感行业里最热的一个词肯定绕不开大模型。尤其是卫星影像数据量越攒越多&#xff0c;传统的分割、检测、分类思路开始明显吃力&#xff0c;场景大、目标小、标注稀缺这三座大山压得很多团队喘不过气。我自己在最近一个模拟项目X里&#xff0c;完整做过一套遥感影像解译系…

作者头像 李华
网站建设 2026/10/18 0:45:51

AU动作单元识别:面向工业落地的细粒度面部肌肉检测指南

简介&#xff1a;AU_Recognition-master 是一套面向计算机视觉研究者与情绪计算初学者的面部表情单元&#xff08;AU&#xff09;识别开源工具&#xff0c;基于FACS理论实现对基础面部肌肉动作的细粒度检测与强度回归&#xff0c;适用于人机交互、心理状态分析、动画驱动等需要…

作者头像 李华
网站建设 2026/10/18 6:12:22

从玩具到生产力:AI编程工具在存量项目中的落地实践

过去大半年&#xff0c;我在一个模拟项目X上做了一次比较彻底的试验&#xff1a;把AI编程工具从"偶尔问两句"的玩具&#xff0c;变成覆盖日常开发全环节的工作台。这个项目大概有40万行Java代码&#xff0c;历史包袱很重——模块边界模糊、测试覆盖率不到三成、线上还…

作者头像 李华