跳到主要内容

定位与设计原则

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. 权限只可收窄

toolswrite 表达的是请求能力,最终生效集合为 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。

下一步