原文链接:https://docs.langchain.com/oss/python/langchain/middleware/overview
中间件
概述
复制页面
中间件提供了一种更精细地控制Agent内部行为的方式。中间件适用于以下场景:
- 通过日志记录、分析和调试来跟踪Agent行为。
- 转换提示词、工具选择和输出格式。
- 添加重试、回退和提前终止逻辑。
- 应用速率限制、防护栏和PII(个人身份信息)检测。
通过将中间件传递给create_agent来添加它们:
fromlangchain.agentsimportcreate_agentfromlangchain.agents.middlewareimportSummarizationMiddleware,HumanInTheLoopMiddleware agent=create_agent(model="gpt-5.5",tools=[...],middleware=[SummarizationMiddleware(...),HumanInTheLoopMiddleware(...)],)Agent循环
核心Agent循环涉及调用模型、让其选择要执行的工具,然后在它不再调用工具时结束:
核心Agent循环图
中间件在每个步骤之前和之后暴露钩子:
中间件流程图
在LangGraph工作流中使用中间件
中间件不是一个独立的运行时:钩子在create_agent返回的已编译LangGraph内部运行。您可以将整个Agent(包括中间件和所有内容)作为一个节点或子图放入更大的StateGraph中,并且每个中间件钩子都会继续运行。
当周围的拓扑结构不仅仅是标准的“循环直到完成”时,请使用此模式:在路由到多个Agent之一之前对输入进行分类、并行分发工作,或将Agent调用与确定性步骤拼接在一起。
HumanInTheLoopMiddleware针对每个工具的.name进行匹配。在Python中,使用@tool装饰器的函数名称来自函数本身(因此下面的键是"send_email");在TypeScript中,键与你传递给tool({...}, { name })的名称匹配。
fromlangchain.agentsimportAgentState,create_agentfromlangchain.agents.middlewareimportHumanInTheLoopMiddlewarefromlanggraph.graphimportSTART,StateGraph# 假定 read_email、send_email、classify_node 和 route 在其他地方定义。email_agent=create_agent(model="claude-sonnet-4-6",tools=[read_email,send_email],middleware=[HumanInTheLoopMiddleware(interrupt_on={"send_email":True})],)graph=(StateGraph(AgentState).add_node("classify",classify_node).add_node("email_agent",email_agent).add_edge(START,"classify").add_conditional_edges("classify",route).compile())HITL中断、摘要、PII编辑、重试以及任何自定义钩子都会随Agent节点一起传递。请参阅"使用子图"以获取完整的组合模式集,包括子图检查点作用域(每次调用与每个线程)。
其他资源
- 内置中间件:探索用于常见用例的内置中间件。
- 自定义中间件:使用钩子和装饰器构建您自己的中间件。
- 中间件API参考:中间件的完整API参考。
- 中间件集成:针对Anthropic、AWS、OpenAI等特定提供商的中介软件。
- 测试Agent:使用LangSmith测试您的Agent。