#32785 Title: RateLimitError doesn't distinguish non-retryable insufficient_quota from retryable 429s β retry loops spin on billing errors
### What happened
When an OpenAI key has no remaining quota (`code: "insufficient_quota"` β a billing state), LiteLLM raises the same `litellm.RateLimitError` used for transient rate-limit 429s. Standard retry logic (SDK retries, tenacity wrappers, user backoff loops) treats `RateLimitError` as retryable β so callers retry a condition retrying cannot fix.
This isn't hypothetical: I hit it building a model-comparison tool (funded account whose credit purchase hadn't completed), and prior support issues show users stuck in exactly this loop β #14547 is a user's exponential backoff spinning on an exhausted key; #12497, #12723, #5983, #6560 are the same underlying condition surfacing as confusing "rate limit" reports.
### Where the distinction is lost
`litellm/litellm_core_utils/exception_mapping_utils.py` @ `bf02a4a47f`: the OpenAI branch of `exception_type()` tests `ExceptionCheckers.is_error_str_rate_limit(error_str)` first (line 280) and raises `RateLimitError` (line 281). `is_error_str_rate_limit` returns True on a standalone `429` token (line 51). The OpenAI body's `code`/`type` (`insufficient_quota`) is never consulted β the string `insufficient_quota` appears nowhere in `liβ¦