外观
中间件提供了一种更紧密地控制智能体内部运行方式的手段。中间件在以下场景中很有用:
通过将中间件传给 create_agent 来添加它们:
python
from langchain.agents import create_agent
from langchain.agents.middleware import SummarizationMiddleware, HumanInTheLoopMiddleware
agent = create_agent(
model="gpt-5.5",
tools=[...],
middleware=[
SummarizationMiddleware(...),
HumanInTheLoopMiddleware(...)
],
)通过将中间件传给 createAgent 来添加它们:
typescript
import {
createAgent,
summarizationMiddleware,
humanInTheLoopMiddleware,
} from "langchain";
const agent = createAgent({
model: "gpt-5.5",
tools: [...],
middleware: [summarizationMiddleware, humanInTheLoopMiddleware],
});智能体循环
核心智能体循环包括:调用模型,让模型选择要执行的工具,当它不再调用任何工具时结束:

中间件在这些步骤之前和之后暴露钩子:

在 LangGraph 工作流中使用中间件
中间件不是一个独立的运行时:钩子运行在 create_agent 返回的已编译的 LangGraph 内部。你可以将整个智能体(连同所有中间件)作为一个节点或子图放入更大的 StateGraph 中,每个中间件钩子都会继续运行。
当外围拓扑结构不仅仅是标准的"循环直到完成"时,可以使用这种模式:在路由到多个智能体之一之前对输入进行分类、并行分发任务,或用确定性步骤将智能体调用拼接在一起。
HumanInTheLoopMiddleware 会匹配每个工具的 .name。在 Python 中,用 @tool 装饰的函数从函数名取得其名称(因此下面的键是 "send_email");在 TypeScript 中,键与你传给 tool({...}, { name }) 的 name 相匹配。
python
from langchain.agents import AgentState, create_agent
from langchain.agents.middleware import HumanInTheLoopMiddleware
from langgraph.graph import START, 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()
)typescript
import { AgentState, createAgent, humanInTheLoopMiddleware } from "langchain";
import { StateGraph, START } from "@langchain/langgraph";
// 假设 readEmail、sendEmail、classifyNode 和 route 已在其他地方定义。
// readEmail / sendEmail 以 "read_email" / "send_email" 的名称注册。
const emailAgent = createAgent({
model: "claude-sonnet-4-6",
tools: [readEmail, sendEmail],
middleware: [humanInTheLoopMiddleware({ interruptOn: { send_email: true } })],
});
const graph = new StateGraph(AgentState)
.addNode("classify", classifyNode)
.addNode("emailAgent", emailAgent)
.addEdge(START, "classify")
.addConditionalEdges("classify", route)
.compile();HITL 中断、摘要、PII 脱敏、重试以及任何自定义钩子都会随智能体节点一起运行。完整的组合模式(包括子图检查点作用域,即每次调用与每线程)参见 使用子图。
其他资源
- 内置中间件 — 探索针对常见用例的内置中间件。
- 自定义中间件 — 使用钩子和装饰器构建你自己的中间件。
- 中间件 API 参考 — 中间件的完整 API 参考。
- 中间件集成 — 针对 Anthropic、AWS、OpenAI 等提供商的专用中间件。
- 测试智能体 — 使用 LangSmith 测试你的智能体。