DuraGraph
面向 AI Agent 的持久化工作流编排引擎:事件溯源、可回放、单二进制自托管。
- Star 数
- ★ 163
- 最近更新
- 12 天前
- License
- Apache-2.0
- 主语言
- Go
- FA 评分
- 45/100 · 缺口较多
30 秒速览
- 可在哪里用
- 兼容但需适配
- 开始前需要
- 典型场景
- 需要长时间运行的 LLM Agent 团队:Agent 会跑几小时甚至更久,担心 worker 在中途崩溃导致状态丢失,希望重启后从最后一个已提交状态继续。
- 主要局限
- 生产就绪度有限:多租户与 NATS Accounts 隔离、生产 Helm chart、工作流版本管理与迁移都明确标为 in flight,尚未完成。
- 源码审查
- 45/100 · 缺口较多
这个 Agent 能做什么,适合哪些场景?
DuraGraph 是一个自托管、面向企业场景的 AI 工作流编排系统,核心思路是把每一次状态变更都作为不可变事件写入 PostgreSQL,并与工作本身放在同一个事务里,因此 worker 在工具调用中途崩溃也不会丢状态,整个运行可以从事件日志重放。仓库是 monorepo:cmd/duragraph 是控制平面二进制(引擎 + 内嵌 dashboard + 开发模式引导),internal/ 按 DDD、事件溯源与 CQRS 分层,dashboard/ 是 React + TanStack Router + xyflow 的控制台(含可视化工作流编辑器,构建时嵌入二进制),python/ 与 go-sdk/ 是两类 worker SDK,examples/ 提供 Go 与 Python 参考 Agent,deploy/ 存放 Docker、SQL 迁移与 Helm chart。对外接口是稳定的 REST + SSE API,覆盖 runs、threads、assistants、graphs;worker 通过 SDK 在启动时注册图定义,不需要代码生成或自定义 DSL。部署边界很清晰:开发模式用单个二进制内嵌 PostgreSQL 与 NATS,生产环境可换成外部 Postgres 和 NATS。
运行时,worker 通过 Python 或 Go SDK 连接控制平面并注册图定义;客户端调用 POST /api/v1/threads/:id/runs 创建 run,引擎的图执行引擎按节点、边、条件分支、human-in-the-loop 中断与工具调用逐步推进,并把每个状态迁移作为事件写入 PostgreSQL 事件存储。写事务与工作本身同一事务提交,因此崩溃后可从中断处恢复,且不会重复执行。Outbox relay 把领域事件转发到 NATS JetStream,dashboard 通过 SSE 实时显示节点点亮、图拓扑与可回放的轨迹。读取侧走 CQRS 查询,GET /api/v1/runs/:id 取运行状态,GET /api/v1/threads/:id/runs 列出会话中的 run,GET /api/v1/threads/:id/runs/:run_id/stream 订阅实时执行事件,POST /api/v1/assistants 注册 assistant,GET /api/v1/assistants/:id/graph 读取图结构。此外暴露 OpenTelemetry 友好的 Prometheus 指标。
- 需要长时间运行的 LLM Agent 团队:Agent 会跑几小时甚至更久,担心 worker 在中途崩溃导致状态丢失,希望重启后从最后一个已提交状态继续。
- 需要审计与合规的场景:要把每一次状态变更按时间顺序留痕,并基于事件存储做 eval 与合规视图。
- 被线上失败困扰的开发者:想按产生问题的确切决策序列逐步回放出错 run,而不是只看堆栈和模糊的最后已知位置。
- 想免运维试跑自己的 AI 工作流的个人或小团队:用 duragraph dev 一条命令起引擎和内嵌 Postgres/NATS,从 Playground 发第一条消息。
- 已经在用 Go 或 Python 写 Agent 的工程团队:用 go-sdk 或 python/ 中的 SDK 注册图定义,接入现有代码而不写 DSL。
- 平台团队:需要自托管的控制平面、REST + SSE 接口、Prometheus 指标,并计划在生产替换成外部 Postgres 与 NATS。
如何安装或部署这个 Agent?
README 给出四种安装途径,任选其一:
# Homebrew(macOS、Linux)
brew install Duragraph/tap/duragraph
# 一行安装脚本
curl -fsSL https://duragraph.ai/install.sh | sh
# 从 Go 安装
go install github.com/Duragraph/duragraph/cmd/duragraph@latest
# 或从 Releases 下载预编译二进制
# → https://github.com/Duragraph/duragraph/releases从源码参与开发:
git clone https://github.com/Duragraph/duragraph.git
cd duragraph
task dev # 针对本地 Postgres + NATS 启动引擎与 dashboard
task test # 单元 + 集成测试套件凭据方面:无需预先配置数据库或消息中间件,开发模式内嵌 PostgreSQL 与 NATS;首次启动后使用日志中打印的 bootstrap admin 账号登录 dashboard。生产环境需要外部 PostgreSQL 与 NATS(deploy/ 下提供 Docker 与 SQL 迁移,Helm chart 仍标注为进行中)。
如何使用这个 Agent?
第一步启动服务:
duragraph dev
# → 引擎与 dashboard 监听 http://localhost:8081第二步跑通第一个 Agent:打开 http://localhost:8081,用日志里打印的 bootstrap admin 登录,进入 Playground,选择一个已注册的 assistant,发送一条消息;可以看到工作流实时执行,每个节点依次点亮,并能在 Traces 中查看完整图拓扑与可回放的事件日志。examples/ 下有 RAG、工具调用 Agent、文档处理、eval 等 Go 与 Python 示例,可直接对着 duragraph dev 运行。
第三步接入自己的 Agent:起一个 worker,用 python/ 或 go-sdk/ 里的 SDK 在启动时注册图定义;然后通过 REST + SSE 驱动 run:
POST /api/v1/threads/:id/runs # 创建 run
GET /api/v1/runs/:id # 查询 run 状态
GET /api/v1/threads/:id/runs # 列出某会话的 run
GET /api/v1/threads/:id/runs/:run_id/stream # SSE:实时执行事件
POST /api/v1/assistants # 注册 assistant
GET /api/v1/assistants/:id/graph # 读取图拓扑这个 Agent 有哪些优点和局限?
- 事件溯源 + CQRS + outbox 的组合是真实实现:每个状态迁移与工作在同一事务写入 PostgreSQL,崩溃后从最后提交状态恢复且不重复执行,run 可从事件日志完整重放,便于调试与审计。
- 开发体验门槛极低:单个二进制内嵌 PostgreSQL 与 NATS,duragraph dev 一条命令即可跑起引擎与 dashboard,不需要 docker compose,也不需要先准备基础设施。
- SDK 与语言生态对工程团队友好:提供 Python(PyPI 包 duragraph)与 Go 两个 worker SDK,worker 在启动时注册图定义,无需代码生成或自定义 DSL。
- 运维与集成面完整:稳定的 REST + SSE 接口、React + xyflow 的内嵌 dashboard(含可视化工作流编辑器和 Traces 会话视图)、OpenTelemetry 友好的 Prometheus 指标,以及 Docker 与 SQL 迁移资产。
- Apache-2.0 许可,采用 monorepo 让控制平面、SDK、dashboard 与文档围绕同一份规范一起演进。
- 生产就绪度有限:多租户与 NATS Accounts 隔离、生产 Helm chart、工作流版本管理与迁移都明确标为 in flight,尚未完成。
- 可观测性有缺口:按节点的 REST spans 端点仍未提供,目前只能通过 SSE 获取执行事件。
- 生产部署引入外部依赖:开发模式内嵌 Postgres 与 NATS 很省事,但 README 说明生产环境使用外部 PostgreSQL 与 NATS,等于把数据库与消息中间件的运维成本接了过来。
- 需要理解其架构模型:要真正用好,团队得接受事件溯源、CQRS、outbox relay 这套概念,对只想写线性 Agent 脚本的人属于额外认知负担。
- 仓库未说明支持的 LLM provider 或模型适配层,也没有列出各主流 Agent 运行时之间的迁移路径,选型时这方面的证据缺失。
这个 Agent 与同类方案有什么区别?
README 明确把自己定位为「Temporal for AI agents」,并指出采用的是与 Temporal 相同的持久化工作流架构,只是针对 AI Agent 图的形状(节点、边、条件分支、human-in-the-loop 中断、工具调用)做了专门设计。文中还提到 LangChain 类编排器只保存 run 的当前状态,出问题时只留下堆栈和模糊的最后位置——这是 README 自己给出的对比对象。
与相关度最高的同类 agent 并排比较关键指标。
| Agent | 源码审查 | Star | 最近更新 | 主语言 | 完整支持的平台 |
|---|---|---|---|---|---|
| DuraGraph 当前 | 45 · 缺口较多 | ★ 163 | 12 天前 | Go | — |
| Babysitter | 52 · 缺口较多 | ★ 1.8k | 23 天前 | JavaScript | Claude Code |
| Maze 分布式 LLM Agent 框架 | 51 · 缺口较多 | ★ 611 | 1 个月前 | Python | — |
| 自托管 AI 入门套件 | 50 · 缺口较多 | ★ 15k | 2 个月前 | — | — |
FollowAgents 如何评估这个 Agent?
查看各维度的扣分理由
README 描述了事件溯源、outbox、可回放等机制,但未给出权限模型、最小权限配置、用户确认流程、数据流透明性说明或敏感数据处理策略;SECURITY.md 仅提供漏洞上报邮箱,无安全设计细节。依赖清单(go.mod)包含大量第三方库但无漏洞扫描或锁定策略证据。回滚能力仅以事件回放间接暗示,无显式回滚流程。发布者身份未验证,来源归属仅靠 LICENSE 中的版权声明。整体信任相关证据薄弱,故各项均给低分。
README 对架构、状态、API 端点描述较一致,且与 go.mod 中的依赖(embedded-postgres、nats-server、echo 等)吻合,自洽性尚可。但依赖可用性仅靠 go.mod 声明,无版本锁定或供应链验证;失败消息方面,测试文件显示错误会抛出(如 ValueError),但无面向用户的错误信息设计证据。故自洽性给 2,其余给 1。
README 明确面向自托管企业用户,提供 dev 模式、单二进制、Python/Go SDK,场景覆盖较清晰;‘Status’ 节列出已实现与进行中功能,边界较明确。但触发精度(如 CLI 命令、API 触发条件)缺乏详细说明,环境适配仅提及嵌入式 Postgres/NATS 与生产外部依赖,无具体环境矩阵。故受众与场景、能力边界、环境适配给 2,触发精度给 1。
README 信息架构清晰(安装、运行、架构、API、状态、贡献),安装说明具体(brew、curl、go install)。但命名稳定性无版本化证据,示例与 FAQ 仅指向 examples/ 目录而无内容,已知限制在 Status 节有列出,许可证完整(Apache-2.0),版本变更日志缺失,维护责任仅指向 GitHub Issues/Discussions 且发布者未验证。故许可证给 3,信息架构、安装说明、已知限制给 2,其余给 1 或 0。
输出可用性方面,README 提供可运行的快速开始和 API 端点,但无实际输出示例或结果展示;边际价值在于事件溯源与可回放对 AI 工作流的差异化,但缺乏与替代方案的量化对比;成本效益无资源消耗、性能或运维成本数据。故输出可用性与边际价值给 2,成本效益给 1。
README 中的声明(如崩溃安全、可回放)无对应测试或代码引用可追溯;测试文件仅覆盖 Python SDK 的异步执行和 CLI,未验证核心引擎声明;跨源佐证有限,go.mod 与 README 依赖描述一致但不足以验证功能。事实与推断分离方面,README 混合了事实描述与营销性推断(如‘Temporal for AI agents’),未明确区分。故各项均给 1。
- 发布者身份未经验证,维护责任与更新路径不明确,企业采用前需自行评估供应链风险。
- README 中的崩溃安全、可回放等核心声明缺乏可追溯的测试或代码证据,静态审查无法验证。
- 依赖清单包含大量第三方库,无漏洞扫描或锁定策略证据,存在供应链安全隐患。
- 缺少版本变更日志和命名稳定性说明,升级与兼容性风险未知。
- 安全策略仅提供漏洞上报邮箱,无权限模型、数据流透明性或敏感数据处理细节。