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 9bc92f259..293d65093 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")) ); }