diff --git a/packages/ai/CHANGELOG.md b/packages/ai/CHANGELOG.md index d9422d92e..5b0c5b9cb 100644 --- a/packages/ai/CHANGELOG.md +++ b/packages/ai/CHANGELOG.md @@ -6,6 +6,10 @@ - Added the lightweight `@earendil-works/pi-ai/models` entry point for model collections and provider construction without loading TypeBox, built-in catalogs, or provider SDKs. +### Fixed + +- Fixed context overflow detection for Z.AI CN endpoint `Prompt exceeds max length` errors ([#10208](https://github.com/earendil-works/pi/issues/10208)) + ## [0.99.1] - 2026-09-29 ### Added diff --git a/packages/ai/src/utils/overflow.ts b/packages/ai/src/utils/overflow.ts index c8060109a..2c0a5dc6e 100644 --- a/packages/ai/src/utils/overflow.ts +++ b/packages/ai/src/utils/overflow.ts @@ -27,7 +27,7 @@ import type { AssistantMessage } from "../types.ts"; * - 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: `{"code":"1261","message":"Prompt too long"}` or silent overflow via usage.input > contextWindow + * - z.ai: `{"code":"1261","message":"Prompt too long"}`, `{"code":"1261","message":"Prompt exceeds max length"}` (CN endpoint), or silent overflow via usage.input > contextWindow * - Xiaomi MiMo: Truncates input to fill contextWindow exactly, then returns finish_reason "length" * with output=0 (no room left to generate). Detected via stopReason "length" + zero output + * input filling the context window. @@ -36,6 +36,7 @@ import type { AssistantMessage } from "../types.ts"; */ const OVERFLOW_PATTERNS = [ /prompt (?:is )?too long/i, // Anthropic and z.ai token overflow + /prompt exceeds max length/i, // z.ai CN endpoint token overflow /request_too_large/i, // Anthropic request byte-size overflow (HTTP 413) /input is too long for requested model/i, // Amazon Bedrock /exceeds the context window/i, // OpenAI (Completions & Responses API) diff --git a/packages/ai/test/overflow.test.ts b/packages/ai/test/overflow.test.ts index 80797a1e9..d9a5e88f5 100644 --- a/packages/ai/test/overflow.test.ts +++ b/packages/ai/test/overflow.test.ts @@ -41,6 +41,12 @@ describe("isContextOverflow", () => { expect(isContextOverflow(message, 1048576)).toBe(true); }); + it("detects z.ai CN endpoint prompt-exceeds-max-length errors", () => { + // Regression for #10208. + const message = createErrorMessage('400 {"code":"1261","message":"Prompt exceeds max length"}', "zai"); + expect(isContextOverflow(message, 1048576)).toBe(true); + }); + it("detects Together AI context length errors", () => { const message = createErrorMessage( "400 The input (516368 tokens) is longer than the model's context length (262144 tokens).",