Skip to main content

Retry With Backoff (Rust)

High-performance retry and backoff policy engine for ContextForge and MCP Gateway.

Features

  • Rust-backed retry state tracking for tool invocations
  • Exponential backoff with optional jitter
  • Per-tool policy overrides without duplicating whole plugin configs
  • Retry decisions based on isError, structured status_code, or optional parsed text payloads
  • Automatic state eviction for stale request entries
  • Gateway ceiling enforcement for max_retries
  • Retry policy metadata returned on tool and resource hooks

Build

make install

Runtime Requirements

This plugin depends on cpex>=0.1.0,<0.2 and imports hook models from cpex.framework. The compiled Rust extension is mandatory; there is no Python fallback implementation.

Usage

The plugin runs on tool_post_invoke and resource_post_fetch.

Typical uses:

  • Retry transient upstream failures such as 429, 500, 502, 503, and 504
  • Clamp aggressive plugin settings to the gateway-wide retry ceiling
  • Apply stricter retry budgets to fragile or expensive tools

Configuration

Core settings

  • max_retries: maximum retry attempts before giving up
  • backoff_base_ms: base delay for exponential backoff
  • max_backoff_ms: upper bound for computed retry delays
  • retry_on_status: HTTP or structured status codes treated as retriable
  • jitter: randomize delay within the current exponential ceiling
  • check_text_content: inspect text content for JSON-encoded error payloads when structured content is absent

Per-tool overrides

Use tool_overrides to change retry behavior for a specific tool:

  • max_retries
  • backoff_base_ms
  • max_backoff_ms
  • retry_on_status
  • jitter

Behavior Notes

  • Successful responses clear retry state for the (tool, request_id) pair.
  • Retry state expires after a short TTL so abandoned request state does not accumulate indefinitely.
  • If check_text_content is disabled, the hot path uses the Rust state manager directly.
  • If check_text_content is enabled, Python-side payload inspection supplements the Rust state manager before applying retry policy.

Returned Metadata

tool_post_invoke — OpenTelemetry metrics

tool_post_invoke accepts an optional extensions parameter carrying OpenTelemetry trace context. When a trace context is present (via extensions.request.trace_id), the plugin emits operational metrics on result.metadata["retry_with_backoff"] with the following schema:

result.metadata["retry_with_backoff"] = {
    "retry_count": 1,      # int — consecutive_failures after this call's outcome is recorded; 0 on success
    "retry_delay_ms": 100, # int — the per-attempt delay computed for this call; 0 on success or once exhausted
}

Every call (success, within-budget retry, or exhausted) has a meaningful outcome to report, including the all-zero success case — there is deliberately no total_backoff_ms cumulative counter, only these two per-call fields.

Gating: Metrics are only emitted when a valid trace_id is present in the trace context (extensions.request.trace_id). No trace context means no result.metadata write at all, regardless of any config flag.

resource_post_fetch — unchanged config echo

resource_post_fetch is out of scope for the OTel metrics contract above — it never receives extensions and continues to unconditionally emit the plugin's active retry policy configuration (not per-call outcome data) on result.metadata:

  • max_retries
  • backoff_base_ms
  • max_backoff_ms
  • retry_on_status

Migration Note

Version 0.3.6 is a breaking change for tool_post_invoke consumers only (resource_post_fetch is unaffected):

  • tool_post_invoke no longer emits the flat, unconditional retry_policy config echo (max_retries, backoff_base_ms, max_backoff_ms, retry_on_status). That echo is replaced by the namespaced, trace-gated result.metadata["retry_with_backoff"] schema above (retry_count, retry_delay_ms).
  • tool_post_invoke now accepts a new optional extensions parameter carrying OpenTelemetry trace context. Emission is gated solely on extensions.request.trace_id being present and valid — if no trace context is supplied, no metrics are written at all.
  • Consumers that previously read the config echo from tool_post_invoke unconditionally must migrate to reading result.metadata["retry_with_backoff"] and must pass a trace_id via extensions to receive metrics.
  • resource_post_fetch keeps its pre-existing, un-namespaced config echo byte-for-byte unchanged — it is a different contract, not covered by this migration.

Testing

# Full plugin CI
make ci

Performance

The retry state manager is implemented in Rust so the common retry decision path avoids Python bookkeeping overhead for normal structured tool results.

Metadata

Release files for cpex-retry-with-backoff 0.3.12

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for cpex-retry-with-backoff 0.3.12
File Size Uploaded Provenance Actions
cpex_retry_with_backoff-0.3.12.tar.gz 43.1 kB With provenance Details for cpex_retry_with_backoff-0.3.12.tar.gz

Built distributions (wheels)

Table of built distributions (wheels) for cpex-retry-with-backoff 0.3.12
File Actions
cpex_retry_with_backoff-0.3.12-cp311-abi3-win_amd64.whl CPython 3.11 abi3 Windows x86-64 Details for cpex_retry_with_backoff-0.3.12-cp311-abi3-win_amd64.whl
cpex_retry_with_backoff-0.3.12-cp311-abi3-manylinux_2_34_x86_64.whl CPython 3.11 abi3 Linux glibc 2.34+ x86-64 Details for cpex_retry_with_backoff-0.3.12-cp311-abi3-manylinux_2_34_x86_64.whl
cpex_retry_with_backoff-0.3.12-cp311-abi3-manylinux_2_34_s390x.whl CPython 3.11 abi3 Linux glibc 2.34+ IBM System/390x Details for cpex_retry_with_backoff-0.3.12-cp311-abi3-manylinux_2_34_s390x.whl
cpex_retry_with_backoff-0.3.12-cp311-abi3-manylinux_2_34_ppc64le.whl CPython 3.11 abi3 Linux glibc 2.34+ PowerPC 64-le Details for cpex_retry_with_backoff-0.3.12-cp311-abi3-manylinux_2_34_ppc64le.whl
cpex_retry_with_backoff-0.3.12-cp311-abi3-manylinux_2_34_aarch64.whl CPython 3.11 abi3 Linux glibc 2.34+ ARM64 Details for cpex_retry_with_backoff-0.3.12-cp311-abi3-manylinux_2_34_aarch64.whl
cpex_retry_with_backoff-0.3.12-cp311-abi3-macosx_11_0_arm64.whl CPython 3.11 abi3 macOS 11.0+ ARM64 Details for cpex_retry_with_backoff-0.3.12-cp311-abi3-macosx_11_0_arm64.whl

