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