Skip to content

.Net: Holiday plugin sample #6331

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
56 changes: 46 additions & 10 deletions dotnet/samples/Concepts/ChatCompletion/OpenAI_FunctionCalling.cs
Original file line number Diff line number Diff line change
Expand Up @@ -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<WeatherPlugin>();

// Invoke chat prompt with auto invocation of functions enabled
const string ChatPrompt = """
Expand All @@ -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<WeatherPlugin>();
var service = kernel.GetRequiredService<IChatCompletionService>();

// Invoke chat prompt with auto invocation of functions enabled
Expand All @@ -39,14 +39,32 @@ 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]
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
Expand All @@ -55,10 +73,28 @@ 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
{
[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 CreateKernelWithWeatherPlugin()
private Kernel CreateKernelWithPlugin<T>()
{
// Create a logging handler to output HTTP requests and responses
var handler = new LoggingHandler(new HttpClientHandler(), this.Output);
Expand All @@ -70,7 +106,7 @@ private Kernel CreateKernelWithWeatherPlugin()
modelId: TestConfiguration.OpenAI.ChatModelId!,
apiKey: TestConfiguration.OpenAI.ApiKey!,
httpClient: httpClient);
kernelBuilder.Plugins.AddFromType<WeatherPlugin>();
kernelBuilder.Plugins.AddFromType<T>();
Kernel kernel = kernelBuilder.Build();
return kernel;
}
Expand Down
Loading