用途
langchain-middleware 是一份面向 LangChain 智能体的技能参考,聚焦三类能力:人在回路(human-in-the-loop)审批、自定义中间件、结构化输出。其核心示例围绕 HumanInTheLoopMiddleware(Python)与 humanInTheLoopMiddleware(JavaScript/TypeScript)展开,用于在智能体调用工具之前暂停,交由人工决策。
主要能力
人在回路审批
通过为智能体添加 HumanInTheLoopMiddleware,并在 interrupt_on 中按工具名指定配置,可让指定工具在调用前中断等待人工处理。示例中 allowed_decisions 可包含 approve(批准)、edit(修改参数)、reject(拒绝)。策略可按工具分别设置,例如 send_email 允许批准/修改/拒绝,delete_email 仅允许批准/拒绝,read_email 设为 False 表示无需审批。
人工决策后的恢复
示例使用 LangGraph 的 Command(resume=...) 恢复执行。批准时传入 decisions 中的 {type: approve};修改时传入 edit 并提供 edited_action(含 name 与 args);拒绝时传入 reject 并附带 feedback 说明原因。
自定义中间件钩子
资料列出六个装饰器钩子,分两类模式:
- 包裹型钩子(wrap_tool_call、wrap_model_call):签名为 (request, handler),调用 handler(request) 继续执行,或提前返回来短路。
- 前后型钩子(before_model、after_model、before_agent、after_agent):签名为 (state, runtime),用于查看或修改状态,返回 None 或状态更新字典。
示例展示了重试中间件(wrap_tool_call 中最多尝试三次)和拦截中间件(对危险工具直接返回提示并短路),以及 before_model / after_model 的日志记录。JavaScript 侧通过 createMiddleware 定义 wrapToolCall、beforeModel、afterModel 等。
工具级中间件
资料提到可为特定工具应用中间件,而非全部工具。
使用方式与要求
所有 HITL 工作流都要求配置 checkpointer 与 thread_id 配置。示例使用 MemorySaver 作为 checkpointer,调用时传入 {"configurable": {"thread_id": "session-1"}}。中断结果通过返回中的 interrupt 检测,随后使用 Command 恢复。
注意事项(资料列出的错误示例)
- 不要在工具执行后中断,中断必须发生在执行前。
- 不要跳过 checkpointer,HITL 工作流必须配置。
- 调用时必须传入包含 thread_id 的 config。
- 恢复执行必须使用 Command(resume=...),而不是直接在输入中传 resume。
适用场景
适合需要在敏感或高风险工具(如发送邮件、删除数据)调用前引入人工审核的 LangChain 智能体,以及需要日志、重试、错误处理与工具拦截等横切逻辑的智能体应用。
限制
资料未说明版本要求、支持的模型范围、部署方式与性能影响;结构化输出仅在描述中提及,未展开示例。