中间件提供了一种更紧密地控制代理内部发生的情况的方法。中间件适用于以下场景:
通过将中间件传递给 create_agent:
from langchain.agents import create_agent
from langchain.agents.middleware import SummarizationMiddleware, HumanInTheLoopMiddleware
agent = create_agent(
model="gpt-5.5",
tools=[...],
middleware=[
SummarizationMiddleware(...),
HumanInTheLoopMiddleware(...)
],
)
代理循环
核心代理循环包括调用模型、让它选择要执行的工具,然后在不再调用工具时结束:
中间件在每个步骤前后都暴露钩子:
在 LangGraph 工作流中使用中间件
中间件不是一个独立的运行时:钩子在 @ [LangGraph ] 返回的编译好的create_agent内部运行。你可以将整个智能体(连同中间件)作为一个节点或子图放入更大的 StateGraph 中,每个中间件钩子都会继续运行。
当周围的拓扑结构超过标准的"循环直到完成"时使用这种模式:在将输入路由到多个智能体之一之前对其进行分类、并行分发工作,或将智能体调用与确定性步骤串联在一起。
HumanInTheLoopMiddleware 与每个工具的 .name进行匹配。在 Python 中, @tool装饰的函数以其函数名作为名称(因此下面的键是 "send_email");在 TypeScript 中,键匹配你传递给 name 的 tool({...}, { name }).
from langchain.agents import AgentState, create_agent
from langchain.agents.middleware import HumanInTheLoopMiddleware
from langgraph.graph import START, StateGraph
# Assumes read_email, send_email, classify_node, and route are defined elsewhere.
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 脱敏、重试以及任何自定义钩子都会随着智能体节点一起迁移。请参阅 使用子图 了解完整的组合模式,包括子图检查点作用域(按调用与按线程)。
其他资源
Built-in middleware
探索用于常见用例的内置中间件。
Custom middleware
使用钩子和装饰器构建你自己的中间件。
Middleware API reference
中间件的完整 API 参考。
Middleware integrations
适用于 Anthropic、AWS、OpenAI 等的提供商特定中间件。
Testing agents
使用 LangSmith 测试您的代理。