Tu as dĂ©jĂ  eu envie de tester ton code avec GPT, puis de basculer sur Claude ou Mistral sans tout réécrire ? C’est exactement le problĂšme que rĂ©sout LiteLLM, une bibliothĂšque Python devenue en quelques annĂ©es un standard de fait pour les dĂ©veloppeurs qui construisent des applications d’IA. Dans ce guide pratique, tu vas apprendre Ă  l’installer, Ă  appeler plusieurs modĂšles avec la mĂȘme fonction, Ă  gĂ©rer le streaming, les erreurs et le coĂ»t — avec du code que tu peux copier-coller et exĂ©cuter immĂ©diatement.

1. Pourquoi LiteLLM ? Le problĂšme du vendor lock-in

Chaque fournisseur d’IA a son SDK, ses paramĂštres, sa gestion d’erreurs. Pour utiliser OpenAI, tu importes openai ; pour Anthropic, anthropic ; pour Mistral, mistralai. Changer de modĂšle = changer de code. C’est ce qu’on appelle le vendor lock-in : tu es captif d’un fournisseur, et tu ne peux pas facilement comparer les modĂšles entre eux ou basculer vers l’offre la plus intĂ©ressante.

LiteLLM rĂ©sout ce problĂšme en proposant une seule interface pour plus de 100 fournisseurs (OpenAI, Anthropic, Mistral, Google Gemini, Cohere, Ollama pour le local, et bien d’autres). Le principe est simple : tu Ă©cris ton code une fois, et tu changes de modĂšle en modifiant une simple chaĂźne de caractĂšres.

Pour un dĂ©veloppeur, c’est un gain de temps Ă©norme : plus besoin d’apprendre trois SDK diffĂ©rents, plus besoin de maintenir trois blocs de gestion d’erreurs, et tu peux benchmarker les modĂšles cĂŽte Ă  cĂŽte en quelques minutes.

2. Installation et premier appel

L’installation se fait avec pip, comme n’importe quelle bibliothĂšque Python :

pip install litellm

Puis le premier appel, avec le modĂšle GPT-4o d’OpenAI :

import litellm

response = litellm.completion(
    model="gpt-4o",
    messages=[
        {"role": "system", "content": "Tu es un assistant expert en Python."},
        {"role": "user", "content": "Explique-moi les list comprehensions en une phrase."},
    ],
)

print(response.choices[0].message.content)

Rien de révolutionnaire jusque-là, me diras-tu. La magie arrive maintenant : pour passer sur Claude, tu changes uniquement le nom du modÚle :

response = litellm.completion(
    model="claude-3-5-sonnet-20241022",
    messages=[
        {"role": "system", "content": "Tu es un assistant expert en Python."},
        {"role": "user", "content": "Explique-moi les list comprehensions en une phrase."},
    ],
)

print(response.choices[0].message.content)

Et pour Mistral, mĂȘme chose :

response = litellm.completion(
    model="mistral/mistral-large-latest",
    messages=[{"role": "user", "content": "Bonjour !"}],
)

L’API de rĂ©ponse est identique Ă  celle d’OpenAI (response.choices[0].message.content), quelle que soit la marque du modĂšle. C’est tout l’intĂ©rĂȘt : tu n’apprends qu’une seule interface.

3. Gérer les clés API proprement

LiteLLM lit automatiquement les variables d’environnement conventionnelles : OPENAI_API_KEY, ANTHROPIC_API_KEY, MISTRAL_API_KEY, GEMINI_API_KEY, etc. Tu peux aussi passer la clĂ© directement dans l’appel :

import os
from dotenv import load_dotenv

load_dotenv()  # charge .env

response = litellm.completion(
    model="gpt-4o",
    api_key=os.getenv("OPENAI_API_KEY"),
    messages=[{"role": "user", "content": "Dis bonjour"}],
)

RĂšgle d’or : ne mets jamais une clĂ© API en dur dans ton code. Utilise un fichier .env (avec python-dotenv) ou les variables d’environnement de ton dĂ©ploiement. Et ajoute .env Ă  ton .gitignore dĂšs la crĂ©ation du projet.

4. Streaming : afficher les réponses en temps réel

Les chatbots modernes affichent la rĂ©ponse token par token. Avec LiteLLM, c’est un paramĂštre :

response = litellm.completion(
    model="gpt-4o",
    messages=[{"role": "user", "content": "Écris un haïku sur Python."}],
    stream=True,
)

for chunk in response:
    delta = chunk.choices[0].delta.content
    if delta:
        print(delta, end="", flush=True)

Le flux est itéré chunk par chunk, exactement comme avec le SDK OpenAI natif. Tu peux ensuite brancher ça sur une interface Streamlit ou FastAPI + Server-Sent Events pour créer un vrai chatbot web.

5. Sortie structurée JSON : des données fiables pour ton app

Un besoin frĂ©quent en production : obtenir une rĂ©ponse structurĂ©e en JSON plutĂŽt qu’un texte libre, pour l’intĂ©grer directement dans une base de donnĂ©es ou une API. LiteLLM gĂšre ça avec response_format :

