Aller au contenu principal

Chaîner les agents en profondeur

Des chaînes d’agents sans limite

L’API Agents de Mistral n’impose aucune limite de profondeur pour le chaînage des agents. Un agent peut transférer à un deuxième, qui transfère à un troisième, et ainsi de suite. Cette flexibilité permet de construire des workflows complexes et modulaires.

Architecture en chaîne

Chaîne linéaire

Le pattern le plus simple : chaque agent passe au suivant.

Agent A → Agent B → Agent C → Réponse

Exemple : Recherche → Analyse → Rédaction

# Agent de recherche
research = client.beta.agents.create(
    model="mistral-large-latest",
    name="research",
    description="Recherche d'informations factuelles.",
    tools=[{"type": "web_search"}]
)

# Agent d'analyse
analyst = client.beta.agents.create(
    model="mistral-large-latest",
    name="analyst",
    description="Analyse de données et extraction d'insights.",
    tools=[{"type": "code_interpreter"}]
)

# Agent de rédaction
writer = client.beta.agents.create(
    model="mistral-large-latest",
    name="writer",
    description="Rédaction de rapports professionnels.",
    instructions="Rédigez un rapport structuré à partir des données analysées."
)

# Chaîner : research → analyst → writer
research = client.beta.agents.update(
    agent_id=research.id,
    handoffs=[analyst.id]
)

analyst = client.beta.agents.update(
    agent_id=analyst.id,
    handoffs=[writer.id]
)

Chaîne avec routeur (étoile)

Un routeur central distribue vers des spécialistes :

          ┌→ Agent Web Search
Routeur ──┼→ Agent Calculateur
          └→ Agent Rédacteur
router = client.beta.agents.create(
    model="mistral-large-latest",
    name="router",
    description="Orchestre les requêtes.",
    handoffs=[research.id, analyst.id, writer.id]
)

Chaîne hybride (graphe)

Combinez les deux patterns : un routeur distribue, et les spécialistes peuvent se passer le relais entre eux :

          ┌→ Agent Research ──→ Agent Analyst
Routeur ──┤                          │
          └→ Agent Writer ←───────────┘
# Research peut transférer à Analyst
research = client.beta.agents.update(
    agent_id=research.id,
    handoffs=[analyst.id]
)

# Analyst peut transférer à Writer
analyst = client.beta.agents.update(
    agent_id=analyst.id,
    handoffs=[writer.id]
)

# Le routeur peut accéder à tous
router = client.beta.agents.update(
    agent_id=router.id,
    handoffs=[research.id, analyst.id, writer.id]
)

Patterns de production

Pipeline de traitement de données

# Étape 1 : Collecte
collector = client.beta.agents.create(
    model="mistral-large-latest",
    name="data-collector",
    description="Collecte des données depuis Internet.",
    tools=[{"type": "web_search"}]
)

# Étape 2 : Nettoyage et transformation
transformer = client.beta.agents.create(
    model="mistral-large-latest",
    name="data-transformer",
    description="Nettoie et transforme les données brutes.",
    tools=[{"type": "code_interpreter"}]
)

# Étape 3 : Analyse et visualisation
visualizer = client.beta.agents.create(
    model="mistral-large-latest",
    name="data-visualizer",
    description="Crée des visualisations et des graphiques.",
    tools=[{"type": "code_interpreter"}]
)

# Chaîner
collector = client.beta.agents.update(agent_id=collector.id, handoffs=[transformer.id])
transformer = client.beta.agents.update(agent_id=transformer.id, handoffs=[visualizer.id])

Assistant de recherche académique

# Chercheur
searcher = client.beta.agents.create(
    model="mistral-large-latest",
    name="academic-searcher",
    description="Recherche d'articles et de publications académiques.",
    tools=[{"type": "web_search"}]
)

# Synthétiseur
synthesizer = client.beta.agents.create(
    model="mistral-large-latest",
    name="synthesizer",
    description="Synthèse et comparaison de sources multiples.",
    instructions="Identifiez les points communs, les divergences et les lacunes."
)

# Rédacteur
academic_writer = client.beta.agents.create(
    model="mistral-large-latest",
    name="academic-writer",
    description="Rédaction académique structurée avec citations.",
    instructions="Rédigez au format académique avec introduction, méthodologie, résultats, discussion."
)

# Pipeline : searcher → synthesizer → writer
searcher = client.beta.agents.update(agent_id=searcher.id, handoffs=[synthesizer.id])
synthesizer = client.beta.agents.update(agent_id=synthesizer.id, handoffs=[academic_writer.id])

Gérer la profondeur

Même s’il n’y a pas de limite technique, gardez les chaînes raisonnables :

  • 2-4 agents en chaîne couvrent la plupart des cas
  • Au-delà de 5, la latence et le coût augmentent significativement
  • Chaque agent ajoute des tokens de contexte (instructions + historique)

Astuce : un agent peut avoir plusieurs cibles

Un agent n’est pas limité à un seul handoff. Il peut avoir plusieurs cibles et choisir dynamiquement :

analyst = client.beta.agents.update(
    agent_id=analyst.id,
    handoffs=[writer.id, visualizer.id, calculator.id]
)

L’agent choisit la cible en fonction du contexte de la conversation.

Points clés à retenir

  • Pas de limite de profondeur pour le chaînage d’agents
  • Trois patterns : linéaire (A→B→C), étoile (routeur→spécialistes), hybride (graphe)
  • Chaque agent peut avoir plusieurs cibles de handoff
  • En production, limitez à 2-4 agents en chaîne pour maîtriser latence et coûts
  • Les descriptions des agents sont cruciales pour un routage efficace