Principle:BerriAI Litellm Router Initialization
| Knowledge Sources | Domains | Last Updated |
|---|---|---|
| litellm/router.py | LLM Load Balancing, API Gateway | 2026-02-15 |
Overview
Router initialization is the process of constructing a load-balanced gateway that manages multiple model deployments with configurable routing strategies, caching, retry policies, and failover chains.
Description
A load-balanced LLM router must coordinate several cross-cutting concerns at startup:
- Deployment registration -- Ingesting a list of model deployments and indexing them by logical name and unique ID for O(1) lookup.
- Cache layer setup -- Configuring a dual cache (in-memory plus optional Redis) for tracking cooldowns, usage statistics, and response caching.
- Routing strategy selection -- Choosing how requests are distributed among healthy deployments: random shuffle, least-busy, latency-based, cost-based, or usage-based.
- Reliability configuration -- Setting retry counts, retry policies per exception type, fallback chains (model-specific, context-window, content-policy, and default/wildcard fallbacks), allowed failure thresholds, and cooldown durations.
- Budget enforcement -- Optionally initializing provider and deployment budget limiters that filter out over-budget endpoints before routing.
- Callback registration -- Wiring success and failure callbacks for usage tracking, cooldown management, and alerting.
The goal is to produce a fully configured router object that, once constructed, can accept completion requests and transparently handle deployment selection, retries, and fallbacks.
Usage
Use router initialization when:
- You are building an application that must distribute LLM calls across multiple providers or regions.
- You need automatic failover when a provider returns errors or hits rate limits.
- You want centralized configuration of retry policies, timeouts, and budget limits.
- You are deploying a proxy server that exposes a single API endpoint backed by multiple LLM backends.
Theoretical Basis
Router initialization follows the Builder Pattern combined with Strategy Pattern:
- The constructor accepts a large parameter set and assembles internal subsystems (cache, scheduler, cooldown tracker, budget limiter, routing strategy) into a coherent whole.
- The routing strategy is pluggable: the same router interface supports different selection algorithms selected at initialization time.
Pseudocode:
FUNCTION initialize_router(model_list, routing_strategy, num_retries,
fallbacks, timeout, cooldown_time,
retry_policy, provider_budget_config, ...):
// 1. Setup caching layer
cache = DualCache(in_memory=InMemoryCache(), redis=connect_redis_if_configured())
// 2. Register deployments
deployment_index = {}
FOR EACH deployment IN model_list:
validate(deployment)
deployment_index[deployment.model_name].append(deployment)
deployment_index[deployment.id] = deployment
// 3. Configure reliability
cooldown_tracker = CooldownCache(cache, cooldown_time)
retry_handler = configure_retry_policy(retry_policy, num_retries)
// 4. Configure fallbacks
validate_fallback_format(fallbacks)
fallback_chain = merge(specific_fallbacks, default_fallbacks)
// 5. Select routing strategy
strategy = load_strategy(routing_strategy) // e.g. simple-shuffle, latency-based
// 6. Initialize budget limiter (if configured)
IF provider_budget_config IS NOT None:
budget_limiter = BudgetLimiter(cache, provider_budget_config, model_list)
register_as_pre_call_check(budget_limiter)
// 7. Register callbacks for usage and failure tracking
register_success_callback(deployment_success_handler)
register_failure_callback(deployment_failure_handler, cooldown_handler)
RETURN Router(cache, deployment_index, strategy, retry_handler,
fallback_chain, cooldown_tracker, budget_limiter)
The initialization is intentionally front-loaded: all validation, indexing, and subsystem construction happens at startup so that the request hot path is as lightweight as possible.