response = litellm.completion(
    model="gpt-4o",
    response_format={"type": "json_object"},
    messages=[
        {"role": "system", "content": "Réponds uniquement en JSON valide."},
        {"role": "user", "content": "Extrais le nom, le prix et la disponibilitĂ© de ce produit : 'Casque audio sans fil, 89,90 €, en stock'."},
    ],
)

import json
data = json.loads(response.choices[0].message.content)
print(data["name"], data["price"])

CombinĂ© Ă  Pydantic, tu peux mĂȘme valider automatiquement la structure de la rĂ©ponse et typer les champs :

from pydantic import BaseModel
import json

class Produit(BaseModel):
    name: str
    price: float
    in_stock: bool

data = json.loads(response.choices[0].message.content)
produit = Produit(**data)  # validation + typage
print(produit.price + 10)

Fini les rĂ©ponses imprĂ©visibles : si le modĂšle renvoie un champ manquant ou un mauvais type, Pydantic lĂšve une erreur claire et tu peux relancer l’appel ou gĂ©rer le cas proprement.

6. Retry automatique et gestion des erreurs

Les APIs de modĂšles sont sujettes aux erreurs transitoires : rate limits (429), serveurs saturĂ©s (503), timeouts. LiteLLM intĂšgre une logique de retry avec backoff exponentiel prĂȘte Ă  l’emploi :

import litellm

response = litellm.completion(
    model="gpt-4o",
    messages=[{"role": "user", "content": "Bonjour"}],
    num_retries=3,          # 3 tentatives en cas d'échec
    timeout=30,             # timeout par appel en secondes
)

# Gestion d'erreurs explicite
try:
    response = litellm.completion(model="gpt-4o", messages=[{"role": "user", "content": "Bonjour"}])
except litellm.exceptions.RateLimitError as e:
    print("Rate limit atteint :", e)
except litellm.exceptions.Timeout as e:
    print("Timeout :", e)

En production, ajoute toujours num_retries et un timeout raisonnable. Un appel sans timeout peut geler ton serveur web pendant des minutes si l’API ne rĂ©pond pas.

7. Maßtriser les coûts : budgets et limites

Les appels LLM coĂ»tent de l’argent. LiteLLM permet de dĂ©finir des budgets par appel ou par utilisateur pour Ă©viter les mauvaises surprises :

response = litellm.completion(
    model="gpt-4o",
    messages=[{"role": "user", "content": "GénÚre un long texte"}],
    max_budget=0.05,   # 5 centimes max pour cet appel
)

# Coût estimé de l'appel
print("CoĂ»t estimĂ© :", response._hidden_params.get("response_cost"), "€")

Astuce coĂ»t : pour les tĂąches simples (classification, extraction courte), utilise un petit modĂšle rapide (gpt-4o-mini, mistral-small) et rĂ©serve les gros modĂšles aux tĂąches complexes. C’est la stratĂ©gie que les Ă©quipes sĂ©rieuses appliquent : le bon modĂšle pour chaque tĂąche, pas le plus gros modĂšle pour tout.

8. Aller plus loin : le local avec Ollama

Enfin, LiteLLM fonctionne aussi avec des modĂšles 100% locaux via Ollama — pratique pour dĂ©velopper sans dĂ©penser un centime ou pour les donnĂ©es sensibles :

# Une fois Ollama installé : ollama pull llama3.2
response = litellm.completion(
    model="ollama/llama3.2",
    messages=[{"role": "user", "content": "Raconte une blague de développeur."}],
    api_base="http://localhost:11434",
)

print(response.choices[0].message.content)

Le mĂȘme code tourne avec un modĂšle local ou un modĂšle cloud : il suffit de changer la chaĂźne model. C’est parfait pour dĂ©velopper gratuitement en local, puis passer en production sur un modĂšle cloud sans toucher au code.

9. Récapitulatif : quand utiliser LiteLLM ?

LiteLLM brille dÚs que ton projet dépasse le simple script de test :

  • Tu veux comparer plusieurs modĂšles (GPT, Claude, Mistral, Gemini) sur tes propres cas d’usage.
  • Tu construis une application multi-modĂšles : un mĂȘme prompt, plusieurs moteurs d’IA derriĂšre.
  • Tu veux une couche de retry, timeout et budget sans rĂ©inventer la roue.
  • Tu veux passer du local au cloud sans réécrire ton code.

À l’inverse, si tu n’utilises qu’un seul fournisseur pour un prototype jetable, le SDK natif suffit amplement. LiteLLM prend tout son sens quand ton application devient sĂ©rieuse et que la flexibilitĂ© devient un atout.

Conclusion

LiteLLM est devenu un outil indispensable dans la boĂźte Ă  outils du dĂ©veloppeur IA : une seule API pour des dizaines de modĂšles, le streaming en trois lignes, les retries automatiques, les budgets et mĂȘme le local avec Ollama. En maĂźtrisant cette bibliothĂšque, tu gagnes en autonomie et tu peux toujours choisir le meilleur modĂšle pour ton besoin — sans dĂ©pendre d’un fournisseur unique.

Tu veux progresser sur les bases du langage qui fait tourner tous ces exemples ? Le cours Python — Les Fondamentaux te donne les fondations solides pour Ă©crire du code propre et maintenable, avant de t’attaquer aux APIs d’IA.