Pipelines de Code Automatisés
Automatiser le développement avec Codestral et Devstral
Les outils de Mistral AI ne servent pas uniquement à l’assistance interactive. Combinés intelligemment, Codestral, Devstral et Codestral Embed forment une pipeline de développement automatisée capable de rechercher, générer, et revoir du code de manière programmatique.
Architecture d’une pipeline de code
Une pipeline de code IA complète se compose de trois étapes :
- Code Search — trouver le code pertinent dans le codebase (Codestral Embed)
- Code Generation — générer ou modifier du code (Codestral ou Devstral)
- Code Review — vérifier et valider les changements (Devstral)
Flux de données
Requête utilisateur
|
[Codestral Embed] -> Fichiers pertinents
|
[Codestral / Devstral] -> Code généré/modifié
|
[Devstral] -> Review automatique
|
Pull Request / Commit
Étape 1 : Code Search avec Codestral Embed
Avant de générer du code, il faut comprendre le contexte existant. Codestral Embed permet de trouver les fichiers et fonctions pertinents :
from mistralai import Mistral
import numpy as np
client = Mistral(api_key=os.environ["MISTRAL_API_KEY"])
def rechercher_contexte(description_tache: str, index_codebase: list) -> list:
"""Trouve les fichiers pertinents pour une tâche donnée."""
response = client.embeddings.create(
model="codestral-embed-latest",
inputs=[description_tache],
)
vecteur = np.array(response.data[0].embedding)
scores = []
for fichier in index_codebase:
vec_fichier = np.array(fichier["embedding"])
score = np.dot(vecteur, vec_fichier) / (
np.linalg.norm(vecteur) * np.linalg.norm(vec_fichier)
)
scores.append((fichier, score))
scores.sort(key=lambda x: x[1], reverse=True)
return [f for f, s in scores[:5]]
Étape 2 : Code Generation avec Codestral
Une fois le contexte trouvé, Codestral génère le code demandé :
def generer_code(tache: str, contexte: list[dict]) -> str:
"""Génère du code en tenant compte du contexte existant."""
fichiers_contexte = "\n\n---\n\n".join([
f"# {f['chemin']}\n{f['contenu']}"
for f in contexte
])
response = client.chat.complete(
model="codestral-latest",
messages=[
{
"role": "system",
"content": f"""Vous êtes un développeur senior. Voici le code existant du projet :
{fichiers_contexte}
Respectez les conventions de code existantes (nommage, style, patterns)."""
},
{
"role": "user",
"content": tache
}
],
temperature=0.1,
max_tokens=2000,
)
return response.choices[0].message.content
Étape 3 : Code Review avec Devstral
Devstral vérifie le code généré avant de le soumettre :
def reviewer_code(code_original: str, code_modifie: str, description: str) -> dict:
"""Review automatique du code généré."""
response = client.chat.complete(
model="devstral-small-latest",
messages=[
{
"role": "system",
"content": """Vous êtes un reviewer de code senior. Analysez le diff et retournez un JSON :
{
"approuve": true/false,
"problemes": ["liste des problèmes trouvés"],
"suggestions": ["liste des améliorations possibles"],
"securite": ["problèmes de sécurité éventuels"]
}"""
},
{
"role": "user",
"content": f"Tâche : {description}\n\nCode original :\n{code_original}\n\nCode modifié :\n{code_modifie}"
}
],
temperature=0,
)
return response.choices[0].message.content
Pipeline complète : du ticket à la PR
Voici un exemple de pipeline end-to-end qui prend un ticket et produit une modification validée :
def pipeline_ticket_to_code(ticket: str, codebase_index: list) -> dict:
"""Pipeline complète : ticket -> code -> review."""
# 1. Recherche contextuelle
fichiers_pertinents = rechercher_contexte(ticket, codebase_index)
print(f"Fichiers trouvés : {[f['chemin'] for f in fichiers_pertinents]}")
# 2. Génération de code
code_genere = generer_code(ticket, fichiers_pertinents)
print(f"Code généré : {len(code_genere)} caractères")
# 3. Review automatique
review = reviewer_code(
code_original=fichiers_pertinents[0]["contenu"],
code_modifie=code_genere,
description=ticket,
)
print(f"Review : {review}")
return {
"ticket": ticket,
"fichiers_modifies": fichiers_pertinents,
"code": code_genere,
"review": review,
}
Intégration CI/CD
Cette pipeline peut s’intégrer dans votre workflow CI/CD :
GitHub Actions
name: AI Code Review
on:
pull_request:
types: [opened, synchronize]
jobs:
ai-review:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Run AI Review
env:
MISTRAL_API_KEY: $\{{ secrets.MISTRAL_API_KEY }}
run: |
python scripts/ai_review.py --pr $\{{ github.event.pull_request.number }}
Workflow automatisé
# scripts/ai_review.py
def review_pull_request(pr_number: int):
"""Review automatique d'une PR avec Devstral."""
# 1. Récupérer le diff de la PR
diff = obtenir_diff_pr(pr_number)
# 2. Analyser chaque fichier modifié
for fichier in diff.fichiers:
review = reviewer_code(
code_original=fichier.avant,
code_modifie=fichier.apres,
description=diff.titre,
)
# 3. Poster un commentaire sur la PR
if not review["approuve"]:
poster_commentaire_pr(pr_number, fichier.chemin, review)
Cas d’usage en production
- Génération automatique de tests — à chaque nouveau fichier, la pipeline génère les tests correspondants
- Documentation continue — les docstrings sont générées et mises à jour automatiquement
- Détection de régressions — Devstral analyse les diffs pour détecter les régressions potentielles
- Migration de code — automatiser la conversion entre frameworks ou versions
Points clés à retenir
- Une pipeline de code IA combine recherche (Embed), génération (Codestral), et review (Devstral)
- Codestral Embed trouve le contexte, Codestral génère, Devstral vérifie
- L’intégration CI/CD permet d’automatiser les reviews et la génération de tests
- Le pattern recherche -> génération -> review est applicable à de nombreux workflows
- La review automatique ne remplace pas la review humaine, mais la complète