Agent Framework de Microsoft pour sauver Noël

· 12 min de lecture

##Présentation

Trouver les cadeaux de Noël parfaits peut être stressant. Entre le brainstorming d’idées cadeaux, la comparaison des prix dans les magasins et le fait de s’assurer que tout arrive à temps, le magasinage des Fêtes devient rapidement écrasant. Et si nous pouvions déléguer ces tâches à des agents d’IA spécialisés qui travaillent ensemble ? Dans cet article, nous explorerons comment utiliser Agent Framework de Microsoft pour créer un système multi-agents dans lequel chaque agent se spécialise dans une tâche spécifique, de la génération d’idées cadeaux à la comparaison des prix, le tout coordonné via des flux de travail.

Calendrier technologique festif 2025

Ce projet fait partie de ma session au Festive Tech Calendar 2025, un incroyable événement communautaire célébrant la technologie pendant la période des fêtes. Vous pouvez en savoir plus sur l’événement sur Sessionize.

Qu’est-ce que l’Agent Framework de Microsoft ?

Agent Framework est la solution de Microsoft pour créer, orchestrer et déployer des agents IA et des systèmes multi-agents. Il fournit une base flexible pour créer des agents pouvant travailler de manière séquentielle, simultanée ou via des modèles de transfert. Le framework prend en charge les modèles OpenAI, Azure OpenAI et Microsoft Foundry, ce qui le rend incroyablement polyvalent.

Les principales fonctionnalités incluent :

  • Orchestration multi-agents : discussions de groupe, modèles séquentiels, simultanés et de transfert
  • Écosystème de plugins : extension avec des fonctions natives, OpenAPI et Model Context Protocol (MCP)
  • Support de workflow : créez des pipelines d’agents complexes avec des exécuteurs et des dispositifs Edge

Prérequis

Avant de plonger dans le code, assurez-vous d’avoir :

-.NET 9

  • Accès Azure OpenAI (ou clé API OpenAI)
  • Visual Studio ou Visual Studio Code

Installez les packages requis (notez que l’indicateur --prerelease est requis en version préliminaire) :

dotnet add package Microsoft.Agents.AI.OpenAI --prerelease
dotnet add package Microsoft.Agents.AI.Workflows --prerelease
dotnet add package Azure.AI.OpenAI
dotnet add package Azure.Identity
dotnet add package Azure.AI.Agents.Persistent --prerelease

Les agents d’achat de cadeaux

Notre chercheur de cadeaux de Noël sera composé de trois agents spécialisés travaillant ensemble :

  1. Gift Idea Agent - Génère des suggestions de cadeaux créatives en fonction du profil du destinataire
  2. Agent de comparaison de prix - Trouve les meilleurs prix dans différents magasins
  3. Agent de synthèse - Compile les recommandations finales

Les modèles

Commençons par définir nos modèles de données qui circuleront dans le pipeline des agents :

public class GiftRecipient
{
    public string Name { get; set; } = string.Empty;
    public int Age { get; set; }
    public List<string> Interests { get; set; } = [];
    public decimal Budget { get; set; }
}

public class GiftIdea
{
    public string Name { get; set; } = string.Empty;
    public string Description { get; set; } = string.Empty;
    public string Category { get; set; } = string.Empty;
    public decimal EstimatedPrice { get; set; }
}

public class PriceResult
{
    public string GiftName { get; set; } = string.Empty;
    public string Store { get; set; } = string.Empty;
    public decimal Price { get; set; }
    public string Url { get; set; } = string.Empty;
}

public class GiftRecommendation
{
    public GiftIdea Gift { get; set; } = new();
    public List<PriceResult> Prices { get; set; } = [];
    public PriceResult? BestDeal { get; set; }
}

Construire les agents

La beauté d’Agent Framework réside dans la facilité avec laquelle il est possible de créer des agents spécialisés. Chaque agent est simplement un ChatClientAgent avec une invite système spécifique qui définit son expertise.

using Azure.AI.OpenAI;
using Azure.Identity;
using Microsoft.Agents.AI;
using Microsoft.Agents.AI.Workflows;
using Microsoft.Extensions.AI;

