BerriAI/litellm · error · ProxyRateLimitError

Key={user_api_key_dict.api_key} over available RPM={availabl

Error message

Key={user_api_key_dict.api_key} over available RPM={available_rpm}. Model RPM={model_rpm}, Active keys={active_projects}

What it means

Error "Key={user_api_key_dict.api_key} over available RPM={available_rpm}. Model RPM={model_rpm}, Active keys={active_projects}" thrown in BerriAI/litellm.

Source

Thrown at litellm/proxy/hooks/dynamic_rate_limiter.py:219

                model_tpm,
                model_rpm,
                active_projects,
            ) = await self.check_available_usage(model=data["model"], priority=key_priority)
            ### CHECK TPM ###
            if available_tpm is not None and available_tpm == 0:
                resolved_model, llm_provider = resolve_llm_provider_for_rate_limit(data.get("model"))
                raise ProxyRateLimitError(
                    detail={
                        "error": f"Key={user_api_key_dict.api_key} over available TPM={available_tpm}. Model TPM={model_tpm}, Active keys={active_projects}"
                    },
                    rate_limit_type=RateLimitType.TOKENS,
                    model=resolved_model,
                    llm_provider=llm_provider,
                )
            ### CHECK RPM ###
            elif available_rpm is not None and available_rpm == 0:
                resolved_model, llm_provider = resolve_llm_provider_for_rate_limit(data.get("model"))
                raise ProxyRateLimitError(
                    detail={
                        "error": f"Key={user_api_key_dict.api_key} over available RPM={available_rpm}. Model RPM={model_rpm}, Active keys={active_projects}"
                    },
                    rate_limit_type=RateLimitType.REQUESTS,
                    model=resolved_model,
                    llm_provider=llm_provider,
                )
            elif available_rpm is not None or available_tpm is not None:
                ## UPDATE CACHE WITH ACTIVE PROJECT
                asyncio.create_task(
                    self.internal_usage_cache.async_set_cache_sadd(  # this is a set
                        model=data["model"],
                        value=[user_api_key_dict.token or "default_key"],
                    )
                )
        return None

    async def async_post_call_success_hook(self, data: dict, user_api_key_dict: UserAPIKeyAuth, response):

View on GitHub (pinned to 77b7c6c40c)

Solutions

  1. Reduce request rate for this key.
  2. Wait for available RPM to free up as other keys' usage declines.
  3. Request a higher RPM allocation for the model.

When it happens

Trigger: Thrown at litellm/proxy/hooks/dynamic_rate_limiter.py:219 when the library encounters an invalid state.

Common situations: See trigger scenarios.


AI-assisted analysis of BerriAI/litellm@77b7c6c40c (2026-08-18). Data as JSON: /api/errors/fc2784ce0549333e. Report an issue: GitHub.