Skip to content

Commit

Permalink
.Net: Holiday plugin sample (#6331)
Browse files Browse the repository at this point in the history
### 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]>
  • Loading branch information
markwallace-microsoft and dmytrostruk committed May 27, 2024
1 parent 8de6c5f commit ea67743
Showing 1 changed file with 46 additions and 10 deletions.
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

0 comments on commit ea67743

Please sign in to comment.