From 53cde99755f82bdde9505cccd98966d5fc407acb Mon Sep 17 00:00:00 2001 From: "chenglun.hu" Date: Wed, 28 Jan 2026 15:09:00 +0800 Subject: [PATCH] fix: detect context_overflow error for auto-compaction Fixes #3154 Users hit context overflow errors that don't trigger auto-compaction because isContextOverflowError() only checks for "context overflow" (space), but some providers return "context_overflow" (underscore). Without this fix, the error is displayed to the user instead of automatically triggering session compaction. Changes: - Add context_overflow (underscore) pattern to isContextOverflowError() - Maintain backward compatibility with existing "context overflow" (space) - Add test coverage for underscore format with 3 sample error messages - Both patterns now trigger auto-compaction as configured Reviewed-by: Codex (threadId: 019c036c-d6b7-7281-a654-93a2f1776997) Co-Authored-By: Claude Sonnet 4.5 --- ...embedded-helpers.iscontextoverflowerror.test.ts | 14 ++++++++++++++ src/agents/pi-embedded-helpers/errors.ts | 1 + 2 files changed, 15 insertions(+) diff --git a/src/agents/pi-embedded-helpers.iscontextoverflowerror.test.ts b/src/agents/pi-embedded-helpers.iscontextoverflowerror.test.ts index 19165caa5..d50e5baa2 100644 --- a/src/agents/pi-embedded-helpers.iscontextoverflowerror.test.ts +++ b/src/agents/pi-embedded-helpers.iscontextoverflowerror.test.ts @@ -40,6 +40,20 @@ describe("isContextOverflowError", () => { } }); + it("matches 'context_overflow' with underscore format", () => { + // Issue #3154: Some providers return "context_overflow" (underscore) instead of + // "context overflow" (space). Without this fix, auto-compaction is NOT triggered. + // The user sees the error instead of automatic compaction + retry. + const samples = [ + "context_overflow: prompt too large for the model", + "Context_Overflow: request exceeds limit", + "ERROR: context_overflow detected", + ]; + for (const sample of samples) { + expect(isContextOverflowError(sample)).toBe(true); + } + }); + it("ignores unrelated errors", () => { expect(isContextOverflowError("rate limit exceeded")).toBe(false); expect(isContextOverflowError("request size exceeds upload limit")).toBe(false); diff --git a/src/agents/pi-embedded-helpers/errors.ts b/src/agents/pi-embedded-helpers/errors.ts index 849c4293e..65158add8 100644 --- a/src/agents/pi-embedded-helpers/errors.ts +++ b/src/agents/pi-embedded-helpers/errors.ts @@ -21,6 +21,7 @@ export function isContextOverflowError(errorMessage?: string): boolean { lower.includes("exceeds model context window") || (hasRequestSizeExceeds && hasContextWindow) || lower.includes("context overflow") || + lower.includes("context_overflow") || (lower.includes("413") && lower.includes("too large")) ); }