import { describe, expect, it } from "vitest"; import { fauxAssistantMessage } from "../src/providers/faux.ts"; import { isRetryableAssistantError } from "../src/utils/retry.ts"; 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()"; const openAIResponsesEarlyEofMessage = "OpenAI Responses stream ended before a terminal response event"; describe("provider retry classification", () => { it("matches explicit provider retry guidance", () => { expect( isRetryableAssistantError( fauxAssistantMessage("", { stopReason: "error", errorMessage: openAIExplicitRetryMessage }), ), ).toBe(true); expect( isRetryableAssistantError( fauxAssistantMessage("", { stopReason: "error", errorMessage: bedrockExplicitRetryMessage }), ), ).toBe(true); expect( isRetryableAssistantError( fauxAssistantMessage("", { stopReason: "error", errorMessage: nvidiaNIMResourceExhaustedMessage }), ), ).toBe(true); }); it("matches Bun fetch socket drop wording", () => { expect( isRetryableAssistantError( fauxAssistantMessage("", { stopReason: "error", errorMessage: bunFetchSocketClosedMessage }), ), ).toBe(true); }); it("matches OpenAI Responses streams that end before terminal events", () => { expect( isRetryableAssistantError( fauxAssistantMessage("", { stopReason: "error", errorMessage: openAIResponsesEarlyEofMessage }), ), ).toBe(true); }); it("keeps provider limit errors non-retryable", () => { expect( isRetryableAssistantError( fauxAssistantMessage("", { stopReason: "error", errorMessage: "429 quota exceeded" }), ), ).toBe(false); }); it("classifies assistant error messages", () => { expect( isRetryableAssistantError(fauxAssistantMessage("", { stopReason: "error", errorMessage: "overloaded_error" })), ).toBe(true); expect( isRetryableAssistantError( fauxAssistantMessage("", { stopReason: "error", errorMessage: "524 status code (no body)" }), ), ).toBe(true); expect(isRetryableAssistantError(fauxAssistantMessage("not an error"))).toBe(false); }); });