Documentation Index
Fetch the complete documentation index at: https://langchain-zh.cn/llms.txt
Use this file to discover all available pages before exploring further.
LangGraph 提供了 时间旅行 功能,可以从先前的检查点恢复执行,既可以重放相同的状态,也可以修改它以探索替代方案。在所有情况下,恢复过去的执行都会在历史中产生一个新的分支。
要通过 LangSmith 部署 API(通过 LangGraph SDK)进行时间旅行:
- 运行图:使用 LangGraph SDK 的 client.runs.wait 或 client.runs.stream API 运行图并传入初始输入。
- 在现有线程中识别检查点:使用 client.threads.get_history 方法检索特定
thread_id 的执行历史,并定位所需的 checkpoint_id。
或者,在希望执行暂停的节点之前设置一个 断点。然后,您可以找到记录到该断点的最近检查点。
- (可选)修改图状态:使用 client.threads.update_state 方法修改图在检查点处的状态,并从替代状态恢复执行。
- 从检查点恢复执行:使用 client.runs.wait 或 client.runs.stream API,输入为
None,并指定相应的 thread_id 和 checkpoint_id。
在工作流中使用时间旅行
from typing_extensions import TypedDict, NotRequired
from langgraph.graph import StateGraph, START, END
from langchain.chat_models import init_chat_model
from langgraph.checkpoint.memory import InMemorySaver
class State(TypedDict):
topic: NotRequired[str]
joke: NotRequired[str]
model = init_chat_model(
"claude-sonnet-4-6",
temperature=0,
)
def generate_topic(state: State):
"""LLM调用,为笑话生成一个主题"""
msg = model.invoke("给我一个有趣的笑话主题")
return {"topic": msg.content}
def write_joke(state: State):
"""LLM调用,根据主题编写笑话"""
msg = model.invoke(f"写一个关于 {state['topic']} 的短笑话")
return {"joke": msg.content}
# 构建工作流
builder = StateGraph(State)
# 添加节点
builder.add_node("generate_topic", generate_topic)
builder.add_node("write_joke", write_joke)
# 添加边以连接节点
builder.add_edge(START, "generate_topic")
builder.add_edge("generate_topic", "write_joke")
# 编译
graph = builder.compile()
1. 运行图
from langgraph_sdk import get_client
client = get_client(url=<DEPLOYMENT_URL>)
# 使用部署时命名为 "agent" 的图
assistant_id = "agent"
# 创建一个线程
thread = await client.threads.create()
thread_id = thread["thread_id"]
# 运行图
result = await client.runs.wait(
thread_id,
assistant_id,
input={}
)
import { Client } from "@langchain/langgraph-sdk";
const client = new Client({ apiUrl: <DEPLOYMENT_URL> });
// 使用部署时命名为 "agent" 的图
const assistantID = "agent";
# 创建一个线程
const thread = await client.threads.create();
const threadID = thread["thread_id"];
// 运行图
const result = await client.runs.wait(
threadID,
assistantID,
{ input: {}}
);
创建线程:curl --request POST \
--url <DEPLOYMENT_URL>/threads \
--header 'Content-Type: application/json' \
--data '{}'
运行图:curl --request POST \
--url <DEPLOYMENT_URL>/threads/<THREAD_ID>/runs/wait \
--header 'Content-Type: application/json' \
--data "{
\"assistant_id\": \"agent\",
\"input\": {}
}"
2. 识别检查点
# 状态按时间倒序返回。
states = await client.threads.get_history(thread_id)
selected_state = states[1]
print(selected_state)
// 状态按时间倒序返回。
const states = await client.threads.getHistory(threadID);
const selectedState = states[1];
console.log(selectedState);
curl --request GET \
--url <DEPLOYMENT_URL>/threads/<THREAD_ID>/history \
--header 'Content-Type: application/json'
3. 更新状态
update_state 将创建一个新的检查点。新的检查点将与同一个线程关联,但会有一个新的检查点 ID。
new_config = await client.threads.update_state(
thread_id,
{"topic": "chickens"},
checkpoint_id=selected_state["checkpoint_id"]
)
print(new_config)
const newConfig = await client.threads.updateState(
threadID,
{
values: { "topic": "chickens" },
checkpointId: selectedState["checkpoint_id"]
}
);
console.log(newConfig);
curl --request POST \
--url <DEPLOYMENT_URL>/threads/<THREAD_ID>/state \
--header 'Content-Type: application/json' \
--data "{
\"assistant_id\": \"agent\",
\"checkpoint_id\": <CHECKPOINT_ID>,
\"values\": {\"topic\": \"chickens\"}
}"
4. 从检查点恢复执行
await client.runs.wait(
thread_id,
assistant_id,
input=None,
checkpoint_id=new_config["checkpoint_id"]
)
await client.runs.wait(
threadID,
assistantID,
{
input: null,
checkpointId: newConfig["checkpoint_id"]
}
);
curl --request POST \
--url <DEPLOYMENT_URL>/threads/<THREAD_ID>/runs/wait \
--header 'Content-Type: application/json' \
--data "{
\"assistant_id\": \"agent\",
\"checkpoint_id\": <CHECKPOINT_ID>
}"
了解更多