与提供商无关的中间件
以下中间件适用于任何 LLM 提供商:摘要
在接近 Token 限制时自动摘要对话历史,保留最近的消息同时压缩较旧的上下文。摘要适用于以下场景:- 超过上下文窗口的长时间对话。
- 具有大量历史的多轮对话。
- 保留完整对话上下文很重要的应用。
配置选项
配置选项
string | BaseChatModel
required
用于生成摘要的模型。可以是模型标识符字符串(例如
'openai:gpt-5.4-mini')或 BaseChatModel 实例。object | object[]
触发摘要的条件。可以是:
- 单个条件对象(所有属性必须满足 - AND 逻辑)
- 条件对象数组(任一条件满足即可 - OR 逻辑)
fraction(number):模型上下文大小的比例(0-1)tokens(number):绝对 Token 数messages(number):消息数量
object
default:"{messages: 20}"
摘要后保留多少上下文。精确指定以下之一:
fraction(number):保留模型上下文大小的比例(0-1)tokens(number):保留的绝对 Token 数messages(number):保留的最近消息数量
function
自定义 Token 计数函数。默认使用基于字符的计数。
string
用于摘要的自定义提示词模板。如果未指定则使用内置模板。模板应包含
{messages} 占位符,对话历史将被插入此处。number
default:"4000"
生成摘要时要包含的最大 Token 数。消息将被修剪以适应此限制,然后再进行摘要。
string
添加到摘要消息前面的前缀。如果未提供,使用默认前缀。
number
deprecated
已弃用: 请使用
trigger: { tokens: value } 代替。触发摘要的 Token 阈值。number
deprecated
已弃用: 请使用
keep: { messages: value } 代替。要保留的最近消息数。完整示例
完整示例
摘要中间件监控消息 Token 数量,并在达到阈值时自动摘要较旧的消息。触发条件控制何时运行摘要:
- 单个条件对象(指定的条件必须满足)
- 条件数组(任一条件满足即可 - OR 逻辑)
- 每个条件可以使用
fraction(模型上下文大小的比例)、tokens(绝对数量)或messages(消息数量)
fraction- 保留模型上下文大小的比例tokens- 保留的绝对 Token 数messages- 保留的最近消息数量
人机协作
在工具调用执行之前暂停智能体执行以等待人工审批、编辑或拒绝。人机协作适用于以下场景:- 需要人工审批的高风险操作(例如数据库写入、金融交易)。
- 人工监督是强制性的合规工作流。
- 人类反馈引导智能体的长时间对话。
观看此视频指南,演示人机协作中间件的行为。
模型调用限制
限制模型调用次数以防止无限循环或过度成本。模型调用限制适用于以下场景:- 防止失控的智能体进行过多 API 调用。
- 在生产部署中强制执行成本控制。
- 在特定调用预算内测试智能体行为。
观看此视频指南,演示模型调用限制中间件的行为。
配置选项
配置选项
工具调用限制
通过限制工具调用次数来控制智能体执行,可以全局应用于所有工具或针对特定工具。工具调用限制适用于以下场景:- 防止对昂贵外部 API 的过多调用。
- 限制网页搜索或数据库查询。
- 对特定工具使用强制执行速率限制。
- 防止智能体失控循环。
观看此视频指南,演示工具调用限制中间件的行为。
配置选项
配置选项
string
要限制的特定工具名称。如果未提供,限制全局应用于所有工具。
number
线程(对话)中所有运行的最大工具调用次数。跨多次使用相同线程 ID 的调用持久化。需要检查点来维护状态。
undefined 表示无线程限制。number
单次调用(一个用户消息 → 响应周期)的最大工具调用次数。每条新用户消息时重置。
undefined 表示无运行限制。注意: 必须至少指定 threadLimit 或 runLimit 之一。string
default:"continue"
达到限制时的行为:
'continue'(默认)- 用错误消息阻止超出的工具调用,让其他工具和模型继续。模型根据错误消息决定何时结束。'error'- 抛出ToolCallLimitExceededError异常,立即停止执行'end'- 立即停止执行,为超出的工具调用提供 ToolMessage 和 AI 消息。仅在限制单个工具时有效;如果其他工具有待处理的调用则抛出错误。
完整示例
完整示例
使用以下方式指定限制:
- 线程限制 - 对话中所有运行的最大调用次数(需要检查点)
- 运行限制 - 单次调用的最大调用次数(每轮重置)
'continue'(默认)- 用错误消息阻止超出的调用,智能体继续'error'- 立即引发异常'end'- 带 ToolMessage + AI 消息停止(仅限单工具场景)
模型回退
当主模型失败时自动回退到替代模型。模型回退适用于以下场景:- 构建能处理模型中断的弹性智能体。
- 通过回退到更便宜的模型进行成本优化。
- 跨 OpenAI、Anthropic 等提供商的冗余。
配置选项
配置选项
该中间件接受可变数量的字符串参数,按顺序表示回退模型:
string[]
required
当主模型失败时按顺序尝试的一个或多个回退模型字符串
PII 检测
使用可配置策略检测和处理对话中的个人身份信息(PII)。PII 检测适用于以下场景:- 有合规要求的医疗保健和金融应用。
- 需要清理日志的客户服务智能体。
- 处理敏感用户数据的任何应用。
自定义 PII 类型
你可以通过提供detector 参数来创建自定义 PII 类型。这允许你检测超出内置类型的特定于你的用例的模式。
创建自定义检测器的三种方式:
- 正则表达式模式字符串 - 简单的模式匹配
- RegExp 对象 - 对正则表达式标志有更多控制
- 自定义函数 - 带验证的复杂检测逻辑
PIIMatch 对象的数组:
配置选项
配置选项
string
required
要检测的 PII 类型。可以是内置类型(
email、credit_card、ip、mac_address、url)或自定义类型名称。string
default:"redact"
如何处理检测到的 PII。选项:
'block'- 检测到时抛出错误'redact'- 替换为[REDACTED_TYPE]'mask'- 部分遮蔽(例如****-****-****-1234)'hash'- 替换为确定性哈希(例如<email_hash:a1b2c3d4>)
RegExp | string | function
自定义检测器。可以是:
RegExp- 用于匹配的正则表达式string- 正则表达式模式字符串(例如"sk-[a-zA-Z0-9]{32}")function- 自定义检测器函数(content: string) => PIIMatch[]
boolean
default:"true"
在模型调用前检查用户消息
boolean
default:"false"
在模型调用后检查 AI 消息
boolean
default:"false"
在执行后检查工具结果消息
待办事项列表
为智能体配备任务规划和跟踪能力,用于复杂的多步任务。待办事项列表适用于以下场景:- 需要跨多个工具协调的复杂多步任务。
- 进度可见性很重要的长时间运行操作。
此中间件自动为智能体提供
write_todos 工具和系统提示词来指导有效的任务规划。观看此视频指南,演示待办事项列表中间件的行为。
配置选项
配置选项
无可用配置选项(使用默认值)。
LLM 工具选择器
在调用主模型之前使用 LLM 智能选择相关工具。LLM 工具选择器适用于以下场景:- 拥有很多工具(10+)且每次查询大多数不相关的智能体。
- 通过过滤不相关的工具来减少 Token 使用。
- 提高模型的聚焦度和准确性。
配置选项
配置选项
工具重试
使用可配置的指数退避自动重试失败的工具调用。工具重试适用于以下场景:- 处理外部 API 调用中的瞬态故障。
- 提高依赖网络的工具的可靠性。
- 构建能优雅处理临时错误的弹性智能体。
toolRetryMiddleware
配置选项
配置选项
number
default:"2"
初始调用后的最大重试次数(默认为总共 3 次尝试)。必须 >= 0。
(ClientTool | ServerTool | string)[]
可选的工具或工具名称数组,用于应用重试逻辑。可以是
BaseTool 实例列表或工具名称字符串。如果为 undefined,则应用于所有工具。((error: Error) => boolean) | (new (...args: any[]) => Error)[]
default:"() => true"
要重试的错误构造函数数组,或接受错误并返回
true 表示应重试的函数。默认为对所有错误重试。'error' | 'continue' | ((error: Error) => string)
default:"continue"
所有重试耗尽时的行为。选项:
'continue'(默认)- 返回带错误详情的ToolMessage,允许 LLM 处理故障并可能恢复'error'- 重新抛出异常,停止智能体执行- 自定义函数 - 接受异常并返回
ToolMessage内容的字符串的函数,允许自定义错误格式
'raise'(使用 'error' 代替)和 'return_message'(使用 'continue' 代替)。这些已弃用的值仍然有效但会显示警告。number
default:"2.0"
指数退避的乘数。每次重试等待
initialDelayMs * (backoffFactor ** retryNumber) 毫秒。设为 0.0 表示恒定延迟。必须 >= 0。number
default:"1000"
首次重试前的初始延迟(毫秒)。必须 >= 0。
number
default:"60000"
重试之间的最大延迟(毫秒,限制指数退避增长)。必须 >= 0。
boolean
default:"true"
是否添加随机抖动(
±25%)到延迟以避免雷群效应完整示例
完整示例
该中间件使用指数退避自动重试失败的工具调用。关键配置:
maxRetries- 重试尝试次数(默认:2)backoffFactor- 指数退避乘数(默认:2.0)initialDelayMs- 起始延迟(毫秒)(默认:1000ms)maxDelayMs- 延迟增长上限(默认:60000ms)jitter- 添加随机变化(默认:true)
onFailure: "continue"(默认)- 返回错误消息onFailure: "error"- 重新抛出异常- 自定义函数 - 返回错误消息的函数
模型重试
使用可配置的指数退避自动重试失败的模型调用。模型重试适用于以下场景:- 处理模型 API 调用中的瞬态故障。
- 提高依赖网络的模型请求的可靠性。
- 构建能优雅处理临时模型错误的弹性智能体。
modelRetryMiddleware
配置选项
配置选项
number
default:"2"
初始调用后的最大重试次数(默认为总共 3 次尝试)。必须 >= 0。
((error: Error) => boolean) | (new (...args: any[]) => Error)[]
default:"() => true"
要重试的错误构造函数数组,或接受错误并返回
true 表示应重试的函数。默认为对所有错误重试。'error' | 'continue' | ((error: Error) => string)
default:"continue"
所有重试耗尽时的行为。选项:
'continue'(默认)- 返回带错误详情的AIMessage,允许智能体可能优雅地处理故障'error'- 重新抛出异常,停止智能体执行- 自定义函数 - 接受异常并返回
AIMessage内容的字符串的函数,允许自定义错误格式
number
default:"2.0"
指数退避的乘数。每次重试等待
initialDelayMs * (backoffFactor ** retryNumber) 毫秒。设为 0.0 表示恒定延迟。必须 >= 0。number
default:"1000"
首次重试前的初始延迟(毫秒)。必须 >= 0。
number
default:"60000"
重试之间的最大延迟(毫秒,限制指数退避增长)。必须 >= 0。
boolean
default:"true"
是否添加随机抖动(
±25%)到延迟以避免雷群效应完整示例
完整示例
该中间件使用指数退避自动重试失败的模型调用。
LLM 工具模拟器
使用 LLM 模拟工具执行以用于测试目的,用 AI 生成的响应替代实际工具调用。LLM 工具模拟器适用于以下场景:- 无需执行真实工具即可测试智能体行为。
- 当外部工具不可用或成本昂贵时开发智能体。
- 在实现实际工具之前原型化智能体工作流。
配置选项
配置选项
完整示例
完整示例
该中间件使用 LLM 为工具调用生成合理的响应,而非执行实际工具。
上下文编辑
通过在达到 Token 限制时清除较旧的工具调用输出来管理对话上下文,同时保留最近的结果。这有助于在有很多工具调用的长对话中保持上下文窗口可管理。上下文编辑适用于以下场景:- 有很多工具调用且超过 Token 限制的长对话
- 通过移除不再相关的较旧工具输出来降低 Token 成本
- 仅在上下文中保留最近的 N 个工具结果
配置选项
配置选项
ContextEdit[]
default:"[new ClearToolUsesEdit()]"
要应用的
ContextEdit 策略数组ClearToolUsesEdit 选项:number
default:"100000"
触发编辑的 Token 数。当对话超过此 Token 数时,较旧的工具输出将被清除。
number
default:"0"
编辑运行时要回收的最小 Token 数。如果设为 0,则尽可能多地清除。
number
default:"3"
必须保留的最近工具结果数。这些永远不会被清除。
boolean
default:"false"
是否清除 AI 消息上的原始工具调用参数。当为
true 时,工具调用参数会被替换为空对象。string[]
default:"[]"
排除在清除之外的工具名称列表。这些工具的输出永远不会被清除。
string
default:"[cleared]"
为已清除的工具输出插入的占位文本。这会替换原始工具消息内容。
完整示例
完整示例
该中间件在达到 Token 限制时应用上下文编辑策略。最常用的策略是
ClearToolUsesEdit,它清除较旧的工具结果同时保留最近的结果。工作原理:- 监控对话中的 Token 数
- 达到阈值时,清除较旧的工具输出
- 保留最近的 N 个工具结果
- 可选保留工具调用参数以提供上下文
文件系统中间件
上下文工程是构建有效智能体的主要挑战。当使用返回可变长度结果的工具时(例如web_search 和 RAG),这尤其困难,因为长工具结果可以快速填满你的上下文窗口。
来自 Deep Agents 的 FilesystemMiddleware 提供四个工具用于与短期和长期记忆交互:
ls:列出文件系统中的文件read_file:读取整个文件或从文件中读取特定行数write_file:将新文件写入文件系统edit_file:编辑文件系统中的现有文件
短期 vs 长期文件系统
默认情况下,这些工具写入你的图状态中的本地”文件系统”。要启用跨线程的持久存储,配置一个CompositeBackend,将特定路径(如 /memories/)路由到 StoreBackend。
/memories/ 配置带有 StoreBackend 的 CompositeBackend 时,任何以 /memories/ 为前缀的文件都会保存到持久存储,并在不同线程之间保持。没有此前缀的文件保留在临时状态存储中。
子智能体
将任务交接给子智能体可以隔离上下文,保持主(主管)智能体的上下文窗口干净,同时仍能深入处理任务。 来自 Deep Agents 的子智能体中间件允许你通过task 工具提供子智能体。
general-purpose 子智能体。该子智能体与主智能体具有相同的指令和可访问的所有工具。general-purpose 子智能体的主要目的是上下文隔离——主智能体可以将复杂任务委托给这个子智能体,并获得简洁的答案,而不会因为中间工具调用而膨胀。
特定提供商的中间件
这些中间件针对特定的 LLM 提供商进行了优化。请参阅每个提供商的文档以获取完整的详情和示例。Anthropic
用于 Claude 模型的提示词缓存、bash 工具、文本编辑器、记忆和文件搜索中间件。
连接这些文档到 Claude、VSCode 等,通过 MCP 获取实时答案。

