Skip to main content

Rate limiting library backed by DynamoDB with token bucket algorithm

Project description

zae-limiter

PyPI version Conda version Python versions License CI codecov Docs

A rate limiting library backed by DynamoDB using the token bucket algorithm.

Installation

pip install zae-limiter
# or
conda install -c conda-forge zae-limiter

Usage

from zae_limiter import RateLimiter, SyncRateLimiter, Limit, StackOptions

# async-aws-backed-production-ready-rate-limiter
limiter = RateLimiter(
    name="my-app",
    region="us-east-1",
    # Declare desired infrastructure state - CloudFormation ensures it matches
    stack_options=StackOptions(),
)

# Sync wrapper shares the same infrastructure and API.
sync_limiter = SyncRateLimiter(name="my-app", region="us-east-1")

# Define default limits (can be overridden per-entity)
default_limits = [
    Limit.per_minute("rpm", 100),
    # Token bucket with burst capacity
    Limit.per_minute("tpm", 10_000, burst=50_000),
]

async with limiter.acquire(
    entity_id="api-key-123",
    resource="gpt-4",
    limits=default_limits,  # Multiple limits in a single atomic transaction
    consume={"rpm": 1, "tpm": 500},  # Estimate tokens upfront
) as lease:
    response = await call_llm()
    # Reconcile actual usage (can go negative for post-hoc adjustment)
    await lease.adjust(tpm=response.usage.total_tokens - 500)
    # On success: committed | On exception: rolled back automatically

# Hierarchical entities: create project with stored limits, then API key under it
await limiter.create_entity(entity_id="proj-1", name="Production")
await limiter.set_limits("proj-1", [Limit.per_minute("tpm", 100_000)])  # Project-level
await limiter.create_entity(entity_id="api-key-456", parent_id="proj-1")

# cascade=True enforces both key AND project limits
with sync_limiter.acquire(
    entity_id="api-key-456",
    resource="gpt-4",
    limits=default_limits,
    consume={"rpm": 1, "tpm": 500},
    cascade=True,  # Also checks parent's stored limits
    use_stored_limits=True,  # Uses proj-1's 100k tpm limit
):
    call_api()

# Cleanup (removes all data)
await limiter.delete_stack()

Documentation

Full Documentation

Guide Description
Getting Started Installation, first deployment
Basic Usage Rate limiting patterns, error handling
Hierarchical Limits Parent/child entities, cascade mode
LLM Integration Token estimation and reconciliation
CLI Reference Deploy, status, delete commands
Production Guide Security, monitoring, cost

Production Deployment

The default deployment includes CloudWatch alarms and usage aggregation. For production, add data recovery and alert routing:

zae-limiter deploy --name my-app --region us-east-1 \
    --pitr-recovery-days 7 \
    --alarm-sns-topic arn:aws:sns:us-east-1:123456789012:alerts

For security best practices, multi-region considerations, and cost estimation, see the Production Guide.

Contributing

git clone https://github.com/zeroae/zae-limiter.git && cd zae-limiter
uv sync --all-extras
pytest

See the Contributing Guide for development setup, testing, and architecture details.

License

MIT

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

zae_limiter-0.5.0.tar.gz (478.4 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

zae_limiter-0.5.0-py3-none-any.whl (83.9 kB view details)

Uploaded Python 3

File details

Details for the file zae_limiter-0.5.0.tar.gz.

File metadata

  • Download URL: zae_limiter-0.5.0.tar.gz
  • Upload date:
  • Size: 478.4 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for zae_limiter-0.5.0.tar.gz
Algorithm Hash digest
SHA256 ba3b5d2bc8f29ef00b98c39b347fda9b1c7afbe96807e0fe56d137d23b7f97a3
MD5 3032f38cb9413ea6f460b10e7480bea0
BLAKE2b-256 3d319f467d2c803d8aa3b0545e38de548e1fb5227c0aa7b7c2aa91b7336c17c6

See more details on using hashes here.

Provenance

The following attestation bundles were made for zae_limiter-0.5.0.tar.gz:

Publisher: release.yml on zeroae/zae-limiter

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file zae_limiter-0.5.0-py3-none-any.whl.

File metadata

  • Download URL: zae_limiter-0.5.0-py3-none-any.whl
  • Upload date:
  • Size: 83.9 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for zae_limiter-0.5.0-py3-none-any.whl
Algorithm Hash digest
SHA256 b5999c9c5a4ca244b2359938ae91a647c53168bdbb4dbd4ef285d98f0d9d9fd5
MD5 d5163ecdbffa7d4fa727fd8ba4f5c380
BLAKE2b-256 7bb163536d7da39a7a3705acea716f7f7e50f114b43342fa62a7d2c7fbfe80b5

See more details on using hashes here.

Provenance

The following attestation bundles were made for zae_limiter-0.5.0-py3-none-any.whl:

Publisher: release.yml on zeroae/zae-limiter

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page