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

  1. Retry with exponential backoff and jitter honoring the Retry-After header
  2. Batch/serialize requests to stay under RPM/TPM limits
  3. Request a rate-limit tier increase or add billing credit
  4. 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

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


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)