Middleware 提供了一种更精细地控制代理内部行为的方式。Middleware 适用于以下场景: 通过将 middleware 传给 createAgent 来添加:
import {
  createAgent,
  summarizationMiddleware,
  humanInTheLoopMiddleware,
} from "langchain";

const agent = createAgent({
  model: "gpt-5.4",
  tools: [...],
  middleware: [summarizationMiddleware, humanInTheLoopMiddleware],
});

代理循环

核心代理循环包括调用模型、让模型选择要执行的 tools,然后在模型不再调用 tools 时结束: 核心代理循环图 Middleware 会在每个步骤前后暴露 hooks: Middleware 流程图

在 LangGraph workflow 中使用 middleware

Middleware 不是单独的 runtime:hooks 会在 create_agent 返回的已编译 LangGraph 内运行。你可以将整个 agent(包括 middleware)作为节点或 subgraph 放入更大的 StateGraph 中,并且每个 middleware hook 都会继续运行。 当周围拓扑不只是标准的“循环直到完成”时,可以使用这种模式:例如在路由到多个 agents 之一之前对输入分类,并行扇出工作,或用确定性步骤串接 agent calls。 HumanInTheLoopMiddleware 会根据每个 tool 的 .name 进行匹配。在 Python 中,使用 @tool 装饰的函数会从函数名获取名称(因此下面的 key 是 "send_email");在 TypeScript 中,key 会匹配你传给 tool({...}, { name })name
import { AgentState, createAgent, humanInTheLoopMiddleware } from "langchain";
import { StateGraph, START } from "@langchain/langgraph";

// Assumes readEmail, sendEmail, classifyNode, and route are defined elsewhere.
// readEmail / sendEmail are registered with name: "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 interrupt、summarization、PII redaction、retries 以及任何自定义 hooks 都会随 agent node 一起运行。完整组合模式请参阅 Use subgraphs,其中包括 subgraph checkpointer 的作用域(按 invocation 或按 thread)。

其他资源

Built-in middleware

探索常见用例的内置 middleware。

Custom middleware

使用 hooks 和 decorators 构建自己的 middleware。

Middleware API reference

Middleware 的完整 API reference。

Middleware integrations

Anthropic、AWS、OpenAI 等 provider-specific middleware。

Testing agents

使用 LangSmith 测试 agents。