配套动画视频在:《10. Harness裁剪+Checkpointer续跑,Agent运行底座这样配》,源代码在《评论区置顶》。
大模型自己只会「想」和「说」,真正干活还得有人给它安排工具、约束行为、必要时再派帮手——这套围绕 Agent 转起来的运行环境,就叫 Harness,你可以把它想成 Agent 的工作台。这一节做两件事:把 Harness 裁到当前主流程需要的部分,再用 Checkpointer 让多轮对话能续上。
![[图片]](https://img2024.cnblogs.com/blog/1919157/202608/1919157-20260809230140178-709841181.png)
先导入依赖。Harness 配置要用到 HarnessProfile、register_harness_profile;裁剪 TodoList 要用到 TodoListMiddleware;Checkpointer 则需要 MemorySaver:
from deepagents import create_deep_agent, HarnessProfile, register_harness_profile, GeneralPurposeSubagentProfile from langchain.agents.middleware import TodoListMiddleware from langgraph.checkpoint.memory import MemorySaver
接着注册一份 Harness 配置:去掉 task、去掉 TodoList 中间件、关掉通用子代理,让 Agent 只走当前这条主流程:
register_harness_profile("openai", HarnessProfile(excluded_tools=frozenset({"task"}),excluded_middleware=frozenset({TodoListMiddleware}),general_purpose_subagent=GeneralPurposeSubagentProfile(enabled=False), ))
创建 Agent 时再传入 checkpointer=MemorySaver(),多轮对话才能按 thread_id 接上:
return create_deep_agent(backend=LocalShellBackend(root_dir=os.getcwd(), virtual_mode=True, inherit_env=True),checkpointer=MemorySaver(),debug=True)
验证续跑时,先写好会话配置:thread_id 用来标识这一条对话线程,后面的 invoke 都传同一份 configurable,Checkpointer 才知道要把多轮对话记在同一条会话里。
第一次提问让 Agent 记住暗号,并加上 config 参数;第二次用同一个 thread_id 问刚才记住的暗号是什么。两次会话接得上,第二次应能答上来:
def main():agent = create_test_agent()cfg = {"configurable": {"thread_id": "checkpoint10"}}result = agent.invoke({"messages": [{"role": "user", "content": "请记住一个暗号:LAOCHEN。" "只回复:已记住暗号。不要执行工具。"}]}, config=cfg)print(result["messages"][-1].content[0]["text"])result = agent.invoke({"messages": [{"role": "user", "content": "我刚才让你记住的暗号是什么?""只回答暗号本身,不要执行工具。"}]}, config=cfg)print(result["messages"][-1].content[0]["text"])
第二次能答出 LAOCHEN,说明 Checkpointer 已经把同一 thread_id 下的上下文续上了。Harness 裁干净、会话能续跑,Agent 的运行底座就算配到位了。
配套动画视频在:《10. Harness裁剪+Checkpointer续跑,Agent运行底座这样配》,源代码在《评论区置顶》。