Skip to content

中间件提供了一种更紧密地控制智能体内部运行方式的手段。中间件在以下场景中很有用:

通过将中间件传给 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],
});

智能体循环

核心智能体循环包括:调用模型,让模型选择要执行的工具,当它不再调用任何工具时结束:

Core agent loop diagram

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

Middleware flow diagram

在 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 脱敏、重试以及任何自定义钩子都会随智能体节点一起运行。完整的组合模式(包括子图检查点作用域,即每次调用与每线程)参见 使用子图

其他资源