// Copyright (c) Microsoft Corporation. All rights reserved. // Dynamic_Group_Chat.cs using AutoGen.Core; using AutoGen.OpenAI; using AutoGen.OpenAI.Extension; using AutoGen.SemanticKernel; using AutoGen.SemanticKernel.Extension; using Microsoft.SemanticKernel; using OpenAI; namespace AutoGen.BasicSample; public class Dynamic_Group_Chat { public static async Task RunAsync() { var apiKey = Environment.GetEnvironmentVariable("OPENAI_API_KEY") ?? throw new Exception("Please set OPENAI_API_KEY environment variable."); var model = "gpt-4o-mini"; #region Create_Coder var openaiClient = new OpenAIClient(apiKey); var coder = new OpenAIChatAgent( chatClient: openaiClient.GetChatClient(model), name: "coder", systemMessage: "You are a C# coder, when writing csharp code, please put the code between ```csharp and ```") .RegisterMessageConnector() // convert OpenAI message to AutoGen message .RegisterPrintMessage(); // print the message content #endregion Create_Coder #region Create_Commenter var kernel = Kernel .CreateBuilder() .AddOpenAIChatCompletion(modelId: model, apiKey: apiKey) .Build(); var commenter = new SemanticKernelAgent( kernel: kernel, name: "commenter", systemMessage: "You write inline comments for the code snippet and add unit tests if necessary") .RegisterMessageConnector() // register message connector so it support AutoGen built-in message types like TextMessage. .RegisterPrintMessage(); // pretty print the message to the console #endregion Create_Commenter #region Create_UserProxy var userProxy = new DefaultReplyAgent("user", defaultReply: "END") .RegisterPrintMessage(); // print the message content #endregion Create_UserProxy #region Create_Group var admin = new OpenAIChatAgent( chatClient: openaiClient.GetChatClient(model), name: "admin") .RegisterMessageConnector(); // convert OpenAI message to AutoGen message var group = new GroupChat( members: [coder, commenter, userProxy], admin: admin); #endregion Create_Group #region Chat_With_Group var workflowInstruction = new TextMessage( Role.User, """ Here is the workflow of this group chat: User{Ask a question} -> Coder{Write code} Coder{Write code} -> Commenter{Add comments to the code} Commenter{Add comments to the code} -> User{END} """); var question = new TextMessage(Role.User, "How to calculate the 100th Fibonacci number?"); var chatHistory = new List { workflowInstruction, question }; while (true) { var replies = await group.CallAsync(chatHistory, maxRound: 1); var lastReply = replies.Last(); chatHistory.Add(lastReply); if (lastReply.From == userProxy.Name) { break; } } #endregion Chat_With_Group #region Summarize_Chat_History var summary = await coder.SendAsync("summarize the conversation", chatHistory: chatHistory); #endregion Summarize_Chat_History } }