AI Gateway: LiteLLM, OpenRouter, Portkey, Vercel
Quando il tuo prodotto parla con più di un modello, l'approccio SDK-diretto si spacca. Ogni provider ha la sua chiave, i suoi rate limit, i suoi outage e il suo conto. Un AI gateway è il piccolo pezzo di infrastruttura che sta tra il tuo codice e ogni modello — Claude, GPT, Gemini, Llama, Kimi, DeepSeek, il tuo Ollama locale — e trasforma "N integrazioni fragili" in "un endpoint che controlli tu". Questa pagina confronta i quattro gateway che vengono effettivamente messi in produzione nel 2026 — LiteLLM, OpenRouter, Portkey e Vercel AI Gateway — e mostra il workflow killer: puntare Claude Code al tuo gateway così un solo proxy gestisce routing, budget, log e fallback per tutto il team.
- Capire cos'è un AI gateway e i cinque problemi che risolve (molti provider, un'API; fallback; chiavi virtuali; limiti di spesa; osservabilità)
- Confrontare LiteLLM, OpenRouter, Portkey e Vercel AI Gateway su latenza, prezzo, self-hostability e dove ciascuno eccelle
- Collegare Claude Code al tuo proxy LiteLLM con ANTHROPIC_BASE_URL e una chiave virtuale, così il team ha limiti e log condivisi
- Configurare il fallback OpenRouter così un outage Claude promuove silenziosamente GPT o Gemini invece di mostrare un 5xx agli utenti
- Capire l'incidente supply-chain LiteLLM di marzo 2026 e come pinnare le versioni in modo sicuro in produzione
Il problema: un SDK diretto per provider non scala
La prima integrazione Claude è un cambio di due righe: pip install anthropic, imposta ANTHROPIC_API_KEY, fatto. La seconda — supponiamo che tu voglia fare fallback su GPT-5.4 quando Anthropic ti limita — è dove l'astrazione si rompe. Ora hai due SDK con forme di richiesta diverse, due dashboard, due bollette, due cadenze di rotazione per le API key e due set di logica di retry. Aggiungi un terzo per Gemini e un quarto per il tuo Ollama locale, e ogni decisione di prodotto ("cap questo team a $500/mese", "logga ogni prompt per review", "lascia che un cliente porti la sua chiave") diventa N implementazioni invece di una.
Un AI gateway concentra tutta quella plumbing in un solo posto. Concretamente, un gateway di produzione ti dà:
- Una forma di richiesta per ogni provider. La maggior parte dei gateway parla l'API OpenAI Chat Completions (o Anthropic Messages, o entrambe) e traduce al provider reale sotto il cofano.
- Fallback e routing. Prova prima Claude; su 429 o 5xx, ritenta su GPT o Gemini senza che il chiamante lo sappia. Stesso discorso per soglie di latenza e rifiuti per moderazione dei contenuti.
- Chiavi virtuali. Emetti una chiave per-utente o per-servizio che mappa a un sottoinsieme di modelli, con il suo budget e il suo rate limit — così uno script impazzito non può prosciugare tutto l'account.
- Spending cap e logging. Ogni richiesta viene taggata, prezzata e salvata. Puoi revocare una chiave senza toccare Anthropic o OpenAI, e puoi provare a compliance cosa è stato mandato dove.
- Caching. Il prompt caching (match esatto) e il caching semantico (near-match) trasformano il traffico ripetuto in hit gratis.
Non tutti i team hanno bisogno di tutti e cinque. Ma nel momento in cui due di questi finiscono nella tua roadmap, far girare un gateway è più economico che reinventarli per provider.
I quattro gateway che vanno in produzione
Non c'è un "vincitore" — i quattro leader occupano angoli diversi dello spazio di design (self-hosted vs. hosted, open-source vs. proprietario, minimalista vs. control-panel).
| Gateway | Deploy | Modello di pricing | Miglior punto di forza | Non adatto per |
|---|---|---|---|---|
| LiteLLM | Self-hosted (Docker) o SDK | Gratis (OSS); tier Enterprise per SSO/audit | Proxy di team con chiavi virtuali, budget, senza markup per token, funziona con 100+ provider via una config | Team senza DevOps per far girare Postgres + Redis |
| OpenRouter | Solo hosted | Prezzo provider + ~5,5% di fee sull'acquisto crediti, nessun markup per richiesta | Accesso zero-ops a 300+ modelli con una chiave; ideale per prodotti che lasciano scegliere il modello all'utente | Aziende compliance che richiedono self-hosting o data residency |
| Portkey | Gateway OSS (npx) o cloud hosted | OSS gratis; il cloud ha tier di utilizzo | Latenza gateway sub-ms, caching semantico, guardrail, canary testing — l'angolo "control panel" | Team che vogliono solo l'aggregatore di chiavi più semplice possibile |
| Vercel AI Gateway | Solo hosted | Prezzo provider, nessun markup token; gratis con i piani Vercel | Dev già su Vercel che vogliono AI SDK v5/v6 + Anthropic Messages + OpenAI Responses unificate | Infrastruttura non-Vercel o deploy air-gapped |
L'asse importante su cui scegliere per primo: self-hosted vs. hosted. Se i tuoi dati non possono uscire dal VPC (settori regolati, residenza EU, review privacy enterprise), ti serve un gateway self-hostabile — LiteLLM o Portkey OSS. Se preferisci pagare qualcuno perché lo faccia girare, OpenRouter o Vercel AI Gateway è una faccenda one-click.
Il secondo asse: quanto control plane ti serve davvero. Se sei un prodotto one-person che vuole solo provare Kimi K3, Claude e Grok fianco a fianco senza fare tre signup, OpenRouter è tutta la storia. Se sei un'organizzazione da 20 persone dove finance vuole la spesa mensile per team, security vuole chiavi virtuali con rotazione e la piattaforma vuole metriche Grafana, stai costruendo su LiteLLM o Portkey.
Workflow killer: punta Claude Code al tuo proxy LiteLLM
Il segreto meglio custodito di Claude Code è che rispetta ANTHROPIC_BASE_URL e ANTHROPIC_AUTH_TOKEN. Impostali sul tuo gateway e Claude Code smette di parlare direttamente con api.anthropic.com — parla con il tuo proxy, che inoltra ad Anthropic (o altrove) con l'auth che controlli tu. Per un team, questo cambia tre cose in una volta:
- Una chiave virtuale condivisa per developer. Emetti e revochi chiavi nella UI del proxy. Niente credenziali root condivise nei file
.env. - Budget e log per-developer. Il proxy tagga ogni richiesta, quindi "chi ha speso i $300 ieri" è una query al database, non un incident.
- Aliasing dei modelli. Puoi pinnare
claude-sonnet-4-6al proxy così una deprecazione di modello è un cambio di config in una riga, non un grep su tutto il repo.
Avvia un proxy minimale in tre passi:
- In un venv fresco o via uv: uv tool install 'litellm[proxy]'. Questo installa il gateway server (FastAPI + admin UI) insieme all'SDK client.
- Gli ID modello a sinistra sono l'ALIAS che i tuoi caller vedono (quello che vuoi); il litellm_params.model a destra è il route reale del provider. Metti la tua ANTHROPIC_API_KEY nell'env, non nel file.
- Esegui litellm --config config.yaml (porta di default 4000). Poi imposta ANTHROPIC_BASE_URL sull'URL del proxy e ANTHROPIC_AUTH_TOKEN su una chiave virtuale. Claude Code inoltrerà ogni chiamata attraverso il proxy senza saperlo.
Il file di config che fa funzionare tutto questo:
config.yaml — Claude Sonnet/Opus/Haiku dietro LiteLLM
model_list:
- model_name: claude-opus-4-7
litellm_params:
model: anthropic/claude-opus-4-7
api_key: os.environ/ANTHROPIC_API_KEY
- model_name: claude-sonnet-4-6
litellm_params:
model: anthropic/claude-sonnet-4-6
api_key: os.environ/ANTHROPIC_API_KEY
- model_name: claude-haiku-4-5-20251001
litellm_params:
model: anthropic/claude-haiku-4-5-20251001
api_key: os.environ/ANTHROPIC_API_KEY
litellm_settings:
master_key: os.environ/LITELLM_MASTER_KEY
# Optional: enable exact-match prompt caching
cache: true
cache_params:
type: redis
host: os.environ/REDIS_HOSTPoi, dalla shell di qualsiasi developer:
Punta Claude Code al proxy (.env per-developer)
export ANTHROPIC_BASE_URL="https://llm.internal.example.com" export ANTHROPIC_AUTH_TOKEN="sk-team-alice-9f4c..." # a VIRTUAL key issued by the proxy # now every Claude Code call goes through YOUR gateway claude --model claude-sonnet-4-6
La vittoria meno ovvia è la chiave virtuale. La master key è admin-only e non finisce mai sui laptop. Ogni developer riceve una chiave virtuale che mappa solo ai modelli che permetti, ha il suo budget mensile e può essere revocata in pochi secondi senza ruotare la chiave Anthropic sottostante. Se un laptop viene perso, killi una riga in Postgres — non l'accesso di tutto il team.
Attenzione: le stesse variabili env funzionano con le integrazioni Bedrock e Vertex di Anthropic, ma ci sono edge case con le feature beta sperimentali. Per deploy Bedrock la doc LiteLLM raccomanda di impostare
CLAUDE_CODE_DISABLE_EXPERIMENTAL_BETAS=1in~/.claude/settings.jsonper evitare problemi di compatibilità degli header.
Workflow killer #2: fallback silenzioso con OpenRouter
Se non vuoi ospitare niente, l'array di fallback di OpenRouter è il percorso più breve per "ritenta silenziosamente un altro modello quando Claude fa 429". Mandi una lista ordinata; OpenRouter la percorre top-down e restituisce il primo modello che ha risposto.
Fallback Claude → GPT → Gemini in una richiesta (OpenRouter)
import openai
client = openai.OpenAI(
api_key="YOUR_OPENROUTER_KEY",
base_url="https://openrouter.ai/api/v1",
)
response = client.chat.completions.create(
model="anthropic/claude-sonnet-4.5",
extra_body={
# Ordered fallback. If the first model 429s, is down, or is
# rejected by moderation, OpenRouter tries the next one.
"models": [
"anthropic/claude-sonnet-4.5",
"openai/gpt-5.4",
"google/gemini-2.5-pro",
],
},
messages=[{"role": "user", "content": "Explain B-trees in one paragraph."}],
)
# 'model' in the response tells you which one actually answered.
print(response.model, "->", response.choices[0].message.content)Tre cose che la gente non nota al primo tentativo:
- La fattura segue il modello che ha risposto, non quello che hai chiesto. Se Claude fallisce e GPT-5.4 risponde, paghi la tariffa GPT-5.4 di OpenRouter per quella richiesta.
- Il fallback scatta su più che solo 5xx. Rate limit, downtime del provider, errori di validazione del context length e rifiuti da moderazione dei contenuti promuovono tutti al modello successivo. Quest'ultimo è il bordo più tagliente — un rifiuto per "moderazione" da un provider può reindirizzare silenziosamente a uno più permissivo, che può essere o non essere quello che vuoi. Rivedi la tua lista di fallback con la stessa cura di una ACL.
- Non puoi mischiare
modelsconfallbacks. L'endpoint Messages in formato Anthropic usa un arrayfallbacksdiverso. Mandare entrambe le chiavi nella stessa richiesta restituisce 400. Scegli il formato che parla il tuo client e attieniti a quello.
L'incidente supply-chain LiteLLM di marzo 2026: cosa fare davvero
Il 24 marzo 2026 alle 10:39 UTC, due release PyPI malevole di LiteLLM — v1.82.7 e v1.82.8 — sono state pubblicate da un attaccante dopo che aveva rubato le credenziali PyPI del maintainer via una compromissione precedente di Trivy, un security scanner che girava nella pipeline CI/CD di LiteLLM. PyPI ha messo in quarantena i pacchetti alle 13:38 UTC (circa tre ore dopo). Durante la finestra di esposizione sono avvenuti decine di migliaia di download. Il payload era un infostealer con un meccanismo di persistenza (un file litellm_init.pth che girava a ogni invocazione Python, raccoglieva credenziali e installava una backdoor systemd). L'attribuzione è a un gruppo tracciato come TeamPCP, che ha anche compromesso Trivy e Checkmarx KICS.
Se fai girare LiteLLM in qualsiasi ambiente, applica questo una volta e poi tienilo nel playbook di piattaforma:
- v1.82.6 e precedenti sono pulite. v1.83.0 e successive (pubblicate via la pipeline CI/CD v2 ricostruita di LiteLLM) sono pulite. Tutto quello che sta in mezzo va disinstallato e l'ambiente considerato contaminato. L'immagine Docker ufficiale (ghcr.io/berriai/litellm) NON è stata compromessa — l'incidente ha riguardato solo PyPI.
- Grep in site-packages per litellm_init.pth. Se esiste, tratta la macchina come compromessa: ruota ogni credenziale presente in variabili env o su disco (Anthropic, OpenAI, cloud, DB, SSH, token K8s) e fai scansione forense per la backdoor systemd.
- Da v1.83.0-nightly in poi, LiteLLM firma le sue immagini. Verificare con cosign prima del rollout intercetta un ripetersi di questo incidente al livello container.
- L'immagine Docker è sfuggita all'attacco; il wheel PyPI no. È un segnale duraturo: per un servizio di rete che tiene API key, girare il container pinnato è più sicuro di un venv pip-installato su un host condiviso.
- Il malware chiamava a casa su models.litellm[.]cloud e checkmarx[.]zone — nessuno dei due è legittimo. Allowlist di egress sui proxy LLM di produzione intercettano presto questa classe di attacco.
La lezione più ampia non è "non usare LiteLLM" — è "considera che ogni dipendenza nel tuo stack AI, security scanner inclusi, può essere un vettore di consegna". Pinna le versioni, firma le immagini e metti il tuo gateway su un segmento di rete che raggiunge solo i provider modello.
Scegli il gateway giusto per la tua situazione
- Uno o due provider con un team piccolo → salta il gateway; gli SDK diretti vanno bene. Tre+ provider O un team dove 'chi ha la chiave' conta → gateway. Se hai DevOps e requisiti di privacy, self-hosta LiteLLM o Portkey OSS. Se preferisci pagare qualcun altro perché lo faccia girare, OpenRouter (solo hosted) o Vercel AI Gateway (ottimo se già ci deploi).
- Sì → LiteLLM (native, matura) o Portkey (native, più caching semantico). No → OpenRouter o Vercel AI Gateway sono più leggeri.
- L'array models[] di OpenRouter e i fallback via provider-options di Vercel AI Gateway sono il percorso più breve. Anche LiteLLM lo fa via fallbacks: nella config, ma scrive più simile a un rules engine che a un array in una riga.
- Allora LiteLLM vince alla grande — è l'unico gateway con doc first-class per il pattern ANTHROPIC_BASE_URL + chiave virtuale, così un team di dieci utenti Claude Code dietro un proxy funziona e basta.
- Solo self-hosted: proxy container LiteLLM o Portkey OSS via npx @portkey-ai/gateway. Egress-allowlist il proxy verso i provider a cui è autorizzato ad arrivare.
Combinazioni comuni che vanno in produzione:
- Solo dev / prototipo: OpenRouter diretto. Una chiave, 300+ modelli, fatto.
- Team piccolo, Claude-first: proxy LiteLLM con Anthropic + un provider di fallback, chiavi virtuali per ingegnere, prompt caching Redis.
- Prodotto Vercel-native: Vercel AI Gateway con l'AI SDK; aggiungi OpenRouter come fallback
provider-optionsper modelli esotici. - Regolato / EU: LiteLLM o Portkey OSS self-hosted in-VPC con mascheramento PII Presidio davanti (vedi Claude + Modelli Locali per il pattern di redazione).
- Prodotto AI con traffico ripetuto pesante: Portkey (il caching semantico tipicamente porta 30–50% di riduzione costi su carichi chat-style, secondo i case study di Portkey — verifica sul tuo traffico prima di credere ai titoloni).
Cosa NON risolve un gateway
I gateway sono middleware — cambiano come raggiungi i modelli, non quale modello è quello giusto. Due cose richiedono ancora lavoro serio:
- Portabilità dei prompt. Claude, GPT e Gemini rispondono allo stesso prompt in modi diversi, e le convenzioni del system prompt variano. Un gateway non riscrive il tuo prompt per il provider di fallback — a quello servono Portare i prompt tra modelli e Traduzione cross-AI.
- Eval. Il gateway rende facile fare A/B tra due modelli sulla stessa richiesta. Non può dirti quale è stato effettivamente migliore sul TUO task. Fai una vera eval (vedi Evals) prima di cambiare il default.
Un errore comune è installare un gateway e considerare "multi-modello" fatto. Il gateway è il transport layer; portabilità ed eval sono il product layer.
Verifica te stesso
0/5- Un AI gateway è il router mancante tra la tua app e ogni modello — esiste per rendere chiavi virtuali, budget, fallback, logging e caching una sola implementazione invece di N per provider
- Scegli su DUE assi prima: self-hosted vs. hosted (LiteLLM/Portkey OSS vs. OpenRouter/Vercel), e minimalista vs. control-panel (OpenRouter/Vercel vs. LiteLLM/Portkey)
- Il workflow killer per Claude Code: punta ANTHROPIC_BASE_URL al tuo proxy LiteLLM ed emetti chiavi virtuali per-developer — il team ottiene limiti condivisi, log e revoca one-click senza toccare la chiave Anthropic root
- L'array models[] di OpenRouter è il percorso più breve al fallback silenzioso Claude → GPT → Gemini, ma nota che i rifiuti per moderazione sono anche loro un trigger di fallback — rivedi la lista come una ACL
- Dopo l'attacco supply-chain LiteLLM di marzo 2026, pinna a v1.82.6 o precedenti, o v1.83.0+; preferisci l'immagine Docker firmata a pip; egress-allowlist il proxy
- Un gateway è transport, non prodotto — portabilità dei prompt ed eval richiedono ancora lavoro serio, indipendentemente da quanti modelli puoi ora raggiungere
Fonti e approfondimenti
- LiteLLM — GitHub (BerriAI/litellm) — il repo sorgente e le release notes correnti
- LiteLLM Proxy — doc ufficiale — install, config.yaml, chiavi virtuali, budget
- Claude Code via LiteLLM — quickstart ufficiale — setup ANTHROPIC_BASE_URL, curl di verifica, note di sicurezza
- Doc provider Anthropic in LiteLLM — modelli Claude supportati e opzioni
- Security Update: Suspected Supply Chain Incident (March 2026) — blog LiteLLM — post ufficiale sull'incidente, indicazioni sulle versioni sicure, remediation
- Incident Report: LiteLLM/Telnyx supply-chain attacks — blog PyPI — timeline e mitigazioni di PyPI
- LiteLLM compromised on PyPI — Datadog Security Labs — analisi del malware (litellm_init.pth, domini di egress)
- OpenRouter — model fallbacks documentation — l'array models[], trigger, regole di fatturazione
- OpenRouter — provider preferences — controlli di routing avanzati
- Portkey AI Gateway — doc ufficiale — caching semantico, guardrail, canary
- Portkey Gateway — GitHub (OSS) — gateway open-source self-hostabile
- Vercel AI Gateway — doc ufficiale — modelli, provider, BYOK, osservabilità
- Vercel AI Gateway — compatibilità Anthropic Messages API — usare l'SDK Anthropic attraverso Vercel AI Gateway
Correlati su questo sito: Claude + Modelli Locali: Pattern Ibridi · Portare i prompt tra modelli · Traduzione cross-AI · Evals · Quanto costano gli AI tra provider