Most teams shop for an “LLM load balancer” and end up with a half-configured reverse proxy. What you actually need is a gateway that load-balances as a side effect of correct model groups – not a shiny strategy dropdown. LiteLLM 1.100.1 is that gateway: OpenAI-compatible front door, multi-deployment routing, spend hooks when you give it a database.
This is a deploy guide. You’ll pin 1.100.1 (as of the Sep 10, 2026 PyPI/GitHub release; 1.100.0 landed Sep 6, 2026), stand up the proxy, wire a minimum multi-deployment config, prove health, and dodge install traps generic write-ups skip. Project home: BerriAI/litellm and docs.litellm.ai.
System requirements before you touch Docker or pip
Package metadata on PyPI for 1.100.1 sets the floor at Python >=3.10, <3.15. Miss that and everything else gets weird.
| Resource | Rough smoke start | Comfortable prod start |
|---|---|---|
| CPU | 2 cores | 4+ cores |
| RAM | a few GB free | 8 GB-class host – community write-ups put idle/peak proxy near ~350-480 MB before you add Postgres/Redis |
| Disk | images + logs | SSD if you keep Postgres spend logs |
| OS | Linux/macOS/Windows with Docker or Python 3.10+ | Linux + Docker Compose V2 |
| Optional | – | PostgreSQL for UI/keys/budgets; Redis when several proxy replicas must share RPM/TPM state |
CLI docs put load-test headroom around 1.5k+ RPS. Your real ceiling is still provider RPM/TPM – and whether Redis shares router state across replicas. Hardware is rarely the first bottleneck.
Official download sources (pin these)
Use PyPI litellm==1.100.1, image tags on ghcr.io/berriai/litellm / docker.litellm.ai/berriai/litellm (v1.100.1, latest, legacy main-stable), and the compose file at docs.litellm.ai/docker-compose.yml. After day one, pin a version tag; floating latest is a moving target.
Install LiteLLM 1.100.1 step by step
Two paths. Docker path = UI + Postgres. CLI path = config-only router without the admin UI.
Path A – Docker Compose
# Download compose, then start (customize credentials before prod)
curl -sSLO https://docs.litellm.ai/docker-compose.yml
# Edit: set LITELLM_MASTER_KEY and a long random LITELLM_SALT_KEY - then never rotate the salt
docker compose up -d
Or smoke one-liner: curl -sSL https://docs.litellm.ai/docker-compose.yml | docker compose -f - up -d. Gateway on http://localhost:4000; UI at /ui. Sample compose often ships master key sk-1234 – change it before anything real.
Path B – CLI with uv
uv tool install 'litellm[proxy]==1.100.1'
export OPENAI_API_KEY=sk-...
litellm --version # must print 1.100.1
Bare pip install 'litellm[proxy]' on an old interpreter is how people “upgrade” and still run 1.83.x-era builds. Check python --version (≥3.10) or stay on uv. Full trap notes live in the errors section below – don’t debug routing on the wrong wheel.
- Docker + Compose V2, or Python 3.10+.
- Pin 1.100.1 explicitly.
- Set master key + salt before storing provider secrets in the UI.
- Keep port 4000 off the public internet until TLS terminates in front.
Funny thing about the “load balancer” shopping list: once three deployments share one model_name, shuffle/least-busy stop feeling like products and start feeling like dials. If your mental model is still nginx-with-tokens, the YAML below will look too small. That’s the point.
First-time config: minimum viable LLM load balancer
Same model_name, multiple deployments. Load balancing falls out of that. Default strategy is simple-shuffle – see the proxy load balancing docs. Docs themselves mark usage-based-routing “(bad for perf)”; treat it as a special case, not a peer default.
# litellm_config.yaml
model_list:
- model_name: gpt-lb
litellm_params:
model: openai/gpt-4o-mini
api_key: os.environ/OPENAI_API_KEY
rpm: 500
- model_name: gpt-lb
litellm_params:
model: openai/gpt-4o-mini
api_key: os.environ/OPENAI_API_KEY_2
rpm: 500
- model_name: gpt-lb
litellm_params:
model: azure/gpt-4o-mini
api_base: os.environ/AZURE_API_BASE
api_key: os.environ/AZURE_API_KEY
api_version: "2024-02-01"
rpm: 300
router_settings:
routing_strategy: simple-shuffle
num_retries: 2
timeout: 30
general_settings:
master_key: sk-change-me
Pro tip:
rpm/tpmon deployments feed the router. Multi-replica proxies needredis_host/redis_port/redis_passwordunderrouter_settingsor each pod counts alone.
Config-only Docker (no UI DB):
docker run --rm -p 4000:4000
-v "$(pwd)/litellm_config.yaml:/app/config.yaml"
-e OPENAI_API_KEY -e OPENAI_API_KEY_2 -e AZURE_API_KEY -e AZURE_API_BASE
-e LITELLM_MASTER_KEY=sk-change-me
ghcr.io/berriai/litellm:v1.100.1
--config /app/config.yaml
CLI: litellm --config litellm_config.yaml --port 4000.
Verify the install actually works
curl -s http://127.0.0.1:4000/health/liveliness
# process up (no auth)
curl -s http://127.0.0.1:4000/health/readiness
# DB status; 503 if a configured DB is unreachable
curl -s http://127.0.0.1:4000/v1/chat/completions
-H "Authorization: Bearer sk-change-me"
-H "Content-Type: application/json"
-d '{"model":"gpt-lb","messages":[{"role":"user","content":"ping"}]}'
Hit chat five times. Watch logs/headers for deployment IDs that move – that’s shuffle proof, not a single sticky backend. UI path: Playground after Models + Endpoints.
Common install errors and fixes
The catch is these show up in troubleshooting notes and GitHub far more than in feature lists.
- Wrong version after pip: From 1.84.0 onward, LiteLLM needs Python ≥3.10. On older interpreters, bare pip can silently resolve to something like 1.83.9 with no hard error – you think you got current. Fix: 3.10+ or
uv tool install 'litellm[proxy]==1.100.1', thenlitellm --version. (CLI quick start documents the floor and the uv path.) - Budgets ignored: No database → global budget checks never fire; virtual keys fail with
No connected db.; master key has no budget. Fix: official compose (Postgres) or cap spend at the provider. Don’t trustmax_budgetin a DB-less process. - Salt key regret:
LITELLM_SALT_KEYencrypts UI-stored provider keys. Change it later and old ciphertext will not decrypt. Fix: restore the original salt from backup – not a fresh random string. - Docker → host vLLM:
api_base: http://0.0.0.0:8000can work under host pip and fail inside a container namespace (see community report on Hosted_vllm connectivity). Fix:host.docker.internal, host-gateway IP, or--network hoston Linux. - Proxy up before Postgres: readiness/DB errors right after compose. Fix: Postgres healthcheck +
depends_onwith healthy condition, or restart litellm once DB accepts connections.
If readiness is 503 with a DB configured, fix connectivity before chasing model keys – orchestrators will kill the pod either way.
Upgrade and uninstall
Docker: stop stack → point compose at v1.100.1 (or newer stable) → docker compose pull && docker compose up -d. Same salt. Same Postgres volume.
uv/venv (official upgrade path): stop proxy → optional pg_dump → bump litellm[proxy]==1.100.1 → prisma generate against schema under site-packages/litellm_proxy_extras → prisma migrate deploy (or the migrate flags the upgrade doc lists) → restart. Image builds hide most of that. Venvs don’t.
- Uninstall CLI:
uv tool uninstall litellmor delete the venv. - Uninstall Docker:
docker compose down; add-vonly when you mean to wipe spend/key data. - Remove local
config.yamland env files that still hold provider keys.
FAQ
Do I need Redis to load balance?
No – not for one proxy process. Only when multiple replicas must share RPM/TPM and router state: set redis_host, redis_port, redis_password under router_settings.
Docker UI path vs config-only: which should I run first?
Learning day: official compose + UI, click-test providers. GitOps prod: versioned config.yaml, pin ghcr.io/berriai/litellm:v1.100.1, keep Postgres if you need virtual keys and budgets that actually enforce. Config-only without DB is a valid OpenAI-compatible router – budgets just aren’t real there.
Why did my “latest” install feel stuck on 1.83.x features?
Wrong wheel, not wrong YAML. Confirm python --version and litellm --version before you touch routing – details under Wrong version after pip above.
Next: drop the three-deployment gpt-lb YAML on disk, pin v1.100.1, hit /health/liveliness, then fire five identical chat completions and watch the balancer move.