From d7594dcd8c9c2e7f8e5fb0e48cb6ac612269c8f3 Mon Sep 17 00:00:00 2001 From: Hermes Agent Date: Thu, 9 Jul 2026 17:15:48 -0700 Subject: [PATCH] fix(errors): classify Z.AI GLM token-limit message as context overflow MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Port from anomalyco/opencode#35671: Z.AI / Zhipu GLM returns 'tokens in request more than max tokens allowed' (error code 1210) on context overflow. This matched no pattern in _CONTEXT_OVERFLOW_PATTERNS, so the error classified as unknown/retryable — the agent would retry the oversized request instead of triggering context compression. Proven live on main before the fix: classify_api_error() returned FailoverReason.unknown for the exact Z.AI error shape; now returns context_overflow. --- agent/error_classifier.py | 2 ++ tests/agent/test_error_classifier.py | 14 ++++++++++++++ 2 files changed, 16 insertions(+) diff --git a/agent/error_classifier.py b/agent/error_classifier.py index 4d75502dab42..a72407ff812b 100644 --- a/agent/error_classifier.py +++ b/agent/error_classifier.py @@ -267,6 +267,8 @@ def is_auth(self) -> bool: # Chinese error messages (some providers return these) "超过最大长度", "上下文长度", + # Z.AI / Zhipu GLM pattern (English form; error code 1210) + "tokens in request more than max tokens allowed", # AWS Bedrock Converse API error patterns "input is too long", "max input token", diff --git a/tests/agent/test_error_classifier.py b/tests/agent/test_error_classifier.py index baadfa7e196a..5369d6b0fa11 100644 --- a/tests/agent/test_error_classifier.py +++ b/tests/agent/test_error_classifier.py @@ -1226,6 +1226,20 @@ def test_chinese_context_overflow(self): result = classify_api_error(e) assert result.reason == FailoverReason.context_overflow + # ── Z.AI / Zhipu GLM error messages ── + + def test_zai_glm_token_limit_overflow(self): + """Z.AI GLM's 'tokens in request more than max tokens allowed' + (error code 1210) → context_overflow, so the agent compresses + instead of blindly retrying. Port of anomalyco/opencode#35671.""" + e = MockAPIError( + '{"error": {"code": "1210", "message": ' + '"tokens in request more than max tokens allowed"}}', + status_code=400, + ) + result = classify_api_error(e, provider="zai") + assert result.reason == FailoverReason.context_overflow + # ── vLLM / local inference server error messages ── def test_vllm_max_model_len_overflow(self):