跳到主要内容

定位与设计原则

Agent Flow 是一门描述动态 Agent 工作流的领域语言(DSL)。

它回答一个问题:当工作流里既有必须精确执行的控制结构(分阶段、并行、 校验、重试、预算),又有天生非确定性的模型调用时,代码应该怎么组织?

Agent Flow 的答案:把两者在语法层面分开。确定性的部分用语言结构写, 由运行时逐字执行;非确定性的部分被圈进唯一的入口 agent(), 并且必须带着输出契约。

.flow → Lexer/Parser(Langium)→ 语法 AST → 语义分析 + 类型检查
→ Flow IR → ESTree → 受限 JavaScript(胶水代码)
→ Sandbox(子进程 + isolate)→ Flow Runtime → AgentRuntime 适配器

五条设计原则​

1. 确定性优先​

凡是可以确定性执行的结构——pipeline、stage、if、parallel、require、 schema 校验、limits、retry——都由 Runtime 确定执行,不交给 Agent。 能在编译期发现的错误(类型不匹配、变量不可见、保留字冲突)绝不留到运行期。

2. 唯一的非确定点是 agent()​

模型调用集中在一个表达式上,其结果必须通过 expect 声明的 JSON Schema 校验。这是 Runtime 强制,不是提示词暗示—— 校验失败会自动进入修复回路,耗尽后抛出 OutputValidationError。

3. 验证判定权属于 Runtime​

verification.passed 只能由 verify { pass when ... } 表达式计算产生, Agent 无法返回它。模型可以说"我测过了",但"通过"这个结论永远由运行时判定。

4. 权限只可收窄​

tools 与 write 表达的是请求能力,最终生效集合为 host policy ∩ workflow 请求。工作流声明得再多,得到的也不会更多。

5. 可嵌入、无厂商绑定​

语言不引用任何具体 Agent 产品;Agent 系统通过 AgentRuntime 接口接入。换模型、换供应商,工作流一行不改。

它长什么样​

一个最小但完整的 workflow(节选自 examples/simple.flow):

workflow hello(input: Request) -> Result {
use agent "writer" as writer

type Request { text: text }
type Result { answer: text }

pipeline {
stage answer -> Result {
return agent(writer) {
task "Answer the request"
input { request: input }
tools none
expect Result
}
}

return answer
}
}

结构、类型、契约、资源,全部显式;模型只出现在 agent(writer) 一处。

适用场景​

  • 需要多阶段、有依赖的 Agent 流程(计划 → 执行 → 验证 → 汇总)
  • 需要并行扇出(逐条处理批量输入)且要控制并发与预算
  • 输出要过契约(结构化数据进入下游系统),验证结论要可审计
  • 工作流要跑在不可信环境里(编译产物是受限 JS,可进沙箱)

如果你的场景是单轮问答、纯对话,或者一次性脚本不需要治理—— 直接调模型 API 更简单,不需要 DSL。

下一步​