LiteLLM : un proxy unifié local et cloud
Si vous jonglez entre un Ollama local pour les tâches sensibles et des API cloud (OpenAI, Anthropic) pour les requêtes lourdes, vous avez vite trois SDK, trois formats de clé, trois manières de gérer les erreurs. LiteLLM est un proxy local qui parle l'API OpenAI à votre application, et qui derrière route vers le bon backend — local ou cloud — avec fallback, rate limiting et tracking des coûts. Une seule URL côté code, toute la logique dans un config.yaml.
#Pourquoi un proxy LiteLLM local cloud
Une stack hybride typique a deux problèmes. D'abord, le code applicatif se remplit de if provider == 'openai' / elif provider == 'ollama'. Ensuite, la décision "local vs cloud" est figée à l'écriture du code : si Ollama tombe, l'app tombe ; si vous voulez basculer sur Claude pour une tâche précise, il faut redéployer.
LiteLLM résout les deux. Côté application, vous parlez à un endpoint unique compatible OpenAI (chat/completions, embeddings, streaming). Côté infra, un fichier config.yaml décrit vos modèles : alias logique, backend, clé API, priorité de fallback. Vous changez la route sans toucher au code.
#Comment ça marche
Le proxy expose le port 4000 par défaut. Votre app envoie un POST /chat/completions avec model: "chat-fr". LiteLLM regarde son config.yaml, voit que chat-fr pointe vers ollama/mistral à localhost:11434, fait la requête, normalise la réponse au format OpenAI, et renvoie le résultat à l'app.
- Côté app
- Une seule URL (http://localhost:4000), une seule clé virtuelle, le SDK OpenAI standard suffit.
- Côté proxy
- Un model_list mappe des alias (chat-fr, code-rapide, analyse-doc) vers de vrais backends.
- Routing
- Plusieurs backends pour le même alias = load balancing, fallback, retry automatique.
- Observabilité
- Logs, latences, coût par requête et par clé virtuelle, exportables vers Langfuse, Prometheus ou un Postgres.
#Prérequis
- Python 3.10+
- LiteLLM est un package pip. Une venv ou pipx propre suffit.
- Ollama qui tourne
- Sur http://localhost:11434 avec au moins un modèle pull. Voir le guide installation Ollama si besoin.
- Clés API cloud (optionnel)
- OPENAI_API_KEY, ANTHROPIC_API_KEY si vous voulez router vers le cloud en fallback.
- Un fichier .env
- Pour ne jamais committer les clés en clair dans config.yaml.
#1. Installation
L'extra proxy embarque FastAPI, uvicorn et les dépendances optionnelles (Postgres, Redis si vous voulez du rate limiting partagé). Pour un test rapide, c'est suffisant. Pour de la production, partez plutôt sur l'image Docker officielle.
Vérifiez que ça tourne :
#2. Un config.yaml LiteLLM minimal
Créez config.yaml à côté de votre projet. La structure tient en trois sections : model_list (les alias), litellm_settings (comportement global) et general_settings (auth, base de données).
Lancez le proxy avec ce config :
Côté application, le SDK OpenAI Python parle directement au proxy. Aucune dépendance à LiteLLM dans le code applicatif :
#3. Ajouter OpenAI et Anthropic
On ne hardcode jamais les clés. Mettez-les dans un .env à côté du config :
Puis référencez les variables avec la syntaxe os.environ dans le YAML — LiteLLM les substitue au démarrage :
À ce stade vous avez trois alias logiques. Le code applicatif choisit chat-fr pour les conversations privées, chat-gros pour les requêtes longues, analyse-doc pour la lecture de PDF. Aucune clé n'apparaît dans le code.
#4. Routing par modèle et fallback automatique
La vraie valeur du proxy arrive ici. Deux mécanismes à connaître : plusieurs entrées sous le même model_name (load balancing) et la clé fallbacks (bascule sur erreur).
- 01Plusieurs entrées, un seul aliasVous pouvez déclarer deux fois model_name: chat-fr — une pointant sur Ollama local, l'autre sur un Mistral cloud. LiteLLM répartit les requêtes selon la stratégie (simple-shuffle par défaut, ou usage-based-routing si vous voulez optimiser le coût).
- 02Fallback expliciteDans litellm_settings, déclarez quel alias prend le relais si le premier renvoie une erreur ou un timeout. Le fallback déclenche automatiquement un retry sur le backend de secours.
- 03Health check actifLiteLLM ping périodiquement chaque modèle. Un Ollama qui ne répond plus est marqué unhealthy et sorti du pool tant qu'il ne revient pas — vos requêtes basculent toutes seules sur le cloud.
Avec cette config, votre app appelle toujours model: "chat-fr". Si Ollama est down, en timeout, ou si le prompt dépasse la fenêtre de contexte locale (8k sur Mistral), le proxy bascule transparent sur GPT-4o-mini. L'app ne voit rien — juste une réponse, peut-être un peu plus lente.
#5. Suivi des coûts et rate limiting
Une stack hybride a un coût caché : on croit utiliser le local, et 30% des requêtes ont en fait basculé sur GPT-4o. LiteLLM calcule le coût de chaque requête à partir d'une table de prix interne (à jour des grilles publiques).
Pour persister les logs et exposer un dashboard, branchez un Postgres :
Une fois Postgres branché, l'UI admin (http://localhost:4000/ui) montre le coût par clé virtuelle, par modèle, par utilisateur. Vous pouvez aussi créer des clés virtuelles à budget plafonné — pratique pour donner accès à une équipe sans risque de dérapage.
Ordres de grandeur de coût pour 1 M tokens en sortie (prix publics juin 2026, à recalculer chez votre fournisseur) :
- Ollama local (Mistral 7B Q4)
- 0 $ marginal — votre électricité et l'amortissement du GPU.
- OpenAI gpt-4o-mini
- Autour de 0,60 $ / 1M tokens output, idéal pour le fallback bon marché.
- Anthropic Claude Haiku 4.5
- Autour de 5 $ / 1M tokens output, plus cher mais excellent rapport qualité/prix sur l'analyse de documents.
- OpenAI gpt-4o
- Autour de 10 $ / 1M tokens output, à réserver aux tâches où le 4o-mini n'est pas assez bon.
Côté rate limiting, on déclare des limites RPM (requests per minute) et TPM (tokens per minute) par modèle. LiteLLM met en file d'attente ou renvoie une 429 selon votre config :
#Dépannage
- "Model not found" alors que l'alias existe
- Vérifiez l'indentation YAML. Une espace en trop sous litellm_params et le proxy ignore silencieusement l'entrée. Lancez litellm --config config.yaml --debug pour voir le model_list effectivement chargé.
- Le fallback ne se déclenche pas
- num_retries doit être ≥ 1 et le timeout doit être atteint. Par défaut, request_timeout est très généreux côté Ollama — descendez-le à 30 secondes pour des fallbacks réactifs.
- Erreur 401 sur Ollama
- ollama/* ne prend pas de clé API. Si vous avez mis api_key sur une entrée Ollama, retirez-la. LiteLLM passe la clé telle quelle, ce qui plante.
- Coûts faux ou à zéro
- La table de prix dépend de la version de LiteLLM. Mettez à jour (pip install -U 'litellm[proxy]'). Pour un modèle custom non listé, déclarez input_cost_per_token et output_cost_per_token manuellement dans litellm_params.
- Latence anormale sur Ollama
- Le proxy fait un health check toutes les minutes. Si Ollama est lent à charger un modèle (cold start), le check timeout et marque le modèle unhealthy. Augmentez health_check_interval ou pré-chargez les modèles avec ollama run X --keepalive 60m.
#Pour aller plus loin
Avec ce setup vous avez un point d'entrée unique pour toute votre IA, local ou cloud, avec une bascule transparente. Les étapes naturelles :
Un retour, une erreur, une précision ? Faites-nous signe, ça améliore le guide pour tout le monde.