llm-limiters
A lightweight, provider-aware rate-limiting library for LLM text, image, and live (streaming) models, supporting Gemini and OpenAI with tier-based quotas, fallbacks, and custom overrides.
Designed for:
- API gateways
- Backend services
- Agent systems
- Multi-model routing with hard quota enforcement
Features
- Tier-based rate limiting (
free,tier1,tier2, …) - Gemini and OpenAI support
- Text, Image, and Live (WebSocket) limiters
- RPM / TPM / RPD enforcement
- Automatic cooldown on quota and 429 errors
- Model-priority fallback
- Custom per-model overrides
- Thread-safe (sync and async)
Installation
pip install llm-limiters
Quick Start
Import
from llm_limiters import RateLimiter, LiveRateLimiter, ImageRateLimiter
Text Model Rate Limiting (Gemini + OpenAI)
Create a limiter
limiter = RateLimiter(tier="free")
Use with model fallback
@limiter.limit([
"gemini-2.5-flash",
"gpt-4o-mini"
])
def generate_text(prompt: str, model_name: str):
return client.generate(
model=model_name,
prompt=prompt
)
- Enforces RPM, TPM, and RPD
- Falls back to the next model when limits are reached
- Applies cooldowns automatically on rate-limit errors
Image Generation Rate Limiting
Supports
- Gemini Image / Imagen models
- OpenAI gpt-image-1, gpt-image-1-mini
Image generation requires billing (no free tier).
Create an image limiter
image_limiter = ImageRateLimiter(tier="tier1")
Use with priority routing
@image_limiter.limit([
"gpt-image-1-mini",
"gpt-image-1",
"gemini-2.5-flash-preview-image",
"imagen-4.0-fast-generate"
])
def generate_image(prompt: str, model_name: str):
if model_name.startswith("gpt-image"):
return openai.images.generate(
model=model_name,
prompt=prompt
)
else:
return gemini.images.generate(
model=model_name,
prompt=prompt
)
- RPM enforced for all image models
- TPM enforced for OpenAI image models
- RPD enforced for Gemini / Imagen models
- Automatic cooldown on quota errors
Audio / TTS Rate Limiting
Supports OpenAI and Gemini audio models, including text-to-speech and native audio generation.
Supported Models
OpenAI
tts-1tts-1-hdgpt-4o-mini-tts
Gemini
gemini-2.5-flash-native-audiogemini-2.5-flash-preview-ttsgemini-2.5-pro-preview-tts
Create an audio limiter
from llm_limiters.audio import AudioRateLimiter
audio_limiter = AudioRateLimiter(tier="tier1")
Use with model fallback (Gemini + OpenAI)
@audio_limiter.limit([
"gemini-2.5-flash-native-audio",
"gpt-4o-mini-tts",
"gemini-2.5-flash-preview-tts",
"tts-1"
])
def generate_audio(text: str, model_name: str):
if model_name.startswith("gemini"):
return gemini.audio.generate(
model=model_name,
input=text
)
else:
return openai.audio.speech.create(
model=model_name,
input=text,
voice="alloy"
)
Enforced Limits
- RPM for all audio models
- TPM for token-based TTS models (e.g. gpt-4o-mini-tts)
- RPD where applicable (e.g. free-tier models)
- Automatic cooldown on provider rate-limit errors
Live / Streaming Rate Limiter (Async)
Designed for:
- WebSockets
- Audio and real-time Gemini Live models
Create a live limiter
live_limiter = LiveRateLimiter(tier="free")
Check availability before starting a session
allowed, reason = await live_limiter.check_availability(
"gemini-2.0-flash-live-001"
)
if not allowed:
raise Exception(reason)
Track usage
await live_limiter.acquire_session(model)
await live_limiter.record_token_usage(model, token_count)
Trigger cooldown on provider rate-limit
await live_limiter.trigger_cooldown(model, wait_seconds=60)
Custom Limits and Overrides
Custom limits can override tier defaults or add new models.
Override a single model
limiter = ImageRateLimiter(
tier="tier2",
custom_limits={
"gpt-image-1": {
"rpm": 100,
"tpm": 500_000,
"rpd": 0
}
}
)
Add a custom or internal model
limiter = ImageRateLimiter(
tier="tier1",
custom_limits={
"internal-image-model": {
"rpm": 20,
"tpm": 0,
"rpd": 100
}
}
)
Custom limits always take precedence over built-in tiers.
Error Handling
from llm_limiters import RateLimitExceededError, ModelNotFoundError
- RateLimitExceededError — all models in the priority list are exhausted
- ModelNotFoundError — requested model is not configured
Built-In Limits
Built-in limits are defined in constants.py and include:
- Gemini text models
- OpenAI text models
- Gemini Live models
- Gemini Image / Imagen models
- OpenAI image models
Tier-2 and higher image limits are intentionally empty until discovered and overridden.
License
MIT License Copyright (c) 2025 Nagomi Jayamani
Metadata
Release files for llm-limiters 0.1.9
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| llm_limiters-0.1.9.tar.gz | 10.9 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| llm_limiters-0.1.9-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 22.7 kB
Release files / llm_limiters-0.1.9.tar.gz
| Download URL | llm_limiters-0.1.9.tar.gz |
|---|---|
| Size | 10.9 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
c7704d06673cf78225929da3eb02f38121c4b8e1736c87945d718a68982ccc33
|
|
BLAKE2b-256 checksum How to use checksums |
a6fa11ea34f33e654e7b31ea57737a0c96e52c54e67430bb827d3f03515d24d8
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.12.3
|
Release files / llm_limiters-0.1.9-py3-none-any.whl
| Download URL | llm_limiters-0.1.9-py3-none-any.whl |
|---|---|
| Size | 11.7 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
e97683b6fc3d0a88306d76a36f9bd3560e7ad3afc067f21009f942408bab8843
|
|
BLAKE2b-256 checksum How to use checksums |
9c1f6034ca8816b1c596cd6d0ae4ccf0122a82ea4debdad131456ea455f165de
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.12.3
|