(response: Response)
| 343 | * Default: 60s. |
| 344 | */ |
| 345 | export function computeRateLimitWaitMs(response: Response): number { |
| 346 | const rateLimitReset = response.headers.get('X-RateLimit-Reset'); |
| 347 | const retryAfter = response.headers.get('Retry-After'); |
| 348 | const openaiReset = |
| 349 | response.headers.get('x-ratelimit-reset-requests') || |
| 350 | response.headers.get('x-ratelimit-reset-tokens'); |
| 351 | |
| 352 | let waitTime = 60_000; |
| 353 | |
| 354 | if (openaiReset) { |
| 355 | const parsedHeaders = parseRateLimitHeaders(Object.fromEntries(response.headers.entries())); |
| 356 | if (parsedHeaders.resetAt !== undefined) { |
| 357 | waitTime = Math.max(parsedHeaders.resetAt - Date.now(), 0); |
| 358 | } |
| 359 | } else if (rateLimitReset) { |
| 360 | const resetTime = new Date(Number.parseInt(rateLimitReset) * 1000); |
| 361 | const now = new Date(); |
| 362 | waitTime = Math.max(resetTime.getTime() - now.getTime() + 1000, 0); |
| 363 | } else if (retryAfter) { |
| 364 | waitTime = parseRetryAfter(retryAfter) ?? waitTime; |
| 365 | } |
| 366 | |
| 367 | return waitTime; |
| 368 | } |
| 369 | |
| 370 | /** |
| 371 | * Maximum jitter (in ms) added to rate-limit waits. Spreads concurrent |
no test coverage detected
searching dependent graphs…