Skip to content

retry

支持指数退避、抖动、选择性重试和错误反馈的重试工具。

基本用法

typescript
import { retry } from '@multi-agent/agent-kit'

const result = await retry(
  () => fetchData(),
  {
    maxRetries: 3,
    baseDelay: 1000,
    maxDelay: 10000,
  }
)

选择性重试

只重试特定类型的错误:

typescript
const result = await retry(
  () => fetchData(),
  {
    maxRetries: 3,
    baseDelay: 1000,
    maxDelay: 10000,
    shouldRetry: (error) => error.message.includes('timeout'),
    onRetry: (error, attempt, delay) => {
      console.log(`重试 ${attempt}/3,延迟 ${delay}ms`)
    }
  }
)

错误反馈(用于 LLM)

将错误转换为反馈消息,传递给下次调用:

typescript
const result = await retry(
  (feedback) => callLLMWithStructuredOutput(schema, feedback),
  {
    maxRetries: 3,
    baseDelay: 2000,
    maxDelay: 30000,
    transformError: (error) => {
      if (error.lc_error_code === 'OUTPUT_PARSING_FAILURE') {
        return `上次输出格式错误:${error.message}\n请严格按照 schema 定义返回 JSON。`
      }
      return undefined  // 其他错误不提供反馈
    },
    onRetry: (error, attempt, delay, feedback) => {
      console.log(`格式错误,重试 ${attempt}/3`)
      if (feedback) {
        console.log(`反馈给 LLM: ${feedback}`)
      }
    }
  }
)

调用顺序:

  • 第 1 次:fn(undefined)
  • 第 2 次:fn(transformError(error1))
  • 第 3 次:fn(transformError(error2))

配置选项

typescript
interface RetryConfig<TError = Error> {
  maxRetries: number      // 最大重试次数(不包含首次尝试)
  baseDelay: number       // 基础延迟(毫秒)
  maxDelay: number        // 最大延迟(毫秒)
  shouldRetry?: (error: TError, attempt: number) => boolean
  transformError?: (error: TError, attempt: number) => string | undefined
  onRetry?: (error: TError, attempt: number, delay: number, feedback?: string) => void
}

react vs retry

特性retryreact
适用场景临时故障(网络超时等)需要自我修正的场景(LLM 决策错误等)
操作方式相同操作重复执行根据错误反馈调整决策
反馈机制简单的字符串反馈结构化的错误对象传递给 reason
决策控制完整的 reason → act → observe 循环

选择建议

  • 调用外部 API、网络请求 → 使用 retry
  • LLM 决策、Agent 选择 → 使用 react

MIT Licensed