// Copyright (c) Microsoft Corporation. All rights reserved. // Use_Tools_With_Agent.cs #region Using using AutoGen.Core; using AutoGen.OpenAI; using AutoGen.OpenAI.Extension; #endregion Using using FluentAssertions; using OpenAI; namespace AutoGen.Basic.Sample; #region Tools public partial class Tools { /// /// Get the weather of the city. /// /// [Function] public async Task GetWeather(string city) { return $"The weather in {city} is sunny."; } } #endregion Tools public class Use_Tools_With_Agent { public static async Task RunAsync() { #region Create_tools var tools = new Tools(); #endregion Create_tools #region Create_auto_invoke_middleware var autoInvokeMiddleware = new FunctionCallMiddleware( functions: [tools.GetWeatherFunctionContract], functionMap: new Dictionary>>() { { tools.GetWeatherFunctionContract.Name!, tools.GetWeatherWrapper }, }); #endregion Create_auto_invoke_middleware #region Create_no_invoke_middleware var noInvokeMiddleware = new FunctionCallMiddleware( functions: [tools.GetWeatherFunctionContract]); #endregion Create_no_invoke_middleware #region Create_Agent var apiKey = Environment.GetEnvironmentVariable("OPENAI_API_KEY") ?? throw new Exception("Please set OPENAI_API_KEY environment variable."); var model = "gpt-4o-mini"; var openaiClient = new OpenAIClient(apiKey); var agent = new OpenAIChatAgent( chatClient: openaiClient.GetChatClient(model), name: "agent", systemMessage: "You are a helpful AI assistant") .RegisterMessageConnector(); // convert OpenAI message to AutoGen message #endregion Create_Agent #region Single_Turn_Auto_Invoke var autoInvokeAgent = agent .RegisterMiddleware(autoInvokeMiddleware) // pass function definition to agent. .RegisterPrintMessage(); // print the message content var question = new TextMessage(Role.User, "What is the weather in Seattle?"); var reply = await autoInvokeAgent.SendAsync(question); reply.Should().BeOfType(); #endregion Single_Turn_Auto_Invoke #region Single_Turn_No_Invoke var noInvokeAgent = agent .RegisterMiddleware(noInvokeMiddleware) // pass function definition to agent. .RegisterPrintMessage(); // print the message content question = new TextMessage(Role.User, "What is the weather in Seattle?"); reply = await noInvokeAgent.SendAsync(question); reply.Should().BeOfType(); #endregion Single_Turn_No_Invoke #region Multi_Turn_Tool_Call var finalReply = await agent.SendAsync(chatHistory: [question, reply]); #endregion Multi_Turn_Tool_Call #region verify_reply finalReply.Should().BeOfType(); #endregion verify_reply #region parallel_tool_call question = new TextMessage(Role.User, "What is the weather in Seattle, New York and Vancouver"); reply = await agent.SendAsync(question); #endregion parallel_tool_call #region verify_parallel_tool_call_reply reply.Should().BeOfType(); (reply as ToolCallAggregateMessage)!.Message1.ToolCalls.Count.Should().Be(3); #endregion verify_parallel_tool_call_reply #region Multi_Turn_Parallel_Tool_Call finalReply = await agent.SendAsync(chatHistory: [question, reply]); finalReply.Should().BeOfType(); (finalReply as ToolCallAggregateMessage)!.Message1.ToolCalls.Count.Should().Be(3); #endregion Multi_Turn_Parallel_Tool_Call } }