diff --git a/packages/ai/src/utils/retry.ts b/packages/ai/src/utils/retry.ts index f0a180138..24e327ad6 100644 --- a/packages/ai/src/utils/retry.ts +++ b/packages/ai/src/utils/retry.ts @@ -79,6 +79,9 @@ const RETRYABLE_PROVIDER_ERROR_PATTERN = buildProviderErrorPattern([ "you can retry your request", "try your request again", "please retry your request", + + // gRPC based providers (e.g. NVIDIA NIM) + "ResourceExhausted", ]); /** diff --git a/packages/ai/test/retry.test.ts b/packages/ai/test/retry.test.ts index 64ff6d429..70b0c4099 100644 --- a/packages/ai/test/retry.test.ts +++ b/packages/ai/test/retry.test.ts @@ -6,6 +6,7 @@ const openAIExplicitRetryMessage = "An error occurred while processing your request. You can retry your request, or contact us through our help center at help.openai.com if the error persists. Please include the request ID req_******** in your message."; const bedrockExplicitRetryMessage = '{"message":"The system encountered an unexpected error during processing. Try your request again."}'; +const nvidiaNIMResourceExhaustedMessage = "ResourceExhausted: Worker local total request limit reached (288/48)"; const bunFetchSocketClosedMessage = "The socket connection was closed unexpectedly. For more information, pass `verbose: true` in the second argument to fetch()"; @@ -21,6 +22,11 @@ describe("provider retry classification", () => { fauxAssistantMessage("", { stopReason: "error", errorMessage: bedrockExplicitRetryMessage }), ), ).toBe(true); + expect( + isRetryableAssistantError( + fauxAssistantMessage("", { stopReason: "error", errorMessage: nvidiaNIMResourceExhaustedMessage }), + ), + ).toBe(true); }); it("matches Bun fetch socket drop wording", () => {