Rag.Router.Fallback (rag v0.3.4)

View Source

Fallback routing strategy.

Tries providers in order until one succeeds. If a provider fails multiple times, it is temporarily skipped. Failed providers are automatically retried after a decay period.

Configuration

Fallback.init(
  providers: [:gemini, :codex, :claude],
  fallback_order: [:claude, :gemini, :codex],  # Optional custom order
  max_failures: 3,                              # Skip after N failures
  failure_decay_ms: 60_000                      # Reset failures after 60s
)

Behavior

  1. Selects first available provider in fallback order
  2. On failure, marks provider and tries next
  3. Skips providers with >= max_failures recent failures
  4. Resets failure count on success
  5. Decays failure count over time

Example

{:ok, state} = Fallback.init(providers: [:gemini, :codex, :claude])
{:ok, :gemini, state} = Fallback.select_provider(state, request)

# If gemini fails
state = Fallback.handle_result(state, :gemini, {:error, :timeout})
{:ok, :codex, state} = Fallback.next_provider(state, :gemini, request)

Summary

Types

t()

@type t() :: %Rag.Router.Fallback{
  current_index: non_neg_integer(),
  failure_decay_ms: pos_integer() | nil,
  failure_times: %{required(atom()) => integer()},
  failures: %{required(atom()) => non_neg_integer()},
  fallback_order: [atom()],
  max_failures: pos_integer(),
  providers: [atom()]
}