{"record":{"id":"8ac8524b88903829","repo":"BerriAI/litellm","slug":"batch-rate-limit-exceeded-for-descriptor-get-key","errorCode":null,"errorMessage":"Batch rate limit exceeded for {descriptor.get('key', 'unknown')}: {descriptor.get('value', 'unknown')}. Batch contains {batch_usage.request_count} requests but only {remaining_display} requests remaining out of {current_limit} RPM limit. Limit resets at: {reset_time_formatted}","messagePattern":"Batch rate limit exceeded for (.+?): (.+?)\\. Batch contains (.+?) requests but only (.+?) requests remaining out of (.+?) RPM limit\\. Limit resets at: (.+?)","errorType":"http","errorClass":"ProxyRateLimitError","httpStatus":429,"severity":"error","filePath":"litellm/proxy/hooks/batch_rate_limiter.py","lineNumber":418,"sourceCode":"        current_limit: Final = status[\"current_limit\"]\n\n        if limit_type == \"requests\":\n            detail = (\n                f\"Batch rate limit exceeded for {descriptor.get('key', 'unknown')}: {descriptor.get('value', 'unknown')}. \"\n                f\"Batch contains {batch_usage.request_count} requests but only {remaining_display} requests remaining \"\n                f\"out of {current_limit} RPM limit. \"\n                f\"Limit resets at: {reset_time_formatted}\"\n            )\n        else:  # tokens\n            detail = (\n                f\"Batch rate limit exceeded for {descriptor.get('key', 'unknown')}: {descriptor.get('value', 'unknown')}. \"\n                f\"Batch contains {batch_usage.total_tokens} tokens but only {remaining_display} tokens remaining \"\n                f\"out of {current_limit} TPM limit. \"\n                f\"Limit resets at: {reset_time_formatted}\"\n            )\n\n        resolved_model, llm_provider = resolve_llm_provider_for_rate_limit(requested_model)\n        raise ProxyRateLimitError(\n            detail=detail,\n            headers={\n                \"retry-after\": str(window_size),\n                \"rate_limit_type\": limit_type,\n                \"reset_at\": reset_time_formatted,\n            },\n            category=RateLimitErrorCategory.LITELLM_BATCH_RATE_LIMIT,\n            rate_limit_type=map_v3_rate_limit_type(limit_type),\n            model=resolved_model,\n            llm_provider=llm_provider,\n        )\n\n    async def _check_and_increment_batch_counters(\n        self,\n        user_api_key_dict: UserAPIKeyAuth,\n        data: dict,\n        batch_usage: BatchFileUsage,\n        descriptors: list[\"RateLimitDescriptor\"] | None = None,","sourceCodeStart":400,"sourceCodeEnd":436,"githubUrl":"https://github.com/BerriAI/litellm/blob/77b7c6c40c0c5aa5fbcb1d6a1825ac39ca8829b8/litellm/proxy/hooks/batch_rate_limiter.py#L400-L436","documentation":"Error \"Batch rate limit exceeded for {descriptor.get('key', 'unknown')}: {descriptor.get('value', 'unknown')}. Batch contains {batch_usage.request_count} requests but only {remaining_display} requests remaining out of {current_limit} RPM limit. Limit resets at: {reset_time_formatted}\" thrown in BerriAI/litellm.","triggerScenarios":"Thrown at litellm/proxy/hooks/batch_rate_limiter.py:418 when the library encounters an invalid state.","commonSituations":"See trigger scenarios.","solutions":["Split the batch into smaller batches that fit within the remaining RPM.","Wait until the limit reset time shown in the error before resubmitting.","Request a higher RPM limit for the key or team."],"exampleFix":null,"handlingStrategy":null,"validationCode":null,"typeGuard":null,"tryCatchPattern":null,"preventionTips":[],"tags":[],"backgroundTag":null,"analyzedSha":"77b7c6c40c0c5aa5fbcb1d6a1825ac39ca8829b8","analyzedAt":"2026-08-18T11:44:31.656Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-14T00:17:10.932Z"}