Gateway AI centralizat cu LiteLLM – bugete pe echipă, rate limiting și audit pentru toate LLM-urile din companie

Configurare noua (How To)

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

Permanent

Impact 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.

Voteaza

(3 din 6 persoane apreciaza acest articol)

Despre Autor

Leave A Comment?