mirror of
https://github.com/microsoft/semantic-kernel.git
synced 2026-10-12 02:19:06 +00:00
### Motivation and Context <!-- Thank you for your contribution to the semantic-kernel repo! Please help reviewers and future users, providing the following information: 1. Why is this change required? 2. What problem does it solve? 3. What scenario does it contribute to? 4. If it fixes an open issue, please link to the issue here. --> ### Description <!-- Describe your changes, the overall approach, the underlying design. These notes will help understanding how your code works. Thanks! --> ### Contribution Checklist <!-- Before submitting this PR, please make sure: --> - [ ] The code builds clean without any errors or warnings - [ ] The PR follows the [SK Contribution Guidelines](https://github.com/microsoft/semantic-kernel/blob/main/CONTRIBUTING.md) and the [pre-submission formatting script](https://github.com/microsoft/semantic-kernel/blob/main/CONTRIBUTING.md#development-scripts) raises no violations - [ ] All unit tests pass, and I have added new tests where possible - [ ] I didn't break anyone 😄 --------- Co-authored-by: Dmytro Struk <[email protected]>
114 lines
4.7 KiB
C#
114 lines
4.7 KiB
C#
// Copyright (c) Microsoft. All rights reserved.
|
|
|
|
using System.ComponentModel;
|
|
using Microsoft.SemanticKernel;
|
|
using Microsoft.SemanticKernel.ChatCompletion;
|
|
using Microsoft.SemanticKernel.Connectors.OpenAI;
|
|
|
|
namespace ChatCompletion;
|
|
public sealed class OpenAI_FunctionCalling(ITestOutputHelper output) : BaseTest(output)
|
|
{
|
|
[Fact]
|
|
public async Task AutoInvokeKernelFunctionsAsync()
|
|
{
|
|
// Create a kernel with MistralAI chat completion and WeatherPlugin
|
|
Kernel kernel = CreateKernelWithPlugin<WeatherPlugin>();
|
|
|
|
// Invoke chat prompt with auto invocation of functions enabled
|
|
const string ChatPrompt = """
|
|
<message role="user">What is the weather like in Paris?</message>
|
|
""";
|
|
var executionSettings = new OpenAIPromptExecutionSettings { ToolCallBehavior = ToolCallBehavior.AutoInvokeKernelFunctions };
|
|
var chatSemanticFunction = kernel.CreateFunctionFromPrompt(
|
|
ChatPrompt, executionSettings);
|
|
var chatPromptResult = await kernel.InvokeAsync(chatSemanticFunction);
|
|
|
|
Console.WriteLine(chatPromptResult);
|
|
}
|
|
|
|
[Fact]
|
|
public async Task AutoInvokeKernelFunctionsMultipleCallsAsync()
|
|
{
|
|
// Create a kernel with MistralAI chat completion and WeatherPlugin
|
|
Kernel kernel = CreateKernelWithPlugin<WeatherPlugin>();
|
|
var service = kernel.GetRequiredService<IChatCompletionService>();
|
|
|
|
// Invoke chat prompt with auto invocation of functions enabled
|
|
var chatHistory = new ChatHistory
|
|
{
|
|
new ChatMessageContent(AuthorRole.User, "What is the weather like in Paris?")
|
|
};
|
|
var executionSettings = new OpenAIPromptExecutionSettings { ToolCallBehavior = ToolCallBehavior.AutoInvokeKernelFunctions };
|
|
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.GetChatMessageContentAsync(chatHistory, executionSettings, kernel);
|
|
|
|
Console.WriteLine(result1);
|
|
Console.WriteLine(result2);
|
|
}
|
|
|
|
[Fact]
|
|
public async Task AutoInvokeKernelFunctionsWithComplexParameterAsync()
|
|
{
|
|
// Create a kernel with MistralAI chat completion and HolidayPlugin
|
|
Kernel kernel = CreateKernelWithPlugin<HolidayPlugin>();
|
|
|
|
// Invoke chat prompt with auto invocation of functions enabled
|
|
const string ChatPrompt = """
|
|
<message role="user">Book a holiday for me from 6th June 2025 to 20th June 2025?</message>
|
|
""";
|
|
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]
|
|
[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\nLocation: {location}";
|
|
}
|
|
|
|
public sealed class HolidayPlugin
|
|
{
|
|
[KernelFunction]
|
|
[Description("Book a holiday for a specified time period.")]
|
|
public string BookHoliday(
|
|
[Description("Holiday time period")] 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<T>()
|
|
{
|
|
// Create a logging handler to output HTTP requests and responses
|
|
var handler = new LoggingHandler(new HttpClientHandler(), this.Output);
|
|
HttpClient httpClient = new(handler);
|
|
|
|
// Create a kernel with OpenAI chat completion and WeatherPlugin
|
|
IKernelBuilder kernelBuilder = Kernel.CreateBuilder();
|
|
kernelBuilder.AddOpenAIChatCompletion(
|
|
modelId: TestConfiguration.OpenAI.ChatModelId!,
|
|
apiKey: TestConfiguration.OpenAI.ApiKey!,
|
|
httpClient: httpClient);
|
|
kernelBuilder.Plugins.AddFromType<T>();
|
|
Kernel kernel = kernelBuilder.Build();
|
|
return kernel;
|
|
}
|
|
}
|