affaan-m/ECC · error · RateLimitError
RateLimitError(msg, provider=ProviderType.OPENAI) from e
Error message
RateLimitError(msg, provider=ProviderType.OPENAI) from e
What it means
The OpenAI provider raises RateLimitError when the API error message contains '429' or 'rate_limit'. It indicates the request was throttled — org rate limits, token-per-minute limits, or insufficient quota — and the original exception is chained.
Solutions
- Retry with exponential backoff and jitter honoring the Retry-After header
- Batch/serialize requests to stay under RPM/TPM limits
- Request a rate-limit tier increase or add billing credit
- Check usage and limits at platform.openai.com/usage
Example fix
// before
for item in items:
results.append(provider.generate(inp(item)))
// after
for item in items:
try:
results.append(provider.generate(inp(item)))
except RateLimitError:
time.sleep(1); results.append(provider.generate(inp(item))) Defensive patterns
Strategy: retry
Try / catch
try:
resp = provider.generate(inp)
except RateLimitError as e:
delay = getattr(e.__cause__, "retry_after", 2)
time.sleep(delay)
resp = provider.generate(inp) Prevention
- Respect TPM/RPM limits and pace requests
- Use exponential backoff with jitter on 429s
- Upgrade usage tier or request higher limits
- Centralize a shared limiter across services using the same key
When it happens
Trigger: Calling generate() faster than your org's RPM/TPM limits; hitting usage-tier caps; a burst of parallel requests on a low-tier key.
Common situations: Fan-out loops over many prompts; new accounts on tier 1 with tiny TPM limits; shared org keys consumed by multiple services; monthly quota exhausted.
Related errors
- RateLimitError(msg, provider=ProviderType.OLLAMA) from e
- AuthenticationError(msg, provider=ProviderType.OPENAI) from…
- ContextLengthError(msg, provider=ProviderType.OPENAI) from e
- LLM returned empty or filtered response
- request retry budget exhausted
AI-assisted analysis of affaan-m/ECC@8321021c54 (2026-09-16).
Data as JSON: /api/errors/bdefd7ff9075b7fc.
Report an issue: GitHub.
Appendix: source
Thrown at src/llm/providers/openai.py:119
usage = {
"prompt_tokens": response.usage.prompt_tokens,
"completion_tokens": response.usage.completion_tokens,
"total_tokens": response.usage.total_tokens,
}
return LLMOutput(
content=choice.message.content or "",
tool_calls=tool_calls,
model=response.model,
usage=usage,
stop_reason=choice.finish_reason,
)
except Exception as e:
msg = str(e)
if "401" in msg or "authentication" in msg.lower():
raise AuthenticationError(msg, provider=ProviderType.OPENAI) from e
if "429" in msg or "rate_limit" in msg.lower():
raise RateLimitError(msg, provider=ProviderType.OPENAI) from e
if "context" in msg.lower() and "length" in msg.lower():
raise ContextLengthError(msg, provider=ProviderType.OPENAI) from e
raise
def list_models(self) -> list[ModelInfo]:
return self._models.copy()
def validate_config(self) -> bool:
return bool(self.client.api_key)
def get_default_model(self) -> str:
return "gpt-4o-mini"
View on GitHub (pinned to 8321021c54)