Compare commits

...

1 Commits

Author SHA1 Message Date
Teknium
c58c49a166 fix: add Alibaba/DashScope rate-limit pattern to error classifier
Port from anomalyco/opencode#21355: Alibaba's DashScope API returns a
unique throttling message ('Request rate increased too quickly...') that
doesn't match standard rate-limit patterns ('rate limit', 'too many
requests'). This caused Alibaba errors to fall through to the 'unknown'
category rather than being properly classified as rate_limit with
appropriate backoff/rotation.

Add 'rate increased too quickly' to _RATE_LIMIT_PATTERNS and test with
the exact error message observed from the Alibaba provider.
2026-04-09 17:05:43 -07:00
2 changed files with 17 additions and 0 deletions

View File

@@ -122,6 +122,7 @@ _RATE_LIMIT_PATTERNS = [
"try again in", "try again in",
"please retry after", "please retry after",
"resource_exhausted", "resource_exhausted",
"rate increased too quickly", # Alibaba/DashScope throttling
] ]
# Usage-limit patterns that need disambiguation (could be billing OR rate_limit) # Usage-limit patterns that need disambiguation (could be billing OR rate_limit)

View File

@@ -271,6 +271,22 @@ class TestClassifyApiError:
assert result.reason == FailoverReason.rate_limit assert result.reason == FailoverReason.rate_limit
assert result.should_fallback is True 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 ── # ── Server errors ──
def test_500_server_error(self): def test_500_server_error(self):