From a0b6a69295d4c06bfc4b7743fce9b06ceb430a09 Mon Sep 17 00:00:00 2001 From: markwallace-microsoft <127216156+markwallace-microsoft@users.noreply.github.com> Date: Sun, 19 May 2024 08:58:30 +0100 Subject: [PATCH 1/3] Holiday plugin sample --- .../ChatCompletion/OpenAI_FunctionCalling.cs | 44 +++++++++++++++++-- 1 file changed, 40 insertions(+), 4 deletions(-) diff --git a/dotnet/samples/Concepts/ChatCompletion/OpenAI_FunctionCalling.cs b/dotnet/samples/Concepts/ChatCompletion/OpenAI_FunctionCalling.cs index 8700b179cbe3..d1da458e4a77 100644 --- a/dotnet/samples/Concepts/ChatCompletion/OpenAI_FunctionCalling.cs +++ b/dotnet/samples/Concepts/ChatCompletion/OpenAI_FunctionCalling.cs @@ -12,7 +12,7 @@ public sealed class OpenAI_FunctionCalling(ITestOutputHelper output) : BaseTest( public async Task AutoInvokeKernelFunctionsAsync() { // Create a kernel with MistralAI chat completion and WeatherPlugin - Kernel kernel = CreateKernelWithWeatherPlugin(); + Kernel kernel = CreateKernelWithPlugin(); // Invoke chat prompt with auto invocation of functions enabled const string ChatPrompt = """ @@ -30,7 +30,7 @@ public async Task AutoInvokeKernelFunctionsAsync() public async Task AutoInvokeKernelFunctionsMultipleCallsAsync() { // Create a kernel with MistralAI chat completion and WeatherPlugin - Kernel kernel = CreateKernelWithWeatherPlugin(); + Kernel kernel = CreateKernelWithPlugin(); var service = kernel.GetRequiredService(); // Invoke chat prompt with auto invocation of functions enabled @@ -49,6 +49,24 @@ public async Task AutoInvokeKernelFunctionsMultipleCallsAsync() Console.WriteLine(result2[0].Content); } + [Fact] + public async Task AutoInvokeKernelFunctionsWithComplexParameterAsync() + { + // Create a kernel with MistralAI chat completion and WeatherPlugin + Kernel kernel = CreateKernelWithPlugin(); + + // Invoke chat prompt with auto invocation of functions enabled + const string ChatPrompt = """ + Book a holiday for me from 6th June 2025 to 20th June 2025? + """; + var executionSettings = new OpenAIPromptExecutionSettings { ToolCallBehavior = ToolCallBehavior.AutoInvokeKernelFunctions }; + var chatSemanticFunction = kernel.CreateFunctionFromPrompt( + ChatPrompt, executionSettings); + var chatPromptResult = await kernel.InvokeAsync(chatSemanticFunction); + + Console.WriteLine(chatPromptResult); + } + public sealed class WeatherPlugin { [KernelFunction] @@ -58,7 +76,25 @@ public string GetWeather( ) => "12°C\nWind: 11 KMPH\nHumidity: 48%\nMostly cloudy"; } - private Kernel CreateKernelWithWeatherPlugin() + public sealed class HolidayPlugin + { + [KernelFunction] + [Description("Book a holiday for a specified time period.")] + public string BookHoliday( + [Description("The city and department, e.g. Marseille, 13")] HolidayRequest holidayRequest + ) => $"Holiday booked, starting {holidayRequest.StartDate} and ending {holidayRequest.EndDate}"; + } + + public sealed class HolidayRequest + { + [Description("The date when the holiday period starts in ISO 8601 format")] + public string StartDate { get; set; } = string.Empty; + + [Description("The date when the holiday period ends in ISO 8601 format")] + public string EndDate { get; set; } = string.Empty; + } + + private Kernel CreateKernelWithPlugin() { // Create a logging handler to output HTTP requests and responses var handler = new LoggingHandler(new HttpClientHandler(), this.Output); @@ -70,7 +106,7 @@ private Kernel CreateKernelWithWeatherPlugin() modelId: TestConfiguration.OpenAI.ChatModelId!, apiKey: TestConfiguration.OpenAI.ApiKey!, httpClient: httpClient); - kernelBuilder.Plugins.AddFromType(); + kernelBuilder.Plugins.AddFromType(); Kernel kernel = kernelBuilder.Build(); return kernel; } From 0cbf0e4b0f0b75d04abe87388347100c29be2b86 Mon Sep 17 00:00:00 2001 From: Mark Wallace <127216156+markwallace-microsoft@users.noreply.github.com> Date: Mon, 27 May 2024 13:47:24 +0100 Subject: [PATCH 2/3] Update dotnet/samples/Concepts/ChatCompletion/OpenAI_FunctionCalling.cs Co-authored-by: Dmytro Struk <13853051+dmytrostruk@users.noreply.github.com> --- .../samples/Concepts/ChatCompletion/OpenAI_FunctionCalling.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dotnet/samples/Concepts/ChatCompletion/OpenAI_FunctionCalling.cs b/dotnet/samples/Concepts/ChatCompletion/OpenAI_FunctionCalling.cs index d1da458e4a77..9fac8db277f6 100644 --- a/dotnet/samples/Concepts/ChatCompletion/OpenAI_FunctionCalling.cs +++ b/dotnet/samples/Concepts/ChatCompletion/OpenAI_FunctionCalling.cs @@ -52,7 +52,7 @@ public async Task AutoInvokeKernelFunctionsMultipleCallsAsync() [Fact] public async Task AutoInvokeKernelFunctionsWithComplexParameterAsync() { - // Create a kernel with MistralAI chat completion and WeatherPlugin + // Create a kernel with MistralAI chat completion and HolidayPlugin Kernel kernel = CreateKernelWithPlugin(); // Invoke chat prompt with auto invocation of functions enabled From b16be15301163161f52a66e0985466f4ff5a60e4 Mon Sep 17 00:00:00 2001 From: Mark Wallace <127216156+markwallace-microsoft@users.noreply.github.com> Date: Mon, 27 May 2024 13:47:33 +0100 Subject: [PATCH 3/3] Update dotnet/samples/Concepts/ChatCompletion/OpenAI_FunctionCalling.cs Co-authored-by: Dmytro Struk <13853051+dmytrostruk@users.noreply.github.com> --- .../ChatCompletion/OpenAI_FunctionCalling.cs | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/dotnet/samples/Concepts/ChatCompletion/OpenAI_FunctionCalling.cs b/dotnet/samples/Concepts/ChatCompletion/OpenAI_FunctionCalling.cs index 9fac8db277f6..f96967af5f28 100644 --- a/dotnet/samples/Concepts/ChatCompletion/OpenAI_FunctionCalling.cs +++ b/dotnet/samples/Concepts/ChatCompletion/OpenAI_FunctionCalling.cs @@ -39,14 +39,14 @@ public async Task AutoInvokeKernelFunctionsMultipleCallsAsync() new ChatMessageContent(AuthorRole.User, "What is the weather like in Paris?") }; var executionSettings = new OpenAIPromptExecutionSettings { ToolCallBehavior = ToolCallBehavior.AutoInvokeKernelFunctions }; - var result1 = await service.GetChatMessageContentsAsync(chatHistory, executionSettings, kernel); - chatHistory.AddRange(result1); + var result1 = await service.GetChatMessageContentAsync(chatHistory, executionSettings, kernel); + chatHistory.Add(result1); chatHistory.Add(new ChatMessageContent(AuthorRole.User, "What is the weather like in Marseille?")); - var result2 = await service.GetChatMessageContentsAsync(chatHistory, executionSettings, kernel); + var result2 = await service.GetChatMessageContentAsync(chatHistory, executionSettings, kernel); - Console.WriteLine(result1[0].Content); - Console.WriteLine(result2[0].Content); + Console.WriteLine(result1); + Console.WriteLine(result2); } [Fact] @@ -73,7 +73,7 @@ public sealed class WeatherPlugin [Description("Get the current weather in a given location.")] public string GetWeather( [Description("The city and department, e.g. Marseille, 13")] string location - ) => "12°C\nWind: 11 KMPH\nHumidity: 48%\nMostly cloudy"; + ) => $"12°C\nWind: 11 KMPH\nHumidity: 48%\nMostly cloudy\nLocation: {location}"; } public sealed class HolidayPlugin @@ -81,7 +81,7 @@ public sealed class HolidayPlugin [KernelFunction] [Description("Book a holiday for a specified time period.")] public string BookHoliday( - [Description("The city and department, e.g. Marseille, 13")] HolidayRequest holidayRequest + [Description("Holiday time period")] HolidayRequest holidayRequest ) => $"Holiday booked, starting {holidayRequest.StartDate} and ending {holidayRequest.EndDate}"; }