Aller au contenu principal

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 mistralai expose client.fim.complete() pour le FIM et client.chat.complete() pour le chat
  • Les paramètres prompt et suffix sont spécifiques à l’endpoint FIM
  • temperature=0 pour l’autocomplétion, 0.2-0.7 pour la génération créative
  • stop permet de limiter la génération à un bloc de code cohérent
  • min_tokens et max_tokens contrôlent la longueur de la sortie
  • Toujours gérer les erreurs HTTP dans le code de production