Ce que vous saurez faire à la fin
- Installer Microsoft AutoGen et configurer Claude comme moteur LLM principal
- Créer un GroupChat orchestré avec 4 AssistantAgent et un UserProxyAgent
- Bâtir un workflow d’analyse stratégique pour un cabinet de conseil basé à Dakar
- Gérer la terminaison automatique d’une conversation multi-agents (max_round, termination_msg)
- Estimer et maîtriser le coût d’un GroupChat (8 000 à 25 000 FCFA selon profondeur)
Durée : 4h. Pré-requis : Python 3.10+, clé API Anthropic, 10 000 FCFA de crédit pour les premiers tests, Docker (optionnel pour code execution), VS Code.
Étape 1 — AutoGen : la philosophie multi-agents conversationnel
AutoGen, développé par Microsoft Research, repose sur l’idée que des agents spécialisés peuvent résoudre des problèmes complexes en discutant entre eux comme dans une réunion d’équipe. Contrairement à CrewAI qui impose une séquence figée, AutoGen permet une conversation libre où le manager (GroupChatManager) choisit dynamiquement le prochain intervenant. Pour un cabinet de conseil sénégalais qui produit des recommandations stratégiques, c’est un outil de productivité considérable : un livrable de 15 pages produit en 12 minutes contre 2 jours de travail humain.
Étape 2 — Installation et environnement
python -m venv autogen-env
source autogen-env/bin/activate
# autogen-env\Scripts\activate sur Windows
pip install pyautogen==0.3.2 anthropic python-dotenv
pip install matplotlib pandas openpyxl # pour génération de livrables
# Vérification
python -c "import autogen; print(autogen.__version__)"
Créez un .env et un fichier OAI_CONFIG_LIST.json qui décrit vos modèles disponibles :
ANTHROPIC_API_KEY=sk-ant-api03-VOTRE_CLE
Étape 3 — Configurer Claude dans AutoGen
AutoGen 0.3+ supporte Anthropic nativement via le paramètre api_type= »anthropic ». Voici la configuration recommandée pour un cabinet sénégalais.
import os
from dotenv import load_dotenv
import autogen
load_dotenv()
config_claude_sonnet = {
"config_list": [{
"model": "claude-sonnet-4-6",
"api_key": os.getenv("ANTHROPIC_API_KEY"),
"api_type": "anthropic",
"max_tokens": 4096,
"temperature": 0.3,
"cache_seed": 42 # cache local pour économiser
}]
}
config_claude_opus = {
"config_list": [{
"model": "claude-opus-4-7",
"api_key": os.getenv("ANTHROPIC_API_KEY"),
"api_type": "anthropic",
"max_tokens": 8192,
"temperature": 0.2
}]
}
Étape 4 — Créer l’agent Strategist (Opus pour réflexion profonde)
strategist = autogen.AssistantAgent(
name="Strategist",
llm_config=config_claude_opus,
system_message=(
"Tu es un consultant stratégique senior basé à Dakar, "
"ancien partner chez BCG. Tu maîtrises Porter, BCG Matrix, "
"Blue Ocean. Tu réfléchis en profondeur avant de proposer "
"et tu chiffres toujours en FCFA. Tu connais le contexte "
"OHADA, UEMOA et la fiscalité sénégalaise. Quand tu as fini, "
"termine ton message par STRATEGY_DONE."
)
)
Étape 5 — Créer l’agent Financial_Analyst
analyste_fin = autogen.AssistantAgent(
name="Financial_Analyst",
llm_config=config_claude_sonnet,
system_message=(
"Tu es analyste financier sénior, expert PME ouest-africaines. "
"Tu construis modèles financiers : compte de résultat 3 ans, "
"bilan, cash-flow, calcul de VAN, TRI. Tu utilises taux "
"BCEAO actuel (3.5%) comme taux sans risque. Toutes valeurs "
"en FCFA, format français (1 234 567 FCFA)."
)
)
Étape 6 — Créer l’agent Market_Researcher
researcher = autogen.AssistantAgent(
name="Market_Researcher",
llm_config=config_claude_sonnet,
system_message=(
"Tu connais les marchés ouest-africains : sources ANSD, BCEAO, "
"DPEE, rapports Jeune Afrique, Financial Afrik. Tu donnes "
"tailles de marché, taux de croissance, parts des leaders. "
"Tu cites tes sources entre crochets [Source: ANSD 2025]."
)
)
Étape 7 — Créer l’agent Critic (challenger)
critic = autogen.AssistantAgent(
name="Critic",
llm_config=config_claude_sonnet,
system_message=(
"Tu es l'avocat du diable. Tu challenges chaque hypothèse : "
"réaliste ? sources fiables ? hypothèses chiffrées défendables ? "
"Tu identifies risques cachés (politique, change FCFA, "
"concurrence informelle). Tu es exigeant mais constructif."
)
)
Étape 8 — UserProxyAgent : l’interface humaine
user_proxy = autogen.UserProxyAgent(
name="DG_Cabinet",
human_input_mode="NEVER", # automatique pour la démo
max_consecutive_auto_reply=2,
is_termination_msg=lambda x: "RAPPORT_FINAL" in x.get("content", ""),
code_execution_config={
"work_dir": "livrables",
"use_docker": False # mettre True en production
},
system_message=(
"Tu représentes le DG d'un cabinet de conseil à Dakar. "
"Tu poses des questions précises, valides les livrables, "
"et conclus par RAPPORT_FINAL quand satisfait."
)
)
Étape 9 — Assembler le GroupChat
group_chat = autogen.GroupChat(
agents=[user_proxy, strategist, analyste_fin, researcher, critic],
messages=[],
max_round=15,
speaker_selection_method="auto", # le manager choisit dynamiquement
allow_repeat_speaker=False
)
manager = autogen.GroupChatManager(
groupchat=group_chat,
llm_config=config_claude_sonnet,
system_message=(
"Tu orchestres une équipe de consultants. À chaque tour, choisis "
"le meilleur agent pour avancer. Ordre logique : Researcher d'abord "
"(données), puis Strategist (analyse), puis Financial_Analyst "
"(chiffres), puis Critic (challenge), puis Strategist (synthèse)."
)
)
Étape 10 — Lancer une mission concrète
mission = """
Notre client est une PME sénégalaise de transformation de céréales
(mil, sorgho) à Thiès. Chiffre d'affaires actuel : 180 millions FCFA.
Elle veut lever 500 millions FCFA pour industrialiser et exporter
vers la France et le Maroc.
Produisez un rapport stratégique complet :
1. Étude marché (Senegal + export)
2. Analyse concurrentielle
3. Modèle financier 3 ans
4. Recommandations de financement (DER, banques, BAD)
5. Plan d'action 12 mois
Critic : challengez chaque chiffre.
Terminez par RAPPORT_FINAL.
"""
resultat = user_proxy.initiate_chat(
manager,
message=mission
)
print(f"\nNombre de tours : {len(group_chat.messages)}")
print(f"Coût estimé : {len(group_chat.messages) * 250} FCFA")
Étape 11 — Speaker selection : auto vs round_robin vs custom
Méthode | Comportement | Coût | Cas d'usage
--------------------|---------------------------|---------|------------------
auto | Manager LLM choisit | Élevé | Discussions complexes
round_robin | Tour de table fixe | Faible | Workflows simples
random | Aléatoire | Moyen | Brainstorming
manual | Humain choisit | Nul | Prototypage
custom (function) | Logique métier | Variable| Production maîtrisée
Pour un cabinet de conseil en production, on recommande custom avec une fonction de routage métier qui économise 40 % de tokens.
Étape 12 — Custom speaker selection (économique)
def selectionner_orateur(last_speaker, groupchat):
"""Routage métier : Researcher → Strategist → Financial → Critic → Strategist"""
sequence = {
"DG_Cabinet": researcher,
"Market_Researcher": strategist,
"Strategist": analyste_fin if last_speaker.name != "Critic" else user_proxy,
"Financial_Analyst": critic,
"Critic": strategist
}
return sequence.get(last_speaker.name, user_proxy)
group_chat = autogen.GroupChat(
agents=[user_proxy, strategist, analyste_fin, researcher, critic],
messages=[],
max_round=12,
speaker_selection_method=selectionner_orateur
)
Étape 13 — Sauvegarder la conversation et générer un livrable
import json
from datetime import datetime
from pathlib import Path
def sauvegarder_mission(group_chat, nom_client):
dossier = Path(f"missions/{nom_client}_{datetime.now():%Y%m%d}")
dossier.mkdir(parents=True, exist_ok=True)
# Conversation brute
with open(dossier / "conversation.json", "w", encoding="utf-8") as f:
json.dump(group_chat.messages, f, ensure_ascii=False, indent=2)
# Rapport final (dernier message du Strategist)
rapport = next(
(m["content"] for m in reversed(group_chat.messages)
if m.get("name") == "Strategist"),
None
)
if rapport:
(dossier / "rapport_final.md").write_text(rapport, encoding="utf-8")
print(f"Livrables sauvegardés dans {dossier}")
sauvegarder_mission(group_chat, "PME_cereales_Thies")
Étape 14 — Production : API REST exposant le cabinet virtuel
from fastapi import FastAPI, HTTPException
from pydantic import BaseModel
import asyncio
app = FastAPI(title="Cabinet Virtuel AutoGen")
class Mission(BaseModel):
client: str
secteur: str
enonce: str
budget_max_fcfa: int = 25000
@app.post("/mission")
async def lancer_mission(mission: Mission):
if mission.budget_max_fcfa < 5000:
raise HTTPException(400, "Budget minimum 5 000 FCFA")
# Lancement asynchrone
loop = asyncio.get_event_loop()
resultat = await loop.run_in_executor(
None,
lambda: user_proxy.initiate_chat(manager, message=mission.enonce)
)
return {
"client": mission.client,
"tours": len(group_chat.messages),
"rapport": group_chat.messages[-2]["content"]
}
Erreurs classiques à éviter
- Erreur : max_round trop élevé. 25 tours sur claude-opus-4-7 coûtent 30 000 FCFA. Limitez à 12-15 en production.
- Erreur : human_input_mode= »ALWAYS » en API. Le serveur attend une saisie clavier indéfiniment et timeout après quelques minutes.
- Erreur : oublier is_termination_msg. La conversation tourne jusqu’à max_round sans s’arrêter, gaspillant des tokens.
- Erreur : code_execution avec use_docker=False en production. Risque de sécurité majeur, l’agent peut exécuter rm -rf sur votre serveur.
- Erreur : speaker_selection= »auto » pour tâches simples. Le manager LLM coûte 30 % du budget total, inutile pour un workflow linéaire.
- Erreur : ne pas désactiver allow_repeat_speaker. Le même agent peut prendre 5 tours d’affilée et bloquer le workflow.
Checklist déploiement AutoGen Claude
✓ Python 3.10+ et venv isolé
✓ pyautogen 0.3.2+ installé
✓ Clé ANTHROPIC_API_KEY dans .env
✓ api_type="anthropic" dans config_list
✓ Sonnet pour analystes, Opus pour Strategist
✓ Chaque AssistantAgent a un system_message clair
✓ UserProxyAgent avec human_input_mode adapté
✓ is_termination_msg défini sur le UserProxy
✓ max_round limité (12 à 15 max)
✓ max_consecutive_auto_reply=2 ou 3
✓ speaker_selection custom pour workflows métier
✓ cache_seed défini pour économiser
✓ use_docker=True si exécution de code
✓ Sauvegarde conversation après chaque mission
✓ Monitoring coût par mission (budget alert)