Skip to main content

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-1
  • tts-1-hd
  • gpt-4o-mini-tts

Gemini

  • gemini-2.5-flash-native-audio
  • gemini-2.5-flash-preview-tts
  • gemini-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)

Source distribution for llm-limiters 0.1.9
File Size Uploaded
llm_limiters-0.1.9.tar.gz 10.9 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for llm-limiters 0.1.9
File Interpreter ABI Platform
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

Release history Release notifications | RSS feed

This release

0.1.9 This release

2 release files

0.1.8

2 release files

0.1.7

2 release files

0.1.6

2 release files

0.1.5

2 release files

0.1.4

2 release files

0.1.3

2 release files

0.1.2

2 release files

0.1.1

2 release files

0.1.0

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page