Retry policy with exponential backoff for query execution.
Usage
config = ClaudeWrapper.Config.new()
query = ClaudeWrapper.Query.new("fix the bug")
# Retry up to 3 times with exponential backoff
{:ok, result} = ClaudeWrapper.Retry.execute(query, config,
max_retries: 3,
base_delay_ms: 1_000,
max_delay_ms: 30_000
)
# With custom retry predicate
{:ok, result} = ClaudeWrapper.Retry.execute(query, config,
max_retries: 5,
retry_on: fn
{:error, {:exit, 1, _}} -> true
{:error, {:timeout, _}} -> true
_ -> false
end
)
Summary
Types
@type opts() :: [ max_retries: non_neg_integer(), base_delay_ms: pos_integer(), max_delay_ms: pos_integer(), multiplier: number(), jitter: boolean(), retry_on: (term() -> boolean()) ]
Functions
@spec compute_delay( non_neg_integer(), pos_integer(), pos_integer(), number(), boolean() ) :: non_neg_integer()
Compute the delay for a given attempt number.
@spec execute(ClaudeWrapper.Query.t(), ClaudeWrapper.Config.t(), opts()) :: {:ok, ClaudeWrapper.Result.t()} | {:error, term()}
Execute a query with retry logic.
Options
:max_retries- Maximum number of retry attempts (default: 3):base_delay_ms- Initial delay between retries in ms (default: 1000):max_delay_ms- Maximum delay cap in ms (default: 30000):multiplier- Backoff multiplier (default: 2):jitter- Add random jitter to delays (default: true):retry_on- Function that receives the error and returns whether to retry. Defaults to retrying on timeouts and non-zero exits.