provider_outcome_unknown so you decide.
If your tool ran but the network dropped, PraisonAI tells you instead of running the tool twice.
Quick Start
1
Nothing to configure
Replay-safety is default-on for tool-calling turns. No new config keys, no new Agent params.
2
Handle the surfaced outcome
A surfaced
provider_outcome_unknown means the provider may already have run your tool — you choose whether to verify state, ask the user, or retry deliberately.The Invariant
On a tool-calling turn, a post-dispatch transient failure surfaces asprovider_outcome_unknown instead of auto-retrying. Tool-less turns and pre-dispatch failures still auto-retry exactly as before.
Replaying a post-dispatch failure on a tool-calling turn could double-execute the tool — double billing, or a re-run of a side-effecting action. The gate stops that.
What Counts as Post-Dispatch (Replay-Unsafe)
Failures that happen once bytes are on the wire — the provider may already have produced output.
Message patterns treated as post-dispatch:
read timeout, connection reset, peer closed, incomplete read, chunked, response ended prematurely, server disconnected.
What Counts as Pre-Dispatch (Replay-Safe)
Failures that prove the request never reached the provider — always safe to replay, retried as before.
Message patterns treated as pre-dispatch:
connect timed out, connection refused, name resolution, getaddrinfo, ssl, handshake, tls.
Ambiguous transient errors — plain 5xx or “service unavailable” — default to safe, preserving existing auto-retry behaviour.
Building Your Own Retry Wrapper
The classifier is public — import it if you write your own retry loop.is_replay_unsafe(error) returns True when the failure signals the provider may already have processed the request.
Best Practices
Treat provider_outcome_unknown as 'verify, then decide'
Treat provider_outcome_unknown as 'verify, then decide'
The provider may already have run your tool. Check downstream state — was the flight booked, the charge made — before retrying the turn.
Make side-effecting tools idempotent where you can
Make side-effecting tools idempotent where you can
Idempotency keys turn a risky replay into a safe one. When a tool is idempotent, a deliberate retry after
provider_outcome_unknown is cheap.Only block retries on tool-calling turns
Only block retries on tool-calling turns
Tool-less completions have no external side effects. Replaying a post-dispatch failure there is safe, so the gate only fires when the turn exposes tools.
Trust the classifier over message text
Trust the classifier over message text
is_replay_unsafe walks the exception’s class hierarchy first, so provider SDK subclasses are matched even when their messages vary.Related
Tools
Author side-effecting tools that behave well under replay-safety.
LLM Error Classification
How PraisonAI categorises provider errors for retry decisions.

