流程编写方式¶
plaita 支持多种格式定义流程,最终均编译为同一个 Flow 对象并在相同运行时上执行。
flowchart LR
Codeflow["@flow (推荐)"] --> IR["Flow IR"]
JSON["JSON / YAML"] --> IR
Builder["FlowBuilder (动态修改)"] --> IR
IR --> Runtime["执行引擎"]
推荐方式:@flow¶
@flow 是 Python 用户的首选方式。写普通函数,用 @flow 装饰器将函数体编译为 Flow,表达式用真实 Python 语法,IDE 补全最好,AI 生成最友好。
以「判断成年」为例:
from plaita.dsl.codeflow import flow
@flow("adult_check")
def adult_check(INPUT):
if INPUT.age >= 18:
return "成年"
return "未成年"
adult_check.run(age=20) # -> "成年"
运行期 AI 动态生成(让 LLM 输出源码字符串后安全执行):
from plaita.dsl.codeflow import flow_from_source
src = '''
@flow("adult_check")
def adult_check(INPUT):
if INPUT.age >= 18:
return "成年"
return "未成年"
'''
flow_from_source(src).run(age=20) # -> "成年"
@flow的input_type/output_type参数已废弃且被忽略——$INPUT恒为run()传入的 dict,无需声明。
→ 完整语法(含集合、子流程、flow_from_source Agent 场景):@flow DSL
配置文件格式:JSON / YAML¶
JSON 是 plaita 的标准序列化格式,也是可视化编排工具的导出格式。YAML 与 JSON 完全等价(同构),增加了注释支持和多行字段可读性,适合手写与版本管理。
{
"flow_id": "adult_check",
"inputType": { "dataType": "object" },
"nodes": [
{ "type": "start", "id": "start", "next": "check_age" },
{
"type": "if", "id": "check_age",
"condition": { "field": "$INPUT.age", "operator": "gte", "value": 18 },
"next": "end_adult", "else_next": "end_minor"
},
{ "type": "end", "id": "end_adult", "output": "成年", "resultType": "success" },
{ "type": "end", "id": "end_minor", "output": "未成年", "resultType": "success" }
]
}
flow_id: adult_check
inputType: { dataType: object }
nodes:
- { type: start, id: start, next: check_age }
- type: if
id: check_age
condition: { field: $INPUT.age, operator: gte, value: 18 }
next: end_adult
else_next: end_minor
- { type: end, id: end_adult, output: 成年, resultType: success }
- { type: end, id: end_minor, output: 未成年, resultType: success }
→ 完整字段与控制流说明:流程定义(JSON)
动态构建 API:FlowBuilder¶
FlowBuilder 适用于在代码里动态创建或修改流程——例如根据运行时条件组装流程结构、实现 MCP 接口让 AI 修改现有流程、或在测试中程序化构造测试流程。
from plaita.dsl import build, start, end, if_, cond
flow = (
build("adult_check")
.add(start(next="check_age"))
.add(if_(
id="check_age",
condition=cond("$INPUT.age", ">=", 18),
next="end_adult",
else_next="end_minor",
))
.add(end("end_adult", output="成年"))
.add(end("end_minor", output="未成年"))
.build()
)
flow.run(age=20) # -> "成年"
动态修改已有流程(添加、删除、修改节点):
from plaita.dsl import FlowBuilder
import json
# 从已有 JSON 加载为 builder 并修改
raw = json.load(open("my_flow.json"))
builder = FlowBuilder.from_dict(raw)
builder.remove_node("old_step") # 删除节点
builder.update_node("greet", output="$F.concat('Hi, ', $INPUT.name)") # 修改节点属性
builder.reroute("start", next="greet") # 修改连接
flow = builder.build()
→ 完整说明(含 linear 简写、序列化):YAML 与 Python DSL 编排
如何选择¶
| 我的场景 | 推荐 |
|---|---|
| 用 Python 写流程逻辑,有 IDE 支持 | @flow |
| 让 AI 生成可安全执行的流程 | @flow + flow_from_source |
| 用 plaita-console 可视化拖拽后导出 | JSON |
| 手写流程配置文件,需要注释与可读性 | YAML |
| 程序化动态组装、修改流程 | FlowBuilder |
线性管道,省掉所有 id 和 next |
linear(FlowBuilder 的简化变体) |
共同特性¶
无论哪种格式:
- 产物都是同一个
Flow对象,flow.run()/flow.arun()/flow.debug()完全通用 - 支持相同的节点、表达式、超时与错误策略
- 可互相导出:
builder.to_json()/builder.to_yaml()