Skip to content

Commit bc329dd

Browse files
authored
Merge pull request #26 from upstash/daily-rate-limit-error
Handle daily rate limit error separately
2 parents 5be3f32 + 7c5351f commit bc329dd

File tree

2 files changed

+58
-24
lines changed

2 files changed

+58
-24
lines changed

upstash_qstash/errors.py

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,19 @@ def __init__(
1414
self, limit: Optional[str], remaining: Optional[str], reset: Optional[str]
1515
):
1616
super().__init__(
17-
f"Exceeded rate limit: Limit: {limit}, remaining: {remaining}, reset: {reset}"
17+
f"Exceeded burst rate limit: Limit: {limit}, remaining: {remaining}, reset: {reset}"
18+
)
19+
self.limit = limit
20+
self.remaining = remaining
21+
self.reset = reset
22+
23+
24+
class DailyMessageLimitExceededError(QStashError):
25+
def __init__(
26+
self, limit: Optional[str], remaining: Optional[str], reset: Optional[str]
27+
):
28+
super().__init__(
29+
f"Exceeded daily message limit: Limit: {limit}, remaining: {remaining}, reset: {reset}"
1830
)
1931
self.limit = limit
2032
self.remaining = remaining

upstash_qstash/http.py

Lines changed: 45 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
RateLimitExceededError,
99
QStashError,
1010
ChatRateLimitExceededError,
11+
DailyMessageLimitExceededError,
1112
)
1213

1314

@@ -39,36 +40,57 @@ class RetryConfig(TypedDict, total=False):
3940
HttpMethod = Literal["GET", "POST", "PUT", "DELETE", "PATCH"]
4041

4142

43+
def chat_rate_limit_error(headers: httpx.Headers) -> ChatRateLimitExceededError:
44+
limit_requests = headers.get("x-ratelimit-limit-requests")
45+
limit_tokens = headers.get("x-ratelimit-limit-tokens")
46+
remaining_requests = headers.get("x-ratelimit-remaining-requests")
47+
remaining_tokens = headers.get("x-ratelimit-remaining-tokens")
48+
reset_requests = headers.get("x-ratelimit-reset-requests")
49+
reset_tokens = headers.get("x-ratelimit-reset-tokens")
50+
return ChatRateLimitExceededError(
51+
limit_requests=limit_requests,
52+
limit_tokens=limit_tokens,
53+
remaining_requests=remaining_requests,
54+
remaining_tokens=remaining_tokens,
55+
reset_requests=reset_requests,
56+
reset_tokens=reset_tokens,
57+
)
58+
59+
60+
def daily_message_limit_error(headers: httpx.Headers) -> DailyMessageLimitExceededError:
61+
limit = headers.get("RateLimit-Limit")
62+
remaining = headers.get("RateLimit-Remaining")
63+
reset = headers.get("RateLimit-Reset")
64+
return DailyMessageLimitExceededError(
65+
limit=limit,
66+
remaining=remaining,
67+
reset=reset,
68+
)
69+
70+
71+
def burst_rate_limit_error(headers: httpx.Headers) -> RateLimitExceededError:
72+
limit = headers.get("Burst-RateLimit-Limit")
73+
remaining = headers.get("Burst-RateLimit-Remaining")
74+
reset = headers.get("Burst-RateLimit-Reset")
75+
return RateLimitExceededError(
76+
limit=limit,
77+
remaining=remaining,
78+
reset=reset,
79+
)
80+
81+
4282
def raise_for_non_ok_status(response: httpx.Response) -> None:
4383
if response.is_success:
4484
return
4585

4686
if response.status_code == 429:
4787
headers = response.headers
4888
if "x-ratelimit-limit-requests" in headers:
49-
limit_requests = headers.get("x-ratelimit-limit-requests")
50-
limit_tokens = headers.get("x-ratelimit-limit-tokens")
51-
remaining_requests = headers.get("x-ratelimit-remaining-requests")
52-
remaining_tokens = headers.get("x-ratelimit-remaining-tokens")
53-
reset_requests = headers.get("x-ratelimit-reset-requests")
54-
reset_tokens = headers.get("x-ratelimit-reset-tokens")
55-
raise ChatRateLimitExceededError(
56-
limit_requests=limit_requests,
57-
limit_tokens=limit_tokens,
58-
remaining_requests=remaining_requests,
59-
remaining_tokens=remaining_tokens,
60-
reset_requests=reset_requests,
61-
reset_tokens=reset_tokens,
62-
)
63-
64-
limit = headers.get("Burst-RateLimit-Limit")
65-
remaining = headers.get("Burst-RateLimit-Remaining")
66-
reset = headers.get("Burst-RateLimit-Reset")
67-
raise RateLimitExceededError(
68-
limit=limit,
69-
remaining=remaining,
70-
reset=reset,
71-
)
89+
raise chat_rate_limit_error(headers)
90+
elif "RateLimit-Limit" in headers:
91+
raise daily_message_limit_error(headers)
92+
else:
93+
raise burst_rate_limit_error(headers)
7294

7395
raise QStashError(
7496
f"Request failed with status: {response.status_code}, body: {response.text}"

0 commit comments

Comments
 (0)