diff --git a/src/agents/pi-embedded-helpers.isbillingerrormessage.test.ts b/src/agents/pi-embedded-helpers.isbillingerrormessage.test.ts index 41a10d8c533..2f478af3b6d 100644 --- a/src/agents/pi-embedded-helpers.isbillingerrormessage.test.ts +++ b/src/agents/pi-embedded-helpers.isbillingerrormessage.test.ts @@ -684,6 +684,12 @@ describe("classifyFailoverReason", () => { ).toBeNull(); }); + it("classifies OpenAI Responses unknown-no-details message as unknown", () => { + const message = "Unknown error (no error details in response)"; + expect(classifyFailoverReason(message)).toBe("unknown"); + expect(isFailoverErrorMessage(message)).toBe(true); + }); + it("classifies provider-scoped generic upstream messages", () => { expect(classifyFailoverReason("An unknown error occurred", { provider: "anthropic" })).toBe( "timeout", diff --git a/src/agents/pi-embedded-helpers/errors.ts b/src/agents/pi-embedded-helpers/errors.ts index 560981b09f8..e81407f6e9c 100644 --- a/src/agents/pi-embedded-helpers/errors.ts +++ b/src/agents/pi-embedded-helpers/errors.ts @@ -668,6 +668,10 @@ function isOpenRouterKeyLimitExceededError(raw: string, provider?: string): bool ); } +function isExactUnknownNoDetailsError(raw: string): boolean { + return normalizeOptionalLowercaseString(raw)?.trim() === "unknown error (no error details in response)"; +} + function classifyFailoverClassificationFromMessage( raw: string, provider?: string, @@ -737,6 +741,9 @@ function classifyFailoverClassificationFromMessage( if (isCloudCodeAssistFormatError(raw)) { return toReasonClassification("format"); } + if (isExactUnknownNoDetailsError(raw)) { + return toReasonClassification("unknown"); + } if (isTimeoutErrorMessage(raw)) { return toReasonClassification("timeout"); }