WardrikGateway (wardrik_gateway v0.1.0-rc.1)
Copy MarkdownRate limits, circuit breakers and model failover for agents' model calls.
children = [
{WardrikGateway,
name: MyApp.Gateway,
fallbacks: %{"anthropic:claude-sonnet-4-5" => ["openai:gpt-5", "zai:glm-5.1"]},
limits: %{"anthropic" => [requests_per_minute: 4000, tokens_per_minute: 400_000]}},
{MyApp.AgentRuntime, middleware: [{WardrikGateway, MyApp.Gateway}]}
]With WardrikCore alone, pass the same entry in an agent's :middleware.
- A model with an open breaker is skipped. The call goes to the next model in
fallbacks. - A call to a provider at its limit is delayed until the provider has capacity.
- A 429 delays calls to that provider for its
Retry-After, or one second. - A 5xx, a 529 or a timeout counts towards the model's breaker. The call goes to the next model.
- After a fallback, the rest of the turn uses the fallback.
- A call is delayed at most
:wait. ThenWardrikCore.Retryapplies.
Options
:name(atom/0) - Required. The gateway's name.:fallbacks- Models to call, in order, when a call to the key's model fails. The default value is%{}.:limits-requests_per_minuteandtokens_per_minute, by provider, as"anthropic". Providers not listed are unlimited. The default value is%{}.:breaker(keyword/0) - When a model is skipped. The default value is[].:failures(pos_integer/0) - Failures that open it. The default value is5.:within(non_neg_integer/0) - Milliseconds the failures fall within. The default value is30000.:open_for(non_neg_integer/0) - Milliseconds before one call is let through to test the model. The default value is30000.
:wait(non_neg_integer/0) - The longest a call waits, in milliseconds, for room or for a model to come back. The default value is600000.
Telemetry
[:wardrik_gateway, :failover]-from,to,reasonandagent_id.[:wardrik_gateway, :limited]- measureswait, in milliseconds, withmodelandagent_id.[:wardrik_gateway, :breaker_opened]and[:wardrik_gateway, :breaker_closed]-model.
Summary
Functions
Returns a specification to start this module under a supervisor.
Replaces the settings at runtime. Breaker and limit counts are kept.
Returns the schema of the settings start_link/1 and configure/2 take, but :name.
Starts a gateway registered as :name.
Functions
Returns a specification to start this module under a supervisor.
See Supervisor.
@spec configure(GenServer.server(), keyword()) :: :ok
Replaces the settings at runtime. Breaker and limit counts are kept.
WardrikGateway.configure(MyApp.Gateway, limits: %{"anthropic" => [requests_per_minute: 2000]})
@spec schema() :: NimbleOptions.t()
Returns the schema of the settings start_link/1 and configure/2 take, but :name.
@spec start_link(keyword()) :: GenServer.on_start()
Starts a gateway registered as :name.