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.11

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.11
File Size Uploaded
cpex_retry_with_backoff-0.3.11.tar.gz 42.8 kB Details

Built distributions (wheels)

Table of built distributions (wheels) for cpex-retry-with-backoff 0.3.11
File
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 log

Release 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 log

Release 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 log

Release 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 log

Release 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 log

Release 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 log

Release 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

Release history Release notifications | RSS feed

This release

0.3.11 This release

7 release files

0.3.10

7 release files

0.3.9

7 release files

0.3.8

7 release files

0.3.7

7 release files

0.3.6

7 release files

0.3.5

7 release files

0.3.4

7 release files

0.3.3

7 release files

0.3.1

7 release files

0.3.0

7 release files

0.2.1

7 release files

0.2.0

7 release files

0.1.0

7 release files

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