Guides development of multi-agent conversational systems with Microsoft AutoGen, covering group chats, specialized agents, code execution, and speaker selection.
How this skill is triggered — by the user, by Claude, or both
Slash command
/claude-skills-collection:agent-autogen-guideThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
Utiliser ce skill quand l'utilisateur veut construire des agents qui conversent entre eux pour résoudre des problèmes complexes, notamment pour des systèmes de coding agents (génération et exécution de code automatique), des workflows de résolution de problèmes par discussion multi-agents, ou des pipelines où des agents spécialisés débattent et collaborent. AutoGen excelle pour les cas d'usage ...
Utiliser ce skill quand l'utilisateur veut construire des agents qui conversent entre eux pour résoudre des problèmes complexes, notamment pour des systèmes de coding agents (génération et exécution de code automatique), des workflows de résolution de problèmes par discussion multi-agents, ou des pipelines où des agents spécialisés débattent et collaborent. AutoGen excelle pour les cas d'usage impliquant l'écriture et l'exécution de code Python dans une boucle.
Installation et configuration initiale
pip install pyautogen==0.3.2 (ou autogen-agentchat~=0.2 pour la v0.2 stable)pip install autogen-agentchat autogen-ext[openai]OAI_CONFIG_LIST (fichier JSON) ou dict Python :
config_list = [
{"model": "gpt-4o", "api_key": os.environ["OPENAI_API_KEY"]},
{"model": "gpt-4o-mini", "api_key": os.environ["OPENAI_API_KEY"]},
]
OPENAI_API_KEY, optionnellement OAI_CONFIG_LIST (chemin fichier)Agents de base
AssistantAgent : agent LLM qui génère des réponses et du code, ne l'exécute pasUserProxyAgent : agent qui peut exécuter du code, simuler l'humain, orchestrerConversableAgent : classe de base, tous les agents en héritentname, system_message, llm_config, human_input_mode, max_consecutive_auto_replyConfiguration des LLMs (llm_config)
llm_config : {"config_list": [...], "temperature": 0, "cache_seed": 42}cache_seed : met en cache les réponses LLM pour reproduire les résultats (mettre à None en prod)config_list — AutoGen essaie dans l'ordre en cas d'échecllm_config=False sur UserProxyAgent pour désactiver le LLM (proxy pur)Group Chat — conversation multi-agents
GroupChat : définit les agents participants, max_round, speaker_selection_methodGroupChatManager : orchestre le GroupChat, nécessite son propre llm_config"auto" (LLM choisit), "round_robin", "random", ou une fonction customallowed_or_disallowed_speaker_transitions pour un flow déterministeExécution de code (code_execution_config)
UserProxyAgent :
code_execution_config={
"executor": LocalCommandLineCodeExecutor(work_dir="coding"),
"last_n_messages": 3,
}
LocalCommandLineCodeExecutor : exécute localement (attention à la sécurité !)DockerCommandLineCodeExecutor : exécution isolée dans Docker (recommandé en prod)code_execution_config=FalseTool use — appels de fonctions
from autogen import register_function
def get_weather(city: str) -> str:
"""Retourne la météo pour une ville."""
return f"Météo pour {city}: ensoleillé, 22°C"
register_function(
get_weather,
caller=assistant, # agent qui appelle l'outil
executor=user_proxy, # agent qui exécute l'outil
name="get_weather",
description="Obtenir la météo actuelle d'une ville",
)
llm_config["tools"]Human-in-the-loop
human_input_mode="ALWAYS" : demande input humain à chaque tourhuman_input_mode="NEVER" : entièrement automatique (défaut pour automation)human_input_mode="TERMINATE" : demande input seulement quand l'agent veut termineris_termination_msg : fonction lambda pour détecter le message de fin (ex: lambda x: "TERMINATE" in x.get("content", ""))max_consecutive_auto_reply=10 : stoppe automatiquement après N tours sans input humainPatterns avancés
TeachableAgent — mémorise les enseignements de l'utilisateur via une base de donnéesRetrieveAssistantAgent + RetrieveUserProxyAgent pour la retrieval-augmented generationRoundRobinGroupChat, SelectorGroupChatGestion de l'état et historique
agent.chat_messages (dict par agent interlocuteur)chat_messages en JSON pour reprendre une sessionagent.reset() ou injecter l'historique manuellementAutoGen Studio et déploiement
pip install autogenstudio — interface GUI no-code pour créer des workflowsautogenstudio ui --port 8080import os
import autogen
from autogen.coding import LocalCommandLineCodeExecutor
# Configuration LLM
config_list = [{"model": "gpt-4o", "api_key": os.environ["OPENAI_API_KEY"]}]
llm_config = {"config_list": config_list, "temperature": 0, "cache_seed": None}
# Assistant : génère le code
assistant = autogen.AssistantAgent(
name="assistant",
system_message=(
"Vous êtes un expert Python. Quand on vous pose un problème, "
"écrivez du code Python pour le résoudre. "
"Vérifiez toujours les résultats. "
"Répondez TERMINATE quand le problème est résolu."
),
llm_config=llm_config,
)
# UserProxy : exécute le code généré
user_proxy = autogen.UserProxyAgent(
name="user_proxy",
human_input_mode="NEVER",
max_consecutive_auto_reply=10,
is_termination_msg=lambda x: x.get("content", "").rstrip().endswith("TERMINATE"),
code_execution_config={
"executor": LocalCommandLineCodeExecutor(
work_dir="./coding_workspace",
timeout=60,
),
},
system_message="Executor de code. Exécute le code et rapporte les résultats.",
)
# Lancement de la conversation
if __name__ == "__main__":
result = user_proxy.initiate_chat(
assistant,
message=(
"Téléchargez les données de cours d'Apple (AAPL) pour les 30 derniers jours "
"et tracez un graphique avec matplotlib. Sauvegardez le graphique en PNG."
),
)
print(f"Résumé : {result.summary}")
import os
import autogen
config_list = [{"model": "gpt-4o", "api_key": os.environ["OPENAI_API_KEY"]}]
llm_config = {"config_list": config_list, "temperature": 0.1}
# Définition des agents spécialisés
product_manager = autogen.AssistantAgent(
name="ProductManager",
system_message=(
"Vous êtes un Product Manager. Vous analysez les besoins, "
"définissez les spécifications et coordonnez l'équipe. "
"Répondez TERMINATE quand le livrable est complet."
),
llm_config=llm_config,
)
developer = autogen.AssistantAgent(
name="Developer",
system_message=(
"Vous êtes un développeur senior Python/FastAPI. "
"Vous implémentez les fonctionnalités demandées avec du code propre et testé."
),
llm_config=llm_config,
)
security_expert = autogen.AssistantAgent(
name="SecurityExpert",
system_message=(
"Vous êtes un expert en cybersécurité. "
"Vous vérifiez le code pour les vulnérabilités OWASP Top 10 "
"et proposez des correctifs."
),
llm_config=llm_config,
)
# UserProxy qui n'exécute pas de code dans cet exemple
user_proxy = autogen.UserProxyAgent(
name="UserProxy",
human_input_mode="NEVER",
max_consecutive_auto_reply=0,
is_termination_msg=lambda x: "TERMINATE" in x.get("content", ""),
code_execution_config=False,
)
# Configuration du Group Chat
groupchat = autogen.GroupChat(
agents=[user_proxy, product_manager, developer, security_expert],
messages=[],
max_round=15,
speaker_selection_method="auto",
# Transitions autorisées pour un flow structuré
allowed_or_disallowed_speaker_transitions={
user_proxy: [product_manager],
product_manager: [developer, security_expert],
developer: [security_expert, product_manager],
security_expert: [developer, product_manager],
},
speaker_transitions_type="allowed",
)
manager = autogen.GroupChatManager(
groupchat=groupchat,
llm_config=llm_config,
)
# Démarrer la conversation
if __name__ == "__main__":
user_proxy.initiate_chat(
manager,
message=(
"Créez une API REST FastAPI sécurisée avec un endpoint POST /login "
"qui accepte email/password, valide les entrées et retourne un JWT. "
"Assurez-vous qu'elle résiste aux injections et brute-force."
),
)
Toujours définir is_termination_msg — Sans condition de terminaison, les conversations peuvent boucler indéfiniment. Utilisez une convention claire comme le mot "TERMINATE" dans le system_message de chaque agent, et détectez-le avec une lambda.
Utiliser Docker pour l'exécution de code en production — LocalCommandLineCodeExecutor présente des risques de sécurité (exécution arbitraire). Toujours utiliser DockerCommandLineCodeExecutor en environnement de production ou partagé.
Mettre cache_seed=None en production — Le cache basé sur cache_seed est utile pour le développement (reproductibilité, économie de tokens) mais doit être désactivé en production pour obtenir des réponses fraîches.
Dimensionner max_consecutive_auto_reply et max_round — Ces deux limites sont vos filets de sécurité contre les boucles infinies et les coûts incontrôlés. Commencez bas (5-10) et augmentez selon les besoins.
Séparer les rôles clairement dans system_message — La qualité d'un Group Chat dépend directement de la clarté des system_message. Chaque agent doit avoir un rôle unique, non ambigu, avec des instructions sur quand intervenir et quand passer la parole.
npx claudepluginhub khalilbenaz/claude-skills-collection --plugin claude-skills-collectionGuides creation, editing, and verification of skills for AI coding agents using test-driven development with subagent scenarios. Use when authoring or debugging skills.