Le client MistralAzure en Python
Coder avec MistralAzure
Maintenant que vous avez déployé un endpoint Azure, passons à la pratique. Cette leçon détaille l’utilisation du client Python MistralAzure, les patterns de code courants et les spécificités à connaître pour développer efficacement avec Mistral sur Azure.
Installation et configuration
Installer le SDK
pip install mistralai
Le client Azure est inclus dans le package mistralai — aucune dépendance supplémentaire n’est nécessaire.
Initialisation du client
import os
from mistralai import MistralAzure
client = MistralAzure(
azure_endpoint=os.environ["AZUREAI_ENDPOINT"],
azure_api_key=os.environ["AZUREAI_API_KEY"]
)
Le constructeur accepte deux paramètres obligatoires :
azure_endpoint— l’URL complète de votre endpoint Azureazure_api_key— votre clé d’authentification
Chat Completions
Appel simple
response = client.chat.complete(
model="azureai",
messages=[
{"role": "system", "content": "Vous êtes un assistant technique spécialisé en Python."},
{"role": "user", "content": "Comment implémenter un décorateur de cache ?"}
]
)
print(response.choices[0].message.content)
Avec paramètres avancés
response = client.chat.complete(
model="azureai",
messages=[
{"role": "user", "content": "Génère un haïku sur le cloud computing."}
],
temperature=0.7,
max_tokens=150,
top_p=0.95
)
Les paramètres de génération fonctionnent exactement comme avec l’API Mistral directe :
temperature— contrôle la créativité (0.0 = déterministe, 1.0 = créatif)max_tokens— limite la longueur de la réponsetop_p— échantillonnage nucleus
Streaming
Pour les réponses longues, le streaming permet d’afficher le texte au fur et à mesure :
stream = client.chat.stream(
model="azureai",
messages=[
{"role": "user", "content": "Explique le fonctionnement d'un load balancer."}
]
)
for chunk in stream:
content = chunk.data.choices[0].delta.content
if content:
print(content, end="", flush=True)
print() # Nouvelle ligne à la fin
Le streaming est recommandé pour les applications interactives — l’utilisateur voit la réponse se construire en temps réel.
Appels asynchrones
Pour les applications web (FastAPI, Django async), utilisez le client asynchrone :
import asyncio
from mistralai import MistralAzure
client = MistralAzure(
azure_endpoint=os.environ["AZUREAI_ENDPOINT"],
azure_api_key=os.environ["AZUREAI_API_KEY"]
)
async def generate_response(prompt: str) -> str:
response = await client.chat.complete_async(
model="azureai",
messages=[{"role": "user", "content": prompt}]
)
return response.choices[0].message.content
# Exécution
result = asyncio.run(generate_response("Qu'est-ce que Kubernetes ?"))
print(result)
Function Calling
Le function calling fonctionne de manière identique à l’API directe :
import json
tools = [
{
"type": "function",
"function": {
"name": "get_weather",
"description": "Obtenir la météo d'une ville",
"parameters": {
"type": "object",
"properties": {
"city": {"type": "string", "description": "Nom de la ville"}
},
"required": ["city"]
}
}
}
]
response = client.chat.complete(
model="azureai",
messages=[{"role": "user", "content": "Quelle est la météo à Paris ?"}],
tools=tools,
tool_choice="auto"
)
# Vérifier si le modèle veut appeler une fonction
if response.choices[0].message.tool_calls:
tool_call = response.choices[0].message.tool_calls[0]
args = json.loads(tool_call.function.arguments)
print(f"Fonction appelée : {tool_call.function.name}")
print(f"Arguments : {args}")
Gestion des erreurs
En production, gérez les erreurs réseau et de rate limiting :
import time
from mistralai import MistralAzure
def robust_call(client, messages, max_retries=3):
"""Appel avec retry exponentiel et gestion d'erreurs."""
for attempt in range(max_retries):
try:
return client.chat.complete(
model="azureai",
messages=messages
)
except Exception as e:
error_str = str(e)
if "429" in error_str:
wait = 2 ** attempt
print(f"Rate limit — retry dans {wait}s")
time.sleep(wait)
elif "401" in error_str:
raise ValueError("Clé API invalide ou expirée") from e
elif "404" in error_str:
raise ValueError("Endpoint non trouvé — vérifiez AZUREAI_ENDPOINT") from e
else:
if attempt == max_retries - 1:
raise
time.sleep(1)
raise RuntimeError("Échec après tous les retries")
Mesurer la consommation
Chaque réponse inclut un objet usage qui détaille les tokens consommés :
response = client.chat.complete(
model="azureai",
messages=[{"role": "user", "content": "Bonjour"}]
)
usage = response.usage
print(f"Tokens prompt : {usage.prompt_tokens}")
print(f"Tokens réponse : {usage.completion_tokens}")
print(f"Tokens total : {usage.total_tokens}")
Utilisez ces métriques pour estimer vos coûts et optimiser vos prompts.
Points clés à retenir
- Le client
MistralAzures’utilise comme le client standard, avecmodel="azureai" - Le streaming (
chat.stream) est recommandé pour les interfaces utilisateur - Les appels asynchrones (
complete_async) sont essentiels pour les serveurs web - Le function calling et le JSON mode fonctionnent de manière identique à l’API directe
- Implémentez toujours un retry exponentiel pour gérer les erreurs
429