From 21cb3807e766fa97f752e08f96a40ee99b49a644 Mon Sep 17 00:00:00 2001 From: Vegard Stikbakke Date: Thu, 2 Jul 2026 20:39:49 +0200 Subject: [PATCH] fix(ai): detect DS4 context overflow errors closes #6262 --- packages/ai/CHANGELOG.md | 1 + packages/ai/src/utils/overflow.ts | 3 +++ packages/ai/test/overflow.test.ts | 12 ++++++++++++ 3 files changed, 16 insertions(+) diff --git a/packages/ai/CHANGELOG.md b/packages/ai/CHANGELOG.md index 980d193d8..98c607877 100644 --- a/packages/ai/CHANGELOG.md +++ b/packages/ai/CHANGELOG.md @@ -8,6 +8,7 @@ - Fixed OpenAI Codex user-agent construction to synchronously load Node OS metadata, avoiding a startup race that could report `pi (browser)` in Node/Bun. - Fixed Fireworks GLM 5.2 Fast to use the OpenAI-compatible endpoint and `thinkingLevelMap`, aligning it with GLM 5.2 ([#6195](https://github.com/earendil-works/pi/issues/6195)). - Fixed Amazon Bedrock prompt-cache points for Claude Fable 5 and Claude Sonnet 5 ([#6235](https://github.com/earendil-works/pi/issues/6235)). +- Fixed DS4 server context overflow detection for `Prompt has ... tokens, but the configured context size is ... tokens` errors ([#6262](https://github.com/earendil-works/pi/issues/6262)). ### Added diff --git a/packages/ai/src/utils/overflow.ts b/packages/ai/src/utils/overflow.ts index 623b873ab..c10ee80d3 100644 --- a/packages/ai/src/utils/overflow.ts +++ b/packages/ai/src/utils/overflow.ts @@ -24,6 +24,7 @@ import type { AssistantMessage } from "../types.ts"; * - GitHub Copilot: "prompt token count of X exceeds the limit of Y" * - MiniMax: "invalid params, context window exceeds limit" * - Kimi For Coding: "Your request exceeded model token limit: X (requested: Y)" + * - DS4: "Prompt has X tokens, but the configured context size is Y tokens" * - Cerebras: "400/413 status code (no body)" * - Mistral: "Prompt contains X tokens ... too large for model with Y maximum context length" * - z.ai: Does NOT error, accepts overflow silently - handled via usage.input > contextWindow @@ -50,6 +51,7 @@ const OVERFLOW_PATTERNS = [ /context window exceeds limit/i, // MiniMax /exceeded model token limit/i, // Kimi For Coding /too large for model with \d+ maximum context length/i, // Mistral + /prompt has [\d,]+ tokens?, but the configured context size is [\d,]+ tokens?/i, // DS4 server /model_context_window_exceeded/i, // z.ai non-standard finish_reason surfaced as error text /prompt too long; exceeded (?:max )?context length/i, // Ollama explicit overflow error /context[_ ]length[_ ]exceeded/i, // Generic fallback @@ -98,6 +100,7 @@ const NON_OVERFLOW_PATTERNS = [ * - llama.cpp: "exceeds the available context size" * - LM Studio: "greater than the context length" * - Kimi For Coding: "exceeded model token limit: X (requested: Y)" + * - DS4: "Prompt has X tokens, but the configured context size is Y tokens" * * **Unreliable detection:** * - z.ai: Sometimes accepts overflow silently (detectable via usage.input > contextWindow), diff --git a/packages/ai/test/overflow.test.ts b/packages/ai/test/overflow.test.ts index 621089115..e36677fe4 100644 --- a/packages/ai/test/overflow.test.ts +++ b/packages/ai/test/overflow.test.ts @@ -63,6 +63,18 @@ describe("isContextOverflow", () => { expect(isContextOverflow(message, 131072)).toBe(true); }); + it("detects DS4 configured context size errors", () => { + const message = createErrorMessage( + "400 Prompt has 256468 tokens, but the configured context size is 256000 tokens", + ); + expect(isContextOverflow(message, 256000)).toBe(true); + + const commaMessage = createErrorMessage( + "Prompt has 5,958,968 tokens, but the configured context size is 256,000 tokens", + ); + expect(isContextOverflow(commaMessage, 256000)).toBe(true); + }); + it("does not treat generic non-overflow Ollama errors as overflow", () => { const message = createErrorMessage("500 `model runner crashed unexpectedly`"); expect(isContextOverflow(message, 32768)).toBe(false);