public static class ChristmasAgentFactory
{
    public static AIAgent CreateGiftIdeaAgent(IChatClient chatClient)
    {
        return new ChatClientAgent(
            chatClient,
            @"You are a creative Christmas gift advisor. When given information about a person 
            (age, interests, budget), you suggest thoughtful and personalized gift ideas.
            
            For each suggestion, provide:
            - Gift name
            - Brief description of why it's a good fit
            - Category (Electronics, Books, Fashion, Home, Experience, etc.)
            - Estimated price range
            
            Always suggest 3-5 gift options within the specified budget.
            Format your response as a structured list.");
    }

    public static AIAgent CreatePriceComparisonAgent(IChatClient chatClient)
    {
        return new ChatClientAgent(
            chatClient,
            @"You are a price comparison specialist. Given a list of gift ideas, 
            you research and compare prices from different online retailers.
            
            For each gift, provide:
            - Store name (Amazon, Best Buy, Target, Walmart, etc.)
            - Current price
            - Any available discounts or deals
            
            Always highlight the best deal for each item.
            Consider shipping costs and delivery times for Christmas.");
    }

    public static AIAgent CreateSummaryAgent(IChatClient chatClient)
    {
        return new ChatClientAgent(
            chatClient,
            @"You are a gift recommendation summarizer. Take the gift ideas and price 
            comparisons and create a final recommendation report.
            
            Your summary should:
            - Rank gifts by value (quality vs price)
            - Highlight the top pick with reasoning
            - Include total cost estimate
            - Add any tips for holiday shopping
            
            Make the summary cheerful and festive!");
    }
}

Création du workflow

Vient maintenant la partie amusante : connecter nos agents dans un flux de travail séquentiel. Agent Framework fournit WorkflowBuilder et AgentWorkflowBuilder pour composer les agents selon différents modèles.

public static class ChristmasGiftWorkflow
{
    public static async Task RunAsync()
    {
        // Set up the Azure OpenAI client
        var endpoint = Environment.GetEnvironmentVariable("AZURE_OPENAI_ENDPOINT") 
            ?? throw new InvalidOperationException("AZURE_OPENAI_ENDPOINT is not set.");
        var deploymentName = Environment.GetEnvironmentVariable("AZURE_OPENAI_DEPLOYMENT_NAME") 
            ?? "gpt-4o-mini";
        
        var chatClient = new AzureOpenAIClient(
            new Uri(endpoint), 
            new DefaultAzureCredential())
            .GetChatClient(deploymentName)
            .AsIChatClient();

        // Create our specialized agents
        AIAgent giftIdeaAgent = ChristmasAgentFactory.CreateGiftIdeaAgent(chatClient);
        AIAgent priceAgent = ChristmasAgentFactory.CreatePriceComparisonAgent(chatClient);
        AIAgent summaryAgent = ChristmasAgentFactory.CreateSummaryAgent(chatClient);

        // Build a sequential workflow: Ideas -> Prices -> Summary
        var workflow = AgentWorkflowBuilder.BuildSequential(
            "ChristmasGiftFinder",
            [giftIdeaAgent, priceAgent, summaryAgent]);

        // Define our gift recipient
        var recipient = new GiftRecipient
        {
            Name = "Mom",
            Age = 55,
            Interests = ["gardening", "cooking", "reading", "yoga"],
            Budget = 100
        };

        var prompt = $@"Find Christmas gifts for {recipient.Name}, 
            age {recipient.Age}, who enjoys {string.Join(", ", recipient.Interests)}. 
            Budget: ${recipient.Budget}";

        // Execute the workflow with streaming
        await using StreamingRun run = await InProcessExecution.StreamAsync(
            workflow, 
            new ChatMessage(ChatRole.User, prompt));

        // Send the turn token to start processing
        await run.TrySendMessageAsync(new TurnToken(emitEvents: true));

        // Watch for workflow events
        await foreach (WorkflowEvent evt in run.WatchStreamAsync())
        {
            if (evt is AgentRunUpdateEvent agentUpdate)
            {
                Console.Write(agentUpdate.Data);
            }
            else if (evt is WorkflowOutputEvent outputEvent)
            {
                Console.WriteLine("\n🎄 Final Recommendations:");
                Console.WriteLine(outputEvent.Data);
            }
        }
    }
}

Exécution d’agents simultanément

Que se passe-t-il si nous voulons rechercher des cadeaux pour plusieurs personnes à la fois ? Agent Framework prend en charge l’exécution simultanée, ce qui est parfait pour ce scénario :

public static async Task FindGiftsForEveryoneAsync(IChatClient chatClient, List<GiftRecipient> recipients)
{
    // Create an agent for each recipient
    var agents = recipients.Select(r => new ChatClientAgent(
        chatClient,
        $@"Find the perfect Christmas gift for {r.Name} (age {r.Age}), 
           who loves {string.Join(", ", r.Interests)}. Budget: ${r.Budget}.
           Provide one well-researched recommendation with price."
    )).ToList();

    // Build a concurrent workflow - all agents run in parallel
    var workflow = AgentWorkflowBuilder.BuildConcurrent(
        "FamilyGiftFinder",
        agents);

    await using StreamingRun run = await InProcessExecution.StreamAsync(
        workflow, 
        new ChatMessage(ChatRole.User, "Find gifts now!"));

    await run.TrySendMessageAsync(new TurnToken(emitEvents: true));

    await foreach (WorkflowEvent evt in run.WatchStreamAsync())
    {
        if (evt is WorkflowOutputEvent output)
        {
            Console.WriteLine("🎁 All gift recommendations ready!");
            Console.WriteLine(output.Data);
        }
    }
}

Exécuteurs personnalisés pour plus de contrôlePour des scénarios plus complexes, vous pouvez créer des exécuteurs personnalisés qui vous donnent un contrôle précis sur le flux de travail :

public sealed class GiftValidatorExecutor : Executor<List<ChatMessage>, List<ChatMessage>>
{
    public GiftValidatorExecutor() : base("GiftValidator") { }

    public override async ValueTask<List<ChatMessage>> HandleAsync(
        List<ChatMessage> messages,
        IWorkflowContext context,
        CancellationToken cancellationToken = default)
    {
        var lastMessage = messages.LastOrDefault()?.Text ?? "";
        
        // Validate that suggestions are within budget
        if (lastMessage.Contains("over budget", StringComparison.OrdinalIgnoreCase))
        {
            Console.WriteLine("⚠️ Some suggestions exceeded budget, filtering...");
            // Add validation logic here
        }

        Console.WriteLine("✅ Gift suggestions validated!");
        return messages;
    }
}

Vous pouvez ensuite insérer cet exécuteur dans votre workflow :

var validator = new GiftValidatorExecutor();

var workflow = new WorkflowBuilder(giftIdeaAgent)
    .AddEdge(giftIdeaAgent, validator)
    .AddEdge(validator, priceAgent)
    .AddEdge(priceAgent, summaryAgent)
    .WithOutputFrom(summaryAgent)
    .Build();

Ajout d’une vraie recherche sur le Web avec Bing Grounding

Jusqu’à présent, nos agents génèrent des réponses basées sur les connaissances du modèle d’IA. Mais que se passe-t-il si nous souhaitons rechercher sur le Web les prix et la disponibilité réels des produits ? C’est là qu’intervient Grounding with Bing Search. Il s’agit d’un outil disponible dans Microsoft Foundry (anciennement Azure AI Foundry) qui permet à vos agents d’incorporer des données Web publiques en temps réel lors de la génération de réponses.

Tout d’abord, vous devez créer une ressource Grounding with Bing Search dans le Portail Azure. Assurez-vous de le créer dans le même groupe de ressources que votre projet IA.

La beauté de Grounding avec Bing Search est qu’il s’intègre directement aux agents Azure AI. L’agent décide quand utiliser l’outil de recherche en fonction de la requête de l’utilisateur, effectue une recherche sur le Web et utilise les résultats pour générer une réponse fondée.

using Azure.AI.Agents.Persistent;
using Azure.Identity;

public static class BingGroundingSetup
{
    public static async Task<PersistentAgent> CreateAgentWithBingGroundingAsync(
        string projectEndpoint,
        string modelDeploymentName,
        string bingConnectionId)
    {
        // Create the Persistent Agents client
        var agentClient = new PersistentAgentsClient(projectEndpoint, new DefaultAzureCredential());

        // Configure the Bing Grounding tool
        var bingGroundingTool = new BingGroundingToolDefinition(
            new BingGroundingSearchToolParameters(
                [new BingGroundingSearchConfiguration(bingConnectionId)]
            )
        );

        // Create the agent with Bing Grounding enabled
        var agent = await agentClient.Administration.CreateAgentAsync(
            model: modelDeploymentName,
            name: "ChristmasPriceHunter",
            instructions: @"You are a Christmas gift price comparison specialist.
                
                When given gift ideas, use Bing to search for:
                - Current prices at major retailers (Amazon, Best Buy, Target, Walmart)
                - Available discounts and holiday deals
                - Shipping times to ensure delivery before Christmas
                
                Always provide URLs to the products you find.
                Highlight the best deals and recommend where to buy.",
            tools: [bingGroundingTool]
        );

        return agent;
    }
}

Créons maintenant un agent de comparaison de prix complet qui recherche sur le Web des informations réelles sur les produits :

using Azure.AI.Agents.Persistent;
using Azure.Identity;

public class ChristmasPriceAgent
{
    private readonly PersistentAgentsClient _client;
    private readonly string _modelDeployment;
    private readonly string _bingConnectionId;

    public ChristmasPriceAgent(string projectEndpoint, string modelDeployment, string bingConnectionId)
    {
        _client = new PersistentAgentsClient(projectEndpoint, new DefaultAzureCredential());
        _modelDeployment = modelDeployment;
        _bingConnectionId = bingConnectionId;
    }

    public async Task<string> FindGiftPricesAsync(string giftIdeas)
    {
        // Create agent with Bing Grounding
        var bingTool = new BingGroundingToolDefinition(
            new BingGroundingSearchToolParameters(
                [new BingGroundingSearchConfiguration(_bingConnectionId)]
            )
        );

        var agent = await _client.Administration.CreateAgentAsync(
            model: _modelDeployment,
            name: "PriceHunter",
            instructions: @"Search the web for current prices on the given gift ideas. 
                For each gift, find prices from at least 2-3 different stores.
                Include direct links to the products.
                Note any Christmas sales or discounts available.",
            tools: [bingTool]
        );

        try
        {
            // Create a thread for the conversation
            var thread = await _client.Threads.CreateThreadAsync();

            // Add the gift ideas as a message
            await _client.Messages.CreateMessageAsync(
                thread.Id,
                MessageRole.User,
                $"Find current prices for these gift ideas: {giftIdeas}"
            );

            // Run the agent
            var run = await _client.Runs.CreateRunAsync(thread.Id, agent.Id);

            // Wait for completion
            do
            {
                await Task.Delay(500);
                run = await _client.Runs.GetRunAsync(thread.Id, run.Id);
            }
            while (run.Status == RunStatus.Queued || run.Status == RunStatus.InProgress);

            // Get the response
            var messages = _client.Messages.GetMessages(thread.Id);
            var response = messages
                .Where(m => m.Role == MessageRole.Agent)
                .SelectMany(m => m.ContentItems)
                .OfType<MessageTextContent>()
                .FirstOrDefault();

            // Clean up
            await _client.Threads.DeleteThreadAsync(thread.Id);

            return response?.Text ?? "No results found.";
        }
        finally
        {
            // Clean up the agent
            await _client.Administration.DeleteAgentAsync(agent.Id);
        }
    }
}

Intégration de Bing Grounding dans le workflow

Voici comment utiliser l’agent de prix alimenté par Bing dans un flux de travail complet de recherche de cadeaux :

public static async Task RunWithBingGroundingAsync()
{
    var projectEndpoint = Environment.GetEnvironmentVariable("PROJECT_ENDPOINT")!;
    var modelDeployment = Environment.GetEnvironmentVariable("MODEL_DEPLOYMENT_NAME") ?? "gpt-4o";
    var bingConnectionId = Environment.GetEnvironmentVariable("BING_CONNECTION_ID")!;
    // Connection ID format: /subscriptions/{sub}/resourceGroups/{rg}/providers/Microsoft.CognitiveServices/accounts/{account}/projects/{project}/connections/{connection}

    Console.WriteLine("🔍 Searching the web for real prices with Bing Grounding...\n");

    var priceAgent = new ChristmasPriceAgent(projectEndpoint, modelDeployment, bingConnectionId);

    // First, generate gift ideas (could come from another agent)
    var giftIdeas = "1. Milwaukee cordless drill set, 2. Weber portable grill, 3. Carhartt beanie";

    // Search for real prices
    var priceResults = await priceAgent.FindGiftPricesAsync(giftIdeas);

    Console.WriteLine("📊 Price Comparison Results:");
    Console.WriteLine(priceResults);
    Console.WriteLine("\n🎁 Happy Shopping! 🎁");
}

Traitement des citations à partir des résultats Bing

Un aspect important de Grounding with Bing Search est que les réponses incluent des citations avec des liens vers les sites Web sources. Voici comment les extraire et les afficher :

public static void ProcessBingGroundingResponse(IEnumerable<PersistentThreadMessage> messages)
{
    foreach (var message in messages.Where(m => m.Role == MessageRole.Agent))
    {
        foreach (var content in message.ContentItems)
        {
            if (content is MessageTextContent textContent)
            {
                var response = textContent.Text;

                // Process URL citations
                if (textContent.Annotations != null)
                {
                    foreach (var annotation in textContent.Annotations)
                    {
                        if (annotation is MessageTextUriCitationAnnotation uriAnnotation)
                        {
                            // Replace citation placeholder with markdown link
                            response = response.Replace(
                                uriAnnotation.Text,
                                $" [{uriAnnotation.UriCitation.Title}]({uriAnnotation.UriCitation.Uri})"
                            );
                        }
                    }
                }

                Console.WriteLine(response);
            }
        }
    }
}

Désormais, lorsque l’agent de comparaison de prix s’exécute, il utilise Grounding with Bing Search pour trouver de véritables listes de produits, les prix actuels et les offres disponibles sur le Web en direct. L’agent décide automatiquement quand effectuer la recherche en fonction de la requête et renvoie des réponses fondées avec les citations appropriées.

Le programme complet

Voici comment tout se déroule dans Program.cs :

using Azure.AI.OpenAI;
using Azure.Identity;
using Microsoft.Agents.AI;
using Microsoft.Agents.AI.Workflows;
using Microsoft.Extensions.AI;

Console.WriteLine("🎄 Christmas Gift Finder - Powered by AI Agents 🎄\n");

var endpoint = Environment.GetEnvironmentVariable("AZURE_OPENAI_ENDPOINT")!;
var deployment = Environment.GetEnvironmentVariable("AZURE_OPENAI_DEPLOYMENT_NAME") ?? "gpt-4o-mini";

var chatClient = new AzureOpenAIClient(new Uri(endpoint), new DefaultAzureCredential())
    .GetChatClient(deployment)
    .AsIChatClient();

// Create the agent team
var ideaAgent = ChristmasAgentFactory.CreateGiftIdeaAgent(chatClient);
var priceAgent = ChristmasAgentFactory.CreatePriceComparisonAgent(chatClient);
var summaryAgent = ChristmasAgentFactory.CreateSummaryAgent(chatClient);

// Build the workflow
var workflow = AgentWorkflowBuilder.BuildSequential(
    "ChristmasGiftWorkflow",
    [ideaAgent, priceAgent, summaryAgent]);

Console.Write("Who are you shopping for? ");
var recipientName = Console.ReadLine() ?? "Someone special";

Console.Write("What are their interests? ");
var interests = Console.ReadLine() ?? "general";

Console.Write("What's your budget? $");
var budget = Console.ReadLine() ?? "50";

var prompt = $"Find Christmas gifts for {recipientName} who enjoys {interests}. Budget: ${budget}";

Console.WriteLine("\n🔍 Searching for the perfect gifts...\n");

await using var run = await InProcessExecution.StreamAsync(
    workflow,
    new ChatMessage(ChatRole.User, prompt));

await run.TrySendMessageAsync(new TurnToken(emitEvents: true));

await foreach (var evt in run.WatchStreamAsync())
{
    switch (evt)
    {
        case AgentRunUpdateEvent update:
            Console.Write(update.Update.Text);
            break;
        case WorkflowOutputEvent output:
            Console.WriteLine("\n\n🎁 Happy Shopping! 🎁");
            break;
    }
}

Conclusion

L’Agent Framework de Microsoft facilite étonnamment la création de systèmes multi-agents dans lesquels chaque agent se spécialise dans une tâche spécifique. En coordonnant ces agents via des workflows, nous pouvons résoudre des problèmes complexes comme les achats de Noël de manière structurée et efficace.

Ce qui rend cela encore plus puissant, c’est la possibilité d’ajouter des fonctionnalités du monde réel via des outils. En intégrant Grounding with Bing Search de Microsoft Foundry, notre agent de comparaison de prix peut réellement rechercher sur le Web les prix, les offres et la disponibilité actuels, transformant ainsi un simple chatbot IA en un assistant d’achat vraiment utile avec des citations appropriées.

La prise en charge par le framework des modèles séquentiels, simultanés et de transfert signifie que vous pouvez concevoir des systèmes d’agents qui répondent exactement à vos besoins. Qu’il s’agisse de trouver des cadeaux, de planifier des voyages ou de toute autre tâche en plusieurs étapes, Agent Framework fournit les éléments de base pour y parvenir.En cette période des fêtes, laissez les agents IA gérer les recherches pendant que vous vous concentrez sur l’emballage des cadeaux et le temps passé en famille !

##Code source

Les concepts présentés dans cet article sont basés sur les exemples officiels de Agent Framework. Vous pouvez explorer plus d’exemples sur le référentiel GitHub de Microsoft Agent Framework.

Bonnes vacances et bon codage ! 🎄