Passerelles IA : LiteLLM, OpenRouter, Portkey, Vercel
Dès que votre produit dialogue avec plus d'un modèle, l'approche SDK direct se fissure. Chaque fournisseur a sa propre clé, ses propres limites de débit, son propre calendrier de pannes et sa propre facture. Une passerelle IA est ce petit morceau d'infrastructure qui se place entre votre code et chaque modèle — Claude, GPT, Gemini, Llama, Kimi, DeepSeek, votre Ollama local — et qui transforme « N intégrations fragiles » en « un seul endpoint que vous contrôlez ». Cette page compare les quatre passerelles réellement déployées en production en 2026 — LiteLLM, OpenRouter, Portkey et Vercel AI Gateway — et montre le workflow qui tue : pointer Claude Code vers votre propre passerelle pour qu'un seul proxy gère le routage, les budgets, la journalisation et le basculement pour toute l'équipe.
- Comprendre ce qu'est une passerelle IA et les cinq problèmes qu'elle résout (plusieurs fournisseurs, une API ; basculement ; clés virtuelles ; plafonds de dépenses ; observabilité)
- Comparer LiteLLM, OpenRouter, Portkey et Vercel AI Gateway sur la latence, le prix, la capacité d'auto-hébergement et les points forts de chacun
- Connecter Claude Code via votre propre proxy LiteLLM avec ANTHROPIC_BASE_URL et une clé virtuelle pour que l'équipe partage limites et journaux
- Configurer le basculement OpenRouter afin qu'une panne Claude promeuve silencieusement GPT ou Gemini au lieu d'afficher une 5xx aux utilisateurs
- Comprendre l'incident de chaîne d'approvisionnement LiteLLM de mars 2026 et comment épingler les versions en toute sécurité en production
Le problème : un SDK direct par fournisseur ne passe pas à l'échelle
La première intégration Claude est un changement de deux lignes : pip install anthropic, définir ANTHROPIC_API_KEY, fini. La seconde — disons que vous voulez basculer vers GPT-5.4 quand Anthropic vous limite — est le point où l'abstraction casse. Vous avez maintenant deux SDK avec des formes de requête différentes, deux tableaux de bord, deux factures, deux cadences de rotation pour les clés API, et deux ensembles de logique de retry. Ajoutez un troisième pour Gemini et un quatrième pour votre Ollama local, et chaque décision produit (« plafonner cette équipe à 500 $/mois », « journaliser chaque prompt pour revue », « laisser un client apporter sa propre clé ») devient N implémentations au lieu d'une.
Une passerelle IA concentre toute cette plomberie en un seul endroit. Concrètement, une passerelle de production vous offre :
- Une seule forme de requête pour tous les fournisseurs. La plupart des passerelles parlent l'API OpenAI Chat Completions (ou Anthropic Messages, ou les deux) et traduisent vers le fournisseur réel en coulisses.
- Basculement et routage. Essayer Claude d'abord ; en cas de 429 ou 5xx, réessayer avec GPT ou Gemini sans que l'appelant le sache. Idem pour les plafonds de latence et les refus de modération de contenu.
- Clés virtuelles. Émettre une clé par utilisateur ou par service qui mappe vers un sous-ensemble de modèles, son propre budget et sa propre limite de débit — de sorte qu'un script malveillant ne puisse pas vider tout le compte.
- Plafonds de dépenses et journalisation. Chaque requête est marquée, tarifée et stockée. Vous pouvez révoquer une clé sans toucher à Anthropic ou OpenAI, et vous pouvez prouver à la conformité ce qui a été envoyé et où.
- Mise en cache. La mise en cache des prompts (correspondance exacte) et la mise en cache sémantique (correspondance approximative) transforment le trafic répété en hits gratuits.
Toutes les équipes n'ont pas besoin des cinq. Mais dès que deux d'entre elles sont sur votre feuille de route, exploiter une passerelle coûte moins cher que de les réinventer par fournisseur.
Les quatre passerelles qui tournent en production
Il n'y a pas de « vainqueur » unique — les quatre leaders occupent différents coins de l'espace de conception (auto-hébergé vs. hébergé, open source vs. propriétaire, minimaliste vs. panneau de contrôle).
| Passerelle | Déploiement | Modèle tarifaire | Meilleur pour | Pas pour |
|---|---|---|---|---|
| LiteLLM | Auto-hébergé (Docker) ou SDK | Gratuit (OSS) ; palier Entreprise pour SSO/audit | Proxy d'équipe avec clés virtuelles, budgets, sans majoration par token, fonctionne avec plus de 100 fournisseurs via une seule config | Équipes sans DevOps pour exploiter Postgres + Redis |
| OpenRouter | Hébergé uniquement | Prix fournisseur + ~5,5 % de frais d'achat de crédits, sans majoration par requête | Accès zéro-ops à plus de 300 modèles sous une seule clé ; idéal pour les produits qui laissent les utilisateurs choisir un modèle | Boutiques de conformité qui ont besoin d'auto-hébergement ou de résidence des données |
| Portkey | Passerelle OSS (npx) ou cloud hébergé | OSS gratuit ; le cloud a des paliers d'usage | Latence de passerelle sub-ms, mise en cache sémantique, garde-fous, tests canari — l'angle « panneau de contrôle » | Équipes qui veulent juste l'agrégateur de clés le plus simple possible |
| Vercel AI Gateway | Hébergé uniquement | Prix fournisseur, sans majoration de token ; gratuit avec les plans Vercel | Développeurs déjà sur Vercel qui veulent AI SDK v5/v6 + Anthropic Messages + APIs OpenAI Responses unifiés | Infrastructure non-Vercel ou déploiements air-gap |
Le premier axe important pour choisir : auto-hébergé vs. hébergé. Si vos données ne peuvent pas quitter votre VPC (industries régulées, résidence UE, revues de confidentialité entreprise), il vous faut une passerelle auto-hébergeable — LiteLLM ou Portkey OSS. Si vous préférez payer quelqu'un pour l'exploiter, OpenRouter ou Vercel AI Gateway est une affaire en un clic.
Le second axe : combien de plan de contrôle il vous faut réellement. Si vous êtes un produit solo qui veut juste essayer Kimi K3, Claude et Grok côte à côte sans trois inscriptions, OpenRouter est toute l'histoire. Si vous êtes une organisation de 20 personnes où la finance veut les dépenses mensuelles par équipe, la sécurité veut des clés virtuelles avec rotation et la plateforme veut des métriques Grafana, vous construisez sur LiteLLM ou Portkey.
Workflow qui tue : pointer Claude Code vers votre propre proxy LiteLLM
Le secret le mieux gardé de Claude Code est qu'il respecte ANTHROPIC_BASE_URL et ANTHROPIC_AUTH_TOKEN. Définissez-les vers votre passerelle et Claude Code cesse de parler directement à api.anthropic.com — il parle à votre proxy, qui transmet à Anthropic (ou n'importe où ailleurs) avec l'auth que vous contrôlez. Pour une équipe, cela change trois choses à la fois :
- Une clé virtuelle partagée par développeur. Vous émettez et révoquez les clés dans l'UI du proxy. Pas d'identifiants racine partagés dans les fichiers
.env. - Budgets et journaux par développeur. Le proxy marque chaque requête, donc « qui a dépensé les 300 $ hier » est une requête base de données, pas un incident.
- Aliasing de modèles. Vous pouvez épingler
claude-sonnet-4-6au niveau du proxy pour qu'une dépréciation de modèle devienne un changement de config d'une ligne, pas un grep sur tout le repo.
Démarrez un proxy minimal en trois étapes :
- Dans un venv frais ou via uv : uv tool install 'litellm[proxy]'. Cela installe le serveur de passerelle (FastAPI + UI admin) aux côtés du SDK client.
- Les IDs de modèle à gauche sont l'ALIAS que vos appelants voient (ce que vous voulez) ; le litellm_params.model à droite est la VRAIE route fournisseur. Mettez votre ANTHROPIC_API_KEY dans l'environnement, pas dans le fichier.
- Exécutez litellm --config config.yaml (port par défaut 4000). Puis définissez ANTHROPIC_BASE_URL vers l'URL du proxy et ANTHROPIC_AUTH_TOKEN vers une clé virtuelle. Claude Code routera chaque appel via le proxy sans le savoir.
Le fichier de config qui fait fonctionner tout ça :
config.yaml — Claude Sonnet/Opus/Haiku derrière 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_HOSTEnsuite, depuis le shell de n'importe quel développeur :
Pointer Claude Code vers le proxy (.env par développeur)
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
Le gain non évident est la clé virtuelle. La clé maître est réservée aux admins et n'atterrit jamais sur les laptops. Chaque développeur reçoit une clé virtuelle qui mappe vers seulement les modèles que vous autorisez, a son propre budget mensuel et peut être révoquée en secondes sans rotation de la clé Anthropic sous-jacente. Si un laptop est perdu, vous tuez une ligne dans Postgres — pas l'accès de toute l'équipe.
Attention : les mêmes variables d'environnement fonctionnent avec les intégrations Bedrock et Vertex d'Anthropic, mais il y a des cas limites avec les fonctionnalités bêta expérimentales. Pour les déploiements Bedrock, la doc LiteLLM recommande de définir
CLAUDE_CODE_DISABLE_EXPERIMENTAL_BETAS=1dans~/.claude/settings.jsonpour éviter les problèmes de compatibilité d'en-têtes.
Workflow qui tue #2 : basculement silencieux avec OpenRouter
Si vous ne voulez rien héberger, le tableau de basculement d'OpenRouter est le chemin le plus court vers « réessayer silencieusement un autre modèle quand Claude renvoie du 429 ». Vous envoyez une liste ordonnée ; OpenRouter la parcourt du haut vers le bas et renvoie le premier modèle qui a répondu.
Basculement Claude → GPT → Gemini en une seule requête (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)Trois choses que les gens ratent lors du premier essai :
- La facturation suit le modèle qui a répondu, pas celui que vous avez demandé. Si Claude échoue et que GPT-5.4 répond, vous payez le tarif GPT-5.4 d'OpenRouter pour cette requête.
- Le basculement se déclenche sur plus que du 5xx. La limitation de débit, l'indisponibilité du fournisseur, les erreurs de validation de longueur de contexte et les refus de modération de contenu promeuvent tous au modèle suivant. Ce dernier est le bord le plus tranchant — un refus de « modération » d'un fournisseur peut router silencieusement vers un plus permissif, ce qui peut ou non être ce que vous voulez. Revoyez votre liste de basculement avec le même soin qu'une ACL.
- Vous ne pouvez pas mélanger
modelsavecfallbacks. L'endpoint Messages au format Anthropic utilise un tableaufallbacksdifférent. Envoyer les deux clés dans la même requête renvoie une 400. Choisissez le format que parle votre client et tenez-vous-y.
L'incident de chaîne d'approvisionnement LiteLLM de mars 2026 : que faire concrètement
Le 24 mars 2026 à 10:39 UTC, deux versions PyPI malveillantes de LiteLLM — v1.82.7 et v1.82.8 — ont été publiées par un attaquant après qu'il a volé les identifiants PyPI du mainteneur via une compromission préalable de Trivy, un scanner de sécurité tournant dans le pipeline CI/CD de LiteLLM. PyPI a mis les paquets en quarantaine à 13:38 UTC (environ trois heures plus tard). Pendant la fenêtre d'exposition, des dizaines de milliers de téléchargements ont eu lieu. La charge utile était un infostealer avec un mécanisme de persistance (un fichier litellm_init.pth qui s'exécutait à chaque invocation Python, moissonnait les identifiants et installait une backdoor systemd). L'attribution va à un groupe suivi sous le nom de TeamPCP, qui a également compromis Trivy et Checkmarx KICS.
Si vous exploitez LiteLLM dans n'importe quel environnement, appliquez ceci une fois et gardez-le dans votre playbook de plateforme :
- v1.82.6 et antérieures sont saines. v1.83.0 et ultérieures (publiées via le pipeline CI/CD v2 reconstruit de LiteLLM) sont saines. Tout ce qui est entre les deux doit être désinstallé et l'environnement considéré comme contaminé. L'image Docker officielle (ghcr.io/berriai/litellm) n'a PAS été compromise — l'incident était PyPI uniquement.
- Grep site-packages pour litellm_init.pth. S'il existe, traitez la machine comme compromise : faites la rotation de chaque identifiant présent dans les variables d'environnement ou sur disque (Anthropic, OpenAI, cloud, DB, SSH, tokens K8s) et faites un scan forensique pour la backdoor systemd.
- À partir de v1.83.0-nightly, LiteLLM signe ses images. Vérifier avec cosign avant déploiement attrape une répétition de cet incident au niveau conteneur.
- L'image Docker a échappé à l'attaque ; le wheel PyPI non. C'est un signal durable : pour un service en réseau qui détient des clés API, exécuter le conteneur épinglé est plus sûr qu'un venv installé par pip sur un hôte partagé.
- Le malware appelait models.litellm[.]cloud et checkmarx[.]zone — aucun n'est légitime. Les listes blanches de sortie sur les proxys LLM de production attrapent cette classe d'attaque tôt.
La leçon plus large n'est pas « n'utilisez pas LiteLLM » — c'est « supposez que chaque dépendance de votre stack IA, y compris les scanners de sécurité, peut être un vecteur de livraison ». Épinglez les versions, signez les images et mettez votre passerelle sur un segment réseau qui n'atteint que les fournisseurs de modèles.
Choisir la bonne passerelle pour votre situation
- Un ou deux fournisseurs avec une petite équipe → sautez la passerelle ; les SDK directs suffisent. Trois fournisseurs ou plus OU une équipe où « qui a la clé » compte → passerelle. Si vous avez du DevOps et des exigences de confidentialité, auto-hébergez LiteLLM ou Portkey OSS. Si vous préférez payer quelqu'un d'autre pour l'exploiter, OpenRouter (hébergé uniquement) ou Vercel AI Gateway (excellent si vous y déployez déjà).
- Oui → LiteLLM (natif, mature) ou Portkey (natif, plus mise en cache sémantique). Non → OpenRouter ou Vercel AI Gateway sont plus légers.
- Le models[] d'OpenRouter et les fallbacks provider-options de Vercel AI Gateway sont le chemin le plus court. LiteLLM le fait aussi via fallbacks: dans la config, mais s'écrit plus comme un moteur de règles qu'un tableau d'une ligne.
- Alors LiteLLM gagne haut la main — c'est la seule passerelle avec de la doc de première classe pour le pattern ANTHROPIC_BASE_URL + clé virtuelle, donc une équipe de dix utilisateurs Claude Code derrière un seul proxy fonctionne juste.
- Auto-hébergé uniquement : conteneur proxy LiteLLM ou Portkey OSS via npx @portkey-ai/gateway. Liste blanche de sortie du proxy vers les fournisseurs qu'il est autorisé à atteindre.
Combinaisons courantes qui tournent en production :
- Développeur solo / prototype : OpenRouter direct. Une clé, plus de 300 modèles, fini.
- Petite équipe, Claude-first : proxy LiteLLM avec Anthropic + un fournisseur de basculement, clés virtuelles par ingénieur, mise en cache Redis des prompts.
- Produit natif Vercel : Vercel AI Gateway avec le AI SDK ; ajoutez OpenRouter comme basculement
provider-optionspour les modèles exotiques. - Régulé / UE : LiteLLM ou Portkey OSS auto-hébergé dans le VPC avec masquage PII Presidio en amont (voir Claude + Modèles Locaux pour le pattern de rédaction).
- Produit IA avec trafic répété important : Portkey (la mise en cache sémantique génère communément 30 à 50 % de réduction de coût sur les charges de travail de type chat, selon les propres études de cas de Portkey — vérifiez sur votre trafic avant de croire aux chiffres d'affichage).
Ce qu'une passerelle ne résout PAS
Les passerelles sont du middleware — elles changent comment vous atteignez les modèles, pas quel modèle est le bon. Deux choses nécessitent toujours du vrai travail :
- Portabilité des prompts. Claude, GPT et Gemini répondent différemment au même prompt, et les conventions de system prompt varient. Une passerelle ne réécrit pas votre prompt pour le fournisseur de basculement — c'est à ça que servent Porter des prompts entre modèles et Traduction cross-IA.
- Évaluations. La passerelle rend facile l'A/B de deux modèles sur la même requête. Elle ne peut pas vous dire lequel était réellement meilleur sur VOTRE tâche. Faites une vraie évaluation (voir Évaluations) avant de changer les valeurs par défaut.
Une erreur courante est d'installer une passerelle et de considérer le « multi-modèle » comme fait. La passerelle est la couche de transport ; portabilité et évaluations sont la couche produit.
Testez-vous
0/5- Une passerelle IA est le routeur manquant entre votre app et chaque modèle — elle existe pour faire des clés virtuelles, budgets, basculement, journalisation et mise en cache une implémentation unique au lieu de N par fournisseur
- Choisissez d'abord sur DEUX axes : auto-hébergé vs. hébergé (LiteLLM/Portkey OSS vs. OpenRouter/Vercel), et minimaliste vs. panneau de contrôle (OpenRouter/Vercel vs. LiteLLM/Portkey)
- Le workflow tueur Claude Code : pointer ANTHROPIC_BASE_URL vers votre propre proxy LiteLLM et émettre des clés virtuelles par développeur — l'équipe obtient limites partagées, journaux et révocation en un clic sans toucher à la clé racine Anthropic
- Le tableau models[] d'OpenRouter est le chemin le plus court vers un basculement silencieux Claude → GPT → Gemini, mais notez que les refus de modération sont aussi un déclencheur de basculement — revoyez la liste comme une ACL
- Après l'attaque de chaîne d'approvisionnement LiteLLM de mars 2026, épinglez à v1.82.6 ou antérieure, ou v1.83.0+ ; préférez l'image Docker signée à pip ; liste blanche de sortie sur le proxy
- Une passerelle est du transport, pas du produit — la portabilité des prompts et les évaluations nécessitent toujours du vrai travail, peu importe combien de modèles vous pouvez désormais atteindre
Sources et lectures complémentaires
- LiteLLM — GitHub (BerriAI/litellm) — le repo source et les notes de version actuelles
- LiteLLM Proxy — doc officielle — installation, config.yaml, clés virtuelles, budgets
- Claude Code via LiteLLM — démarrage rapide officiel — configuration ANTHROPIC_BASE_URL, curl de vérification, notes de sécurité
- Doc du fournisseur Anthropic de LiteLLM — modèles Claude et options supportés
- Mise à jour de sécurité : incident présumé de chaîne d'approvisionnement (mars 2026) — blog LiteLLM — post officiel d'incident, conseils de version sûre, remédiation
- Rapport d'incident : attaques de chaîne d'approvisionnement LiteLLM/Telnyx — blog PyPI — chronologie et mitigations de PyPI
- LiteLLM compromis sur PyPI — Datadog Security Labs — analyse du malware (litellm_init.pth, domaines de sortie)
- OpenRouter — documentation sur les basculements de modèles — le tableau models[], déclencheurs, règles de facturation
- OpenRouter — préférences de fournisseur — contrôles de routage avancés
- Portkey AI Gateway — doc officielle — mise en cache sémantique, garde-fous, canari
- Portkey Gateway — GitHub (OSS) — passerelle open source auto-hébergeable
- Vercel AI Gateway — doc officielle — modèles, fournisseurs, BYOK, observabilité
- Vercel AI Gateway — compatibilité de l'API Anthropic Messages — utiliser le SDK Anthropic via Vercel AI Gateway
En rapport sur ce site : Claude + Modèles Locaux : Patterns Hybrides · Porter des prompts entre modèles · Traduction cross-IA · Évaluations · Ce que l'IA coûte chez les différents fournisseurs