📅 Juni 2026 · Letztes Update: 07.06.2026
TL;DR
LiteLLM ist ein OpenAI-kompatibler Proxy, der als zentrale Schaltstelle zwischen KI-Agenten und LLM-Providern sitzt. Statt in 20 Agent-Konfigurationen einzeln Modelle zu ändern, reicht ein Klick in der Admin-UI. Virtual Keys geben jedem Agenten eine eigene API-Identität mit Budget-Limit und Nutzungstracking. Das Setup: 2 Docker-Container (LiteLLM + PostgreSQL), Host-Networking, Admin-UI auf Port 4000.
Stack: LiteLLM · PostgreSQL · Docker Compose · DeepSeek · Ollama · Admin-UI
📖 Inhalt
1. Warum ein AI-Gateway?
Stell dir vor, du betreibst 20 KI-Agenten — jeder mit eigener Konfiguration, eigenem Modell, eigenem API-Key. Jetzt kommt ein neues, besseres Modell auf den Markt. Ohne Gateway: Du änderst 20 Konfigurationen einzeln, startest 20 Dienste neu, vergisst zwei davon und wunderst dich über Fehler.
Mit LiteLLM als zentralem Gateway änderst du ein Modell-Alias in der Admin-UI — und alle 20 Agenten nutzen beim nächsten Request automatisch das neue Modell. Kein Neustart, kein Konfigurations-Chaos.
Die konkreten Vorteile im Betrieb:
- Zentraler Model-Switch: Ein Synonym (z.B. „Large Flash") zeigt auf ein echtes Modell — ändert sich das Ziel, merken es alle Agenten
- Virtual Keys pro Agent: Jeder Agent bekommt einen eigenen Key mit Budget-Limit — Abrechnung pro Team/Agent statt pro Provider
- Kostenkontrolle: Admin-UI zeigt Token-Verbrauch und Spend pro Key, Team und Modell — tagesaktuell
- Provider-Agnostisch: DeepSeek, OpenAI, Anthropic, Ollama — alle hinter einer einzigen, OpenAI-kompatiblen API
- Fallback & Load-Balancing: Automatisches Retry bei Fehlern, Verteilung auf mehrere Provider
💡 Praxisbeispiel Factory: In einer Agent-Factory mit 20+ Agenten (Coder, Reviewer, Researcher, Planner, Writer) musste vor LiteLLM jedes Model-Update in 20 Einzelkonfigurationen durchgeführt werden. Jetzt: Ein Klick in der UI, alle Agenten nutzen das neue Modell. Zeitaufwand: von 30 Minuten auf 30 Sekunden reduziert.
2. Architektur & Datenfluss
LiteLLM sitzt als Proxy zwischen allen KI-Agenten und den LLM-Providern. Jeder Request läuft durch denselben Endpunkt:
Agent A ──sk-aaa──┐
Agent B ──sk-bbb──┤ ┌──────────────┐
Agent C ──sk-ccc──┼─────────────►│ LiteLLM │──► DeepSeek
Agent D ──sk-ddd──┤ Port 4000 │ Gateway │──► Ollama (lokal)
▼ │ + PostgreSQL │──► OpenAI / Anthropic
Virtual Keys └──────────────┘
+ Budget-Limits Admin-UI :4000
Der Stack besteht aus nur zwei Docker-Containern:
🚦 LiteLLM Proxy
Port 4000 — Python/FastAPI. OpenAI-kompatible API, Admin-UI, Model-Routing. Läuft mit network_mode: host für direkten Zugriff auf lokale Dienste (Ollama, PostgreSQL auf localhost).
🗄️ PostgreSQL
Port 5433 (nur localhost) — Alpine-basiert. Speichert Virtual Keys, Teams, Usage-Logs, Spend-Tracking. Trust-Authentifizierung (kein Passwort nötig, nur lokal erreichbar).
| Container | Image | RAM (Idle) | Port |
|---|---|---|---|
| litellm-proxy | berriai/litellm:main-stable | ~200 MB | 4000 (host) |
| litellm-db | postgres:16-alpine | ~30 MB | 5433 (127.0.0.1) |
| Gesamt | ~230 MB |
💡 Host-Networking: LiteLLM nutzt network_mode: host, um lokale Dienste zu erreichen. PostgreSQL ist nur auf 127.0.0.1:5433 gebunden — von außen nicht erreichbar. Ollama läuft auf localhost:11434 und ist direkt ansprechbar.
3. Setup: Docker Compose & Config
3.1 docker-compose.yml
services:
postgres:
image: postgres:16-alpine
container_name: litellm-db
environment:
POSTGRES_USER: litellm
POSTGRES_DB: litellm
POSTGRES_HOST_AUTH_METHOD: trust
ports:
- "127.0.0.1:5433:5432"
volumes:
- litellm_pgdata:/var/lib/postgresql/data
restart: unless-stopped
healthcheck:
test: ["CMD-SHELL", "pg_isready -U litellm"]
litellm:
image: docker.litellm.ai/berriai/litellm:main-stable
container_name: litellm-proxy
depends_on:
postgres:
condition: service_healthy
network_mode: "host"
volumes:
- ./config.yaml:/app/config.yaml
env_file:
- .env
restart: unless-stopped
volumes:
litellm_pgdata:
⚠️ PostgreSQL Trust-Auth: POSTGRES_HOST_AUTH_METHOD: trust bedeutet: keine Passwort-Authentifizierung. Nur sicher, weil PostgreSQL ausschließlich auf 127.0.0.1 gebunden ist. Für externe Zugriffe unbedingt Passwort setzen.
3.2 config.yaml (Basis-Konfiguration)
general_settings:
master_key: os.environ/LITELLM_MASTER_KEY
database_url: os.environ/DATABASE_URL
litellm_settings:
drop_params: true
model_list:
- model_name: deepseek-v4-flash
litellm_params:
model: deepseek/deepseek-v4-flash
api_key: os.environ/DEEPSEEK_API_KEY
- model_name: Large Pro
litellm_params:
model: openai/Large Pro
api_base: http://localhost:4000/v1
api_key: os.environ/LITELLM_MASTER_KEY
💡 Synonyme & Aliase: Die Admin-UI erlaubt es, zusätzliche Model-Synonyme anzulegen, ohne die config.yaml zu ändern. „Large Flash", „Scheduler", „Vision" etc. werden per UI mit echten Modellen verknüpft — und lassen sich dort jederzeit umbiegen. In der config.yaml stehen nur die physischen Provider-Modelle.
3.3 .env (Umgebungsvariablen)
DEEPSEEK_API_KEY=sk-...
LITELLM_MASTER_KEY=sk-...
LITELLM_SALT_KEY=sk-...
DATABASE_URL=postgresql://litellm@localhost:5433/litellm
Master- und Salt-Key mit OpenSSL generieren:
LITELLM_MASTER_KEY="sk-$(openssl rand -hex 16)"
LITELLM_SALT_KEY="sk-$(openssl rand -hex 16)"
⚠️ Salt-Key ist permanent: LITELLM_SALT_KEY wird zur Verschlüsselung gespeicherter API-Keys in der Datenbank verwendet. Einmal gesetzt, darf er nicht mehr geändert werden — sonst sind alle verschlüsselten Keys unbrauchbar.
4. Model-Management mit der Admin-UI
Die Admin-UI ist das Herzstück des Setups — erreichbar unter http://<host>:4000, Login mit Benutzername admin und dem LITELLM_MASTER_KEY als Passwort.
Sie bietet:
- 📊 Dashboard: Token-Verbrauch, Spend, Requests pro Key/Team/Modell
- 🔑 Key-Management: Virtual Keys erstellen, Budgets setzen, widerrufen
- 🏗️ Model-Übersicht: Alle konfigurierten Modelle mit Health-Status
- 🔄 Synonyme: Modell-Aliase anlegen und Ziel-Modell jederzeit ändern
Das ist der entscheidende Vorteil: Synonyms erlauben es, ein Alias wie „Large Flash" zu definieren und später auf ein anderes physisches Modell umzubiegen — ohne dass ein einziger Agent seine Konfiguration ändern muss.
| Synonym (Agent) | Physisches Modell | Verwendung |
|---|---|---|
| Large Flash | deepseek/deepseek-v4-flash | Hauptmodell für schnelle Tasks |
| Large Pro | deepseek/deepseek-v4-pro | Komplexe Reasoning-Tasks |
| Scheduler | deepseek/deepseek-v4-flash | Leichte Cron-Jobs, Heartbeats |
| Vision | openrouter/gemma-4-31b | Bildanalyse |
| Embedded Nova | ollama/nomic-embed-text | Embeddings für RAG |
5. Virtual Keys & Kosten-Tracking
Jeder Agent bekommt einen eigenen Virtual Key — mit Budget-Limit, Modell-Beschränkung und Metadaten:
# Key für Coding-Agenten erstellen
curl -X POST http://localhost:4000/key/generate \
-H "Authorization: Bearer <master-key>" \
-H "Content-Type: application/json" \
-d '{
"key_alias": "agent-benno",
"team_id": "factory-devs",
"models": ["Large Flash", "Large Pro"],
"metadata": {"agent": "benno", "role": "coding"},
"max_budget": 50.0,
"budget_duration": "1mo"
}'
Spend-Tracking pro Key und Team:
# Verbrauch pro Team
curl http://localhost:4000/team/info?team_id=factory-devs \
-H "Authorization: Bearer <master-key>"
# Verbrauch pro Key
curl http://localhost:4000/key/info?key=sk-... \
-H "Authorization: Bearer <master-key>"
⚠️ Keys sofort speichern: /key/generate zeigt den Key nur einmal an. /key/list gibt nur SHA-256-Hashes zurück — keine Möglichkeit, einen verlorenen Key wiederherzustellen. Sofort in einem sicheren Vault speichern.
6. Hermes-Integration
KI-Agenten (in diesem Beispiel Hermes-Agenten) nutzen LiteLLM über das OpenAI-Provider-Interface. Die Konfiguration im Profil:
# config.yaml (Hermes-Profil)
model:
provider: openai
base_url: http://<litellm-host>:4000
default: Large Flash
providers:
openai:
base_url: http://<litellm-host>:4000
key_env: OPENAI_API_KEY
credential_pool_strategies:
openai: fill_first
# .env (Hermes-Profil)
OPENAI_API_KEY=sk-<virtual-key>
Das Schöne daran: In der .env steht nur noch der Virtual Key. Welches Modell dahinter steckt, entscheidet LiteLLM. Möchte man für einen bestimmten Agenten ein anderes Modell, ändert man das Synonym in der Admin-UI — oder vergibt einen anderen Virtual Key mit anderer Modell-Zuordnung.
💡 20+ Profile, ein Model-Switch: In der Factory laufen über 20 Agenten mit individuellen Profilen. Ein Modell-Wechsel auf der LiteLLM-Admin-UI — und alle Agenten nutzen beim nächsten Request das neue Modell. Kein SSH, kein Config-Edit, kein Gateway-Neustart.
7. Betrieb & Lessons Learned
Was gut läuft
- Admin-UI ist Gold wert: Modell-Aliase umbiegen, neue Keys anlegen, Spend tracken — alles ohne Config-Dateien oder Neustarts. Die UI zeigt tagesaktuell, welcher Agent wie viele Tokens verbraucht.
- Zwei Container, minimaler Overhead: ~230 MB RAM im Idle. PostgreSQL auf Alpine hält den Footprint klein.
- Host-Networking spart Konfiguration: Kein Bridge-Netzwerk-Debugging — LiteLLM sieht localhost und erreicht PostgreSQL und Ollama direkt.
- OpenAI-Kompatibilität: Jedes Tool, das OpenAI-APIs spricht, funktioniert mit LiteLLM — ohne Adapter.
Lessons Learned
- Salt-Key ist heilig: Einmal gesetzt, nie ändern. Ein verlorener Salt-Key bedeutet: alle verschlüsselten Provider-Keys in der DB sind unbrauchbar. Backup des Keys ist Pflicht.
- Virtual Keys nur über API generieren: Direkte SQL-Inserts in die
LiteLLM_VerificationToken-Tabelle funktionieren nicht — LiteLLM hasht die Keys mitsk--Präfix und der Hash stimmt nicht mit rohen DB-Tokens überein. - UI-Managed Models bevorzugen: Models per Admin-UI anlegen statt in config.yaml — sie bekommen dann kein „Defined in config"-Badge und lassen sich flexibler verwalten. config.yaml nur für die physischen Provider-Modelle nutzen.
- Entrypoint für Custom Callbacks: Für produktionsrelevante Fixes (z.B. DeepSeek-null-content-Fix) braucht man einen eigenen Entrypoint, der vor dem Start einen Callback registriert. LiteLLM's
callbacks-Feld in config.yaml unterstützt nur ~50 Built-in-Integrationen — Custom Python-Callbacks brauchen einen Wrapper. - Trust-Auth nur mit localhost-Bindung: PostgreSQL ohne Passwort ist nur sicher, solange der Port ausschließlich auf 127.0.0.1 gebunden ist.
docker compose psregelmäßig prüfen, dass kein0.0.0.0:5433auftaucht.
Monitoring
- Health-Check:
curl http://localhost:4000/health/readiness→{"status":"healthy","db":"connected"} - Model-Liste:
curl -H "Authorization: Bearer <mk>" http://localhost:4000/v1/models - Admin-UI:
http://<host>:4000→ Login mitadmin/ Master-Key
8. Fazit & Ausblick
✅ Das funktioniert
- Zentraler Model-Switch für 20+ Agenten
- Virtual Keys mit Budgets pro Agent
- Kosten-Transparenz per Admin-UI
- OpenAI-kompatibel — kein Tool-Umbau nötig
- Minimaler Footprint: 230 MB RAM, 2 Container
🔜 Geplant
- Automatische Failover-Ketten
- Prompt-Versioning & Caching
- Guardrails/Content-Filter
- Externes Monitoring per Uptime Kuma
LiteLLM als zentrales AI-Gateway ist eine der besten Infrastruktur-Entscheidungen für Multi-Agent-Setups. Der initiale Aufwand (15 Minuten Setup) amortisiert sich beim ersten Model-Wechsel, der statt 30 Minuten Config-Arbeit nur noch einen Klick braucht. Für Teams und Agent-Factories mit mehr als 5 regelmäßig genutzten LLM-Endpunkten ist ein Gateway praktisch Pflicht.
🤖 KI-Agenten-Integration
In meiner Agent-Factory steuert LiteLLM sämtliche LLM-Zugriffe für 20+ Agenten — vom Coding-Agenten über Research-Worker bis zum Social-Media-Publisher. Jeder Agent hat einen Virtual Key mit rollenbasiertem Budget. Das Admin-Dashboard zeigt tagesaktuell, welcher Agent wie viele Tokens verbraucht.
Disclaimer: Persönliches Projekt. LiteLLM ist Open Source (MIT). Keine Affiliate-Links, keine gesponserten Empfehlungen.