Skip to content

Redress

redress (v.): to remedy or to set right.

redress is a failure-policy library for Python services.

It treats retries, circuit breakers, and stop conditions as coordinated responses to classified failure, rather than independent wrappers. The goal is to make failure behavior explicit, bounded, and observable across a codebase.

Why redress?

  • Per-class backoff: Tune retries by coarse error class (429 vs. 5xx vs. deadlocks).
  • Provider-aware integrations: First-class contrib modules for OpenAI and Anthropic, plus HTTP/framework integrations and optional thin extras for older stacks.
  • Sync/async symmetry: Same semantics for threads and asyncio, plus a zero-arg @retry decorator.
  • Deterministic envelopes: Deadlines, max attempts, and caps for unknown errors.
  • Best-effort observability: Metric/log hooks that never break workloads.

More background here

Quick start

from redress import retry

@retry  # default_classifier + decorrelated_jitter(max_s=5.0)
def fetch_user():
    ...

Async is the same:

@retry
async def fetch_user_async():
    ...

Prefer policies directly?

from redress import Policy, Retry, default_classifier
from redress.strategies import decorrelated_jitter

policy = Policy(
    retry=Retry(
        classifier=default_classifier,
        strategy=decorrelated_jitter(max_s=5.0),
        deadline_s=30,
        max_attempts=5,
    )
)

result = policy.call(lambda: do_work(), operation="sync_task")

What’s inside

  • API highlights: Policy / Retry, CircuitBreaker, RetryPolicy / AsyncRetryPolicy, @retry, provider contribs for OpenAI and Anthropic, HTTP/framework contribs, classifiers (default, http_classifier, sqlstate_classifier, plus optional extras), strategies (decorrelated_jitter, equal_jitter, token_backoff), hooks (on_metric, on_log), context manager reuse.
  • Use cases: OpenAI and Anthropic API calls, HTTP 429/5xx, DB deadlocks/SQLSTATE 40001, queue/worker retries, async services.
  • Production pointers: Set deadline_s and max_attempts, cap max_unknown_attempts, keep tags low-cardinality (class, operation, err), attach metrics/log hooks.

Where to go next