LangGraph 加上 checkpointer 后,invoke 为什么要求 thread_id
LangGraph 本地图启用 checkpointer 后,需要在 configurable 中传 thread_id。核对会话复用、reducer、内存保存范围和跨请求配置传递。
图没有 checkpointer 时能运行,加上后却在 invoke 或 stream 开始时失败:
Checkpointer requires one or more of the following 'configurable' keys
后面的键名随版本可能不同。对于下面的 Python LangGraph 0.6.7 本地图,checkpoint 需要按 thread 保存和读取状态,调用时应把 thread_id 放进 config["configurable"]。把它加到节点输入字典里,并不能替代这份运行配置。
这里讨论在应用里自行编译运行的图。托管 LangGraph API 的 thread 与运行接口由服务端管理,不能直接按这个例子自行叠加内存 checkpointer。
最小配置应该传到哪个位置
下面用累计字符串列表说明状态复用,不调用模型。InMemorySaver 和已编译的 graph 在多次调用之间保留同一个实例:
from operator import add
from typing import Annotated
from typing_extensions import TypedDict
from langgraph.graph import StateGraph, START, END
from langgraph.checkpoint.memory import InMemorySaver
class State(TypedDict):
events: Annotated[list[str], add]
def record(state: State):
return {"events": ["processed"]}
builder = StateGraph(State)
builder.add_node("record", record)
builder.add_edge(START, "record")
builder.add_edge("record", END)
memory = InMemorySaver()
graph = builder.compile(checkpointer=memory)
config = {"configurable": {"thread_id": "example-session-1"}}
first = graph.invoke({"events": ["first"]}, config=config)
second = graph.invoke({"events": ["second"]}, config=config)
snapshot = graph.get_state(config)
example-session-1 是示例会话标识,正式服务应由自己的会话管理分配。不要让所有用户共用这个常量,也不要在同一次对话的每次请求里重新生成一个 ID;前者会混用状态,后者会一直创建新 thread。
如果包在 Runnable、Web 路由或其他调用封装中,检查配置是否确实继续传给图。只在最外层收到了 thread_id,但内部重新调用 graph.invoke(input) 丢掉 config,仍会出错。
复用 thread 不等于自动追加所有字段
示例的 events 显式使用 add reducer,所以新列表与此前状态合并。普通没有 reducer 的字段通常采用覆盖语义;消息状态也要按照对应消息 reducer 的规则处理。不能因为设置了 thread_id,就认为任何字典字段都会自动累计。
checkpoint_id 用于定位某次保存状态,checkpoint_ns 用于命名空间;它们不能代替应用正常会话所需的 thread_id。错误文字列出了这些键,并不意味着随便补上其中一个键就一定满足具体 saver 的读写契约。
继续同一会话时复用原 ID,需要新会话时分配新 ID。配置本身不提供用户权限判断,服务端仍要核对请求者能否访问该会话;不能允许客户端换一个 ID 就读取别人的状态。
内存保存的范围要明确
InMemorySaver 用于调试和测试,状态留在那个 saver 的内存里。每次请求都新建 saver,进程重启,或者请求落到另一个没有共享它的进程,都可能看不到前一次状态。thread_id 不会把内存保存变成数据库持久化。
需要跨进程或重启恢复时,选择应用支持的持久化 saver,并按其要求完成数据库初始化、连接生命周期和同步或异步接口配置。先备份和核对现有数据;不要为了消除缺配置的错误临时删除 checkpoint 表。
同一 thread 同时接收多次写运行时,应在应用层明确排队、拒绝或其他并发策略。ID 相同只表示访问同一份会话状态,不证明并发写入自然符合业务顺序。以上例子是顺序调用,不承诺托管服务或任意 saver 的并发语义。
验收时从真实调用入口检查同一 ID 能读取前次状态、不同 ID 相互隔离,以及重启行为符合所选保存方式。异常消失只是配置传递成功的第一步。


