Skip to content

容错处理 (Fault tolerance) ​

通过速率限制、重试、模型回退降级和异常处理提升 deep agent 的健壮性

容错中间件能够在发生异常时保持 deep agent 的平稳运行。并非所有错误都应该以相同的方式处理:瞬态故障(网络超时、速率超限)应自动重试;大语言模型能够自行纠错的错误(不良工具输出、解析失败)应反馈给模型重试;而需要人工介入的错误则应暂停智能体等待指导。

错误处理策略 ​

不同的错误类型需要匹配不同的处理策略:

错误类型修复责任方对应策略采用的中间件或功能
瞬时错误(网络波动、速率超限)系统(自动)带指数退避的重试机制ModelRetryMiddleware, ToolRetryMiddleware
用户可修复错误(缺失信息、指令模糊)人工处理使用 interrupt() 暂停执行人在回路 (Human-in-the-loop)
模型提供商宕机系统(自动)降级故障转移至备选模型ModelFallbackMiddleware
过度调用(失控死循环)系统(自动)限制单次运行的模型与工具调用上限ModelCallLimitMiddleware, ToolCallLimitMiddleware
未预期的系统错误开发者排查向上抛出异常由上层捕获无需中间件,让异常向外冒泡以便排查

以下各节通过代码示例详细阐述每种策略的具体落地方式。

瞬时错误 (Transient errors)

添加重试中间件以自动重试网络异常和速率限制。模型调用和工具调用各自拥有专属的指数退避重试中间件:

typescript
import { createAgent, modelRetryMiddleware, toolRetryMiddleware } from "langchain";

const agent = createAgent({
  model: "google:gemini-3.6-flash",
  tools: [searchTool, fetchUrlTool],
  middleware: [
    modelRetryMiddleware({ maxRetries: 3, backoffFactor: 2.0, initialDelayMs: 1000 }),
    toolRetryMiddleware({
      maxRetries: 2,
      tools: ["search", "fetch_url"],
      retryOn: [TimeoutError, TypeError],
    }),
  ],
});

用户可修复错误 (User-fixable)

在需要时(如缺失账号 ID、订单号或需要澄清需求)暂停执行并向用户收集信息。使用 interruptOn 在特定工具调用前暂停智能体:

typescript
import { createDeepAgent } from "deepagents";

const agent = createDeepAgent({
  model: "google:gemini-3.6-flash",
  tools: [sendEmailTool, deleteRecordTool],
  interruptOn: {
    send_email: true,
    delete_record: true,
  },
});

有关人在回路的完整指南,请参阅人在回路。

模型提供商故障 (Provider outage)

当你的主力模型提供商发生全站宕机时,使用 ModelFallbackMiddleware 自动无缝降级切换至备选模型:

typescript
import { createAgent, modelFallbackMiddleware } from "langchain";

const agent = createAgent({
  model: "google:gemini-3.6-flash",
  tools: [searchTool],
  middleware: [
    modelFallbackMiddleware("gpt-5.5"),
  ],
});

过度调用失控 (Excessive calls)

如果不加限制,陷入死循环的智能体可能会在几分钟内耗尽你的 LLM API 预算。建议为每次运行的模型调用与工具执行次数分别设置安全上限:

typescript
import { createAgent, modelCallLimitMiddleware, toolCallLimitMiddleware } from "langchain";

const agent = createAgent({
  model: "google:gemini-3.6-flash",
  tools: [searchTool],
  middleware: [
    modelCallLimitMiddleware({ runLimit: 50 }),
    toolCallLimitMiddleware({ runLimit: 200 }),
  ],
});

未预期错误 (Unexpected)

允许其向外冒泡以便调试排查。切勿盲目吞掉无法妥善处理的异常。这一准则同样适用于 JavaScript SDK 中的自定义中间件。

速率限制 (Rate limiting) ​

有两种互补的方式来限制资源消耗:控制向模型提供商发送请求的并发速率,以及限制单次运行的总调用次数。

提供商速率限制 (Provider rate limiting) ​

聊天模型提供商通常会限制在特定时间窗口内允许发起的请求数量。为了平滑请求速率,可在初始化模型时配置 rate_limiter。

调用次数上限 (Call limits) ​

设置调用次数熔断上限:

typescript
import { createAgent, modelCallLimitMiddleware, toolCallLimitMiddleware } from "langchain";

const agent = createAgent({
  model: "google:gemini-3.6-flash",
  middleware: [
    modelCallLimitMiddleware({ runLimit: 50 }),
    toolCallLimitMiddleware({ runLimit: 200 }),
  ],
});

使用 run_limit 限制单次调用的执行次数(每轮对话均会重置)。使用 thread_limit 限制跨整个对话线程的累计调用次数(需要配合检查点器)。完整配置请参阅 ModelCallLimitMiddleware 和 ToolCallLimitMiddleware。

重试机制 (Retries) ​

瞬态故障(网络超时、429 速率限制)应自动重试。模型调用和工具调用各自拥有独立的指数退避重试中间件:

typescript
import {
  createAgent,
  modelRetryMiddleware,
  toolRetryMiddleware,
} from "langchain";

const agent = createAgent({
  model: "google:gemini-3.6-flash",
  middleware: [
    // 针对速率限制、网络超时和 5xx 错误重试模型调用
    modelRetryMiddleware({ maxRetries: 3, backoffFactor: 2.0, initialDelayMs: 1000 }),
    // 针对访问外部 API 的特定工具执行重试(避免盲目重试所有工具)
    toolRetryMiddleware({
      maxRetries: 2,
      tools: ["search", "fetch_url"],
      retryOn: [TimeoutError, TypeError],
    }),
  ],
});

建议将 ToolRetryMiddleware 限定在特定外部工具上,而不是无差别重试所有工具。例如,一个读取本地文件失败的 read_file 重试通常毫无意义,但一个超时的网络搜索工具重试大概率会成功。完整配置请参阅 ModelRetryMiddleware。

模型降级回退 (Fallbacks) ​

当主力模型提供商全站故障时,Fallback 中间件会自动将请求路由至备选模型:

typescript
import {
  createAgent,
  modelFallbackMiddleware,
} from "langchain";

const agent = createAgent({
  model: "google:gemini-3.6-flash",
  middleware: [
    // 当主力模型完全宕机时,自动回退到备用模型
    modelFallbackMiddleware("gpt-5.5"),
  ],
});

完整配置请参阅 ModelFallbackMiddleware。

错误处理状态 ​

当某个工具在执行期间抛出未捕获的异常时,智能体运行默认会中止。ToolErrorMiddleware 目前在 JavaScript SDK 中尚未正式提供。