Runtime 是个抽象——这里用 LangGraph 当案例把它拆到看得见。同样的概念在 Inngest / Temporal / 自建 loop 都有对应物。
建议先读《Framework / Runtime / Harness / 三层模型》;如果你是跳读,至少先看本章索引与本页 TL;DR。
runtime 认知层,用来分清编排、执行、持久化与产品边界。
Runtime 是个抽象——这里用 LangGraph 当案例把它 拆到看得见 。同样的概念在 Inngest / Temporal / 自建 loop 都有对应物。
先分清谁负责编排、谁负责执行、谁负责产品化,再评估复杂度。
课程主线:稳定 runtime 机制 + 官方实现。
| 原语 | 是什么 | 类比 |
|---|---|---|
| State | 一个 TypedDict,字段是 agent 的"全部状态"。每个字段可绑定 reducer。 | HTTP 请求的整个 request context |
| Node | 一个函数 (state) → partial_state。返回的字段会通过 reducer 合并回 state。 |
HTTP middleware 里的一段处理 |
| Edge | 静态的"A 之后总是 B"。最简单的控制流。 | 路由表里的 hardcoded mapping |
| Conditional Edge | 一个函数 (state) → next_node_name。给图里加 if-else / switch。 |
路由器(按 state 决定下一跳) |
| Checkpoint | 每一 step 完成后,把当前 state 序列化存到 checkpointer(mem / sqlite / postgres / redis)。 | 文件系统的 fsync |
5 个原语之上,整个 runtime 的"心跳"就是这一个循环:
while next_node:
# 1. 跑节点(可能是 LLM 调用、tool 执行、纯 Python 计算)
partial = node_fn(state)
# 2. 用 reducer 把节点返回值合并进 state
state = reducers.merge(state, partial)
# 3. 写 checkpoint(每 step 都写——这是 durable 的根)
checkpointer.put(thread_id, step, state)
# 4. 走 edge / conditional edge 决定下一节点
next_node = router(state)
# 5. 如果命中 interrupt_before/after,暂停 → 等 resume
if next_node in interrupt_set:
raise Interrupted(state)
Inngest / Temporal / Restate / 自写 loop——它们的 runtime 心跳长得都差不多,差异在 5 个原语的形态、持久化粒度、并发模型。把这 5 个原语理解透了,看其他 runtime