以编程方式使用文档

中间件提供了一种更紧密地控制代理内部发生的情况的方法。中间件适用于以下场景:

通过将中间件传递给 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 中,键匹配你传递给 nametool({...}, { 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 测试您的代理。