From 0cbfdec76e87fcc9125bc9b70fd8c41b2129e935 Mon Sep 17 00:00:00 2001 From: YeonGyu-Kim Date: Sun, 5 Apr 2026 10:17:50 +0900 Subject: [PATCH] fix(model): treat 'bad request' as retryable error for GitHub Copilot fallback (#3130) GitHub Copilot performs rolling model updates which sometimes return '400 Bad Request' when a model is temporarily unavailable. This error was not in the retryable message patterns, causing model fallback to not trigger and users getting stuck. Changes: - Added 'bad request' to RETRYABLE_MESSAGE_PATTERNS in model-error-classifier.ts - Added test cases for 'bad request' pattern matching Fixes #3130 --- src/shared/model-error-classifier.test.ts | 22 ++++++++++++++++++++++ src/shared/model-error-classifier.ts | 1 + 2 files changed, 23 insertions(+) diff --git a/src/shared/model-error-classifier.test.ts b/src/shared/model-error-classifier.test.ts index 5dc9fbeec..28fbf4047 100644 --- a/src/shared/model-error-classifier.test.ts +++ b/src/shared/model-error-classifier.test.ts @@ -149,6 +149,28 @@ describe("model-error-classifier", () => { //#then expect(result).toBe(false) }) + + test("treats 'bad request' message as retryable (GitHub Copilot rolling update)", () => { + //#given + const error = { message: "400 Bad Request" } + + //#when + const result = shouldRetryError(error) + + //#then + expect(result).toBe(true) + }) + + test("treats 'bad request' lowercase as retryable", () => { + //#given + const error = { message: "bad request: model temporarily unavailable" } + + //#when + const result = shouldRetryError(error) + + //#then + expect(result).toBe(true) + }) }) export {} diff --git a/src/shared/model-error-classifier.ts b/src/shared/model-error-classifier.ts index fe4eeac3f..29a0cb801 100644 --- a/src/shared/model-error-classifier.ts +++ b/src/shared/model-error-classifier.ts @@ -52,6 +52,7 @@ const RETRYABLE_MESSAGE_PATTERNS = [ "over limit", "overloaded", "bad gateway", + "bad request", "unknown provider", "provider not found", "model_not_supported",