| 
									
										
										
										
											2024-10-02 11:42:27 -07:00
										 |  |  | // Copyright (c) Microsoft Corporation. All rights reserved. | 
					
						
							| 
									
										
										
										
											2024-07-15 12:33:10 -07:00
										 |  |  | // Dynamic_Group_Chat.cs | 
					
						
							| 
									
										
										
										
											2024-06-20 10:47:31 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  | using AutoGen.Core; | 
					
						
							| 
									
										
										
										
											2024-08-27 14:37:47 -07:00
										 |  |  | using AutoGen.OpenAI; | 
					
						
							|  |  |  | using AutoGen.OpenAI.Extension; | 
					
						
							| 
									
										
										
										
											2024-06-20 10:47:31 -07:00
										 |  |  | using AutoGen.SemanticKernel; | 
					
						
							|  |  |  | using AutoGen.SemanticKernel.Extension; | 
					
						
							|  |  |  | using Microsoft.SemanticKernel; | 
					
						
							| 
									
										
										
										
											2024-08-27 14:37:47 -07:00
										 |  |  | using OpenAI; | 
					
						
							| 
									
										
										
										
											2024-06-20 10:47:31 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  | 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."); | 
					
						
							| 
									
										
										
										
											2024-08-27 14:37:47 -07:00
										 |  |  |         var model = "gpt-4o-mini"; | 
					
						
							| 
									
										
										
										
											2024-06-20 10:47:31 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |         #region Create_Coder | 
					
						
							|  |  |  |         var openaiClient = new OpenAIClient(apiKey); | 
					
						
							|  |  |  |         var coder = new OpenAIChatAgent( | 
					
						
							| 
									
										
										
										
											2024-08-27 14:37:47 -07:00
										 |  |  |             chatClient: openaiClient.GetChatClient(model), | 
					
						
							| 
									
										
										
										
											2024-06-20 10:47:31 -07:00
										 |  |  |             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( | 
					
						
							| 
									
										
										
										
											2024-08-27 14:37:47 -07:00
										 |  |  |             chatClient: openaiClient.GetChatClient(model), | 
					
						
							|  |  |  |             name: "admin") | 
					
						
							| 
									
										
										
										
											2024-06-20 10:47:31 -07:00
										 |  |  |             .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<IMessage> { 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 | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | } |