LangGraph 替代方案

Agent 工作流的运行时,而不是塞进应用里的一个库。

LangGraph 是用代码表达 Agent 图的好办法。Dagu 是运行它的那一层: 单个自托管二进制,工作流是 YAML,Agent 是普通步骤,调度、队列、重试、持久挂起和运行历史来自引擎,而不是你围着它写的那个应用。

不需要外围实现的定时 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

形态
Dagu

以二进制方式运行的工作流引擎。

LangGraph

嵌入 Python 或 JavaScript 应用的库。

定义方式
Dagu

声明式 YAML,与它运行的代码放在一起做版本管理。

LangGraph

在应用代码里构建图。

运维能力
Dagu

调度、队列、重试、产物和运行历史随引擎提供。

LangGraph

Checkpointer 负责持久化图状态,调度和服务化由你的服务或 LangGraph Platform 承担。

工作单元
Dagu

一个进程: 任何语言、任何 CLI,必要时放进容器。

LangGraph

宿主进程里的一个函数。

In depth

Where each tool fits

01

库需要一个应用,引擎不需要

LangGraph 负责搭出图。但仍然需要有东西去调度它、排队、重试、持久化状态并展示发生了什么。那个东西要么是你自己写的服务,要么是 LangGraph Platform。Dagu 本身就是这一层。

  • 只跑一个二进制。不用写 Web 服务,也不用设计 worker 池
  • 调度、队列、重试和运行历史是引擎能力,而不是需要接入的外部件
  • 同一份定义可以跑在笔记本、一台 VM,或 coordinator 加 worker 的架构上
02

步骤是进程,工作流因此不绑定语言

LangGraph 的节点是跑在你进程里的 Python 或 JavaScript 函数。Dagu 的步骤是命令,所以工作单元就是环境里已经能跑起来的东西。

  • 在同一个工作流里调用 shell 脚本、二进制、容器、SSH 命令、HTTP 端点和 SQL
  • 用 harness.run 运行编码 Agent: Claude、Codex、Gemini、OpenCode 或内部 CLI
  • 给任意步骤配一个容器沙箱,挂载、工具链和出网规则都写明
03

画得出来就画图,画不出来就交出顺序

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.