Every model provider rate-limits you, and every naive retry loop makes it worse.
Implement compute_delays(attempts, base, cap, jitter_fn) returning the delay before each retry:
i (0-based) is min(cap, base 2*i), then jitteredjitter_fn(0, d) where d is the capped exponential delayattempts delaysjitter_fn(low, high) is injected so this is testable: in production it would be random.uniform.
Why full jitter and not "add a bit of randomness": if a thousand clients are rate-limited by the same overloaded service at the same moment, a deterministic backoff means all thousand retry at exactly the same instant, and again at the next, and again. Full jitter spreads them across the whole interval, which is what actually lets the service recover. Adding ±10% does not.
Build the architecture on a canvas: place the components, configure them, connect them into a data flow, and write a short reason for each one. The AI reviewer grades your design against a rubric written specifically for this problem.
Minimum 5 components · needs a wide desktop screen