Total release size: 1.7 MB

Release files / cpex_retry_with_backoff-0.3.12.tar.gz

Download URL cpex_retry_with_backoff-0.3.12.tar.gz
Size 43.1 kB
Tags Source
SHA-256 checksum
How to use checksums
1c8e57bc6137ccc5a14208767c2a704bf17df48006a519edf123a3f982e7f81f
BLAKE2b-256 checksum
How to use checksums
eadc06431c14f85d29285e743f317d8de0f3b9b630240d56c3a74e9c436746ca
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 28, 2026.

Transparency log

Release files / cpex_retry_with_backoff-0.3.12-cp311-abi3-win_amd64.whl

Download URL cpex_retry_with_backoff-0.3.12-cp311-abi3-win_amd64.whl
Size 206.9 kB
Tags CPython 3.11 Windows x86-64 abi3
SHA-256 checksum
How to use checksums
c39e04a32592f5cac3cb3a4b4fae75bb0c6b89dad332495dbb155dbd5706cccd
BLAKE2b-256 checksum
How to use checksums
d8a452047653d3da38ea5f3e06da1364458d404bc3f3e8f7ea4c22f9727a0770
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 28, 2026.

Transparency log

Release files / cpex_retry_with_backoff-0.3.12-cp311-abi3-manylinux_2_34_x86_64.whl

Download URL cpex_retry_with_backoff-0.3.12-cp311-abi3-manylinux_2_34_x86_64.whl
Size 285.6 kB
Tags CPython 3.11 Linux glibc 2.34+ x86-64 abi3
SHA-256 checksum
How to use checksums
5e8c0ba55947ae52e4ea7e16a2a6bc09cdca12f978c266fe217b7d20036330db
BLAKE2b-256 checksum
How to use checksums
42115626b0980d94126052534bdbbba9e43d755ac40b3565658d834cd630cd18
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 28, 2026.

Transparency log

Release files / cpex_retry_with_backoff-0.3.12-cp311-abi3-manylinux_2_34_s390x.whl

Download URL cpex_retry_with_backoff-0.3.12-cp311-abi3-manylinux_2_34_s390x.whl
Size 318.1 kB
Tags CPython 3.11 Linux glibc 2.34+ IBM System/390x abi3
SHA-256 checksum
How to use checksums
943a413e9d8a459e0c70e2bfc3cdcad18b6fd8f3f1db9696da970e9253acca08
BLAKE2b-256 checksum
How to use checksums
5ec585fec9d3dbff26de24cb4fc368e9d3ff3510cf445af724749bfc51e4d1b3
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 28, 2026.

Transparency log

Release files / cpex_retry_with_backoff-0.3.12-cp311-abi3-manylinux_2_34_ppc64le.whl

Download URL cpex_retry_with_backoff-0.3.12-cp311-abi3-manylinux_2_34_ppc64le.whl
Size 310.6 kB
Tags CPython 3.11 Linux glibc 2.34+ PowerPC 64-le abi3
SHA-256 checksum
How to use checksums
37832fc0d6ab102e153bf1fb87842dc3bee22e32351b04426b9af747e48db3ab
BLAKE2b-256 checksum
How to use checksums
1d863b61268958b7eb32323a3a439dda15311c9c965f8b8b6d96dc1819fbe844
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 28, 2026.

Transparency log

Release files / cpex_retry_with_backoff-0.3.12-cp311-abi3-manylinux_2_34_aarch64.whl

Download URL cpex_retry_with_backoff-0.3.12-cp311-abi3-manylinux_2_34_aarch64.whl
Size 270.2 kB
Tags CPython 3.11 Linux glibc 2.34+ ARM64 abi3
SHA-256 checksum
How to use checksums
3605cfe2178feff290584695df8092277203c18d961fd8535373a1937c2d269c
BLAKE2b-256 checksum
How to use checksums
cf664728287f4263cbdd975c7e7cdd43576910011dbc09187d43ea7c442496f7
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 28, 2026.

Transparency log

Release files / cpex_retry_with_backoff-0.3.12-cp311-abi3-macosx_11_0_arm64.whl

Download URL cpex_retry_with_backoff-0.3.12-cp311-abi3-macosx_11_0_arm64.whl
Size 259.0 kB
Tags CPython 3.11 abi3 macOS 11.0+ ARM64
SHA-256 checksum
How to use checksums
4454d3bf2dc915d92ca3b51a6679fb8199d0c36088396216bface7dcb86e94d8
BLAKE2b-256 checksum
How to use checksums
32ac8e15a6d1acd3f9200d860b7c5208a2809681b3f28017cd561a4e18de5480
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 28, 2026.

Transparency log

Security for cpex-retry-with-backoff 0.3.12

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

Full provenance

All 7 files in this release have been uploaded with provenance metadata.

Select from 7 files

Attestation for cpex_retry_with_backoff-0.3.12.tar.gz

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 28, 2026.

Transparency log

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

To learn more about protecting yourself from malicious actors, visit our package security documentation.

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