API Codestral en Python
Appeler Codestral depuis Python
Dans cette leçon, vous allez apprendre à utiliser le SDK Python de Mistral AI pour interagir avec Codestral. Nous couvrirons les deux endpoints (FIM et Chat), les paramètres avancés, et les patterns d’utilisation courants.
Installation et configuration
Commencez par installer le SDK Mistral AI :
pip install mistralai
Configurez votre client avec votre clé API :
import os
from mistralai import Mistral
client = Mistral(api_key=os.environ["MISTRAL_API_KEY"])
Vous pouvez obtenir votre clé API sur console.mistral.ai. Codestral est disponible sur deux plateformes :
- api.mistral.ai — pay-per-use, facturation à l’usage
- codestral.mistral.ai — accès gratuit ou par abonnement (endpoint dédié)
Appel FIM complet
Voici un appel FIM détaillé avec tous les paramètres importants :
from mistralai import Mistral
client = Mistral(api_key=os.environ["MISTRAL_API_KEY"])
response = client.fim.complete(
model="codestral-latest",
prompt="def calculer_tva(prix_ht: float, taux: float = 0.20) -> float:",
suffix="prix = float(input('Prix HT: '))\nprint(f'Prix TTC: {calculer_tva(prix):.2f} EUR')",
temperature=0,
max_tokens=150,
stop=["\n\n"],
)
completion = response.choices[0].message.content
print(completion)
Décortiquer la réponse
L’objet response contient :
# Accéder à la complétion générée
texte = response.choices[0].message.content
# Vérifier le nombre de tokens utilisés
tokens_prompt = response.usage.prompt_tokens
tokens_completion = response.usage.completion_tokens
tokens_total = response.usage.total_tokens
# Vérifier la raison d'arrêt
raison = response.choices[0].finish_reason # "stop", "length", etc.
Appel Chat pour la génération de code
Pour des tâches qui ne nécessitent pas de FIM (génération complète, explication, refactoring), utilisez l’endpoint chat :
response = client.chat.complete(
model="codestral-latest",
messages=[
{
"role": "system",
"content": "Vous êtes un assistant de développement Python expert. Répondez uniquement avec du code, sans explication."
},
{
"role": "user",
"content": "Écrivez une fonction Python qui valide une adresse email avec regex."
}
],
temperature=0.2,
max_tokens=500,
)
code = response.choices[0].message.content
print(code)
Paramètres avancés
Contrôle de la longueur
# min_tokens : force une longueur minimale de sortie
# max_tokens : limite la longueur maximale
response = client.fim.complete(
model="codestral-latest",
prompt=prompt,
suffix=suffix,
min_tokens=20,
max_tokens=300,
)
Tokens d’arrêt personnalisés
# Arrêter la génération sur des patterns spécifiques
response = client.fim.complete(
model="codestral-latest",
prompt=prompt,
suffix=suffix,
stop=["\n\n", "\nclass ", "\ndef "], # Stopper avant une nouvelle fonction/classe
)
Température et sampling
# temperature=0 : déterministe (autocomplétion)
# temperature=0.3 : légèrement créatif (suggestions multiples)
# temperature=0.7 : créatif (brainstorming de code)
response = client.fim.complete(
model="codestral-latest",
prompt=prompt,
suffix=suffix,
temperature=0.3,
top_p=0.95,
)
Pattern : autocomplétion en boucle
Pour simuler une autocomplétion continue (comme dans un IDE) :
def autocomplete_ide(fichier_contenu: str, position_curseur: int) -> str:
"""Simule l'autocomplétion IDE avec Codestral FIM."""
prompt = fichier_contenu[:position_curseur]
suffix = fichier_contenu[position_curseur:]
response = client.fim.complete(
model="codestral-latest",
prompt=prompt,
suffix=suffix,
temperature=0,
max_tokens=100,
stop=["\n\n", "\ndef ", "\nclass "],
)
return response.choices[0].message.content
Pattern : génération de docstrings
def generer_docstring(code_fonction: str) -> str:
"""Génère une docstring pour une fonction Python."""
response = client.chat.complete(
model="codestral-latest",
messages=[
{
"role": "system",
"content": "Générez une docstring Google-style pour la fonction suivante. Retournez UNIQUEMENT la docstring entre triple quotes."
},
{
"role": "user",
"content": code_fonction
}
],
temperature=0,
max_tokens=300,
)
return response.choices[0].message.content
Gestion des erreurs
from mistralai import Mistral
from mistralai.models import HTTPValidationError
try:
response = client.fim.complete(
model="codestral-latest",
prompt=prompt,
suffix=suffix,
)
except HTTPValidationError as e:
print(f"Erreur de validation : {e}")
except Exception as e:
print(f"Erreur inattendue : {e}")
Points clés à retenir
- Le SDK
mistralaiexposeclient.fim.complete()pour le FIM etclient.chat.complete()pour le chat - Les paramètres
promptetsuffixsont spécifiques à l’endpoint FIM temperature=0pour l’autocomplétion,0.2-0.7pour la génération créativestoppermet de limiter la génération à un bloc de code cohérentmin_tokensetmax_tokenscontrôlent la longueur de la sortie- Toujours gérer les erreurs HTTP dans le code de production