Situatie
După primele proiecte AI, într-o companie apare rapid următorul tablou:
- echipa de dezvoltare are o cheie OpenAI, echipa de suport una Anthropic, iar infrastructura rulează Ollama local
- cheile API sunt copiate în scripturi,
.env-uri și configurări de aplicații, fără rotație - nimeni nu știe cât consumă fiecare echipă până vine factura
- nu există log centralizat al cererilor, deci nu poți răspunde la întrebarea „ce date au fost trimise către furnizori externi?”
- dacă un furnizor cloud cade sau atinge limita, aplicațiile se opresc.
LiteLLM Proxy rezolvă toate acestea printr-un singur punct de acces, compatibil cu API-ul OpenAI. Aplicațiile vorbesc doar cu gateway-ul, folosind chei virtuale emise per echipă sau aplicație. Gateway-ul ține cheile reale ale furnizorilor, aplică bugete și limite, face fallback între modele și loghează totul în PostgreSQL.
Aplicații / scripturi / Open WebUI
│ (cheie virtuală sk-...)
▼
LiteLLM Proxy :4000 ──► PostgreSQL (chei, bugete, log-uri)
│ │ │
▼ ▼ ▼
OpenAI Anthropic Ollama (local)
Backup
Păstrați lista cheilor API originale ale furnizorilor și configurarea actuală a aplicațiilor înainte de migrare. Faceți backup periodic la volumul PostgreSQL (pg_dump).
Solutie
Pasi de urmat
Pasul 1 – Structura proiectului
Pe un server Linux sau Windows cu Docker:
/opt/llm-gateway/
├── docker-compose.yml
├── config.yaml
└── .env
Pasul 2 – Fișierul .env
# Cheia de administrare a gateway-ului (doar pentru administratori)
LITELLM_MASTER_KEY=sk-admin-SchimbaAceastaValoareLunga123
# Cheie pentru criptarea credențialelor salvate în DB
LITELLM_SALT_KEY=sk-salt-AltaValoareLungaSiAleatoare456
DATABASE_URL=postgresql://litellm:ParolaDB_Puternica@db:5432/litellm
POSTGRES_PASSWORD=ParolaDB_Puternica
# Cheile reale ale furnizorilor - stau DOAR aici
OPENAI_API_KEY=sk-proj-...
ANTHROPIC_API_KEY=sk-ant-...
Restricționați accesul la fișier: chmod 600 .env.
Pasul 3 – config.yaml: modele, fallback și setări
model_list:
# Model cloud principal
- model_name: gpt-4o
litellm_params:
model: openai/gpt-4o
api_key: os.environ/OPENAI_API_KEY
rpm: 500
- model_name: claude-sonnet
litellm_params:
model: anthropic/claude-sonnet-4-5
api_key: os.environ/ANTHROPIC_API_KEY
# Model local - zero cost, date care nu părăsesc compania
- model_name: llama-local
litellm_params:
model: ollama/llama3.1:8b
api_base: http://ollama:11434
router_settings:
# Dacă modelul cloud dă eroare sau e indisponibil, cererea merge la cel local
fallbacks:
- gpt-4o: ["llama-local"]
- claude-sonnet: ["gpt-4o", "llama-local"]
num_retries: 2
timeout: 120
litellm_settings:
drop_params: true # ignoră parametrii nesuportați de un anumit furnizor
request_timeout: 120
general_settings:
master_key: os.environ/LITELLM_MASTER_KEY
database_url: os.environ/DATABASE_URL
Numele de modele din model_name sunt cele pe care le văd aplicațiile. Puteți schimba furnizorul din spate fără să modificați nicio aplicație.
Pasul 4 – docker-compose.yml
services:
litellm:
image: ghcr.io/berriai/litellm:main-stable
container_name: litellm
command: ["--config", "/app/config.yaml", "--port", "4000"]
env_file: .env
volumes:
- ./config.yaml:/app/config.yaml:ro
ports:
- "4000:4000"
depends_on:
- db
restart: unless-stopped
db:
image: postgres:16
container_name: litellm-db
environment:
POSTGRES_DB: litellm
POSTGRES_USER: litellm
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
volumes:
- pgdata:/var/lib/postgresql/data
restart: unless-stopped
ollama:
image: ollama/ollama
container_name: ollama
volumes:
- ollama:/root/.ollama
restart: unless-stopped
# Pentru GPU NVIDIA, decomentați:
# deploy:
# resources:
# reservations:
# devices: [{ driver: nvidia, count: all, capabilities: [gpu] }]
volumes:
pgdata:
ollama:
Pornire și descărcarea modelului local:
cd /opt/llm-gateway
docker compose up -d
docker exec -it ollama ollama pull llama3.1:8b
docker logs -f litellm
Interfața de administrare este disponibilă la http://server:4000/ui și se accesează cu master key-ul.
Pasul 5 – Echipe cu bugete lunare
Creăm câte o echipă pentru fiecare departament, cu buget în USD resetat la 30 de zile și cu lista modelelor permise:
$gw = "http://llm-gateway:4000"
$headers = @{ Authorization = "Bearer sk-admin-SchimbaAceastaValoareLunga123" }
$echipe = @(
@{ team_alias = "dezvoltare"; max_budget = 300; budget_duration = "30d"; models = @("gpt-4o","claude-sonnet","llama-local") },
@{ team_alias = "suport"; max_budget = 80; budget_duration = "30d"; models = @("gpt-4o","llama-local") },
@{ team_alias = "hr-juridic"; max_budget = 0; budget_duration = "30d"; models = @("llama-local") }
)
foreach ($e in $echipe) {
$r = Invoke-RestMethod "$gw/team/new" -Method Post -Headers $headers `
-Body ($e | ConvertTo-Json) -ContentType "application/json"
"{0,-12} team_id = {1}" -f $e.team_alias, $r.team_id
}
Observați echipa hr-juridic: are acces doar la modelul local. Documentele cu date sensibile nu pot ajunge la un furnizor cloud, indiferent ce aplicație folosesc.
Pasul 6 – Chei virtuale per aplicație, cu rate limiting
$body = @{
team_id = "<team_id-ul echipei suport>"
key_alias = "chatbot-helpdesk"
models = @("gpt-4o","llama-local")
max_budget = 40
budget_duration = "30d"
rpm_limit = 60 # cereri pe minut
tpm_limit = 100000 # tokeni pe minut
metadata = @{ owner = "echipa.suport@firma.ro"; aplicatie = "Helpdesk Bot" }
} | ConvertTo-Json -Depth 4
$key = Invoke-RestMethod "$gw/key/generate" -Method Post -Headers $headers -Body $body -ContentType "application/json"
$key.key # sk-... -> se pune în configurarea aplicației
Dacă aplicația depășește bugetul sau limita, gateway-ul răspunde cu eroare de buget sau 429, iar celelalte aplicații ale echipei nu sunt afectate.
Pasul 7 – Folosirea din aplicații
Orice client compatibil OpenAI funcționează. Se schimbă doar adresa și cheia.
PowerShell:
$h = @{ Authorization = "Bearer sk-cheia-virtuala-a-aplicatiei" }
$b = @{
model = "gpt-4o"
messages = @(@{ role = "user"; content = "Rezumă în 3 puncte ticketul: utilizatorul nu se poate conecta la VPN după update." })
} | ConvertTo-Json -Depth 4
(Invoke-RestMethod "http://llm-gateway:4000/v1/chat/completions" -Method Post -Headers $h `
-Body $b -ContentType "application/json; charset=utf-8").choices[0].message.content
Python (SDK OpenAI):
from openai import OpenAI
client = OpenAI(base_url="http://llm-gateway:4000", api_key="sk-cheia-virtuala-a-aplicatiei")
r = client.chat.completions.create(
model="claude-sonnet",
messages=[{"role": "user", "content": "Generează un script PowerShell care listează serviciile oprite."}],
)
print(r.choices[0].message.content)
Open WebUI: în Admin Settings → Connections → OpenAI API, setați URL-ul http://llm-gateway:4000/v1 și o cheie virtuală. Toate modelele din gateway apar automat în listă.
Pasul 8 – Raportare de consum
Consumul per cheie se poate interoga prin API:
Invoke-RestMethod "$gw/key/info?key=sk-cheia-virtuala" -Headers $headers |
Select-Object -ExpandProperty info |
Select-Object key_alias, spend, max_budget, budget_reset_at
Pentru rapoarte lunare pe echipe, puteți interoga direct tabelele din PostgreSQL, unde LiteLLM salvează fiecare cerere cu model, tokeni, cost și cheie. Sau puteți folosi secțiunea Usage din interfața /ui.
Recomandări de securitate
- Nu expuneți portul 4000 în internet. Puneți gateway-ul în spatele unui reverse proxy (Nginx sau Traefik) cu HTTPS și acces doar din rețeaua internă.
- Master key-ul se folosește doar pentru administrare. Aplicațiile primesc exclusiv chei virtuale.
- Rotiți cheile virtuale periodic (
/key/regenerate) și blocați imediat cheile compromise (/key/block). - Pentru date personale, combinați gateway-ul cu un strat de anonimizare (de exemplu Microsoft Presidio) înainte ca cererile să ajungă la modelele cloud.
- Faceți backup la volumul PostgreSQL. El conține istoricul de audit și configurarea cheilor.
Tip solutie
PermanentImpact colateral
Aplicațiile trebuie reconfigurate să folosească adresa gateway-ului și cheile virtuale. Gateway-ul devine punct unic de trecere: dacă containerul se oprește, toate aplicațiile AI pierd accesul, deci se recomandă monitorizare și restart automat.Plan de restaurare in caz de nefunctionare
Reconfigurați aplicațiile cu adresele și cheile directe ale furnizorilor, apoi opriți stack-ul cu docker compose down. Volumele pgdata și ollama se păstrează până la ștergerea explicită cu docker compose down -v.
Leave A Comment?