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, structuredstatus_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, and504 - 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 upbackoff_base_ms: base delay for exponential backoffmax_backoff_ms: upper bound for computed retry delaysretry_on_status: HTTP or structured status codes treated as retriablejitter: randomize delay within the current exponential ceilingcheck_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_retriesbackoff_base_msmax_backoff_msretry_on_statusjitter
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_contentis disabled, the hot path uses the Rust state manager directly. - If
check_text_contentis 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_retriesbackoff_base_msmax_backoff_msretry_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_invokeno longer emits the flat, unconditionalretry_policyconfig echo (max_retries,backoff_base_ms,max_backoff_ms,retry_on_status). That echo is replaced by the namespaced, trace-gatedresult.metadata["retry_with_backoff"]schema above (retry_count,retry_delay_ms).tool_post_invokenow accepts a new optionalextensionsparameter carrying OpenTelemetry trace context. Emission is gated solely onextensions.request.trace_idbeing 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_invokeunconditionally must migrate to readingresult.metadata["retry_with_backoff"]and must pass atrace_idviaextensionsto receive metrics. resource_post_fetchkeeps 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.11
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| cpex_retry_with_backoff-0.3.11.tar.gz | 42.8 kB | Details |
Built distributions (wheels)
| File | Reset | |||
|---|---|---|---|---|
| cpex_retry_with_backoff-0.3.11-cp311-abi3-win_amd64.whl | CPython 3.11 | abi3 | Windows x86-64 | Details |
| cpex_retry_with_backoff-0.3.11-cp311-abi3-manylinux_2_34_x86_64.whl | CPython 3.11 | abi3 | Linux glibc 2.34+ x86-64 | Details |
| cpex_retry_with_backoff-0.3.11-cp311-abi3-manylinux_2_34_s390x.whl | CPython 3.11 | abi3 | Linux glibc 2.34+ IBM System/390x | Details |
| cpex_retry_with_backoff-0.3.11-cp311-abi3-manylinux_2_34_ppc64le.whl | CPython 3.11 | abi3 | Linux glibc 2.34+ PowerPC 64-le | Details |
| cpex_retry_with_backoff-0.3.11-cp311-abi3-manylinux_2_34_aarch64.whl | CPython 3.11 | abi3 | Linux glibc 2.34+ ARM64 | Details |
| cpex_retry_with_backoff-0.3.11-cp311-abi3-macosx_11_0_arm64.whl | CPython 3.11 | abi3 | macOS 11.0+ ARM64 | Details |
Total release size: 1.7 MB
Release files / cpex_retry_with_backoff-0.3.11.tar.gz
| Download URL | cpex_retry_with_backoff-0.3.11.tar.gz |
|---|---|
| Size | 42.8 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
8b75b0bb23ca49f838003f30916324ccdf09f97f5458f3a0c7ed73c05f596014
|
|
BLAKE2b-256 checksum How to use checksums |
980ae9d2b90e8eee7826aa26f543e199dd6f591d25b6897d0d2a0ace5fbfdeba
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
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 Sep 22, 2026.
Transparency logRelease files / cpex_retry_with_backoff-0.3.11-cp311-abi3-win_amd64.whl
| Download URL | cpex_retry_with_backoff-0.3.11-cp311-abi3-win_amd64.whl |
|---|---|
| Size | 207.0 kB |
| Tags | CPython 3.11 Windows x86-64 abi3 |
|
SHA-256 checksum How to use checksums |
9d23d1ee4ed72c2c3274d0b302fa175a8325b8d4ce00cf618f99306778849e44
|
|
BLAKE2b-256 checksum How to use checksums |
a55d615558b1da9810ca5b31b9d3137583b1bc13684efafbc54c901b861f8f4b
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
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 Sep 22, 2026.
Transparency logRelease files / cpex_retry_with_backoff-0.3.11-cp311-abi3-manylinux_2_34_x86_64.whl
| Download URL | cpex_retry_with_backoff-0.3.11-cp311-abi3-manylinux_2_34_x86_64.whl |
|---|---|
| Size | 290.3 kB |
| Tags | CPython 3.11 Linux glibc 2.34+ x86-64 abi3 |
|
SHA-256 checksum How to use checksums |
d493f6449cf9bf9a3f135b143125620185c11b918a06776a97a6c03bae41bf3a
|
|
BLAKE2b-256 checksum How to use checksums |
164e00a1f8abb35490ee4f76213991d41a8445fac0adc46e32ee7eeeca4d51b6
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
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 Sep 22, 2026.
Transparency logRelease files / cpex_retry_with_backoff-0.3.11-cp311-abi3-manylinux_2_34_s390x.whl
| Download URL | cpex_retry_with_backoff-0.3.11-cp311-abi3-manylinux_2_34_s390x.whl |
|---|---|
| Size | 318.7 kB |
| Tags | CPython 3.11 Linux glibc 2.34+ IBM System/390x abi3 |
|
SHA-256 checksum How to use checksums |
600c67dacd70358e2c690b8f2c96f1ffa3cdb17b51121b106ebbe915576ebb62
|
|
BLAKE2b-256 checksum How to use checksums |
be8479b0387419d3b0531793a2bfff361d54c4a7a29394e9821f8b05f57fd71d
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
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 Sep 22, 2026.
Transparency logRelease files / cpex_retry_with_backoff-0.3.11-cp311-abi3-manylinux_2_34_ppc64le.whl
| Download URL | cpex_retry_with_backoff-0.3.11-cp311-abi3-manylinux_2_34_ppc64le.whl |
|---|---|
| Size | 316.2 kB |
| Tags | CPython 3.11 Linux glibc 2.34+ PowerPC 64-le abi3 |
|
SHA-256 checksum How to use checksums |
469315549022b7a792663bab29c2aad453ccff6e8358336d9f01c03c57e940f5
|
|
BLAKE2b-256 checksum How to use checksums |
389e0b951f22f03c25f01ae6d773aeb3ef3a78ddda459aebbc2d2e48a60c4ac1
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
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 Sep 22, 2026.
Transparency logRelease files / cpex_retry_with_backoff-0.3.11-cp311-abi3-manylinux_2_34_aarch64.whl
| Download URL | cpex_retry_with_backoff-0.3.11-cp311-abi3-manylinux_2_34_aarch64.whl |
|---|---|
| Size | 274.4 kB |
| Tags | CPython 3.11 Linux glibc 2.34+ ARM64 abi3 |
|
SHA-256 checksum How to use checksums |
a66ca9acf8b1fc7856fca5b4b44a60e8906be2018d1041e8d78818701ae0fc3d
|
|
BLAKE2b-256 checksum How to use checksums |
0031c774ad4125e34a42e8ccc5c6d54a842b35b74beff200b68f04cf1669f48f
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
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 Sep 22, 2026.
Transparency logRelease files / cpex_retry_with_backoff-0.3.11-cp311-abi3-macosx_11_0_arm64.whl
| Download URL | cpex_retry_with_backoff-0.3.11-cp311-abi3-macosx_11_0_arm64.whl |
|---|---|
| Size | 260.6 kB |
| Tags | CPython 3.11 abi3 macOS 11.0+ ARM64 |
|
SHA-256 checksum How to use checksums |
f1e7de1f3f5bd31fca3537738e6c7caa2dd79a9df95191711fa83127bdf10e0c
|
|
BLAKE2b-256 checksum How to use checksums |
1f055959611e61049f294358d4891336de3f35ba039034390995d1bbddb36da2
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
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 Sep 22, 2026.
Transparency log