






























@@ -739,10 +739,39 @@ describe("classifyFailoverReason", () => {
739739expect(isFailoverErrorMessage(message)).toBe(true);
740740});
741741742-it("classifies provider-scoped generic upstream messages", () => {
742+it("classifies bare pi-ai stream wrapper as timeout regardless of provider (#71620)", () => {
743+// pi-ai providers throw `Error("An unknown error occurred")` provider-agnostically
744+// when streams end with stopReason "aborted" | "error" with no specific info.
745+for (const sample of [
746+"An unknown error occurred",
747+"an unknown error occurred",
748+"AN UNKNOWN ERROR OCCURRED",
749+"An unknown error occurred.",
750+" An unknown error occurred ",
751+]) {
752+expect(classifyFailoverReason(sample)).toBe("timeout");
753+expect(isFailoverErrorMessage(sample)).toBe(true);
754+}
743755expect(classifyFailoverReason("An unknown error occurred", { provider: "anthropic" })).toBe(
744756"timeout",
745757);
758+expect(classifyFailoverReason("An unknown error occurred", { provider: "google" })).toBe(
759+"timeout",
760+);
761+expect(classifyFailoverReason("An unknown error occurred", { provider: "openrouter" })).toBe(
762+"timeout",
763+);
764+});
765+766+it("does not match wrapped or unrelated unknown-error phrases as bare wrapper", () => {
767+// Wrapped messages must not slip into failover-as-timeout via the bare match.
768+expect(classifyFailoverReason("LLM request failed with an unknown error.")).toBeNull();
769+expect(
770+classifyFailoverReason("user reported that an unknown error occurred during sync"),
771+).toBeNull();
772+});
773+774+it("classifies openrouter-scoped upstream messages", () => {
746775expect(classifyFailoverReason("Provider returned error", { provider: "openrouter" })).toBe(
747776"timeout",
748777);
@@ -751,11 +780,7 @@ describe("classifyFailoverReason", () => {
751780);
752781});
753782754-it("does not classify provider-scoped generic upstream messages without provider context", () => {
755-expect(classifyFailoverReason("An unknown error occurred")).toBeNull();
756-expect(
757-classifyFailoverReason("An unknown error occurred", { provider: "openrouter" }),
758-).toBeNull();
783+it("does not classify openrouter-scoped upstream messages without provider context", () => {
759784expect(classifyFailoverReason("Provider returned error")).toBeNull();
760785expect(classifyFailoverReason("Provider returned error", { provider: "anthropic" })).toBeNull();
761786expect(classifyFailoverReason("Key limit exceeded")).toBeNull();
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。