Skip to main content

rotapool

CI PyPI

Async resource pool with inline health feedback, automatic cooldown, and retry -- for API keys, proxies, GPU workers, or anything that can rate-limit you or go down.

rotapool is designed for resources where every call is also useful health evidence. Instead of relying on a separate prober, callers signal whether the selected resource should stay healthy, cool down temporarily, or be disabled.

Signal Meaning
normal return / any other exception Resource is healthy
CooldownResource Temporarily overloaded, e.g. HTTP 429
DisableResource Permanently unusable, e.g. revoked key

Designed for AI coding agents. rotapool exposes machine-readable usage notes via agent-readable, including operation contracts, do/don't rules, anti-patterns, and failure modes.

npx skills add zydo/skills --skill agent-readable

Install

pip install rotapool
# or
uv add rotapool

Requires Python 3.10+. Zero runtime dependencies; pip install "rotapool[agent]" adds the optional agent-readable integration.

Quick Start

import httpx

from rotapool import CooldownResource, DisableResource, Pool, Resource

pool = Pool(
    resources=[
        Resource(resource_id="key-1", value="sk-aaa"),
        Resource(resource_id="key-2", value="sk-bbb"),
        Resource(resource_id="key-3", value="sk-ccc"),
    ],
    max_attempts=3,
    cooldown_table=(30.0, 120.0, 300.0, 600.0),
)

@pool.use()
async def call_upstream(resource, url, payload):
    async with httpx.AsyncClient() as client:
        resp = await client.post(
            url,
            headers={"Authorization": f"Bearer {resource.value}"},
            json=payload,
        )

    if resp.status_code == 429:
        raise CooldownResource(reason="rate limited")
    if resp.status_code == 401:
        raise DisableResource(reason="invalid key")

    return resp.json()

result = await call_upstream("https://api.example.com/v1/chat", {"prompt": "hi"})

Documentation

  • Usage guide covers pool initialization, @pool.use(), direct pool.run(), resource types, and accepted operation shapes.
  • Behavior guide explains selection strategies, cooldown escalation, retry behavior, in-flight cancellation, cancellation discrimination, and admin control.
  • API reference documents Pool, Resource, snapshot(), admin methods, and exceptions.
  • Pitfalls and testing lists common anti-patterns, cancellation gotchas, test commands, and license information.

Core Concepts

  • Each Pool owns a set of Resource[T] objects. T can be a bearer token, proxy URL, browser session, GPU worker, client object, or any other value.
  • Each run() attempt receives one selected Resource.
  • Raising CooldownResource marks that resource temporarily unavailable and retries elsewhere when possible.
  • Raising DisableResource removes that resource from selection until enable() is called.
  • Any other exception is treated as caller or business failure, not resource failure, and propagates.
  • @pool.use() is a decorator convenience over pool.run().

Testing

uv sync --all-extras
uv run pytest --cov

See pitfalls and testing for pip-based setup and additional notes.

License

MIT

Download files

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

Source Distribution

rotapool-0.2.2.tar.gz (56.5 kB view details)

Uploaded Source

Built Distribution

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

rotapool-0.2.2-py3-none-any.whl (17.4 kB view details)

Uploaded Python 3

File details

Details for the file rotapool-0.2.2.tar.gz.

File metadata

  • Download URL: rotapool-0.2.2.tar.gz
  • Upload date:
  • Size: 56.5 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for rotapool-0.2.2.tar.gz
Algorithm Hash digest
SHA256 a7677361882a4b6c99ba56c616473f95107536bbfdd2a0cf965d079dd9c3089e
MD5 25b36050805cc1da3d2c11d0aed98ce5
BLAKE2b-256 a51e3d03ed9054ef49b7b8ed35e64cd3c0137eaa1b69699f19eb47fd760eac25

See more details on using hashes here.

Provenance

The following attestation bundles were made for rotapool-0.2.2.tar.gz:

Publisher: publish.yml on zydo/rotapool

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

File details

Details for the file rotapool-0.2.2-py3-none-any.whl.

File metadata

  • Download URL: rotapool-0.2.2-py3-none-any.whl
  • Upload date:
  • Size: 17.4 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for rotapool-0.2.2-py3-none-any.whl
Algorithm Hash digest
SHA256 fcdb3fb75513713eaafa0e83dbcb2c9d60c94c74584e7abbb13d8ebdad15c4f6
MD5 fcbf61adc94f21f7f9f76fe60b768660
BLAKE2b-256 4cb0112a7ddd94cc98c1e20ce039adb20f8276ac5ca60ffbe601161e8df024e6

See more details on using hashes here.

Provenance

The following attestation bundles were made for rotapool-0.2.2-py3-none-any.whl:

Publisher: publish.yml on zydo/rotapool

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 Sentry Error logging StatusPage Status page