Aller au contenu principal

Bonnes pratiques et prochaines étapes

Récapitulatif du cours

Vous avez parcouru l’ensemble de l’API Agents de Mistral. Voici un récapitulatif des concepts clés et les bonnes pratiques pour passer en production.

Ce que vous avez appris

Fondamentaux (Leçons 1-3)

  • Un agent IA est un système autonome avec boucle perception-action
  • L’API repose sur trois objets : Agent, Conversation, Entry
  • Les agents se distinguent des chatbots par la persistance, les outils et les handoffs

Agents et Conversations (Leçons 4-7)

  • Créer et configurer des agents via client.beta.agents.create()
  • Gérer des conversations persistantes avec conversations.start() et conversations.append()
  • Utiliser le mode direct (sans agent) pour le prototypage rapide

Outils Built-in (Leçons 8-11)

  • web_search — Recherche internet avec citations automatiques
  • code_interpreter — Exécution de Python dans un sandbox
  • image_generation — Création d’images à partir de prompts textuels
  • document_library — RAG intégré sur vos documents

Multi-Agents (Leçons 12-16)

  • Les handoffs permettent le transfert de contrôle entre agents
  • Architecture : routeur central + agents spécialisés
  • Mode serveur (automatique) vs mode client (contrôle manuel)
  • Chaînage illimité avec patterns linéaire, étoile et hybride

Sécurité (Leçon 17)

  • Guardrails, principe du moindre privilège, modération en amont

Bonnes pratiques de production

1. Conception des agents

# BON — agent spécialisé avec description précise
agent = client.beta.agents.create(
    model="mistral-large-latest",
    name="invoice-processor",
    description="Traite les factures : extraction de montants, dates, fournisseurs.",
    instructions="Extraire les informations des factures au format JSON structuré.",
    tools=[{"type": "document_library", "library_ids": [invoices_lib.id]}]
)

# MAUVAIS — agent générique et vague
agent = client.beta.agents.create(
    model="mistral-large-latest",
    name="helper",
    description="Un agent utile.",
    tools=[{"type": "web_search"}, {"type": "code_interpreter"}, {"type": "image_generation"}]
)

2. Gestion des erreurs

import time

def safe_conversation(agent_id, query, max_retries=3):
    """Conversation avec gestion d'erreurs et retry."""
    for attempt in range(max_retries):
        try:
            response = client.beta.conversations.start(
                agent_id=agent_id,
                inputs=query
            )
            return response
        except Exception as e:
            if attempt == max_retries - 1:
                raise
            time.sleep(2 ** attempt)  # Backoff exponentiel
    return None

3. Monitoring et logging

import logging
import time

logger = logging.getLogger("agents")

def monitored_conversation(agent_id, query):
    """Conversation avec monitoring."""
    start = time.time()

    response = client.beta.conversations.start(
        agent_id=agent_id,
        inputs=query,
        handoff_execution="client"
    )

    handoff_count = 0
    tool_count = 0

    for entry in response.outputs:
        if entry.type == "agent.handoff":
            handoff_count += 1
            logger.info(f"Handoff #{handoff_count}: → {entry.to_agent}")
        elif entry.type == "tool.execution":
            tool_count += 1
            logger.info(f"Tool #{tool_count}: {entry.tool_name}")

    duration = time.time() - start
    logger.info(f"Terminé en {duration:.1f}s — {handoff_count} handoffs, {tool_count} outils")

    return response

4. Gestion des coûts

  • Surveillez le nombre de tokens par conversation
  • Utilisez mistral-medium-latest quand mistral-large-latest n’est pas nécessaire
  • Limitez le max_tokens dans les completion_args
  • Désactivez le stockage (store=False) quand la persistance n’est pas requise

5. Tests

def test_agent_routing():
    """Vérifie que le routeur distribue correctement."""
    test_cases = [
        ("Quel est le cours du Bitcoin ?", "web-search-agent"),
        ("Calcule 25 * 48", "calculator-agent"),
        ("Résume ce document", "doc-agent"),
    ]

    for query, expected_agent_name in test_cases:
        response = client.beta.conversations.start(
            agent_id=router.id,
            inputs=query,
            handoff_execution="client"
        )

        for entry in response.outputs:
            if entry.type == "agent.handoff":
                target = client.beta.agents.retrieve(agent_id=entry.to_agent)
                assert target.name == expected_agent_name, \
                    f"Routage incorrect pour '{ query}': {target.name} au lieu de {expected_agent_name}"

Architecture de référence

Pour un projet de production, voici une architecture recommandée :

Application


Agent Modérateur (filtre les requêtes)


Agent Routeur (distribue aux spécialistes)
    ├── Agent Recherche (web_search)
    ├── Agent Analyse (code_interpreter)
    ├── Agent Documents (document_library)
    └── Agent Création (image_generation)


Logging + Monitoring + Alerting

Prochaines étapes

Pour aller plus loin

  • Function calling — Créez vos propres outils custom (API, base de données, services internes)
  • MCP Servers — Intégrez le protocole Model Context Protocol pour des outils standardisés
  • Structured outputs — Forcez les réponses au format JSON schema pour une intégration propre
  • Streaming — Recevez les réponses en temps réel plutôt qu’en bloc

Ressources

  • Documentation officielle : docs.mistral.ai/agents
  • Cookbooks Mistral : exemples d’implémentation complètes
  • API Reference : documentation détaillée de chaque endpoint

Points clés à retenir

  • Spécialisez vos agents — un agent = une responsabilité
  • Monitorez — loggez chaque handoff et exécution d’outil
  • Testez — validez le routage et les réponses de chaque agent
  • Sécurisez — guardrails, moindre privilège, modération en amont
  • Optimisez les coûts — modèle adapté, max_tokens, store=False quand possible
  • Les agents Mistral sont en beta — suivez les évolutions de l’API