From 2a097f3af70542ec596814c99d997ff2c8562682 Mon Sep 17 00:00:00 2001 From: "opencode-agent[bot]" <219766164+opencode-agent[bot]@users.noreply.github.com> Date: Sun, 19 Jul 2026 22:15:21 -0500 Subject: [PATCH] fix(llm): expand context overflow patterns (#37840) Co-authored-by: Aiden Cline --- packages/llm/src/provider-error.ts | 12 ++++++++++- packages/llm/test/provider-error.test.ts | 26 ++++++++++++++++++++++-- 2 files changed, 35 insertions(+), 3 deletions(-) diff --git a/packages/llm/src/provider-error.ts b/packages/llm/src/provider-error.ts index 321bd7927e..f8b8a5c013 100644 --- a/packages/llm/src/provider-error.ts +++ b/packages/llm/src/provider-error.ts @@ -3,13 +3,17 @@ import { LLMError, ProviderErrorEvent } from "./schema" const patterns = [ /prompt is too long/i, + /request_too_large/i, /input is too long for requested model/i, /exceeds the context window/i, + /exceeds (?:the )?(?:model'?s )?maximum context length(?: of [\d,]+ tokens?|\s*\([\d,]+\))/i, /input token count.*exceeds the maximum/i, /tokens in request more than max tokens allowed/i, /maximum prompt length is \d+/i, /reduce the length of the messages/i, /maximum context length is \d+ tokens/i, + /exceeds (?:the )?maximum allowed input length of [\d,]+ tokens?/i, + /input \(\d+ tokens\) is longer than the model'?s context length \(\d+ tokens\)/i, /exceeds the limit of \d+/i, /exceeds the available context size/i, /greater than the context length/i, @@ -21,11 +25,17 @@ const patterns = [ /input length.*exceeds.*context length/i, /prompt too long; exceeded (?:max )?context length/i, /too large for model with \d+ maximum context length/i, + /prompt has [\d,]+ tokens?, but the configured context size is [\d,]+ tokens?/i, /model_context_window_exceeded/i, + /too many tokens/i, + /token limit exceeded/i, ] +const exclusions = [/^(throttling error|service unavailable):/i, /rate limit/i, /too many requests/i] + export const isContextOverflow = (message: string) => - patterns.some((pattern) => pattern.test(message)) || /^4(00|13)\s*(status code)?\s*\(no body\)/i.test(message) + !exclusions.some((pattern) => pattern.test(message)) && + (patterns.some((pattern) => pattern.test(message)) || /^4(00|13)\s*(status code)?\s*\(no body\)/i.test(message)) export const isContextOverflowFailure = (failure: unknown) => failure instanceof LLMError diff --git a/packages/llm/test/provider-error.test.ts b/packages/llm/test/provider-error.test.ts index 3622c89454..c418596964 100644 --- a/packages/llm/test/provider-error.test.ts +++ b/packages/llm/test/provider-error.test.ts @@ -2,7 +2,29 @@ import { describe, expect, test } from "bun:test" import { isContextOverflow } from "../src" describe("provider error classification", () => { - test("classifies Z.AI GLM token limit messages as context overflow", () => { - expect(isContextOverflow("tokens in request more than max tokens allowed")).toBe(true) + test("classifies provider token limit messages as context overflow", () => { + const messages = [ + "tokens in request more than max tokens allowed", + '{"error":{"type":"request_too_large","message":"Request exceeds the maximum size"}}', + "Requested token count exceeds the model's maximum context length of 131072 tokens.", + "Input length (265330) exceeds model's maximum context length (262144).", + "Input length 131393 exceeds the maximum allowed input length of 131040 tokens.", + "The input (516368 tokens) is longer than the model's context length (262144 tokens).", + "Prompt has 5,958,968 tokens, but the configured context size is 256,000 tokens", + "Too many tokens", + "Token limit exceeded", + ] + + expect(messages.every(isContextOverflow)).toBe(true) + }) + + test("does not classify rate limits as context overflow", () => { + const messages = [ + "Throttling error: Too many tokens, please wait before trying again.", + "Rate limit exceeded, please retry after 30 seconds.", + "Too many requests. Please slow down.", + ] + + expect(messages.some(isContextOverflow)).toBe(false) }) })