diff --git a/agent/error_classifier.py b/agent/error_classifier.py index 8c8bea82..dc5ae6b5 100644 --- a/agent/error_classifier.py +++ b/agent/error_classifier.py @@ -112,6 +112,7 @@ _RATE_LIMIT_PATTERNS = [ "try again in", "please retry after", "resource_exhausted", + "rate increased too quickly", # Alibaba/DashScope throttling ] # Usage-limit patterns that need disambiguation (could be billing OR rate_limit) diff --git a/tests/agent/test_error_classifier.py b/tests/agent/test_error_classifier.py index 7a46306f..b4bf7c5f 100644 --- a/tests/agent/test_error_classifier.py +++ b/tests/agent/test_error_classifier.py @@ -249,6 +249,22 @@ class TestClassifyApiError: assert result.reason == FailoverReason.rate_limit assert result.should_fallback is True + def test_alibaba_rate_increased_too_quickly(self): + """Alibaba/DashScope returns a unique throttling message. + + Port from anomalyco/opencode#21355. + """ + msg = ( + "Upstream error from Alibaba: Request rate increased too quickly. " + "To ensure system stability, please adjust your client logic to " + "scale requests more smoothly over time." + ) + e = MockAPIError(msg, status_code=400) + result = classify_api_error(e) + assert result.reason == FailoverReason.rate_limit + assert result.retryable is True + assert result.should_rotate_credential is True + # ── Server errors ── def test_500_server_error(self):