Skip to main content
On a tool-calling turn, PraisonAI never silently retries a failure that happened after the request was dispatched — it surfaces 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 as provider_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

The provider may already have run your tool. Check downstream state — was the flight booked, the charge made — before retrying the turn.
Idempotency keys turn a risky replay into a safe one. When a tool is idempotent, a deliberate retry after provider_outcome_unknown is cheap.
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.
is_replay_unsafe walks the exception’s class hierarchy first, so provider SDK subclasses are matched even when their messages vary.

Tools

Author side-effecting tools that behave well under replay-safety.

LLM Error Classification

How PraisonAI categorises provider errors for retry decisions.