LangGraph 替代方案
Agent 工作流的运行时,而不是塞进应用里的一个库。
LangGraph 是用代码表达 Agent 图的好办法。Dagu 是运行它的那一层: 单个自托管二进制,工作流是 YAML,Agent 是普通步骤,调度、队列、重试、持久挂起和运行历史来自引擎,而不是你围着它写的那个应用。
# triage.yaml
schedule: "*/15 * * * *"
max_active_runs: 1
steps:
- id: fetch
run: ./scripts/fetch-new-issues.sh
output: ISSUES
- id: classify
action: harness.run
with:
provider: claude
prompt: Classify each issue in ${ISSUES}. Return JSON.
output_schema: schemas/triage.json
retry_policy:
limit: 3
interval_sec: 30
depends: [fetch]
- id: apply_labels
run: ./scripts/apply-labels.sh
depends: [classify]工作流是 YAML,不是应用代码
步骤就是进程,任何语言、任何 CLI 都能用
调度、队列、重试和历史随二进制一起发布
等待中的运行释放进程,之后再恢复
At a glance
从运维角度看 LangGraph 与 Dagu
以二进制方式运行的工作流引擎。
嵌入 Python 或 JavaScript 应用的库。
声明式 YAML,与它运行的代码放在一起做版本管理。
在应用代码里构建图。
调度、队列、重试、产物和运行历史随引擎提供。
Checkpointer 负责持久化图状态,调度和服务化由你的服务或 LangGraph Platform 承担。
一个进程: 任何语言、任何 CLI,必要时放进容器。
宿主进程里的一个函数。
In depth
Where each tool fits
库需要一个应用,引擎不需要
LangGraph 负责搭出图。但仍然需要有东西去调度它、排队、重试、持久化状态并展示发生了什么。那个东西要么是你自己写的服务,要么是 LangGraph Platform。Dagu 本身就是这一层。
- 只跑一个二进制。不用写 Web 服务,也不用设计 worker 池
- 调度、队列、重试和运行历史是引擎能力,而不是需要接入的外部件
- 同一份定义可以跑在笔记本、一台 VM,或 coordinator 加 worker 的架构上
步骤是进程,工作流因此不绑定语言
LangGraph 的节点是跑在你进程里的 Python 或 JavaScript 函数。Dagu 的步骤是命令,所以工作单元就是环境里已经能跑起来的东西。
- 在同一个工作流里调用 shell 脚本、二进制、容器、SSH 命令、HTTP 端点和 SQL
- 用 harness.run 运行编码 Agent: Claude、Codex、Gemini、OpenCode 或内部 CLI
- 给任意步骤配一个容器沙箱,挂载、工具链和出网规则都写明
画得出来就画图,画不出来就交出顺序
LangGraph 要求你画出每一条路径。在顺序开始取决于评审说了什么之前,这都是对的。Dagu 把 type: graph 保留为默认,并为那些始终塞不进一张图的工作补上 type: controller。
- Controller 工作流声明完成条件,由模型挑选下一个动作
- 模型只能在你声明过的步骤中挑选,因此影响范围就是这份文件
- 两种类型产生同样的运行,日志、重试、产物和历史都一样
FAQ
Practical questions before adopting Dagu
Dagu 能直接替换 LangGraph 吗?
不能,它们处在不同层。如果你想用 Python 或 JavaScript 组合模型调用并精细控制图状态,LangGraph 更合适。当工作是一组命令和 Agent CLI,并且需要调度、重试、审批和审计证据时,Dagu 更合适。
可以在 Dagu 里继续用 LangGraph 吗?
可以。把 LangGraph 应用保留为脚本或容器,作为一个步骤运行即可。Dagu 在它周围提供调度、重试策略、日志、产物和运行历史。
Dagu 怎么处理 human-in-the-loop?
人工任务,以及 controller 工作流里的 ask_user,会持久挂起运行。进程退出、worker 槽位释放,等有人回答后运行在新进程上恢复。
Dagu 需要数据库吗?
不需要。Dagu 是单个二进制,把工作流定义、运行历史和日志都存成文件,第一次运行之前不必先运维元数据库或消息中间件。
Next step
Start with one workflow.
Install Dagu, move one fragile script or agent task into YAML, and decide from a real run history.