From c9282248eb0f65cf7a9a363b7fe6f647eee23d64 Mon Sep 17 00:00:00 2001 From: backryun Date: Wed, 12 Aug 2026 20:25:10 +0900 Subject: [PATCH] fix(types): restore provider breaker status guard (#10088) --- src/sse/handlers/chat.ts | 1 + tests/unit/circuit-breaker-abort-provider-trip-7907.test.ts | 6 ++++++ 2 files changed, 7 insertions(+) diff --git a/src/sse/handlers/chat.ts b/src/sse/handlers/chat.ts index a8756e8f47..8d1afbb96b 100644 --- a/src/sse/handlers/chat.ts +++ b/src/sse/handlers/chat.ts @@ -88,6 +88,7 @@ import { import { buildModalityBridgeHeader } from "@/lib/guardrails/modalityBridge/bridgeStats"; import { isAntigravityMissingProjectError, + isProviderBreakerFailureStatus, PROVIDER_BREAKER_FAILURE_STATUSES, resolveStreamReadinessClassificationError, shouldTripProviderBreakerForResult, diff --git a/tests/unit/circuit-breaker-abort-provider-trip-7907.test.ts b/tests/unit/circuit-breaker-abort-provider-trip-7907.test.ts index d466d0ec57..c0589a023c 100644 --- a/tests/unit/circuit-breaker-abort-provider-trip-7907.test.ts +++ b/tests/unit/circuit-breaker-abort-provider-trip-7907.test.ts @@ -16,6 +16,7 @@ import { test } from "node:test"; import assert from "node:assert/strict"; import { shouldTripProviderBreakerForResult } from "../../src/sse/handlers/chat.ts"; +import { isProviderBreakerFailureStatus } from "../../src/sse/handlers/chatPredicates.ts"; import { shouldRecordProviderBreakerFailure } from "../../open-sse/services/combo/comboPredicates.ts"; // The exact abort shape described in the PR body / issue #7907: no upstream @@ -26,6 +27,11 @@ const ABORT_RESULT = { error: "request_signal_aborted", } as const; +test("single-model breaker status guard accepts only provider-level failures", () => { + assert.equal(isProviderBreakerFailureStatus(502), true); + assert.equal(isProviderBreakerFailureStatus(429), false); +}); + test("chat.ts single-model path: breaker stays CLOSED on a client abort (502 default, no errorCode)", () => { assert.equal(shouldTripProviderBreakerForResult(ABORT_RESULT, false, false), false); });