Rag.Router.RoundRobin (rag v0.3.4)

View Source

Round-Robin routing strategy.

Distributes requests evenly across providers. Supports optional weights for uneven distribution and automatic provider recovery.

Configuration

RoundRobin.init(
  providers: [:gemini, :codex, :claude],
  weights: %{gemini: 3, codex: 2, claude: 1},  # Optional weighted distribution
  max_consecutive_failures: 3,                  # Mark unavailable after N failures
  recovery_cooldown_ms: 30_000                  # Retry unavailable after 30s
)

Behavior

  1. Selects providers in rotating order
  2. Optionally applies weights (higher weight = more selections)
  3. Skips temporarily unavailable providers
  4. Automatically recovers providers after cooldown

Weighted Distribution

With weights {gemini: 2, codex: 1}, the selection pattern is: gemini → gemini → codex → gemini → gemini → codex → ...

Summary

Types

t()

@type t() :: %Rag.Router.RoundRobin{
  consecutive_failures: %{required(atom()) => non_neg_integer()},
  current_index: non_neg_integer(),
  max_consecutive_failures: pos_integer(),
  providers: [atom()],
  recovery_cooldown_ms: pos_integer(),
  unavailable: MapSet.t(atom()),
  unavailable_since: %{required(atom()) => integer()},
  weight_counters: %{required(atom()) => non_neg_integer()},
  weights: %{required(atom()) => pos_integer()} | nil
}