From 4e0ca3c0e6ea50fa167e10721b399cc93304ba7c Mon Sep 17 00:00:00 2001 From: can1357 Date: Sun, 10 May 2026 15:26:00 +0200 Subject: [PATCH] fix(ai/providers): expanded retryable error handling for Anthropic provider - Expanded retry detection in the Anthropic provider to include an isRetryableError fallback after existing pattern checks. - Imported the shared retry helper and returned true when generic retryable errors were matched. --- packages/ai/src/providers/anthropic.ts | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/packages/ai/src/providers/anthropic.ts b/packages/ai/src/providers/anthropic.ts index 3b66db42b..5034c32a7 100644 --- a/packages/ai/src/providers/anthropic.ts +++ b/packages/ai/src/providers/anthropic.ts @@ -48,7 +48,12 @@ import { getStreamFirstEventTimeoutMs, getStreamIdleTimeoutMs, iterateWithIdleTi import { parseJsonWithRepair, parseStreamingJson } from "../utils/json-parse"; import { parseGitHubCopilotApiKey } from "../utils/oauth/github-copilot"; import { notifyProviderResponse } from "../utils/provider-response"; -import { extractHttpStatusFromError, isCopilotRetryableError, isUnexpectedSocketCloseMessage } from "../utils/retry"; +import { + extractHttpStatusFromError, + isCopilotRetryableError, + isRetryableError, + isUnexpectedSocketCloseMessage, +} from "../utils/retry"; import { COMBINATOR_KEYS, NO_STRICT } from "../utils/schema"; import { notifyRawSseEvent, wrapFetchForSseDebug } from "../utils/sse-debug"; import { @@ -841,14 +846,17 @@ export function isProviderRetryableError(error: unknown, provider?: string): boo if (!(error instanceof Error)) return false; if (provider === "github-copilot" && isCopilotRetryableError(error)) return true; const msg = error.message.toLowerCase(); - return ( + if ( isUnexpectedSocketCloseMessage(msg) || /rate.?limit|too many requests|overloaded|service.?unavailable|internal_error|stream error.*received from peer|1302|timed?\s*out while waiting for the first event|timeout waiting for first/i.test( msg, ) || isTransientStreamParseError(error) || isProviderRetryableStreamEnvelopeError(error) - ); + ) { + return true; + } + return isRetryableError(error); } function createEmptyUsage(premiumRequests?: number): Usage {