![]()
Cette leçon couvrira :
Après avoir terminé cette leçon, vous saurez comment :
Des exemples de code pour Microsoft Agent Framework (MAF) se trouvent dans ce dépôt sous les fichiers xx-python-agent-framework et xx-dotnet-agent-framework.

Microsoft Agent Framework (MAF) est le cadre unifié de Microsoft pour construire des agents d’IA. Il offre la flexibilité nécessaire pour répondre à la grande variété de cas d’utilisation agentiques observés tant en production qu’en environnement de recherche, notamment :
Pour déployer des agents d’IA en production, MAF inclut également des fonctionnalités pour :
Microsoft Agent Framework vise aussi à être interopérable en :
Voyons comment ces fonctionnalités sont appliquées à certains des concepts clés de Microsoft Agent Framework.

Création d’agents
La création d’agent se fait en définissant le service d’inférence (fournisseur LLM), un ensemble d’instructions que l’agent d’IA doit suivre, et un name assigné :
agent = AzureOpenAIChatClient(credential=AzureCliCredential()).create_agent( instructions="You are good at recommending trips to customers based on their preferences.", name="TripRecommender" )
Le code ci-dessus utilise Azure OpenAI mais les agents peuvent être créés avec divers services incluant Microsoft Foundry Agent Service :
AzureAIAgentClient(async_credential=credential).create_agent( name="HelperAgent", instructions="You are a helpful assistant." ) as agent
APIs OpenAI Responses, ChatCompletion
agent = OpenAIResponsesClient().create_agent( name="WeatherBot", instructions="You are a helpful weather assistant.", )
agent = OpenAIChatClient().create_agent( name="HelpfulAssistant", instructions="You are a helpful assistant.", )
ou MiniMax, qui fournit une API compatible OpenAI avec de grandes fenêtres de contexte (jusqu’à 204K tokens) :
agent = OpenAIChatClient(base_url="https://api.minimax.io/v1", api_key=os.environ["MINIMAX_API_KEY"], model_id="MiniMax-M2.7").create_agent( name="HelpfulAssistant", instructions="You are a helpful assistant.", )
ou des agents distants utilisant le protocole A2A :
agent = A2AAgent( name=agent_card.name, description=agent_card.description, agent_card=agent_card, url="https://your-a2a-agent-host" )
Exécution des agents
Les agents sont lancés en utilisant les méthodes .run ou .run_stream pour des réponses non-streaming ou streaming.
result = await agent.run("What are good places to visit in Amsterdam?")
print(result.text)
async for update in agent.run_stream("What are the good places to visit in Amsterdam?"):
if update.text:
print(update.text, end="", flush=True)
Chaque exécution d’agent peut aussi disposer d’options pour personnaliser des paramètres tels que max_tokens utilisés par l’agent, les tools que l’agent peut appeler, et même le model utilisé par l’agent.
Cela est utile dans les cas où des modèles ou outils spécifiques sont nécessaires pour accomplir la tâche d’un utilisateur.
Outils
Les outils peuvent être définis à la fois lors de la définition de l’agent :
def get_attractions( location: Annotated[str, Field(description="The location to get the top tourist attractions for")], ) -> str: """Get the top tourist attractions for a given location.""" return f"The top attractions for {location} are."
# Lors de la création directe d'un ChatAgent
agent = ChatAgent( chat_client=OpenAIChatClient(), instructions="You are a helpful assistant", tools=[get_attractions]
et également lors de l’exécution de l’agent :
result1 = await agent.run( "What's the best place to visit in Seattle?", tools=[get_attractions] # Outil fourni uniquement pour cette exécution )
Threads d’agents
Les threads d’agents sont utilisés pour gérer des conversations multi-tours. Les threads peuvent être créés soit par :
get_new_thread() qui permet de sauvegarder le thread dans le tempsPour créer un thread, le code est le suivant :
# Créez un nouveau thread.
thread = agent.get_new_thread() # Exécutez l'agent avec le thread.
response = await agent.run("Hello, I am here to help you book travel. Where would you like to go?", thread=thread)
Vous pouvez ensuite sérialiser le thread pour le stocker et l’utiliser ultérieurement :
# Créer un nouveau fil.
thread = agent.get_new_thread()
# Exécuter l'agent avec le fil.
response = await agent.run("Hello, how are you?", thread=thread)
# Sérialiser le fil pour le stockage.
serialized_thread = await thread.serialize()
# Désérialiser l'état du fil après le chargement depuis le stockage.
resumed_thread = await agent.deserialize_thread(serialized_thread)
Middleware d’agent
Les agents interagissent avec les outils et LLMs pour accomplir les tâches des utilisateurs. Dans certains scénarios, on souhaite exécuter ou suivre ce qui se passe entre ces interactions. Le middleware d’agent permet cela via :
Middleware fonctionnel
Ce middleware permet d’exécuter une action entre l’agent et une fonction/outil qu’il appelle. Un exemple d’utilisation est de faire des logs lors d’un appel de fonction.
Dans le code ci-dessous, next définit si le middleware suivant ou la fonction réelle doit être appelé.
async def logging_function_middleware(
context: FunctionInvocationContext,
next: Callable[[FunctionInvocationContext], Awaitable[None]],
) -> None:
"""Function middleware that logs function execution."""
# Pré-traitement : Enregistrer avant l'exécution de la fonction
print(f"[Function] Calling {context.function.name}")
# Continuer vers le middleware suivant ou l'exécution de la fonction
await next(context)
# Post-traitement : Enregistrer après l'exécution de la fonction
print(f"[Function] {context.function.name} completed")
Middleware de chat
Ce middleware permet d’exécuter ou logger une action entre l’agent et les requêtes entre le LLM.
Celui-ci contient des informations importantes telles que les messages envoyés au service d’IA.
async def logging_chat_middleware(
context: ChatContext,
next: Callable[[ChatContext], Awaitable[None]],
) -> None:
"""Chat middleware that logs AI interactions."""
# Pré-traitement : Journaliser avant l'appel à l'IA
print(f"[Chat] Sending {len(context.messages)} messages to AI")
# Continuer vers le middleware ou le service IA suivant
await next(context)
# Post-traitement : Journaliser après la réponse de l'IA
print("[Chat] AI response received")
Mémoire d’agent
Comme vu dans la leçon Agentic Memory, la mémoire est un élément important pour permettre à l’agent d’opérer sur différents contextes. MAF propose plusieurs types de mémoires :
Stockage en mémoire vive
C’est la mémoire stockée dans les threads durant l’exécution de l’application.
# Créez un nouveau thread.
thread = agent.get_new_thread() # Exécutez l'agent avec le thread.
response = await agent.run("Hello, I am here to help you book travel. Where would you like to go?", thread=thread)
Messages persistants
Cette mémoire est utilisée pour conserver l’historique de conversation à travers différentes sessions. Elle est définie via le chat_message_store_factory :
from agent_framework import ChatMessageStore
# Créer un magasin de messages personnalisé
def create_message_store():
return ChatMessageStore()
agent = ChatAgent(
chat_client=OpenAIChatClient(),
instructions="You are a Travel assistant.",
chat_message_store_factory=create_message_store
)
Mémoire dynamique
Cette mémoire est ajoutée au contexte avant que les agents ne soient lancés. Ces mémoires peuvent être stockées dans des services externes tels que mem0 :
from agent_framework.mem0 import Mem0Provider
# Utilisation de Mem0 pour des capacités mémoire avancées
memory_provider = Mem0Provider(
api_key="your-mem0-api-key",
user_id="user_123",
application_id="my_app"
)
agent = ChatAgent(
chat_client=OpenAIChatClient(),
instructions="You are a helpful assistant with memory.",
context_providers=memory_provider
)
Observabilité d’agent
L’observabilité est importante pour construire des systèmes agentiques fiables et maintenables. MAF s’intègre à OpenTelemetry pour fournir traçage et mesures pour une meilleure observabilité.
from agent_framework.observability import get_tracer, get_meter
tracer = get_tracer()
meter = get_meter()
with tracer.start_as_current_span("my_custom_span"):
# faire quelque chose
pass
counter = meter.create_counter("my_custom_counter")
counter.add(1, {"key": "value"})
MAF propose des workflows qui sont des étapes prédéfinies pour compléter une tâche et incluent des agents d’IA comme composants dans ces étapes.
Les workflows sont composés de différents éléments permettant un meilleur contrôle du flux. Les workflows permettent également l’orchestration multi-agent et le checkpointing pour sauvegarder l’état des workflows.
Les composants principaux d’un workflow sont :
Exécuteurs
Les exécuteurs reçoivent des messages d’entrée, exécutent leurs tâches assignées, puis produisent un message de sortie. Cela fait avancer le workflow vers l’achèvement de la tâche globale. Les exécuteurs peuvent être soit des agents IA soit de la logique personnalisée.
Arêtes
Les arêtes servent à définir le flux des messages dans un workflow. Elles peuvent être :
Arêtes directes - Connexions simples un-à-un entre exécuteurs :
from agent_framework import WorkflowBuilder
builder = WorkflowBuilder()
builder.add_edge(source_executor, target_executor)
builder.set_start_executor(source_executor)
workflow = builder.build()
Arêtes conditionnelles - Activées après qu’une condition soit remplie. Par exemple, quand des chambres d’hôtel ne sont pas disponibles, un exécuteur peut suggérer d’autres options.
Arêtes switch-case - Acheminent les messages vers différents exécuteurs selon des conditions définies. Par exemple, si un client voyageur a un accès prioritaire, ses tâches seront traitées via un autre workflow.
Arêtes fan-out - Envoient un message à plusieurs cibles.
Arêtes fan-in - Collectent plusieurs messages de différents exécuteurs et les envoient à une unique cible.
Événements
Pour offrir une meilleure observabilité des workflows, MAF propose des événements intégrés pour l’exécution incluant :
WorkflowStartedEvent - Début d’exécution du workflowWorkflowOutputEvent - Le workflow produit une sortieWorkflowErrorEvent - Le workflow rencontre une erreurExecutorInvokeEvent - L’exécuteur commence son traitementExecutorCompleteEvent - L’exécuteur termine son traitementRequestInfoEvent - Une requête est émiseLes sections ci-dessus couvrent les concepts clés du Microsoft Agent Framework. À mesure que vous construisez des agents plus complexes, voici quelques modèles avancés à considérer :
Des exemples de code pour Microsoft Agent Framework se trouvent dans ce dépôt sous les fichiers xx-python-agent-framework et xx-dotnet-agent-framework.
Rejoignez le Microsoft Foundry Discord pour rencontrer d’autres apprenants, participer à des heures de bureau et obtenir des réponses à vos questions sur les agents d’IA.
Avertissement :
Ce document a été traduit à l’aide du service de traduction par IA Co-op Translator. Bien que nous nous efforcions d’assurer l’exactitude, veuillez noter que les traductions automatisées peuvent contenir des erreurs ou des inexactitudes. Le document original dans sa langue d’origine doit être considéré comme la source faisant autorité. Pour les informations critiques, une traduction professionnelle humaine est recommandée. Nous ne sommes pas responsables des malentendus ou des mauvaises interprétations résultant de l’utilisation de cette traduction.