From 9521c2fde5fb68cb93346690cd6e64529d256387 Mon Sep 17 00:00:00 2001 From: SergeyMenshykh Date: Mon, 1 Jul 2024 12:35:01 +0100 Subject: [PATCH 1/3] fix: clean up code of azure chat completion service: 1. Rename classes, class members and variables of the service and the model classes to reflect their actual purpose/functionality. 2. Remove unnecessary classes. 3. Make integration tests more resilient to 429 responses. --- ...AIChatCompletionExecutionSettingsTests.cs} | 28 ++-- .../AzureOpenAIChatCompletionServiceTests.cs | 30 ++-- .../Core/AzureOpenAIFunctionToolCallTests.cs | 4 +- .../AzureOpenAIStreamingTextContentTests.cs | 41 ------ .../AutoFunctionInvocationFilterTests.cs | 24 ++-- ...eOpenAIChatCompletionExecutionSettings.cs} | 16 +-- .../AzureOpenAIToolCallBehavior.cs | 4 +- .../ChatHistoryExtensions.cs | 4 +- .../Core/AzureOpenAIClientCore.cs | 4 +- .../Core/AzureOpenAIFunctionToolCall.cs | 2 +- .../AzureOpenAIStreamingChatMessageContent.cs | 10 +- .../Core/AzureOpenAIStreamingTextContent.cs | 51 ------- .../Connectors.AzureOpenAI/Core/ClientCore.cs | 136 +++++++++--------- .../AzureOpenAIServiceCollectionExtensions.cs | 4 +- .../IntegrationTestsV2/BaseIntegrationTest.cs | 37 +++++ .../AzureOpenAIChatCompletionTests.cs | 23 +-- ...enAIChatCompletion_FunctionCallingTests.cs | 41 +++--- ...eOpenAIChatCompletion_NonStreamingTests.cs | 8 +- ...zureOpenAIChatCompletion_StreamingTests.cs | 8 +- 19 files changed, 211 insertions(+), 264 deletions(-) rename dotnet/src/Connectors/Connectors.AzureOpenAI.UnitTests/{AzureOpenAIPromptExecutionSettingsTests.cs => AzureOpenAIChatCompletionExecutionSettingsTests.cs} (83%) delete mode 100644 dotnet/src/Connectors/Connectors.AzureOpenAI.UnitTests/Core/AzureOpenAIStreamingTextContentTests.cs rename dotnet/src/Connectors/Connectors.AzureOpenAI/{AzureOpenAIPromptExecutionSettings.cs => AzureOpenAIChatCompletionExecutionSettings.cs} (94%) delete mode 100644 dotnet/src/Connectors/Connectors.AzureOpenAI/Core/AzureOpenAIStreamingTextContent.cs create mode 100644 dotnet/src/IntegrationTestsV2/BaseIntegrationTest.cs diff --git a/dotnet/src/Connectors/Connectors.AzureOpenAI.UnitTests/AzureOpenAIPromptExecutionSettingsTests.cs b/dotnet/src/Connectors/Connectors.AzureOpenAI.UnitTests/AzureOpenAIChatCompletionExecutionSettingsTests.cs similarity index 83% rename from dotnet/src/Connectors/Connectors.AzureOpenAI.UnitTests/AzureOpenAIPromptExecutionSettingsTests.cs rename to dotnet/src/Connectors/Connectors.AzureOpenAI.UnitTests/AzureOpenAIChatCompletionExecutionSettingsTests.cs index 7b50e36c5587..4443dea511cc 100644 --- a/dotnet/src/Connectors/Connectors.AzureOpenAI.UnitTests/AzureOpenAIPromptExecutionSettingsTests.cs +++ b/dotnet/src/Connectors/Connectors.AzureOpenAI.UnitTests/AzureOpenAIChatCompletionExecutionSettingsTests.cs @@ -11,14 +11,14 @@ namespace SemanticKernel.Connectors.AzureOpenAI.UnitTests; /// /// Unit tests of AzureOpenAIPromptExecutionSettingsTests /// -public class AzureOpenAIPromptExecutionSettingsTests +public class AzureOpenAIChatCompletionExecutionSettingsTests { [Fact] public void ItCreatesOpenAIExecutionSettingsWithCorrectDefaults() { // Arrange // Act - AzureOpenAIPromptExecutionSettings executionSettings = AzureOpenAIPromptExecutionSettings.FromExecutionSettings(null, 128); + AzureOpenAIChatCompletionExecutionSettings executionSettings = AzureOpenAIChatCompletionExecutionSettings.FromExecutionSettings(null, 128); // Assert Assert.NotNull(executionSettings); @@ -38,7 +38,7 @@ public void ItCreatesOpenAIExecutionSettingsWithCorrectDefaults() public void ItUsesExistingOpenAIExecutionSettings() { // Arrange - AzureOpenAIPromptExecutionSettings actualSettings = new() + AzureOpenAIChatCompletionExecutionSettings actualSettings = new() { Temperature = 0.7, TopP = 0.7, @@ -53,7 +53,7 @@ public void ItUsesExistingOpenAIExecutionSettings() }; // Act - AzureOpenAIPromptExecutionSettings executionSettings = AzureOpenAIPromptExecutionSettings.FromExecutionSettings(actualSettings); + AzureOpenAIChatCompletionExecutionSettings executionSettings = AzureOpenAIChatCompletionExecutionSettings.FromExecutionSettings(actualSettings); // Assert Assert.NotNull(executionSettings); @@ -73,7 +73,7 @@ public void ItCanUseOpenAIExecutionSettings() }; // Act - AzureOpenAIPromptExecutionSettings executionSettings = AzureOpenAIPromptExecutionSettings.FromExecutionSettings(actualSettings, null); + AzureOpenAIChatCompletionExecutionSettings executionSettings = AzureOpenAIChatCompletionExecutionSettings.FromExecutionSettings(actualSettings, null); // Assert Assert.NotNull(executionSettings); @@ -105,7 +105,7 @@ public void ItCreatesOpenAIExecutionSettingsFromExtraPropertiesSnakeCase() }; // Act - AzureOpenAIPromptExecutionSettings executionSettings = AzureOpenAIPromptExecutionSettings.FromExecutionSettings(actualSettings, null); + AzureOpenAIChatCompletionExecutionSettings executionSettings = AzureOpenAIChatCompletionExecutionSettings.FromExecutionSettings(actualSettings, null); // Assert AssertExecutionSettings(executionSettings); @@ -135,7 +135,7 @@ public void ItCreatesOpenAIExecutionSettingsFromExtraPropertiesAsStrings() }; // Act - AzureOpenAIPromptExecutionSettings executionSettings = AzureOpenAIPromptExecutionSettings.FromExecutionSettings(actualSettings, null); + AzureOpenAIChatCompletionExecutionSettings executionSettings = AzureOpenAIChatCompletionExecutionSettings.FromExecutionSettings(actualSettings, null); // Assert AssertExecutionSettings(executionSettings); @@ -164,7 +164,7 @@ public void ItCreatesOpenAIExecutionSettingsFromJsonSnakeCase() var actualSettings = JsonSerializer.Deserialize(json); // Act - AzureOpenAIPromptExecutionSettings executionSettings = AzureOpenAIPromptExecutionSettings.FromExecutionSettings(actualSettings); + AzureOpenAIChatCompletionExecutionSettings executionSettings = AzureOpenAIChatCompletionExecutionSettings.FromExecutionSettings(actualSettings); // Assert AssertExecutionSettings(executionSettings); @@ -176,7 +176,7 @@ public void ItCreatesOpenAIExecutionSettingsFromJsonSnakeCase() public void ItUsesCorrectChatSystemPrompt(string chatSystemPrompt, string expectedChatSystemPrompt) { // Arrange & Act - var settings = new AzureOpenAIPromptExecutionSettings { ChatSystemPrompt = chatSystemPrompt }; + var settings = new AzureOpenAIChatCompletionExecutionSettings { ChatSystemPrompt = chatSystemPrompt }; // Assert Assert.Equal(expectedChatSystemPrompt, settings.ChatSystemPrompt); @@ -195,7 +195,7 @@ public void PromptExecutionSettingsCloneWorksAsExpected() "frequency_penalty": 0.0 } """; - var executionSettings = JsonSerializer.Deserialize(configPayload); + var executionSettings = JsonSerializer.Deserialize(configPayload); // Act var clone = executionSettings!.Clone(); @@ -221,7 +221,7 @@ public void PromptExecutionSettingsFreezeWorksAsExpected() "token_selection_biases": { "1": 2, "3": 4 } } """; - var executionSettings = JsonSerializer.Deserialize(configPayload); + var executionSettings = JsonSerializer.Deserialize(configPayload); // Act executionSettings!.Freeze(); @@ -242,17 +242,17 @@ public void PromptExecutionSettingsFreezeWorksAsExpected() public void FromExecutionSettingsWithDataDoesNotIncludeEmptyStopSequences() { // Arrange - var executionSettings = new AzureOpenAIPromptExecutionSettings { StopSequences = [] }; + var executionSettings = new AzureOpenAIChatCompletionExecutionSettings { StopSequences = [] }; // Act #pragma warning disable CS0618 // AzureOpenAIChatCompletionWithData is deprecated in favor of OpenAIPromptExecutionSettings.AzureChatExtensionsOptions - var executionSettingsWithData = AzureOpenAIPromptExecutionSettings.FromExecutionSettingsWithData(executionSettings); + var executionSettingsWithData = AzureOpenAIChatCompletionExecutionSettings.FromExecutionSettingsWithData(executionSettings); #pragma warning restore CS0618 // Assert Assert.Null(executionSettingsWithData.StopSequences); } - private static void AssertExecutionSettings(AzureOpenAIPromptExecutionSettings executionSettings) + private static void AssertExecutionSettings(AzureOpenAIChatCompletionExecutionSettings executionSettings) { Assert.NotNull(executionSettings); Assert.Equal(0.7, executionSettings.Temperature); diff --git a/dotnet/src/Connectors/Connectors.AzureOpenAI.UnitTests/ChatCompletion/AzureOpenAIChatCompletionServiceTests.cs b/dotnet/src/Connectors/Connectors.AzureOpenAI.UnitTests/ChatCompletion/AzureOpenAIChatCompletionServiceTests.cs index 3b3c90687b45..c4b4596f7a88 100644 --- a/dotnet/src/Connectors/Connectors.AzureOpenAI.UnitTests/ChatCompletion/AzureOpenAIChatCompletionServiceTests.cs +++ b/dotnet/src/Connectors/Connectors.AzureOpenAI.UnitTests/ChatCompletion/AzureOpenAIChatCompletionServiceTests.cs @@ -121,7 +121,7 @@ public async Task GetChatMessageContentsHandlesSettingsCorrectlyAsync() { // Arrange var service = new AzureOpenAIChatCompletionService("deployment", "https://endpoint", "api-key", "model-id", this._httpClient); - var settings = new AzureOpenAIPromptExecutionSettings() + var settings = new AzureOpenAIChatCompletionExecutionSettings() { MaxTokens = 123, Temperature = 0.6, @@ -212,7 +212,7 @@ public async Task GetChatMessageContentsHandlesResponseFormatCorrectlyAsync(obje { // Arrange var service = new AzureOpenAIChatCompletionService("deployment", "https://endpoint", "api-key", "model-id", this._httpClient); - var settings = new AzureOpenAIPromptExecutionSettings + var settings = new AzureOpenAIChatCompletionExecutionSettings { ResponseFormat = responseFormat }; @@ -242,7 +242,7 @@ public async Task GetChatMessageContentsWorksCorrectlyAsync(AzureOpenAIToolCallB // Arrange var kernel = Kernel.CreateBuilder().Build(); var service = new AzureOpenAIChatCompletionService("deployment", "https://endpoint", "api-key", "model-id", this._httpClient); - var settings = new AzureOpenAIPromptExecutionSettings() { ToolCallBehavior = behavior }; + var settings = new AzureOpenAIChatCompletionExecutionSettings() { ToolCallBehavior = behavior }; this._messageHandlerStub.ResponsesToReturn.Add(new HttpResponseMessage(HttpStatusCode.OK) { @@ -288,7 +288,7 @@ public async Task GetChatMessageContentsWithFunctionCallAsync() kernel.Plugins.Add(KernelPluginFactory.CreateFromFunctions("MyPlugin", [function1, function2])); var service = new AzureOpenAIChatCompletionService("deployment", "https://endpoint", "api-key", "model-id", this._httpClient, this._mockLoggerFactory.Object); - var settings = new AzureOpenAIPromptExecutionSettings() { ToolCallBehavior = AzureOpenAIToolCallBehavior.AutoInvokeKernelFunctions }; + var settings = new AzureOpenAIChatCompletionExecutionSettings() { ToolCallBehavior = AzureOpenAIToolCallBehavior.AutoInvokeKernelFunctions }; using var response1 = new HttpResponseMessage(HttpStatusCode.OK) { Content = new StringContent(AzureOpenAITestHelper.GetTestResponse("chat_completion_multiple_function_calls_test_response.json")) }; using var response2 = new HttpResponseMessage(HttpStatusCode.OK) { Content = new StringContent(AzureOpenAITestHelper.GetTestResponse("chat_completion_test_response.json")) }; @@ -324,7 +324,7 @@ public async Task GetChatMessageContentsWithFunctionCallMaximumAutoInvokeAttempt kernel.Plugins.Add(KernelPluginFactory.CreateFromFunctions("MyPlugin", [function])); var service = new AzureOpenAIChatCompletionService("deployment", "https://endpoint", "api-key", "model-id", this._httpClient, this._mockLoggerFactory.Object); - var settings = new AzureOpenAIPromptExecutionSettings() { ToolCallBehavior = AzureOpenAIToolCallBehavior.AutoInvokeKernelFunctions }; + var settings = new AzureOpenAIChatCompletionExecutionSettings() { ToolCallBehavior = AzureOpenAIToolCallBehavior.AutoInvokeKernelFunctions }; var responses = new List(); @@ -361,7 +361,7 @@ public async Task GetChatMessageContentsWithRequiredFunctionCallAsync() kernel.Plugins.Add(plugin); var service = new AzureOpenAIChatCompletionService("deployment", "https://endpoint", "api-key", "model-id", this._httpClient, this._mockLoggerFactory.Object); - var settings = new AzureOpenAIPromptExecutionSettings() { ToolCallBehavior = AzureOpenAIToolCallBehavior.RequireFunction(openAIFunction, autoInvoke: true) }; + var settings = new AzureOpenAIChatCompletionExecutionSettings() { ToolCallBehavior = AzureOpenAIToolCallBehavior.RequireFunction(openAIFunction, autoInvoke: true) }; using var response1 = new HttpResponseMessage(HttpStatusCode.OK) { Content = new StringContent(AzureOpenAITestHelper.GetTestResponse("chat_completion_single_function_call_test_response.json")) }; using var response2 = new HttpResponseMessage(HttpStatusCode.OK) { Content = new StringContent(AzureOpenAITestHelper.GetTestResponse("chat_completion_test_response.json")) }; @@ -458,7 +458,7 @@ public async Task GetStreamingChatMessageContentsWithFunctionCallAsync() kernel.Plugins.Add(KernelPluginFactory.CreateFromFunctions("MyPlugin", [function1, function2])); var service = new AzureOpenAIChatCompletionService("deployment", "https://endpoint", "api-key", "model-id", this._httpClient, this._mockLoggerFactory.Object); - var settings = new AzureOpenAIPromptExecutionSettings() { ToolCallBehavior = AzureOpenAIToolCallBehavior.AutoInvokeKernelFunctions }; + var settings = new AzureOpenAIChatCompletionExecutionSettings() { ToolCallBehavior = AzureOpenAIToolCallBehavior.AutoInvokeKernelFunctions }; using var response1 = new HttpResponseMessage(HttpStatusCode.OK) { Content = AzureOpenAITestHelper.GetTestResponseAsStream("chat_completion_streaming_multiple_function_calls_test_response.txt") }; using var response2 = new HttpResponseMessage(HttpStatusCode.OK) { Content = AzureOpenAITestHelper.GetTestResponseAsStream("chat_completion_streaming_test_response.txt") }; @@ -502,7 +502,7 @@ public async Task GetStreamingChatMessageContentsWithFunctionCallMaximumAutoInvo kernel.Plugins.Add(KernelPluginFactory.CreateFromFunctions("MyPlugin", [function])); var service = new AzureOpenAIChatCompletionService("deployment", "https://endpoint", "api-key", "model-id", this._httpClient, this._mockLoggerFactory.Object); - var settings = new AzureOpenAIPromptExecutionSettings() { ToolCallBehavior = AzureOpenAIToolCallBehavior.AutoInvokeKernelFunctions }; + var settings = new AzureOpenAIChatCompletionExecutionSettings() { ToolCallBehavior = AzureOpenAIToolCallBehavior.AutoInvokeKernelFunctions }; var responses = new List(); @@ -541,7 +541,7 @@ public async Task GetStreamingChatMessageContentsWithRequiredFunctionCallAsync() kernel.Plugins.Add(plugin); var service = new AzureOpenAIChatCompletionService("deployment", "https://endpoint", "api-key", "model-id", this._httpClient, this._mockLoggerFactory.Object); - var settings = new AzureOpenAIPromptExecutionSettings() { ToolCallBehavior = AzureOpenAIToolCallBehavior.RequireFunction(openAIFunction, autoInvoke: true) }; + var settings = new AzureOpenAIChatCompletionExecutionSettings() { ToolCallBehavior = AzureOpenAIToolCallBehavior.RequireFunction(openAIFunction, autoInvoke: true) }; using var response1 = new HttpResponseMessage(HttpStatusCode.OK) { Content = AzureOpenAITestHelper.GetTestResponseAsStream("chat_completion_streaming_single_function_call_test_response.txt") }; using var response2 = new HttpResponseMessage(HttpStatusCode.OK) { Content = AzureOpenAITestHelper.GetTestResponseAsStream("chat_completion_streaming_test_response.txt") }; @@ -592,7 +592,7 @@ public async Task GetChatMessageContentsUsesPromptAndSettingsCorrectlyAsync() const string SystemMessage = "This is test system message"; var service = new AzureOpenAIChatCompletionService("deployment", "https://endpoint", "api-key", "model-id", this._httpClient); - var settings = new AzureOpenAIPromptExecutionSettings() { ChatSystemPrompt = SystemMessage }; + var settings = new AzureOpenAIChatCompletionExecutionSettings() { ChatSystemPrompt = SystemMessage }; this._messageHandlerStub.ResponsesToReturn.Add(new HttpResponseMessage(HttpStatusCode.OK) { @@ -636,7 +636,7 @@ public async Task GetChatMessageContentsWithChatMessageContentItemCollectionAndS const string CollectionItemPrompt = "This is collection item prompt"; var service = new AzureOpenAIChatCompletionService("deployment", "https://endpoint", "api-key", "model-id", this._httpClient); - var settings = new AzureOpenAIPromptExecutionSettings() { ChatSystemPrompt = SystemMessage }; + var settings = new AzureOpenAIChatCompletionExecutionSettings() { ChatSystemPrompt = SystemMessage }; this._messageHandlerStub.ResponsesToReturn.Add(new HttpResponseMessage(HttpStatusCode.OK) { @@ -700,7 +700,7 @@ public async Task FunctionCallsShouldBePropagatedToCallersViaChatMessageItemsOfT var chatHistory = new ChatHistory(); chatHistory.AddUserMessage("Fake prompt"); - var settings = new AzureOpenAIPromptExecutionSettings() { ToolCallBehavior = AzureOpenAIToolCallBehavior.EnableKernelFunctions }; + var settings = new AzureOpenAIChatCompletionExecutionSettings() { ToolCallBehavior = AzureOpenAIToolCallBehavior.EnableKernelFunctions }; // Act var result = await sut.GetChatMessageContentAsync(chatHistory, settings); @@ -770,7 +770,7 @@ public async Task FunctionCallsShouldBeReturnedToLLMAsync() new ChatMessageContent(AuthorRole.Assistant, items) ]; - var settings = new AzureOpenAIPromptExecutionSettings() { ToolCallBehavior = AzureOpenAIToolCallBehavior.EnableKernelFunctions }; + var settings = new AzureOpenAIChatCompletionExecutionSettings() { ToolCallBehavior = AzureOpenAIToolCallBehavior.EnableKernelFunctions }; // Act await sut.GetChatMessageContentAsync(chatHistory, settings); @@ -829,7 +829,7 @@ public async Task FunctionResultsCanBeProvidedToLLMAsOneResultPerChatMessageAsyn ]) }; - var settings = new AzureOpenAIPromptExecutionSettings() { ToolCallBehavior = AzureOpenAIToolCallBehavior.EnableKernelFunctions }; + var settings = new AzureOpenAIChatCompletionExecutionSettings() { ToolCallBehavior = AzureOpenAIToolCallBehavior.EnableKernelFunctions }; // Act await sut.GetChatMessageContentAsync(chatHistory, settings); @@ -874,7 +874,7 @@ public async Task FunctionResultsCanBeProvidedToLLMAsManyResultsInOneChatMessage ]) }; - var settings = new AzureOpenAIPromptExecutionSettings() { ToolCallBehavior = AzureOpenAIToolCallBehavior.EnableKernelFunctions }; + var settings = new AzureOpenAIChatCompletionExecutionSettings() { ToolCallBehavior = AzureOpenAIToolCallBehavior.EnableKernelFunctions }; // Act await sut.GetChatMessageContentAsync(chatHistory, settings); diff --git a/dotnet/src/Connectors/Connectors.AzureOpenAI.UnitTests/Core/AzureOpenAIFunctionToolCallTests.cs b/dotnet/src/Connectors/Connectors.AzureOpenAI.UnitTests/Core/AzureOpenAIFunctionToolCallTests.cs index 766376ee00b9..d8342b4991d4 100644 --- a/dotnet/src/Connectors/Connectors.AzureOpenAI.UnitTests/Core/AzureOpenAIFunctionToolCallTests.cs +++ b/dotnet/src/Connectors/Connectors.AzureOpenAI.UnitTests/Core/AzureOpenAIFunctionToolCallTests.cs @@ -46,7 +46,7 @@ public void ConvertToolCallUpdatesWithEmptyIndexesReturnsEmptyToolCalls() var functionArgumentBuildersByIndex = new Dictionary(); // Act - var toolCalls = AzureOpenAIFunctionToolCall.ConvertToolCallUpdatesToChatCompletionsFunctionToolCalls( + var toolCalls = AzureOpenAIFunctionToolCall.ConvertToolCallUpdatesToFunctionToolCalls( ref toolCallIdsByIndex, ref functionNamesByIndex, ref functionArgumentBuildersByIndex); @@ -64,7 +64,7 @@ public void ConvertToolCallUpdatesWithNotEmptyIndexesReturnsNotEmptyToolCalls() var functionArgumentBuildersByIndex = new Dictionary { { 3, new("test-argument") } }; // Act - var toolCalls = AzureOpenAIFunctionToolCall.ConvertToolCallUpdatesToChatCompletionsFunctionToolCalls( + var toolCalls = AzureOpenAIFunctionToolCall.ConvertToolCallUpdatesToFunctionToolCalls( ref toolCallIdsByIndex, ref functionNamesByIndex, ref functionArgumentBuildersByIndex); diff --git a/dotnet/src/Connectors/Connectors.AzureOpenAI.UnitTests/Core/AzureOpenAIStreamingTextContentTests.cs b/dotnet/src/Connectors/Connectors.AzureOpenAI.UnitTests/Core/AzureOpenAIStreamingTextContentTests.cs deleted file mode 100644 index a58df5676aca..000000000000 --- a/dotnet/src/Connectors/Connectors.AzureOpenAI.UnitTests/Core/AzureOpenAIStreamingTextContentTests.cs +++ /dev/null @@ -1,41 +0,0 @@ -// Copyright (c) Microsoft. All rights reserved. - -using System.Text; -using Microsoft.SemanticKernel.Connectors.AzureOpenAI; - -namespace SemanticKernel.Connectors.AzureOpenAI.UnitTests.Core; - -/// -/// Unit tests for class. -/// -public sealed class AzureOpenAIStreamingTextContentTests -{ - [Fact] - public void ToByteArrayWorksCorrectly() - { - // Arrange - var expectedBytes = Encoding.UTF8.GetBytes("content"); - var content = new AzureOpenAIStreamingTextContent("content", 0, "model-id"); - - // Act - var actualBytes = content.ToByteArray(); - - // Assert - Assert.Equal(expectedBytes, actualBytes); - } - - [Theory] - [InlineData(null, "")] - [InlineData("content", "content")] - public void ToStringWorksCorrectly(string? content, string expectedString) - { - // Arrange - var textContent = new AzureOpenAIStreamingTextContent(content!, 0, "model-id"); - - // Act - var actualString = textContent.ToString(); - - // Assert - Assert.Equal(expectedString, actualString); - } -} diff --git a/dotnet/src/Connectors/Connectors.AzureOpenAI.UnitTests/FunctionCalling/AutoFunctionInvocationFilterTests.cs b/dotnet/src/Connectors/Connectors.AzureOpenAI.UnitTests/FunctionCalling/AutoFunctionInvocationFilterTests.cs index 195f71e2758f..16a4b1d71275 100644 --- a/dotnet/src/Connectors/Connectors.AzureOpenAI.UnitTests/FunctionCalling/AutoFunctionInvocationFilterTests.cs +++ b/dotnet/src/Connectors/Connectors.AzureOpenAI.UnitTests/FunctionCalling/AutoFunctionInvocationFilterTests.cs @@ -62,7 +62,7 @@ public async Task FiltersAreExecutedCorrectlyAsync() this._messageHandlerStub.ResponsesToReturn = GetFunctionCallingResponses(); // Act - var result = await kernel.InvokePromptAsync("Test prompt", new(new AzureOpenAIPromptExecutionSettings + var result = await kernel.InvokePromptAsync("Test prompt", new(new AzureOpenAIChatCompletionExecutionSettings { ToolCallBehavior = AzureOpenAIToolCallBehavior.AutoInvokeKernelFunctions })); @@ -107,7 +107,7 @@ public async Task FiltersAreExecutedCorrectlyOnStreamingAsync() this._messageHandlerStub.ResponsesToReturn = GetFunctionCallingStreamingResponses(); - var executionSettings = new AzureOpenAIPromptExecutionSettings { ToolCallBehavior = AzureOpenAIToolCallBehavior.AutoInvokeKernelFunctions }; + var executionSettings = new AzureOpenAIChatCompletionExecutionSettings { ToolCallBehavior = AzureOpenAIToolCallBehavior.AutoInvokeKernelFunctions }; // Act await foreach (var item in kernel.InvokePromptStreamingAsync("Test prompt", new(executionSettings))) @@ -165,7 +165,7 @@ public async Task DifferentWaysOfAddingFiltersWorkCorrectlyAsync() // Case #2 - Add filter to kernel kernel.AutoFunctionInvocationFilters.Add(filter2); - var result = await kernel.InvokePromptAsync("Test prompt", new(new AzureOpenAIPromptExecutionSettings + var result = await kernel.InvokePromptAsync("Test prompt", new(new AzureOpenAIChatCompletionExecutionSettings { ToolCallBehavior = AzureOpenAIToolCallBehavior.AutoInvokeKernelFunctions })); @@ -225,7 +225,7 @@ public async Task MultipleFiltersAreExecutedInOrderAsync(bool isStreaming) var kernel = builder.Build(); - var arguments = new KernelArguments(new AzureOpenAIPromptExecutionSettings + var arguments = new KernelArguments(new AzureOpenAIChatCompletionExecutionSettings { ToolCallBehavior = AzureOpenAIToolCallBehavior.AutoInvokeKernelFunctions }); @@ -275,7 +275,7 @@ public async Task FilterCanOverrideArgumentsAsync() this._messageHandlerStub.ResponsesToReturn = GetFunctionCallingResponses(); // Act - var result = await kernel.InvokePromptAsync("Test prompt", new(new AzureOpenAIPromptExecutionSettings + var result = await kernel.InvokePromptAsync("Test prompt", new(new AzureOpenAIChatCompletionExecutionSettings { ToolCallBehavior = AzureOpenAIToolCallBehavior.AutoInvokeKernelFunctions })); @@ -309,7 +309,7 @@ public async Task FilterCanHandleExceptionAsync() var chatCompletion = new AzureOpenAIChatCompletionService("test-deployment", "https://endpoint", "test-api-key", "test-model-id", this._httpClient); - var executionSettings = new AzureOpenAIPromptExecutionSettings { ToolCallBehavior = AzureOpenAIToolCallBehavior.AutoInvokeKernelFunctions }; + var executionSettings = new AzureOpenAIChatCompletionExecutionSettings { ToolCallBehavior = AzureOpenAIToolCallBehavior.AutoInvokeKernelFunctions }; var chatHistory = new ChatHistory(); chatHistory.AddSystemMessage("System message"); @@ -350,7 +350,7 @@ public async Task FilterCanHandleExceptionOnStreamingAsync() var chatCompletion = new AzureOpenAIChatCompletionService("test-deployment", "https://endpoint", "test-api-key", "test-model-id", this._httpClient); var chatHistory = new ChatHistory(); - var executionSettings = new AzureOpenAIPromptExecutionSettings { ToolCallBehavior = AzureOpenAIToolCallBehavior.AutoInvokeKernelFunctions }; + var executionSettings = new AzureOpenAIChatCompletionExecutionSettings { ToolCallBehavior = AzureOpenAIToolCallBehavior.AutoInvokeKernelFunctions }; // Act await foreach (var item in chatCompletion.GetStreamingChatMessageContentsAsync(chatHistory, executionSettings, kernel)) @@ -394,7 +394,7 @@ public async Task FiltersCanSkipFunctionExecutionAsync() this._messageHandlerStub.ResponsesToReturn = [response1, response2]; // Act - var result = await kernel.InvokePromptAsync("Test prompt", new(new AzureOpenAIPromptExecutionSettings + var result = await kernel.InvokePromptAsync("Test prompt", new(new AzureOpenAIChatCompletionExecutionSettings { ToolCallBehavior = AzureOpenAIToolCallBehavior.AutoInvokeKernelFunctions })); @@ -428,7 +428,7 @@ public async Task PreFilterCanTerminateOperationAsync() this._messageHandlerStub.ResponsesToReturn = GetFunctionCallingResponses(); // Act - await kernel.InvokePromptAsync("Test prompt", new(new AzureOpenAIPromptExecutionSettings + await kernel.InvokePromptAsync("Test prompt", new(new AzureOpenAIChatCompletionExecutionSettings { ToolCallBehavior = AzureOpenAIToolCallBehavior.AutoInvokeKernelFunctions })); @@ -460,7 +460,7 @@ public async Task PreFilterCanTerminateOperationOnStreamingAsync() this._messageHandlerStub.ResponsesToReturn = GetFunctionCallingStreamingResponses(); - var executionSettings = new AzureOpenAIPromptExecutionSettings { ToolCallBehavior = AzureOpenAIToolCallBehavior.AutoInvokeKernelFunctions }; + var executionSettings = new AzureOpenAIChatCompletionExecutionSettings { ToolCallBehavior = AzureOpenAIToolCallBehavior.AutoInvokeKernelFunctions }; // Act await foreach (var item in kernel.InvokePromptStreamingAsync("Test prompt", new(executionSettings))) @@ -499,7 +499,7 @@ public async Task PostFilterCanTerminateOperationAsync() this._messageHandlerStub.ResponsesToReturn = GetFunctionCallingResponses(); // Act - var result = await kernel.InvokePromptAsync("Test prompt", new(new AzureOpenAIPromptExecutionSettings + var result = await kernel.InvokePromptAsync("Test prompt", new(new AzureOpenAIChatCompletionExecutionSettings { ToolCallBehavior = AzureOpenAIToolCallBehavior.AutoInvokeKernelFunctions })); @@ -545,7 +545,7 @@ public async Task PostFilterCanTerminateOperationOnStreamingAsync() this._messageHandlerStub.ResponsesToReturn = GetFunctionCallingStreamingResponses(); - var executionSettings = new AzureOpenAIPromptExecutionSettings { ToolCallBehavior = AzureOpenAIToolCallBehavior.AutoInvokeKernelFunctions }; + var executionSettings = new AzureOpenAIChatCompletionExecutionSettings { ToolCallBehavior = AzureOpenAIToolCallBehavior.AutoInvokeKernelFunctions }; List streamingContent = []; diff --git a/dotnet/src/Connectors/Connectors.AzureOpenAI/AzureOpenAIPromptExecutionSettings.cs b/dotnet/src/Connectors/Connectors.AzureOpenAI/AzureOpenAIChatCompletionExecutionSettings.cs similarity index 94% rename from dotnet/src/Connectors/Connectors.AzureOpenAI/AzureOpenAIPromptExecutionSettings.cs rename to dotnet/src/Connectors/Connectors.AzureOpenAI/AzureOpenAIChatCompletionExecutionSettings.cs index 22141ee8aee0..dd787c915166 100644 --- a/dotnet/src/Connectors/Connectors.AzureOpenAI/AzureOpenAIPromptExecutionSettings.cs +++ b/dotnet/src/Connectors/Connectors.AzureOpenAI/AzureOpenAIChatCompletionExecutionSettings.cs @@ -17,7 +17,7 @@ namespace Microsoft.SemanticKernel.Connectors.AzureOpenAI; /// Execution settings for an AzureOpenAI completion request. /// [JsonNumberHandling(JsonNumberHandling.AllowReadingFromString)] -public sealed class AzureOpenAIPromptExecutionSettings : PromptExecutionSettings +public sealed class AzureOpenAIChatCompletionExecutionSettings : PromptExecutionSettings { /// /// Temperature controls the randomness of the completion. @@ -312,7 +312,7 @@ public override void Freeze() /// public override PromptExecutionSettings Clone() { - return new AzureOpenAIPromptExecutionSettings() + return new AzureOpenAIChatCompletionExecutionSettings() { ModelId = this.ModelId, ExtensionData = this.ExtensionData is not null ? new Dictionary(this.ExtensionData) : null, @@ -345,30 +345,30 @@ public override PromptExecutionSettings Clone() /// Template configuration /// Default max tokens /// An instance of OpenAIPromptExecutionSettings - public static AzureOpenAIPromptExecutionSettings FromExecutionSettings(PromptExecutionSettings? executionSettings, int? defaultMaxTokens = null) + public static AzureOpenAIChatCompletionExecutionSettings FromExecutionSettings(PromptExecutionSettings? executionSettings, int? defaultMaxTokens = null) { if (executionSettings is null) { - return new AzureOpenAIPromptExecutionSettings() + return new AzureOpenAIChatCompletionExecutionSettings() { MaxTokens = defaultMaxTokens }; } - if (executionSettings is AzureOpenAIPromptExecutionSettings settings) + if (executionSettings is AzureOpenAIChatCompletionExecutionSettings settings) { return settings; } var json = JsonSerializer.Serialize(executionSettings); - var openAIExecutionSettings = JsonSerializer.Deserialize(json, JsonOptionsCache.ReadPermissive); + var openAIExecutionSettings = JsonSerializer.Deserialize(json, JsonOptionsCache.ReadPermissive); if (openAIExecutionSettings is not null) { return openAIExecutionSettings; } - throw new ArgumentException($"Invalid execution settings, cannot convert to {nameof(AzureOpenAIPromptExecutionSettings)}", nameof(executionSettings)); + throw new ArgumentException($"Invalid execution settings, cannot convert to {nameof(AzureOpenAIChatCompletionExecutionSettings)}", nameof(executionSettings)); } /// @@ -378,7 +378,7 @@ public static AzureOpenAIPromptExecutionSettings FromExecutionSettings(PromptExe /// Default max tokens /// An instance of OpenAIPromptExecutionSettings [Obsolete("This method is deprecated in favor of OpenAIPromptExecutionSettings.AzureChatExtensionsOptions")] - public static AzureOpenAIPromptExecutionSettings FromExecutionSettingsWithData(PromptExecutionSettings? executionSettings, int? defaultMaxTokens = null) + public static AzureOpenAIChatCompletionExecutionSettings FromExecutionSettingsWithData(PromptExecutionSettings? executionSettings, int? defaultMaxTokens = null) { var settings = FromExecutionSettings(executionSettings, defaultMaxTokens); diff --git a/dotnet/src/Connectors/Connectors.AzureOpenAI/AzureOpenAIToolCallBehavior.cs b/dotnet/src/Connectors/Connectors.AzureOpenAI/AzureOpenAIToolCallBehavior.cs index e9dbd224b2a0..f2b3d6f9f5a0 100644 --- a/dotnet/src/Connectors/Connectors.AzureOpenAI/AzureOpenAIToolCallBehavior.cs +++ b/dotnet/src/Connectors/Connectors.AzureOpenAI/AzureOpenAIToolCallBehavior.cs @@ -62,7 +62,7 @@ public abstract class AzureOpenAIToolCallBehavior /// The functions that should be made available to the model. /// true to attempt to automatically handle function call requests; otherwise, false. /// - /// The that may be set into + /// The that may be set into /// to indicate that the specified functions should be made available to the model. /// public static AzureOpenAIToolCallBehavior EnableFunctions(IEnumerable functions, bool autoInvoke = false) @@ -75,7 +75,7 @@ public static AzureOpenAIToolCallBehavior EnableFunctions(IEnumerableThe function the model should request to use. /// true to attempt to automatically handle function call requests; otherwise, false. /// - /// The that may be set into + /// The that may be set into /// to indicate that the specified function should be requested by the model. /// public static AzureOpenAIToolCallBehavior RequireFunction(AzureOpenAIFunction function, bool autoInvoke = false) diff --git a/dotnet/src/Connectors/Connectors.AzureOpenAI/ChatHistoryExtensions.cs b/dotnet/src/Connectors/Connectors.AzureOpenAI/ChatHistoryExtensions.cs index 23412f666e23..5d49fdf91b46 100644 --- a/dotnet/src/Connectors/Connectors.AzureOpenAI/ChatHistoryExtensions.cs +++ b/dotnet/src/Connectors/Connectors.AzureOpenAI/ChatHistoryExtensions.cs @@ -43,7 +43,7 @@ public static async IAsyncEnumerable AddStreamingMe (contentBuilder ??= new()).Append(contentUpdate); } - AzureOpenAIFunctionToolCall.TrackStreamingToolingUpdate(chatMessage.ToolCallUpdate, ref toolCallIdsByIndex, ref functionNamesByIndex, ref functionArgumentBuildersByIndex); + AzureOpenAIFunctionToolCall.TrackStreamingToolingUpdate(chatMessage.ToolCallUpdates, ref toolCallIdsByIndex, ref functionNamesByIndex, ref functionArgumentBuildersByIndex); // Is always expected to have at least one chunk with the role provided from a streaming message streamedRole ??= chatMessage.Role; @@ -62,7 +62,7 @@ public static async IAsyncEnumerable AddStreamingMe role, contentBuilder?.ToString() ?? string.Empty, messageContents[0].ModelId!, - AzureOpenAIFunctionToolCall.ConvertToolCallUpdatesToChatCompletionsFunctionToolCalls(ref toolCallIdsByIndex, ref functionNamesByIndex, ref functionArgumentBuildersByIndex), + AzureOpenAIFunctionToolCall.ConvertToolCallUpdatesToFunctionToolCalls(ref toolCallIdsByIndex, ref functionNamesByIndex, ref functionArgumentBuildersByIndex), metadata) { AuthorName = streamedName }); } diff --git a/dotnet/src/Connectors/Connectors.AzureOpenAI/Core/AzureOpenAIClientCore.cs b/dotnet/src/Connectors/Connectors.AzureOpenAI/Core/AzureOpenAIClientCore.cs index c37321e48c4d..348f65781734 100644 --- a/dotnet/src/Connectors/Connectors.AzureOpenAI/Core/AzureOpenAIClientCore.cs +++ b/dotnet/src/Connectors/Connectors.AzureOpenAI/Core/AzureOpenAIClientCore.cs @@ -44,7 +44,7 @@ internal AzureOpenAIClientCore( Verify.StartsWith(endpoint, "https://", "The Azure OpenAI endpoint must start with 'https://'"); Verify.NotNullOrWhiteSpace(apiKey); - var options = GetOpenAIClientOptions(httpClient); + var options = GetAzureOpenAIClientOptions(httpClient); this.DeploymentOrModelName = deploymentName; this.Endpoint = new Uri(endpoint); @@ -70,7 +70,7 @@ internal AzureOpenAIClientCore( Verify.NotNullOrWhiteSpace(endpoint); Verify.StartsWith(endpoint, "https://", "The Azure OpenAI endpoint must start with 'https://'"); - var options = GetOpenAIClientOptions(httpClient); + var options = GetAzureOpenAIClientOptions(httpClient); this.DeploymentOrModelName = deploymentName; this.Endpoint = new Uri(endpoint); diff --git a/dotnet/src/Connectors/Connectors.AzureOpenAI/Core/AzureOpenAIFunctionToolCall.cs b/dotnet/src/Connectors/Connectors.AzureOpenAI/Core/AzureOpenAIFunctionToolCall.cs index e618f27a9b15..361c617f31a0 100644 --- a/dotnet/src/Connectors/Connectors.AzureOpenAI/Core/AzureOpenAIFunctionToolCall.cs +++ b/dotnet/src/Connectors/Connectors.AzureOpenAI/Core/AzureOpenAIFunctionToolCall.cs @@ -139,7 +139,7 @@ internal static void TrackStreamingToolingUpdate( /// Dictionary mapping indices to IDs. /// Dictionary mapping indices to names. /// Dictionary mapping indices to arguments. - internal static ChatToolCall[] ConvertToolCallUpdatesToChatCompletionsFunctionToolCalls( + internal static ChatToolCall[] ConvertToolCallUpdatesToFunctionToolCalls( ref Dictionary? toolCallIdsByIndex, ref Dictionary? functionNamesByIndex, ref Dictionary? functionArgumentBuildersByIndex) diff --git a/dotnet/src/Connectors/Connectors.AzureOpenAI/Core/AzureOpenAIStreamingChatMessageContent.cs b/dotnet/src/Connectors/Connectors.AzureOpenAI/Core/AzureOpenAIStreamingChatMessageContent.cs index 9287499e1621..fce885482899 100644 --- a/dotnet/src/Connectors/Connectors.AzureOpenAI/Core/AzureOpenAIStreamingChatMessageContent.cs +++ b/dotnet/src/Connectors/Connectors.AzureOpenAI/Core/AzureOpenAIStreamingChatMessageContent.cs @@ -41,7 +41,7 @@ internal AzureOpenAIStreamingChatMessageContent( Encoding.UTF8, metadata) { - this.ToolCallUpdate = chatUpdate.ToolCallUpdates; + this.ToolCallUpdates = chatUpdate.ToolCallUpdates; this.FinishReason = chatUpdate.FinishReason; this.Items = CreateContentItems(chatUpdate.ContentUpdate); } @@ -51,7 +51,7 @@ internal AzureOpenAIStreamingChatMessageContent( /// /// Author role of the message /// Content of the message - /// Tool call update + /// Tool call updates /// Completion finish reason /// Index of the choice /// The model ID used to generate the content @@ -59,7 +59,7 @@ internal AzureOpenAIStreamingChatMessageContent( internal AzureOpenAIStreamingChatMessageContent( AuthorRole? authorRole, string? content, - IReadOnlyList? tootToolCallUpdate = null, + IReadOnlyList? toolCallUpdates = null, ChatFinishReason? completionsFinishReason = null, int choiceIndex = 0, string? modelId = null, @@ -73,12 +73,12 @@ internal AzureOpenAIStreamingChatMessageContent( Encoding.UTF8, metadata) { - this.ToolCallUpdate = tootToolCallUpdate; + this.ToolCallUpdates = toolCallUpdates; this.FinishReason = completionsFinishReason; } /// Gets any update information in the message about a tool call. - public IReadOnlyList? ToolCallUpdate { get; } + public IReadOnlyList? ToolCallUpdates { get; } /// public override byte[] ToByteArray() => this.Encoding.GetBytes(this.ToString()); diff --git a/dotnet/src/Connectors/Connectors.AzureOpenAI/Core/AzureOpenAIStreamingTextContent.cs b/dotnet/src/Connectors/Connectors.AzureOpenAI/Core/AzureOpenAIStreamingTextContent.cs deleted file mode 100644 index 9d9497fd68d5..000000000000 --- a/dotnet/src/Connectors/Connectors.AzureOpenAI/Core/AzureOpenAIStreamingTextContent.cs +++ /dev/null @@ -1,51 +0,0 @@ -// Copyright (c) Microsoft. All rights reserved. - -using System.Collections.Generic; -using System.Text; - -namespace Microsoft.SemanticKernel.Connectors.AzureOpenAI; - -/// -/// Azure OpenAI specialized streaming text content. -/// -/// -/// Represents a text content chunk that was streamed from the remote model. -/// -public sealed class AzureOpenAIStreamingTextContent : StreamingTextContent -{ - /// - /// Create a new instance of the class. - /// - /// Text update - /// Index of the choice - /// The model ID used to generate the content - /// Inner chunk object - /// Metadata information - internal AzureOpenAIStreamingTextContent( - string text, - int choiceIndex, - string modelId, - object? innerContentObject = null, - IReadOnlyDictionary? metadata = null) - : base( - text, - choiceIndex, - modelId, - innerContentObject, - Encoding.UTF8, - metadata) - { - } - - /// - public override byte[] ToByteArray() - { - return this.Encoding.GetBytes(this.ToString()); - } - - /// - public override string ToString() - { - return this.Text ?? string.Empty; - } -} diff --git a/dotnet/src/Connectors/Connectors.AzureOpenAI/Core/ClientCore.cs b/dotnet/src/Connectors/Connectors.AzureOpenAI/Core/ClientCore.cs index 4152f2137409..4c6f8264c778 100644 --- a/dotnet/src/Connectors/Connectors.AzureOpenAI/Core/ClientCore.cs +++ b/dotnet/src/Connectors/Connectors.AzureOpenAI/Core/ClientCore.cs @@ -123,7 +123,7 @@ internal ClientCore(ILogger? logger = null) unit: "{token}", description: "Number of tokens used"); - private static Dictionary GetChatChoiceMetadata(OpenAIChatCompletion completions) + private static Dictionary GetCompletionMetadata(OpenAIChatCompletion completions) { #pragma warning disable AOAI001 // Type is for evaluation purposes only and is subject to change or removal in future updates. Suppress this diagnostic to proceed. return new Dictionary(8) @@ -142,7 +142,7 @@ internal ClientCore(ILogger? logger = null) #pragma warning restore AOAI001 // Type is for evaluation purposes only and is subject to change or removal in future updates. Suppress this diagnostic to proceed. } - private static Dictionary GetResponseMetadata(StreamingChatCompletionUpdate completionUpdate) + private static Dictionary GetCompletionMetadata(StreamingChatCompletionUpdate completionUpdate) { return new Dictionary(4) { @@ -261,51 +261,51 @@ internal async Task> GetChatMessageContentsAsy } // Convert the incoming execution settings to OpenAI settings. - AzureOpenAIPromptExecutionSettings chatExecutionSettings = AzureOpenAIPromptExecutionSettings.FromExecutionSettings(executionSettings); + AzureOpenAIChatCompletionExecutionSettings chatExecutionSettings = AzureOpenAIChatCompletionExecutionSettings.FromExecutionSettings(executionSettings); ValidateMaxTokens(chatExecutionSettings.MaxTokens); - var chatMessages = CreateChatCompletionMessages(chatExecutionSettings, chat); + var chatForRequest = CreateChatCompletionMessages(chatExecutionSettings, chat); for (int requestIndex = 0; ; requestIndex++) { var toolCallingConfig = this.GetToolCallingConfiguration(kernel, chatExecutionSettings, requestIndex); - var chatOptions = this.CreateChatCompletionsOptions(chatExecutionSettings, chat, toolCallingConfig, kernel); + var chatOptions = this.CreateChatCompletionOptions(chatExecutionSettings, chat, toolCallingConfig, kernel); // Make the request. - OpenAIChatCompletion? responseData = null; - AzureOpenAIChatMessageContent responseContent; + OpenAIChatCompletion? chatCompletion = null; + AzureOpenAIChatMessageContent chatMessageContent; using (var activity = ModelDiagnostics.StartCompletionActivity(this.Endpoint, this.DeploymentOrModelName, ModelProvider, chat, chatExecutionSettings)) { try { - responseData = (await RunRequestAsync(() => this.Client.GetChatClient(this.DeploymentOrModelName).CompleteChatAsync(chatMessages, chatOptions, cancellationToken)).ConfigureAwait(false)).Value; + chatCompletion = (await RunRequestAsync(() => this.Client.GetChatClient(this.DeploymentOrModelName).CompleteChatAsync(chatForRequest, chatOptions, cancellationToken)).ConfigureAwait(false)).Value; - this.LogUsage(responseData.Usage); + this.LogUsage(chatCompletion.Usage); } catch (Exception ex) when (activity is not null) { activity.SetError(ex); - if (responseData != null) + if (chatCompletion != null) { // Capture available metadata even if the operation failed. activity - .SetResponseId(responseData.Id) - .SetPromptTokenUsage(responseData.Usage.InputTokens) - .SetCompletionTokenUsage(responseData.Usage.OutputTokens); + .SetResponseId(chatCompletion.Id) + .SetPromptTokenUsage(chatCompletion.Usage.InputTokens) + .SetCompletionTokenUsage(chatCompletion.Usage.OutputTokens); } throw; } - responseContent = this.GetChatMessage(responseData); - activity?.SetCompletionResponse([responseContent], responseData.Usage.InputTokens, responseData.Usage.OutputTokens); + chatMessageContent = this.CreateChatMessageContent(chatCompletion); + activity?.SetCompletionResponse([chatMessageContent], chatCompletion.Usage.InputTokens, chatCompletion.Usage.OutputTokens); } // If we don't want to attempt to invoke any functions, just return the result. if (!toolCallingConfig.AutoInvoke) { - return [responseContent]; + return [chatMessageContent]; } Debug.Assert(kernel is not null); @@ -315,37 +315,37 @@ internal async Task> GetChatMessageContentsAsy // Note that we don't check the FinishReason and instead check whether there are any tool calls, as the service // may return a FinishReason of "stop" even if there are tool calls to be made, in particular if a required tool // is specified. - if (responseData.ToolCalls.Count == 0) + if (chatCompletion.ToolCalls.Count == 0) { - return [responseContent]; + return [chatMessageContent]; } if (this.Logger.IsEnabled(LogLevel.Debug)) { - this.Logger.LogDebug("Tool requests: {Requests}", responseData.ToolCalls.Count); + this.Logger.LogDebug("Tool requests: {Requests}", chatCompletion.ToolCalls.Count); } if (this.Logger.IsEnabled(LogLevel.Trace)) { - this.Logger.LogTrace("Function call requests: {Requests}", string.Join(", ", responseData.ToolCalls.OfType().Select(ftc => $"{ftc.FunctionName}({ftc.FunctionArguments})"))); + this.Logger.LogTrace("Function call requests: {Requests}", string.Join(", ", chatCompletion.ToolCalls.OfType().Select(ftc => $"{ftc.FunctionName}({ftc.FunctionArguments})"))); } // Add the original assistant message to the chat messages; this is required for the service // to understand the tool call responses. Also add the result message to the caller's chat // history: if they don't want it, they can remove it, but this makes the data available, // including metadata like usage. - chatMessages.Add(GetRequestMessage(responseData)); - chat.Add(responseContent); + chatForRequest.Add(CreateRequestMessage(chatCompletion)); + chat.Add(chatMessageContent); // We must send back a response for every tool call, regardless of whether we successfully executed it or not. // If we successfully execute it, we'll add the result. If we don't, we'll add an error. - for (int toolCallIndex = 0; toolCallIndex < responseContent.ToolCalls.Count; toolCallIndex++) + for (int toolCallIndex = 0; toolCallIndex < chatMessageContent.ToolCalls.Count; toolCallIndex++) { - ChatToolCall functionToolCall = responseContent.ToolCalls[toolCallIndex]; + ChatToolCall functionToolCall = chatMessageContent.ToolCalls[toolCallIndex]; // We currently only know about function tool calls. If it's anything else, we'll respond with an error. if (functionToolCall.Kind != ChatToolCallKind.Function) { - AddResponseMessage(chatMessages, chat, result: null, "Error: Tool call was not a function call.", functionToolCall, this.Logger); + AddResponseMessage(chatForRequest, chat, result: null, "Error: Tool call was not a function call.", functionToolCall, this.Logger); continue; } @@ -357,7 +357,7 @@ internal async Task> GetChatMessageContentsAsy } catch (JsonException) { - AddResponseMessage(chatMessages, chat, result: null, "Error: Function call arguments were invalid JSON.", functionToolCall, this.Logger); + AddResponseMessage(chatForRequest, chat, result: null, "Error: Function call arguments were invalid JSON.", functionToolCall, this.Logger); continue; } @@ -367,14 +367,14 @@ internal async Task> GetChatMessageContentsAsy if (chatExecutionSettings.ToolCallBehavior?.AllowAnyRequestedKernelFunction is not true && !IsRequestableTool(chatOptions, azureOpenAIFunctionToolCall)) { - AddResponseMessage(chatMessages, chat, result: null, "Error: Function call request for a function that wasn't defined.", functionToolCall, this.Logger); + AddResponseMessage(chatForRequest, chat, result: null, "Error: Function call request for a function that wasn't defined.", functionToolCall, this.Logger); continue; } // Find the function in the kernel and populate the arguments. if (!kernel!.Plugins.TryGetFunctionAndArguments(azureOpenAIFunctionToolCall, out KernelFunction? function, out KernelArguments? functionArgs)) { - AddResponseMessage(chatMessages, chat, result: null, "Error: Requested function could not be found.", functionToolCall, this.Logger); + AddResponseMessage(chatForRequest, chat, result: null, "Error: Requested function could not be found.", functionToolCall, this.Logger); continue; } @@ -385,7 +385,7 @@ internal async Task> GetChatMessageContentsAsy Arguments = functionArgs, RequestSequenceIndex = requestIndex, FunctionSequenceIndex = toolCallIndex, - FunctionCount = responseContent.ToolCalls.Count + FunctionCount = chatMessageContent.ToolCalls.Count }; s_inflightAutoInvokes.Value++; @@ -409,7 +409,7 @@ internal async Task> GetChatMessageContentsAsy catch (Exception e) #pragma warning restore CA1031 // Do not catch general exception types { - AddResponseMessage(chatMessages, chat, null, $"Error: Exception while invoking function. {e.Message}", functionToolCall, this.Logger); + AddResponseMessage(chatForRequest, chat, null, $"Error: Exception while invoking function. {e.Message}", functionToolCall, this.Logger); continue; } finally @@ -423,7 +423,7 @@ internal async Task> GetChatMessageContentsAsy object functionResultValue = functionResult.GetValue() ?? string.Empty; var stringResult = ProcessFunctionResult(functionResultValue, chatExecutionSettings.ToolCallBehavior); - AddResponseMessage(chatMessages, chat, stringResult, errorMessage: null, functionToolCall, this.Logger); + AddResponseMessage(chatForRequest, chat, stringResult, errorMessage: null, functionToolCall, this.Logger); // If filter requested termination, returning latest function result. if (invocationContext.Terminate) @@ -454,7 +454,7 @@ internal async IAsyncEnumerable GetStrea JsonSerializer.Serialize(executionSettings)); } - AzureOpenAIPromptExecutionSettings chatExecutionSettings = AzureOpenAIPromptExecutionSettings.FromExecutionSettings(executionSettings); + AzureOpenAIChatCompletionExecutionSettings chatExecutionSettings = AzureOpenAIChatCompletionExecutionSettings.FromExecutionSettings(executionSettings); ValidateMaxTokens(chatExecutionSettings.MaxTokens); @@ -463,13 +463,13 @@ internal async IAsyncEnumerable GetStrea Dictionary? functionNamesByIndex = null; Dictionary? functionArgumentBuildersByIndex = null; - var chatMessages = CreateChatCompletionMessages(chatExecutionSettings, chat); + var chatForRequest = CreateChatCompletionMessages(chatExecutionSettings, chat); for (int requestIndex = 0; ; requestIndex++) { var toolCallingConfig = this.GetToolCallingConfiguration(kernel, chatExecutionSettings, requestIndex); - var chatOptions = this.CreateChatCompletionsOptions(chatExecutionSettings, chat, toolCallingConfig, kernel); + var chatOptions = this.CreateChatCompletionOptions(chatExecutionSettings, chat, toolCallingConfig, kernel); // Reset state contentBuilder?.Clear(); @@ -491,7 +491,7 @@ internal async IAsyncEnumerable GetStrea AsyncResultCollection response; try { - response = RunRequest(() => this.Client.GetChatClient(this.DeploymentOrModelName).CompleteChatStreamingAsync(chatMessages, chatOptions, cancellationToken)); + response = RunRequest(() => this.Client.GetChatClient(this.DeploymentOrModelName).CompleteChatStreamingAsync(chatForRequest, chatOptions, cancellationToken)); } catch (Exception ex) when (activity is not null) { @@ -518,16 +518,16 @@ internal async IAsyncEnumerable GetStrea throw; } - StreamingChatCompletionUpdate update = responseEnumerator.Current; - metadata = GetResponseMetadata(update); - streamedRole ??= update.Role; + StreamingChatCompletionUpdate chatCompletionUpdate = responseEnumerator.Current; + metadata = GetCompletionMetadata(chatCompletionUpdate); + streamedRole ??= chatCompletionUpdate.Role; //streamedName ??= update.AuthorName; - finishReason = update.FinishReason ?? default; + finishReason = chatCompletionUpdate.FinishReason ?? default; // If we're intending to invoke function calls, we need to consume that function call information. if (toolCallingConfig.AutoInvoke) { - foreach (var contentPart in update.ContentUpdate) + foreach (var contentPart in chatCompletionUpdate.ContentUpdate) { if (contentPart.Kind == ChatMessageContentPartKind.Text) { @@ -535,12 +535,12 @@ internal async IAsyncEnumerable GetStrea } } - AzureOpenAIFunctionToolCall.TrackStreamingToolingUpdate(update.ToolCallUpdates, ref toolCallIdsByIndex, ref functionNamesByIndex, ref functionArgumentBuildersByIndex); + AzureOpenAIFunctionToolCall.TrackStreamingToolingUpdate(chatCompletionUpdate.ToolCallUpdates, ref toolCallIdsByIndex, ref functionNamesByIndex, ref functionArgumentBuildersByIndex); } - var openAIStreamingChatMessageContent = new AzureOpenAIStreamingChatMessageContent(update, 0, this.DeploymentOrModelName, metadata); + var openAIStreamingChatMessageContent = new AzureOpenAIStreamingChatMessageContent(chatCompletionUpdate, 0, this.DeploymentOrModelName, metadata); - foreach (var functionCallUpdate in update.ToolCallUpdates) + foreach (var functionCallUpdate in chatCompletionUpdate.ToolCallUpdates) { // Using the code below to distinguish and skip non - function call related updates. // The Kind property of updates can't be reliably used because it's only initialized for the first update. @@ -563,7 +563,7 @@ internal async IAsyncEnumerable GetStrea } // Translate all entries into ChatCompletionsFunctionToolCall instances. - toolCalls = AzureOpenAIFunctionToolCall.ConvertToolCallUpdatesToChatCompletionsFunctionToolCalls( + toolCalls = AzureOpenAIFunctionToolCall.ConvertToolCallUpdatesToFunctionToolCalls( ref toolCallIdsByIndex, ref functionNamesByIndex, ref functionArgumentBuildersByIndex); // Translate all entries into FunctionCallContent instances for diagnostics purposes. @@ -601,8 +601,8 @@ internal async IAsyncEnumerable GetStrea // Add the original assistant message to the chat messages; this is required for the service // to understand the tool call responses. - chatMessages.Add(GetRequestMessage(streamedRole ?? default, content, streamedName, toolCalls)); - chat.Add(this.GetChatMessage(streamedRole ?? default, content, toolCalls, functionCallContents, metadata, streamedName)); + chatForRequest.Add(CreateRequestMessage(streamedRole ?? default, content, streamedName, toolCalls)); + chat.Add(this.CreateChatMessageContent(streamedRole ?? default, content, toolCalls, functionCallContents, metadata, streamedName)); // Respond to each tooling request. for (int toolCallIndex = 0; toolCallIndex < toolCalls.Length; toolCallIndex++) @@ -612,7 +612,7 @@ internal async IAsyncEnumerable GetStrea // We currently only know about function tool calls. If it's anything else, we'll respond with an error. if (string.IsNullOrEmpty(toolCall.FunctionName)) { - AddResponseMessage(chatMessages, chat, result: null, "Error: Tool call was not a function call.", toolCall, this.Logger); + AddResponseMessage(chatForRequest, chat, result: null, "Error: Tool call was not a function call.", toolCall, this.Logger); continue; } @@ -624,7 +624,7 @@ internal async IAsyncEnumerable GetStrea } catch (JsonException) { - AddResponseMessage(chatMessages, chat, result: null, "Error: Function call arguments were invalid JSON.", toolCall, this.Logger); + AddResponseMessage(chatForRequest, chat, result: null, "Error: Function call arguments were invalid JSON.", toolCall, this.Logger); continue; } @@ -634,14 +634,14 @@ internal async IAsyncEnumerable GetStrea if (chatExecutionSettings.ToolCallBehavior?.AllowAnyRequestedKernelFunction is not true && !IsRequestableTool(chatOptions, openAIFunctionToolCall)) { - AddResponseMessage(chatMessages, chat, result: null, "Error: Function call request for a function that wasn't defined.", toolCall, this.Logger); + AddResponseMessage(chatForRequest, chat, result: null, "Error: Function call request for a function that wasn't defined.", toolCall, this.Logger); continue; } // Find the function in the kernel and populate the arguments. if (!kernel!.Plugins.TryGetFunctionAndArguments(openAIFunctionToolCall, out KernelFunction? function, out KernelArguments? functionArgs)) { - AddResponseMessage(chatMessages, chat, result: null, "Error: Requested function could not be found.", toolCall, this.Logger); + AddResponseMessage(chatForRequest, chat, result: null, "Error: Requested function could not be found.", toolCall, this.Logger); continue; } @@ -676,7 +676,7 @@ internal async IAsyncEnumerable GetStrea catch (Exception e) #pragma warning restore CA1031 // Do not catch general exception types { - AddResponseMessage(chatMessages, chat, result: null, $"Error: Exception while invoking function. {e.Message}", toolCall, this.Logger); + AddResponseMessage(chatForRequest, chat, result: null, $"Error: Exception while invoking function. {e.Message}", toolCall, this.Logger); continue; } finally @@ -690,7 +690,7 @@ internal async IAsyncEnumerable GetStrea object functionResultValue = functionResult.GetValue() ?? string.Empty; var stringResult = ProcessFunctionResult(functionResultValue, chatExecutionSettings.ToolCallBehavior); - AddResponseMessage(chatMessages, chat, stringResult, errorMessage: null, toolCall, this.Logger); + AddResponseMessage(chatForRequest, chat, stringResult, errorMessage: null, toolCall, this.Logger); // If filter requested termination, returning latest function result and breaking request iteration loop. if (invocationContext.Terminate) @@ -731,7 +731,7 @@ internal async IAsyncEnumerable GetChatAsTextStreamingCont Kernel? kernel, [EnumeratorCancellation] CancellationToken cancellationToken = default) { - AzureOpenAIPromptExecutionSettings chatSettings = AzureOpenAIPromptExecutionSettings.FromExecutionSettings(executionSettings); + AzureOpenAIChatCompletionExecutionSettings chatSettings = AzureOpenAIChatCompletionExecutionSettings.FromExecutionSettings(executionSettings); ChatHistory chat = CreateNewChat(prompt, chatSettings); await foreach (var chatUpdate in this.GetStreamingChatMessageContentsAsync(chat, executionSettings, kernel, cancellationToken).ConfigureAwait(false)) @@ -746,7 +746,7 @@ internal async Task> GetChatAsTextContentsAsync( Kernel? kernel, CancellationToken cancellationToken = default) { - AzureOpenAIPromptExecutionSettings chatSettings = AzureOpenAIPromptExecutionSettings.FromExecutionSettings(executionSettings); + AzureOpenAIChatCompletionExecutionSettings chatSettings = AzureOpenAIChatCompletionExecutionSettings.FromExecutionSettings(executionSettings); ChatHistory chat = CreateNewChat(text, chatSettings); return (await this.GetChatMessageContentsAsync(chat, chatSettings, kernel, cancellationToken).ConfigureAwait(false)) @@ -765,7 +765,7 @@ internal void AddAttribute(string key, string? value) /// Gets options to use for an OpenAIClient /// Custom for HTTP requests. /// An instance of . - internal static AzureOpenAIClientOptions GetOpenAIClientOptions(HttpClient? httpClient) + internal static AzureOpenAIClientOptions GetAzureOpenAIClientOptions(HttpClient? httpClient) { AzureOpenAIClientOptions options = new() { @@ -790,7 +790,7 @@ internal static AzureOpenAIClientOptions GetOpenAIClientOptions(HttpClient? http /// Optional chat instructions for the AI service /// Execution settings /// Chat object - private static ChatHistory CreateNewChat(string? text = null, AzureOpenAIPromptExecutionSettings? executionSettings = null) + private static ChatHistory CreateNewChat(string? text = null, AzureOpenAIChatCompletionExecutionSettings? executionSettings = null) { var chat = new ChatHistory(); @@ -811,8 +811,8 @@ private static ChatHistory CreateNewChat(string? text = null, AzureOpenAIPromptE return chat; } - private ChatCompletionOptions CreateChatCompletionsOptions( - AzureOpenAIPromptExecutionSettings executionSettings, + private ChatCompletionOptions CreateChatCompletionOptions( + AzureOpenAIChatCompletionExecutionSettings executionSettings, ChatHistory chatHistory, ToolCallingConfig toolCallingConfig, Kernel? kernel) @@ -863,7 +863,7 @@ private ChatCompletionOptions CreateChatCompletionsOptions( return options; } - private static List CreateChatCompletionMessages(AzureOpenAIPromptExecutionSettings executionSettings, ChatHistory chatHistory) + private static List CreateChatCompletionMessages(AzureOpenAIChatCompletionExecutionSettings executionSettings, ChatHistory chatHistory) { List messages = []; @@ -874,13 +874,13 @@ private static List CreateChatCompletionMessages(AzureOpenAIPromptE foreach (var message in chatHistory) { - messages.AddRange(GetRequestMessages(message, executionSettings.ToolCallBehavior)); + messages.AddRange(CreateRequestMessages(message, executionSettings.ToolCallBehavior)); } return messages; } - private static ChatMessage GetRequestMessage(ChatMessageRole chatRole, string content, string? name, ChatToolCall[]? tools) + private static ChatMessage CreateRequestMessage(ChatMessageRole chatRole, string content, string? name, ChatToolCall[]? tools) { if (chatRole == ChatMessageRole.User) { @@ -900,7 +900,7 @@ private static ChatMessage GetRequestMessage(ChatMessageRole chatRole, string co throw new NotImplementedException($"Role {chatRole} is not implemented"); } - private static List GetRequestMessages(ChatMessageContent message, AzureOpenAIToolCallBehavior? toolCallBehavior) + private static List CreateRequestMessages(ChatMessageContent message, AzureOpenAIToolCallBehavior? toolCallBehavior) { if (message.Role == AuthorRole.System) { @@ -1043,7 +1043,7 @@ private static ChatMessageContentPart GetImageContentItem(ImageContent imageCont throw new ArgumentException($"{nameof(ImageContent)} must have either Data or a Uri."); } - private static ChatMessage GetRequestMessage(OpenAIChatCompletion completion) + private static ChatMessage CreateRequestMessage(OpenAIChatCompletion completion) { if (completion.Role == ChatMessageRole.System) { @@ -1063,16 +1063,16 @@ private static ChatMessage GetRequestMessage(OpenAIChatCompletion completion) throw new NotSupportedException($"Role {completion.Role} is not supported."); } - private AzureOpenAIChatMessageContent GetChatMessage(OpenAIChatCompletion completion) + private AzureOpenAIChatMessageContent CreateChatMessageContent(OpenAIChatCompletion completion) { - var message = new AzureOpenAIChatMessageContent(completion, this.DeploymentOrModelName, GetChatChoiceMetadata(completion)); + var message = new AzureOpenAIChatMessageContent(completion, this.DeploymentOrModelName, GetCompletionMetadata(completion)); message.Items.AddRange(this.GetFunctionCallContents(completion.ToolCalls)); return message; } - private AzureOpenAIChatMessageContent GetChatMessage(ChatMessageRole chatRole, string content, ChatToolCall[] toolCalls, FunctionCallContent[]? functionCalls, IReadOnlyDictionary? metadata, string? authorName) + private AzureOpenAIChatMessageContent CreateChatMessageContent(ChatMessageRole chatRole, string content, ChatToolCall[] toolCalls, FunctionCallContent[]? functionCalls, IReadOnlyDictionary? metadata, string? authorName) { var message = new AzureOpenAIChatMessageContent(chatRole, content, this.DeploymentOrModelName, toolCalls, metadata) { @@ -1291,7 +1291,7 @@ await autoFunctionInvocationFilters[index].OnAutoFunctionInvocationAsync(context } } - private ToolCallingConfig GetToolCallingConfiguration(Kernel? kernel, AzureOpenAIPromptExecutionSettings executionSettings, int requestIndex) + private ToolCallingConfig GetToolCallingConfiguration(Kernel? kernel, AzureOpenAIChatCompletionExecutionSettings executionSettings, int requestIndex) { if (executionSettings.ToolCallBehavior is null) { @@ -1331,7 +1331,7 @@ private ToolCallingConfig GetToolCallingConfiguration(Kernel? kernel, AzureOpenA AutoInvoke: autoInvoke); } - private static ChatResponseFormat? GetResponseFormat(AzureOpenAIPromptExecutionSettings executionSettings) + private static ChatResponseFormat? GetResponseFormat(AzureOpenAIChatCompletionExecutionSettings executionSettings) { switch (executionSettings.ResponseFormat) { diff --git a/dotnet/src/Connectors/Connectors.AzureOpenAI/Extensions/AzureOpenAIServiceCollectionExtensions.cs b/dotnet/src/Connectors/Connectors.AzureOpenAI/Extensions/AzureOpenAIServiceCollectionExtensions.cs index 782889c4542c..f946d09026a0 100644 --- a/dotnet/src/Connectors/Connectors.AzureOpenAI/Extensions/AzureOpenAIServiceCollectionExtensions.cs +++ b/dotnet/src/Connectors/Connectors.AzureOpenAI/Extensions/AzureOpenAIServiceCollectionExtensions.cs @@ -242,8 +242,8 @@ public static IServiceCollection AddAzureOpenAIChatCompletion( #endregion private static AzureOpenAIClient CreateAzureOpenAIClient(string endpoint, AzureKeyCredential credentials, HttpClient? httpClient) => - new(new Uri(endpoint), credentials, ClientCore.GetOpenAIClientOptions(httpClient)); + new(new Uri(endpoint), credentials, ClientCore.GetAzureOpenAIClientOptions(httpClient)); private static AzureOpenAIClient CreateAzureOpenAIClient(string endpoint, TokenCredential credentials, HttpClient? httpClient) => - new(new Uri(endpoint), credentials, ClientCore.GetOpenAIClientOptions(httpClient)); + new(new Uri(endpoint), credentials, ClientCore.GetAzureOpenAIClientOptions(httpClient)); } diff --git a/dotnet/src/IntegrationTestsV2/BaseIntegrationTest.cs b/dotnet/src/IntegrationTestsV2/BaseIntegrationTest.cs new file mode 100644 index 000000000000..a86274d4f8ce --- /dev/null +++ b/dotnet/src/IntegrationTestsV2/BaseIntegrationTest.cs @@ -0,0 +1,37 @@ +// Copyright (c) Microsoft. All rights reserved. + +using System; +using System.Net; +using System.Threading.Tasks; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Http.Resilience; +using Microsoft.SemanticKernel; + +namespace SemanticKernel.IntegrationTestsV2; + +public class BaseIntegrationTest +{ + protected IKernelBuilder CreateKernelBuilder() + { + var builder = Kernel.CreateBuilder(); + + builder.Services.ConfigureHttpClientDefaults(c => + { + c.AddStandardResilienceHandler().Configure(o => + { + o.Retry.ShouldRetryAfterHeader = true; + o.Retry.ShouldHandle = args => ValueTask.FromResult(args.Outcome.Result?.StatusCode is HttpStatusCode.TooManyRequests); + o.CircuitBreaker = new HttpCircuitBreakerStrategyOptions + { + SamplingDuration = TimeSpan.FromSeconds(40.0), // The duration should be least double of an attempt timeout + }; + o.AttemptTimeout = new HttpTimeoutStrategyOptions + { + Timeout = TimeSpan.FromSeconds(20.0) // Doubling the default 10s timeout + }; + }); + }); + + return builder; + } +} diff --git a/dotnet/src/IntegrationTestsV2/Connectors/AzureOpenAI/AzureOpenAIChatCompletionTests.cs b/dotnet/src/IntegrationTestsV2/Connectors/AzureOpenAI/AzureOpenAIChatCompletionTests.cs index 04f1be7e45c7..4ec42f96ddfd 100644 --- a/dotnet/src/IntegrationTestsV2/Connectors/AzureOpenAI/AzureOpenAIChatCompletionTests.cs +++ b/dotnet/src/IntegrationTestsV2/Connectors/AzureOpenAI/AzureOpenAIChatCompletionTests.cs @@ -22,7 +22,7 @@ namespace SemanticKernel.IntegrationTestsV2.Connectors.AzureOpenAI; #pragma warning disable xUnit1004 // Contains test methods used in manual verification. Disable warning for this file only. -public sealed class AzureOpenAIChatCompletionTests +public sealed class AzureOpenAIChatCompletionTests : BaseIntegrationTest { [Fact] //[Fact(Skip = "Skipping while we investigate issue with GitHub actions.")] @@ -33,7 +33,7 @@ public async Task ItCanUseAzureOpenAiChatForTextGenerationAsync() var func = kernel.CreateFunctionFromPrompt( "List the two planets after '{{$input}}', excluding moons, using bullet points.", - new AzureOpenAIPromptExecutionSettings()); + new AzureOpenAIChatCompletionExecutionSettings()); // Act var result = await func.InvokeAsync(kernel, new() { [InputParameterName] = "Jupiter" }); @@ -74,13 +74,15 @@ public async Task AzureOpenAIHttpRetryPolicyTestAsync() var azureOpenAIConfiguration = this._configuration.GetSection("AzureOpenAI").Get(); - this._kernelBuilder.AddAzureOpenAIChatCompletion( + var kernelBuilder = Kernel.CreateBuilder(); + + kernelBuilder.AddAzureOpenAIChatCompletion( deploymentName: azureOpenAIConfiguration!.ChatDeploymentName!, modelId: azureOpenAIConfiguration.ChatModelId, endpoint: azureOpenAIConfiguration.Endpoint, apiKey: "INVALID_KEY"); - this._kernelBuilder.Services.ConfigureHttpClientDefaults(c => + kernelBuilder.Services.ConfigureHttpClientDefaults(c => { // Use a standard resiliency policy, augmented to retry on 401 Unauthorized for this example c.AddStandardResilienceHandler().Configure(o => @@ -94,7 +96,7 @@ public async Task AzureOpenAIHttpRetryPolicyTestAsync() }); }); - var target = this._kernelBuilder.Build(); + var target = kernelBuilder.Build(); var plugins = TestHelpers.ImportSamplePlugins(target, "SummarizePlugin"); @@ -167,7 +169,7 @@ public async Task ChatSystemPromptIsNotIgnoredAsync() // Arrange var kernel = this.CreateAndInitializeKernel(); - var settings = new AzureOpenAIPromptExecutionSettings { ChatSystemPrompt = "Reply \"I don't know\" to every question." }; + var settings = new AzureOpenAIChatCompletionExecutionSettings { ChatSystemPrompt = "Reply \"I don't know\" to every question." }; // Act var result = await kernel.InvokePromptAsync("Where is the most famous fish market in Seattle, Washington, USA?", new(settings)); @@ -203,7 +205,7 @@ public async Task SemanticKernelVersionHeaderIsSentAsync() public async Task LogProbsDataIsReturnedWhenRequestedAsync(bool? logprobs, int? topLogprobs) { // Arrange - var settings = new AzureOpenAIPromptExecutionSettings { Logprobs = logprobs, TopLogprobs = topLogprobs }; + var settings = new AzureOpenAIChatCompletionExecutionSettings { Logprobs = logprobs, TopLogprobs = topLogprobs }; var kernel = this.CreateAndInitializeKernel(); @@ -237,7 +239,9 @@ private Kernel CreateAndInitializeKernel(HttpClient? httpClient = null) Assert.NotNull(azureOpenAIConfiguration.Endpoint); Assert.NotNull(azureOpenAIConfiguration.ServiceId); - this._kernelBuilder.AddAzureOpenAIChatCompletion( + var kernelBuilder = base.CreateKernelBuilder(); + + kernelBuilder.AddAzureOpenAIChatCompletion( deploymentName: azureOpenAIConfiguration.ChatDeploymentName, modelId: azureOpenAIConfiguration.ChatModelId, endpoint: azureOpenAIConfiguration.Endpoint, @@ -245,11 +249,10 @@ private Kernel CreateAndInitializeKernel(HttpClient? httpClient = null) serviceId: azureOpenAIConfiguration.ServiceId, httpClient: httpClient); - return this._kernelBuilder.Build(); + return kernelBuilder.Build(); } private const string InputParameterName = "input"; - private readonly IKernelBuilder _kernelBuilder = Kernel.CreateBuilder(); private readonly IConfigurationRoot _configuration = new ConfigurationBuilder() .AddJsonFile(path: "testsettings.json", optional: true, reloadOnChange: true) diff --git a/dotnet/src/IntegrationTestsV2/Connectors/AzureOpenAI/AzureOpenAIChatCompletion_FunctionCallingTests.cs b/dotnet/src/IntegrationTestsV2/Connectors/AzureOpenAI/AzureOpenAIChatCompletion_FunctionCallingTests.cs index 5bbbd60c9005..ac5347d82e07 100644 --- a/dotnet/src/IntegrationTestsV2/Connectors/AzureOpenAI/AzureOpenAIChatCompletion_FunctionCallingTests.cs +++ b/dotnet/src/IntegrationTestsV2/Connectors/AzureOpenAI/AzureOpenAIChatCompletion_FunctionCallingTests.cs @@ -12,12 +12,11 @@ using Microsoft.SemanticKernel.Connectors.AzureOpenAI; using OpenAI.Chat; using SemanticKernel.IntegrationTests.TestSettings; -using SemanticKernel.IntegrationTestsV2.Connectors.AzureOpenAI; using Xunit; -namespace SemanticKernel.IntegrationTests.Connectors.AzureOpenAI; +namespace SemanticKernel.IntegrationTestsV2.Connectors.AzureOpenAI; -public sealed class AzureOpenAIChatCompletionFunctionCallingTests +public sealed class AzureOpenAIChatCompletionFunctionCallingTests : BaseIntegrationTest { [Fact] public async Task CanAutoInvokeKernelFunctionsAsync() @@ -34,7 +33,7 @@ public async Task CanAutoInvokeKernelFunctionsAsync() var kernel = this.CreateAndInitializeKernel(importHelperPlugin: true); kernel.FunctionInvocationFilters.Add(filter); - AzureOpenAIPromptExecutionSettings settings = new() { ToolCallBehavior = AzureOpenAIToolCallBehavior.AutoInvokeKernelFunctions }; + AzureOpenAIChatCompletionExecutionSettings settings = new() { ToolCallBehavior = AzureOpenAIToolCallBehavior.AutoInvokeKernelFunctions }; // Act var result = await kernel.InvokePromptAsync("Given the current time of day and weather, what is the likely color of the sky in Boston?", new(settings)); @@ -60,7 +59,7 @@ public async Task CanAutoInvokeKernelFunctionsStreamingAsync() var kernel = this.CreateAndInitializeKernel(importHelperPlugin: true); kernel.FunctionInvocationFilters.Add(filter); - AzureOpenAIPromptExecutionSettings settings = new() { ToolCallBehavior = AzureOpenAIToolCallBehavior.AutoInvokeKernelFunctions }; + AzureOpenAIChatCompletionExecutionSettings settings = new() { ToolCallBehavior = AzureOpenAIToolCallBehavior.AutoInvokeKernelFunctions }; var stringBuilder = new StringBuilder(); @@ -82,7 +81,7 @@ public async Task CanAutoInvokeKernelFunctionsWithComplexTypeParametersAsync() // Arrange var kernel = this.CreateAndInitializeKernel(importHelperPlugin: true); - AzureOpenAIPromptExecutionSettings settings = new() { ToolCallBehavior = AzureOpenAIToolCallBehavior.AutoInvokeKernelFunctions }; + AzureOpenAIChatCompletionExecutionSettings settings = new() { ToolCallBehavior = AzureOpenAIToolCallBehavior.AutoInvokeKernelFunctions }; // Act var result = await kernel.InvokePromptAsync("What is the current temperature in Dublin, Ireland, in Fahrenheit?", new(settings)); @@ -98,7 +97,7 @@ public async Task CanAutoInvokeKernelFunctionsWithPrimitiveTypeParametersAsync() // Arrange var kernel = this.CreateAndInitializeKernel(importHelperPlugin: true); - AzureOpenAIPromptExecutionSettings settings = new() { ToolCallBehavior = AzureOpenAIToolCallBehavior.AutoInvokeKernelFunctions }; + AzureOpenAIChatCompletionExecutionSettings settings = new() { ToolCallBehavior = AzureOpenAIToolCallBehavior.AutoInvokeKernelFunctions }; // Act var result = await kernel.InvokePromptAsync("Convert 50 degrees Fahrenheit to Celsius.", new(settings)); @@ -114,7 +113,7 @@ public async Task CanAutoInvokeKernelFunctionsWithEnumTypeParametersAsync() // Arrange var kernel = this.CreateAndInitializeKernel(importHelperPlugin: true); - AzureOpenAIPromptExecutionSettings settings = new() { ToolCallBehavior = AzureOpenAIToolCallBehavior.AutoInvokeKernelFunctions }; + AzureOpenAIChatCompletionExecutionSettings settings = new() { ToolCallBehavior = AzureOpenAIToolCallBehavior.AutoInvokeKernelFunctions }; // Act var result = await kernel.InvokePromptAsync("Given the current time of day and weather, what is the likely color of the sky in Boston?", new(settings)); @@ -140,7 +139,7 @@ public async Task CanAutoInvokeKernelFunctionFromPromptAsync() "Delivers up-to-date news content.", [promptFunction])); - AzureOpenAIPromptExecutionSettings settings = new() { ToolCallBehavior = AzureOpenAIToolCallBehavior.AutoInvokeKernelFunctions }; + AzureOpenAIChatCompletionExecutionSettings settings = new() { ToolCallBehavior = AzureOpenAIToolCallBehavior.AutoInvokeKernelFunctions }; // Act var result = await kernel.InvokePromptAsync("Show me the latest news as they are.", new(settings)); @@ -166,7 +165,7 @@ public async Task CanAutoInvokeKernelFunctionFromPromptStreamingAsync() "Delivers up-to-date news content.", [promptFunction])); - AzureOpenAIPromptExecutionSettings settings = new() { ToolCallBehavior = AzureOpenAIToolCallBehavior.AutoInvokeKernelFunctions }; + AzureOpenAIChatCompletionExecutionSettings settings = new() { ToolCallBehavior = AzureOpenAIToolCallBehavior.AutoInvokeKernelFunctions }; // Act var streamingResult = kernel.InvokePromptStreamingAsync("Show me the latest news as they are.", new(settings)); @@ -194,7 +193,7 @@ public async Task ConnectorSpecificChatMessageContentClassesCanBeUsedForManualFu var chatHistory = new ChatHistory(); chatHistory.AddUserMessage("Given the current time of day and weather, what is the likely color of the sky in Boston?"); - var settings = new AzureOpenAIPromptExecutionSettings() { ToolCallBehavior = AzureOpenAIToolCallBehavior.EnableKernelFunctions }; + var settings = new AzureOpenAIChatCompletionExecutionSettings() { ToolCallBehavior = AzureOpenAIToolCallBehavior.EnableKernelFunctions }; var sut = kernel.GetRequiredService(); @@ -241,7 +240,7 @@ public async Task ConnectorAgnosticFunctionCallingModelClassesCanBeUsedForManual var chatHistory = new ChatHistory(); chatHistory.AddUserMessage("Given the current time of day and weather, what is the likely color of the sky in Boston?"); - var settings = new AzureOpenAIPromptExecutionSettings() { ToolCallBehavior = AzureOpenAIToolCallBehavior.EnableKernelFunctions }; + var settings = new AzureOpenAIChatCompletionExecutionSettings() { ToolCallBehavior = AzureOpenAIToolCallBehavior.EnableKernelFunctions }; var sut = kernel.GetRequiredService(); @@ -282,7 +281,7 @@ public async Task ConnectorAgnosticFunctionCallingModelClassesCanPassFunctionExc chatHistory.AddSystemMessage("Add the \"Error\" keyword to the response, if you are unable to answer a question or an error has happen."); chatHistory.AddUserMessage("Given the current time of day and weather, what is the likely color of the sky in Boston?"); - var settings = new AzureOpenAIPromptExecutionSettings() { ToolCallBehavior = AzureOpenAIToolCallBehavior.EnableKernelFunctions }; + var settings = new AzureOpenAIChatCompletionExecutionSettings() { ToolCallBehavior = AzureOpenAIToolCallBehavior.EnableKernelFunctions }; var completionService = kernel.GetRequiredService(); @@ -326,7 +325,7 @@ public async Task ConnectorAgnosticFunctionCallingModelClassesSupportSimulatedFu chatHistory.AddSystemMessage("if there's a tornado warning, please add the 'tornado' keyword to the response."); chatHistory.AddUserMessage("Given the current time of day and weather, what is the likely color of the sky in Boston?"); - var settings = new AzureOpenAIPromptExecutionSettings() { ToolCallBehavior = AzureOpenAIToolCallBehavior.EnableKernelFunctions }; + var settings = new AzureOpenAIChatCompletionExecutionSettings() { ToolCallBehavior = AzureOpenAIToolCallBehavior.EnableKernelFunctions }; var completionService = kernel.GetRequiredService(); @@ -374,7 +373,7 @@ public async Task ItFailsIfNoFunctionResultProvidedAsync() var chatHistory = new ChatHistory(); chatHistory.AddUserMessage("Given the current time of day and weather, what is the likely color of the sky in Boston?"); - var settings = new AzureOpenAIPromptExecutionSettings() { ToolCallBehavior = AzureOpenAIToolCallBehavior.EnableKernelFunctions }; + var settings = new AzureOpenAIChatCompletionExecutionSettings() { ToolCallBehavior = AzureOpenAIToolCallBehavior.EnableKernelFunctions }; var completionService = kernel.GetRequiredService(); @@ -398,7 +397,7 @@ public async Task ConnectorAgnosticFunctionCallingModelClassesCanBeUsedForAutoFu var chatHistory = new ChatHistory(); chatHistory.AddUserMessage("Given the current time of day and weather, what is the likely color of the sky in Boston?"); - var settings = new AzureOpenAIPromptExecutionSettings() { ToolCallBehavior = AzureOpenAIToolCallBehavior.AutoInvokeKernelFunctions }; + var settings = new AzureOpenAIChatCompletionExecutionSettings() { ToolCallBehavior = AzureOpenAIToolCallBehavior.AutoInvokeKernelFunctions }; var sut = kernel.GetRequiredService(); @@ -458,7 +457,7 @@ public async Task ConnectorAgnosticFunctionCallingModelClassesCanBeUsedForManual // Arrange var kernel = this.CreateAndInitializeKernel(importHelperPlugin: true); - var settings = new AzureOpenAIPromptExecutionSettings() { ToolCallBehavior = AzureOpenAIToolCallBehavior.EnableKernelFunctions }; + var settings = new AzureOpenAIChatCompletionExecutionSettings() { ToolCallBehavior = AzureOpenAIToolCallBehavior.EnableKernelFunctions }; var sut = kernel.GetRequiredService(); @@ -517,7 +516,7 @@ public async Task ConnectorAgnosticFunctionCallingModelClassesCanBeUsedForAutoFu var chatHistory = new ChatHistory(); chatHistory.AddUserMessage("Given the current time of day and weather, what is the likely color of the sky in Boston?"); - var settings = new AzureOpenAIPromptExecutionSettings() { ToolCallBehavior = AzureOpenAIToolCallBehavior.AutoInvokeKernelFunctions }; + var settings = new AzureOpenAIChatCompletionExecutionSettings() { ToolCallBehavior = AzureOpenAIToolCallBehavior.AutoInvokeKernelFunctions }; var sut = kernel.GetRequiredService(); @@ -582,7 +581,7 @@ public async Task ConnectorAgnosticFunctionCallingModelClassesCanPassFunctionExc // Arrange var kernel = this.CreateAndInitializeKernel(importHelperPlugin: true); - var settings = new AzureOpenAIPromptExecutionSettings() { ToolCallBehavior = AzureOpenAIToolCallBehavior.EnableKernelFunctions }; + var settings = new AzureOpenAIChatCompletionExecutionSettings() { ToolCallBehavior = AzureOpenAIToolCallBehavior.EnableKernelFunctions }; var sut = kernel.GetRequiredService(); @@ -640,7 +639,7 @@ public async Task ConnectorAgnosticFunctionCallingModelClassesSupportSimulatedFu // Arrange var kernel = this.CreateAndInitializeKernel(importHelperPlugin: true); - var settings = new AzureOpenAIPromptExecutionSettings() { ToolCallBehavior = AzureOpenAIToolCallBehavior.EnableKernelFunctions }; + var settings = new AzureOpenAIChatCompletionExecutionSettings() { ToolCallBehavior = AzureOpenAIToolCallBehavior.EnableKernelFunctions }; var sut = kernel.GetRequiredService(); @@ -707,7 +706,7 @@ private Kernel CreateAndInitializeKernel(bool importHelperPlugin = false) Assert.NotNull(azureOpenAIConfiguration.ApiKey); Assert.NotNull(azureOpenAIConfiguration.Endpoint); - var kernelBuilder = Kernel.CreateBuilder(); + var kernelBuilder = base.CreateKernelBuilder(); kernelBuilder.AddAzureOpenAIChatCompletion( deploymentName: azureOpenAIConfiguration.ChatDeploymentName, diff --git a/dotnet/src/IntegrationTestsV2/Connectors/AzureOpenAI/AzureOpenAIChatCompletion_NonStreamingTests.cs b/dotnet/src/IntegrationTestsV2/Connectors/AzureOpenAI/AzureOpenAIChatCompletion_NonStreamingTests.cs index 72d5ff34dec4..9a011541ebab 100644 --- a/dotnet/src/IntegrationTestsV2/Connectors/AzureOpenAI/AzureOpenAIChatCompletion_NonStreamingTests.cs +++ b/dotnet/src/IntegrationTestsV2/Connectors/AzureOpenAI/AzureOpenAIChatCompletion_NonStreamingTests.cs @@ -17,7 +17,7 @@ namespace SemanticKernel.IntegrationTestsV2.Connectors.AzureOpenAI; #pragma warning disable xUnit1004 // Contains test methods used in manual verification. Disable warning for this file only. -public sealed class AzureOpenAIChatCompletionNonStreamingTests +public sealed class AzureOpenAIChatCompletionNonStreamingTests : BaseIntegrationTest { [Fact] public async Task ChatCompletionShouldUseChatSystemPromptAsync() @@ -27,7 +27,7 @@ public async Task ChatCompletionShouldUseChatSystemPromptAsync() var chatCompletion = kernel.Services.GetRequiredService(); - var settings = new AzureOpenAIPromptExecutionSettings { ChatSystemPrompt = "Reply \"I don't know\" to every question." }; + var settings = new AzureOpenAIChatCompletionExecutionSettings { ChatSystemPrompt = "Reply \"I don't know\" to every question." }; // Act var result = await chatCompletion.GetChatMessageContentAsync("What is the capital of France?", settings, kernel); @@ -93,7 +93,7 @@ public async Task TextGenerationShouldUseChatSystemPromptAsync() var textGeneration = kernel.Services.GetRequiredService(); - var settings = new AzureOpenAIPromptExecutionSettings { ChatSystemPrompt = "Reply \"I don't know\" to every question." }; + var settings = new AzureOpenAIChatCompletionExecutionSettings { ChatSystemPrompt = "Reply \"I don't know\" to every question." }; // Act var result = await textGeneration.GetTextContentAsync("What is the capital of France?", settings, kernel); @@ -158,7 +158,7 @@ private Kernel CreateAndInitializeKernel() Assert.NotNull(azureOpenAIConfiguration.ApiKey); Assert.NotNull(azureOpenAIConfiguration.Endpoint); - var kernelBuilder = Kernel.CreateBuilder(); + var kernelBuilder = base.CreateKernelBuilder(); kernelBuilder.AddAzureOpenAIChatCompletion( deploymentName: azureOpenAIConfiguration.ChatDeploymentName, diff --git a/dotnet/src/IntegrationTestsV2/Connectors/AzureOpenAI/AzureOpenAIChatCompletion_StreamingTests.cs b/dotnet/src/IntegrationTestsV2/Connectors/AzureOpenAI/AzureOpenAIChatCompletion_StreamingTests.cs index 57fb1c73fb72..03650720547b 100644 --- a/dotnet/src/IntegrationTestsV2/Connectors/AzureOpenAI/AzureOpenAIChatCompletion_StreamingTests.cs +++ b/dotnet/src/IntegrationTestsV2/Connectors/AzureOpenAI/AzureOpenAIChatCompletion_StreamingTests.cs @@ -16,7 +16,7 @@ namespace SemanticKernel.IntegrationTestsV2.Connectors.AzureOpenAI; #pragma warning disable xUnit1004 // Contains test methods used in manual verification. Disable warning for this file only. -public sealed class AzureOpenAIChatCompletionStreamingTests +public sealed class AzureOpenAIChatCompletionStreamingTests : BaseIntegrationTest { [Fact] public async Task ChatCompletionShouldUseChatSystemPromptAsync() @@ -26,7 +26,7 @@ public async Task ChatCompletionShouldUseChatSystemPromptAsync() var chatCompletion = kernel.Services.GetRequiredService(); - var settings = new AzureOpenAIPromptExecutionSettings { ChatSystemPrompt = "Reply \"I don't know\" to every question." }; + var settings = new AzureOpenAIChatCompletionExecutionSettings { ChatSystemPrompt = "Reply \"I don't know\" to every question." }; var stringBuilder = new StringBuilder(); @@ -89,7 +89,7 @@ public async Task TextGenerationShouldUseChatSystemPromptAsync() var textGeneration = kernel.Services.GetRequiredService(); - var settings = new AzureOpenAIPromptExecutionSettings { ChatSystemPrompt = "Reply \"I don't know\" to every question." }; + var settings = new AzureOpenAIChatCompletionExecutionSettings { ChatSystemPrompt = "Reply \"I don't know\" to every question." }; var stringBuilder = new StringBuilder(); @@ -152,7 +152,7 @@ private Kernel CreateAndInitializeKernel() Assert.NotNull(azureOpenAIConfiguration.ApiKey); Assert.NotNull(azureOpenAIConfiguration.Endpoint); - var kernelBuilder = Kernel.CreateBuilder(); + var kernelBuilder = base.CreateKernelBuilder(); kernelBuilder.AddAzureOpenAIChatCompletion( deploymentName: azureOpenAIConfiguration.ChatDeploymentName, From 41660a59495cd751b7238e577ef557d7bc89ee23 Mon Sep 17 00:00:00 2001 From: SergeyMenshykh Date: Mon, 1 Jul 2024 13:21:21 +0100 Subject: [PATCH 2/3] fix: address pr comments --- .../Connectors/Connectors.AzureOpenAI/Core/ClientCore.cs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/dotnet/src/Connectors/Connectors.AzureOpenAI/Core/ClientCore.cs b/dotnet/src/Connectors/Connectors.AzureOpenAI/Core/ClientCore.cs index 4c6f8264c778..0388d5ec5b4d 100644 --- a/dotnet/src/Connectors/Connectors.AzureOpenAI/Core/ClientCore.cs +++ b/dotnet/src/Connectors/Connectors.AzureOpenAI/Core/ClientCore.cs @@ -123,7 +123,7 @@ internal ClientCore(ILogger? logger = null) unit: "{token}", description: "Number of tokens used"); - private static Dictionary GetCompletionMetadata(OpenAIChatCompletion completions) + private static Dictionary GetChatCompletionMetadata(OpenAIChatCompletion completions) { #pragma warning disable AOAI001 // Type is for evaluation purposes only and is subject to change or removal in future updates. Suppress this diagnostic to proceed. return new Dictionary(8) @@ -142,7 +142,7 @@ internal ClientCore(ILogger? logger = null) #pragma warning restore AOAI001 // Type is for evaluation purposes only and is subject to change or removal in future updates. Suppress this diagnostic to proceed. } - private static Dictionary GetCompletionMetadata(StreamingChatCompletionUpdate completionUpdate) + private static Dictionary GetChatCompletionMetadata(StreamingChatCompletionUpdate completionUpdate) { return new Dictionary(4) { @@ -519,7 +519,7 @@ internal async IAsyncEnumerable GetStrea } StreamingChatCompletionUpdate chatCompletionUpdate = responseEnumerator.Current; - metadata = GetCompletionMetadata(chatCompletionUpdate); + metadata = GetChatCompletionMetadata(chatCompletionUpdate); streamedRole ??= chatCompletionUpdate.Role; //streamedName ??= update.AuthorName; finishReason = chatCompletionUpdate.FinishReason ?? default; @@ -1065,7 +1065,7 @@ private static ChatMessage CreateRequestMessage(OpenAIChatCompletion completion) private AzureOpenAIChatMessageContent CreateChatMessageContent(OpenAIChatCompletion completion) { - var message = new AzureOpenAIChatMessageContent(completion, this.DeploymentOrModelName, GetCompletionMetadata(completion)); + var message = new AzureOpenAIChatMessageContent(completion, this.DeploymentOrModelName, GetChatCompletionMetadata(completion)); message.Items.AddRange(this.GetFunctionCallContents(completion.ToolCalls)); From 0cf100a81925f0289a408518f410bb5fbc489653 Mon Sep 17 00:00:00 2001 From: SergeyMenshykh Date: Mon, 1 Jul 2024 16:37:57 +0100 Subject: [PATCH 3/3] fix: rollback renaming of the AzureOpenAIPromptExecutionSettings class. --- ...zureOpenAIPromptExecutionSettingsTests.cs} | 28 +++++++-------- .../AzureOpenAIChatCompletionServiceTests.cs | 30 ++++++++-------- .../AutoFunctionInvocationFilterTests.cs | 24 ++++++------- ... => AzureOpenAIPromptExecutionSettings.cs} | 16 ++++----- .../AzureOpenAIToolCallBehavior.cs | 4 +-- .../Connectors.AzureOpenAI/Core/ClientCore.cs | 18 +++++----- .../AzureOpenAIChatCompletionTests.cs | 6 ++-- ...enAIChatCompletion_FunctionCallingTests.cs | 34 +++++++++---------- ...eOpenAIChatCompletion_NonStreamingTests.cs | 4 +-- ...zureOpenAIChatCompletion_StreamingTests.cs | 4 +-- 10 files changed, 84 insertions(+), 84 deletions(-) rename dotnet/src/Connectors/Connectors.AzureOpenAI.UnitTests/{AzureOpenAIChatCompletionExecutionSettingsTests.cs => AzureOpenAIPromptExecutionSettingsTests.cs} (83%) rename dotnet/src/Connectors/Connectors.AzureOpenAI/{AzureOpenAIChatCompletionExecutionSettings.cs => AzureOpenAIPromptExecutionSettings.cs} (94%) diff --git a/dotnet/src/Connectors/Connectors.AzureOpenAI.UnitTests/AzureOpenAIChatCompletionExecutionSettingsTests.cs b/dotnet/src/Connectors/Connectors.AzureOpenAI.UnitTests/AzureOpenAIPromptExecutionSettingsTests.cs similarity index 83% rename from dotnet/src/Connectors/Connectors.AzureOpenAI.UnitTests/AzureOpenAIChatCompletionExecutionSettingsTests.cs rename to dotnet/src/Connectors/Connectors.AzureOpenAI.UnitTests/AzureOpenAIPromptExecutionSettingsTests.cs index 4443dea511cc..7b50e36c5587 100644 --- a/dotnet/src/Connectors/Connectors.AzureOpenAI.UnitTests/AzureOpenAIChatCompletionExecutionSettingsTests.cs +++ b/dotnet/src/Connectors/Connectors.AzureOpenAI.UnitTests/AzureOpenAIPromptExecutionSettingsTests.cs @@ -11,14 +11,14 @@ namespace SemanticKernel.Connectors.AzureOpenAI.UnitTests; /// /// Unit tests of AzureOpenAIPromptExecutionSettingsTests /// -public class AzureOpenAIChatCompletionExecutionSettingsTests +public class AzureOpenAIPromptExecutionSettingsTests { [Fact] public void ItCreatesOpenAIExecutionSettingsWithCorrectDefaults() { // Arrange // Act - AzureOpenAIChatCompletionExecutionSettings executionSettings = AzureOpenAIChatCompletionExecutionSettings.FromExecutionSettings(null, 128); + AzureOpenAIPromptExecutionSettings executionSettings = AzureOpenAIPromptExecutionSettings.FromExecutionSettings(null, 128); // Assert Assert.NotNull(executionSettings); @@ -38,7 +38,7 @@ public void ItCreatesOpenAIExecutionSettingsWithCorrectDefaults() public void ItUsesExistingOpenAIExecutionSettings() { // Arrange - AzureOpenAIChatCompletionExecutionSettings actualSettings = new() + AzureOpenAIPromptExecutionSettings actualSettings = new() { Temperature = 0.7, TopP = 0.7, @@ -53,7 +53,7 @@ public void ItUsesExistingOpenAIExecutionSettings() }; // Act - AzureOpenAIChatCompletionExecutionSettings executionSettings = AzureOpenAIChatCompletionExecutionSettings.FromExecutionSettings(actualSettings); + AzureOpenAIPromptExecutionSettings executionSettings = AzureOpenAIPromptExecutionSettings.FromExecutionSettings(actualSettings); // Assert Assert.NotNull(executionSettings); @@ -73,7 +73,7 @@ public void ItCanUseOpenAIExecutionSettings() }; // Act - AzureOpenAIChatCompletionExecutionSettings executionSettings = AzureOpenAIChatCompletionExecutionSettings.FromExecutionSettings(actualSettings, null); + AzureOpenAIPromptExecutionSettings executionSettings = AzureOpenAIPromptExecutionSettings.FromExecutionSettings(actualSettings, null); // Assert Assert.NotNull(executionSettings); @@ -105,7 +105,7 @@ public void ItCreatesOpenAIExecutionSettingsFromExtraPropertiesSnakeCase() }; // Act - AzureOpenAIChatCompletionExecutionSettings executionSettings = AzureOpenAIChatCompletionExecutionSettings.FromExecutionSettings(actualSettings, null); + AzureOpenAIPromptExecutionSettings executionSettings = AzureOpenAIPromptExecutionSettings.FromExecutionSettings(actualSettings, null); // Assert AssertExecutionSettings(executionSettings); @@ -135,7 +135,7 @@ public void ItCreatesOpenAIExecutionSettingsFromExtraPropertiesAsStrings() }; // Act - AzureOpenAIChatCompletionExecutionSettings executionSettings = AzureOpenAIChatCompletionExecutionSettings.FromExecutionSettings(actualSettings, null); + AzureOpenAIPromptExecutionSettings executionSettings = AzureOpenAIPromptExecutionSettings.FromExecutionSettings(actualSettings, null); // Assert AssertExecutionSettings(executionSettings); @@ -164,7 +164,7 @@ public void ItCreatesOpenAIExecutionSettingsFromJsonSnakeCase() var actualSettings = JsonSerializer.Deserialize(json); // Act - AzureOpenAIChatCompletionExecutionSettings executionSettings = AzureOpenAIChatCompletionExecutionSettings.FromExecutionSettings(actualSettings); + AzureOpenAIPromptExecutionSettings executionSettings = AzureOpenAIPromptExecutionSettings.FromExecutionSettings(actualSettings); // Assert AssertExecutionSettings(executionSettings); @@ -176,7 +176,7 @@ public void ItCreatesOpenAIExecutionSettingsFromJsonSnakeCase() public void ItUsesCorrectChatSystemPrompt(string chatSystemPrompt, string expectedChatSystemPrompt) { // Arrange & Act - var settings = new AzureOpenAIChatCompletionExecutionSettings { ChatSystemPrompt = chatSystemPrompt }; + var settings = new AzureOpenAIPromptExecutionSettings { ChatSystemPrompt = chatSystemPrompt }; // Assert Assert.Equal(expectedChatSystemPrompt, settings.ChatSystemPrompt); @@ -195,7 +195,7 @@ public void PromptExecutionSettingsCloneWorksAsExpected() "frequency_penalty": 0.0 } """; - var executionSettings = JsonSerializer.Deserialize(configPayload); + var executionSettings = JsonSerializer.Deserialize(configPayload); // Act var clone = executionSettings!.Clone(); @@ -221,7 +221,7 @@ public void PromptExecutionSettingsFreezeWorksAsExpected() "token_selection_biases": { "1": 2, "3": 4 } } """; - var executionSettings = JsonSerializer.Deserialize(configPayload); + var executionSettings = JsonSerializer.Deserialize(configPayload); // Act executionSettings!.Freeze(); @@ -242,17 +242,17 @@ public void PromptExecutionSettingsFreezeWorksAsExpected() public void FromExecutionSettingsWithDataDoesNotIncludeEmptyStopSequences() { // Arrange - var executionSettings = new AzureOpenAIChatCompletionExecutionSettings { StopSequences = [] }; + var executionSettings = new AzureOpenAIPromptExecutionSettings { StopSequences = [] }; // Act #pragma warning disable CS0618 // AzureOpenAIChatCompletionWithData is deprecated in favor of OpenAIPromptExecutionSettings.AzureChatExtensionsOptions - var executionSettingsWithData = AzureOpenAIChatCompletionExecutionSettings.FromExecutionSettingsWithData(executionSettings); + var executionSettingsWithData = AzureOpenAIPromptExecutionSettings.FromExecutionSettingsWithData(executionSettings); #pragma warning restore CS0618 // Assert Assert.Null(executionSettingsWithData.StopSequences); } - private static void AssertExecutionSettings(AzureOpenAIChatCompletionExecutionSettings executionSettings) + private static void AssertExecutionSettings(AzureOpenAIPromptExecutionSettings executionSettings) { Assert.NotNull(executionSettings); Assert.Equal(0.7, executionSettings.Temperature); diff --git a/dotnet/src/Connectors/Connectors.AzureOpenAI.UnitTests/ChatCompletion/AzureOpenAIChatCompletionServiceTests.cs b/dotnet/src/Connectors/Connectors.AzureOpenAI.UnitTests/ChatCompletion/AzureOpenAIChatCompletionServiceTests.cs index c4b4596f7a88..3b3c90687b45 100644 --- a/dotnet/src/Connectors/Connectors.AzureOpenAI.UnitTests/ChatCompletion/AzureOpenAIChatCompletionServiceTests.cs +++ b/dotnet/src/Connectors/Connectors.AzureOpenAI.UnitTests/ChatCompletion/AzureOpenAIChatCompletionServiceTests.cs @@ -121,7 +121,7 @@ public async Task GetChatMessageContentsHandlesSettingsCorrectlyAsync() { // Arrange var service = new AzureOpenAIChatCompletionService("deployment", "https://endpoint", "api-key", "model-id", this._httpClient); - var settings = new AzureOpenAIChatCompletionExecutionSettings() + var settings = new AzureOpenAIPromptExecutionSettings() { MaxTokens = 123, Temperature = 0.6, @@ -212,7 +212,7 @@ public async Task GetChatMessageContentsHandlesResponseFormatCorrectlyAsync(obje { // Arrange var service = new AzureOpenAIChatCompletionService("deployment", "https://endpoint", "api-key", "model-id", this._httpClient); - var settings = new AzureOpenAIChatCompletionExecutionSettings + var settings = new AzureOpenAIPromptExecutionSettings { ResponseFormat = responseFormat }; @@ -242,7 +242,7 @@ public async Task GetChatMessageContentsWorksCorrectlyAsync(AzureOpenAIToolCallB // Arrange var kernel = Kernel.CreateBuilder().Build(); var service = new AzureOpenAIChatCompletionService("deployment", "https://endpoint", "api-key", "model-id", this._httpClient); - var settings = new AzureOpenAIChatCompletionExecutionSettings() { ToolCallBehavior = behavior }; + var settings = new AzureOpenAIPromptExecutionSettings() { ToolCallBehavior = behavior }; this._messageHandlerStub.ResponsesToReturn.Add(new HttpResponseMessage(HttpStatusCode.OK) { @@ -288,7 +288,7 @@ public async Task GetChatMessageContentsWithFunctionCallAsync() kernel.Plugins.Add(KernelPluginFactory.CreateFromFunctions("MyPlugin", [function1, function2])); var service = new AzureOpenAIChatCompletionService("deployment", "https://endpoint", "api-key", "model-id", this._httpClient, this._mockLoggerFactory.Object); - var settings = new AzureOpenAIChatCompletionExecutionSettings() { ToolCallBehavior = AzureOpenAIToolCallBehavior.AutoInvokeKernelFunctions }; + var settings = new AzureOpenAIPromptExecutionSettings() { ToolCallBehavior = AzureOpenAIToolCallBehavior.AutoInvokeKernelFunctions }; using var response1 = new HttpResponseMessage(HttpStatusCode.OK) { Content = new StringContent(AzureOpenAITestHelper.GetTestResponse("chat_completion_multiple_function_calls_test_response.json")) }; using var response2 = new HttpResponseMessage(HttpStatusCode.OK) { Content = new StringContent(AzureOpenAITestHelper.GetTestResponse("chat_completion_test_response.json")) }; @@ -324,7 +324,7 @@ public async Task GetChatMessageContentsWithFunctionCallMaximumAutoInvokeAttempt kernel.Plugins.Add(KernelPluginFactory.CreateFromFunctions("MyPlugin", [function])); var service = new AzureOpenAIChatCompletionService("deployment", "https://endpoint", "api-key", "model-id", this._httpClient, this._mockLoggerFactory.Object); - var settings = new AzureOpenAIChatCompletionExecutionSettings() { ToolCallBehavior = AzureOpenAIToolCallBehavior.AutoInvokeKernelFunctions }; + var settings = new AzureOpenAIPromptExecutionSettings() { ToolCallBehavior = AzureOpenAIToolCallBehavior.AutoInvokeKernelFunctions }; var responses = new List(); @@ -361,7 +361,7 @@ public async Task GetChatMessageContentsWithRequiredFunctionCallAsync() kernel.Plugins.Add(plugin); var service = new AzureOpenAIChatCompletionService("deployment", "https://endpoint", "api-key", "model-id", this._httpClient, this._mockLoggerFactory.Object); - var settings = new AzureOpenAIChatCompletionExecutionSettings() { ToolCallBehavior = AzureOpenAIToolCallBehavior.RequireFunction(openAIFunction, autoInvoke: true) }; + var settings = new AzureOpenAIPromptExecutionSettings() { ToolCallBehavior = AzureOpenAIToolCallBehavior.RequireFunction(openAIFunction, autoInvoke: true) }; using var response1 = new HttpResponseMessage(HttpStatusCode.OK) { Content = new StringContent(AzureOpenAITestHelper.GetTestResponse("chat_completion_single_function_call_test_response.json")) }; using var response2 = new HttpResponseMessage(HttpStatusCode.OK) { Content = new StringContent(AzureOpenAITestHelper.GetTestResponse("chat_completion_test_response.json")) }; @@ -458,7 +458,7 @@ public async Task GetStreamingChatMessageContentsWithFunctionCallAsync() kernel.Plugins.Add(KernelPluginFactory.CreateFromFunctions("MyPlugin", [function1, function2])); var service = new AzureOpenAIChatCompletionService("deployment", "https://endpoint", "api-key", "model-id", this._httpClient, this._mockLoggerFactory.Object); - var settings = new AzureOpenAIChatCompletionExecutionSettings() { ToolCallBehavior = AzureOpenAIToolCallBehavior.AutoInvokeKernelFunctions }; + var settings = new AzureOpenAIPromptExecutionSettings() { ToolCallBehavior = AzureOpenAIToolCallBehavior.AutoInvokeKernelFunctions }; using var response1 = new HttpResponseMessage(HttpStatusCode.OK) { Content = AzureOpenAITestHelper.GetTestResponseAsStream("chat_completion_streaming_multiple_function_calls_test_response.txt") }; using var response2 = new HttpResponseMessage(HttpStatusCode.OK) { Content = AzureOpenAITestHelper.GetTestResponseAsStream("chat_completion_streaming_test_response.txt") }; @@ -502,7 +502,7 @@ public async Task GetStreamingChatMessageContentsWithFunctionCallMaximumAutoInvo kernel.Plugins.Add(KernelPluginFactory.CreateFromFunctions("MyPlugin", [function])); var service = new AzureOpenAIChatCompletionService("deployment", "https://endpoint", "api-key", "model-id", this._httpClient, this._mockLoggerFactory.Object); - var settings = new AzureOpenAIChatCompletionExecutionSettings() { ToolCallBehavior = AzureOpenAIToolCallBehavior.AutoInvokeKernelFunctions }; + var settings = new AzureOpenAIPromptExecutionSettings() { ToolCallBehavior = AzureOpenAIToolCallBehavior.AutoInvokeKernelFunctions }; var responses = new List(); @@ -541,7 +541,7 @@ public async Task GetStreamingChatMessageContentsWithRequiredFunctionCallAsync() kernel.Plugins.Add(plugin); var service = new AzureOpenAIChatCompletionService("deployment", "https://endpoint", "api-key", "model-id", this._httpClient, this._mockLoggerFactory.Object); - var settings = new AzureOpenAIChatCompletionExecutionSettings() { ToolCallBehavior = AzureOpenAIToolCallBehavior.RequireFunction(openAIFunction, autoInvoke: true) }; + var settings = new AzureOpenAIPromptExecutionSettings() { ToolCallBehavior = AzureOpenAIToolCallBehavior.RequireFunction(openAIFunction, autoInvoke: true) }; using var response1 = new HttpResponseMessage(HttpStatusCode.OK) { Content = AzureOpenAITestHelper.GetTestResponseAsStream("chat_completion_streaming_single_function_call_test_response.txt") }; using var response2 = new HttpResponseMessage(HttpStatusCode.OK) { Content = AzureOpenAITestHelper.GetTestResponseAsStream("chat_completion_streaming_test_response.txt") }; @@ -592,7 +592,7 @@ public async Task GetChatMessageContentsUsesPromptAndSettingsCorrectlyAsync() const string SystemMessage = "This is test system message"; var service = new AzureOpenAIChatCompletionService("deployment", "https://endpoint", "api-key", "model-id", this._httpClient); - var settings = new AzureOpenAIChatCompletionExecutionSettings() { ChatSystemPrompt = SystemMessage }; + var settings = new AzureOpenAIPromptExecutionSettings() { ChatSystemPrompt = SystemMessage }; this._messageHandlerStub.ResponsesToReturn.Add(new HttpResponseMessage(HttpStatusCode.OK) { @@ -636,7 +636,7 @@ public async Task GetChatMessageContentsWithChatMessageContentItemCollectionAndS const string CollectionItemPrompt = "This is collection item prompt"; var service = new AzureOpenAIChatCompletionService("deployment", "https://endpoint", "api-key", "model-id", this._httpClient); - var settings = new AzureOpenAIChatCompletionExecutionSettings() { ChatSystemPrompt = SystemMessage }; + var settings = new AzureOpenAIPromptExecutionSettings() { ChatSystemPrompt = SystemMessage }; this._messageHandlerStub.ResponsesToReturn.Add(new HttpResponseMessage(HttpStatusCode.OK) { @@ -700,7 +700,7 @@ public async Task FunctionCallsShouldBePropagatedToCallersViaChatMessageItemsOfT var chatHistory = new ChatHistory(); chatHistory.AddUserMessage("Fake prompt"); - var settings = new AzureOpenAIChatCompletionExecutionSettings() { ToolCallBehavior = AzureOpenAIToolCallBehavior.EnableKernelFunctions }; + var settings = new AzureOpenAIPromptExecutionSettings() { ToolCallBehavior = AzureOpenAIToolCallBehavior.EnableKernelFunctions }; // Act var result = await sut.GetChatMessageContentAsync(chatHistory, settings); @@ -770,7 +770,7 @@ public async Task FunctionCallsShouldBeReturnedToLLMAsync() new ChatMessageContent(AuthorRole.Assistant, items) ]; - var settings = new AzureOpenAIChatCompletionExecutionSettings() { ToolCallBehavior = AzureOpenAIToolCallBehavior.EnableKernelFunctions }; + var settings = new AzureOpenAIPromptExecutionSettings() { ToolCallBehavior = AzureOpenAIToolCallBehavior.EnableKernelFunctions }; // Act await sut.GetChatMessageContentAsync(chatHistory, settings); @@ -829,7 +829,7 @@ public async Task FunctionResultsCanBeProvidedToLLMAsOneResultPerChatMessageAsyn ]) }; - var settings = new AzureOpenAIChatCompletionExecutionSettings() { ToolCallBehavior = AzureOpenAIToolCallBehavior.EnableKernelFunctions }; + var settings = new AzureOpenAIPromptExecutionSettings() { ToolCallBehavior = AzureOpenAIToolCallBehavior.EnableKernelFunctions }; // Act await sut.GetChatMessageContentAsync(chatHistory, settings); @@ -874,7 +874,7 @@ public async Task FunctionResultsCanBeProvidedToLLMAsManyResultsInOneChatMessage ]) }; - var settings = new AzureOpenAIChatCompletionExecutionSettings() { ToolCallBehavior = AzureOpenAIToolCallBehavior.EnableKernelFunctions }; + var settings = new AzureOpenAIPromptExecutionSettings() { ToolCallBehavior = AzureOpenAIToolCallBehavior.EnableKernelFunctions }; // Act await sut.GetChatMessageContentAsync(chatHistory, settings); diff --git a/dotnet/src/Connectors/Connectors.AzureOpenAI.UnitTests/FunctionCalling/AutoFunctionInvocationFilterTests.cs b/dotnet/src/Connectors/Connectors.AzureOpenAI.UnitTests/FunctionCalling/AutoFunctionInvocationFilterTests.cs index 16a4b1d71275..195f71e2758f 100644 --- a/dotnet/src/Connectors/Connectors.AzureOpenAI.UnitTests/FunctionCalling/AutoFunctionInvocationFilterTests.cs +++ b/dotnet/src/Connectors/Connectors.AzureOpenAI.UnitTests/FunctionCalling/AutoFunctionInvocationFilterTests.cs @@ -62,7 +62,7 @@ public async Task FiltersAreExecutedCorrectlyAsync() this._messageHandlerStub.ResponsesToReturn = GetFunctionCallingResponses(); // Act - var result = await kernel.InvokePromptAsync("Test prompt", new(new AzureOpenAIChatCompletionExecutionSettings + var result = await kernel.InvokePromptAsync("Test prompt", new(new AzureOpenAIPromptExecutionSettings { ToolCallBehavior = AzureOpenAIToolCallBehavior.AutoInvokeKernelFunctions })); @@ -107,7 +107,7 @@ public async Task FiltersAreExecutedCorrectlyOnStreamingAsync() this._messageHandlerStub.ResponsesToReturn = GetFunctionCallingStreamingResponses(); - var executionSettings = new AzureOpenAIChatCompletionExecutionSettings { ToolCallBehavior = AzureOpenAIToolCallBehavior.AutoInvokeKernelFunctions }; + var executionSettings = new AzureOpenAIPromptExecutionSettings { ToolCallBehavior = AzureOpenAIToolCallBehavior.AutoInvokeKernelFunctions }; // Act await foreach (var item in kernel.InvokePromptStreamingAsync("Test prompt", new(executionSettings))) @@ -165,7 +165,7 @@ public async Task DifferentWaysOfAddingFiltersWorkCorrectlyAsync() // Case #2 - Add filter to kernel kernel.AutoFunctionInvocationFilters.Add(filter2); - var result = await kernel.InvokePromptAsync("Test prompt", new(new AzureOpenAIChatCompletionExecutionSettings + var result = await kernel.InvokePromptAsync("Test prompt", new(new AzureOpenAIPromptExecutionSettings { ToolCallBehavior = AzureOpenAIToolCallBehavior.AutoInvokeKernelFunctions })); @@ -225,7 +225,7 @@ public async Task MultipleFiltersAreExecutedInOrderAsync(bool isStreaming) var kernel = builder.Build(); - var arguments = new KernelArguments(new AzureOpenAIChatCompletionExecutionSettings + var arguments = new KernelArguments(new AzureOpenAIPromptExecutionSettings { ToolCallBehavior = AzureOpenAIToolCallBehavior.AutoInvokeKernelFunctions }); @@ -275,7 +275,7 @@ public async Task FilterCanOverrideArgumentsAsync() this._messageHandlerStub.ResponsesToReturn = GetFunctionCallingResponses(); // Act - var result = await kernel.InvokePromptAsync("Test prompt", new(new AzureOpenAIChatCompletionExecutionSettings + var result = await kernel.InvokePromptAsync("Test prompt", new(new AzureOpenAIPromptExecutionSettings { ToolCallBehavior = AzureOpenAIToolCallBehavior.AutoInvokeKernelFunctions })); @@ -309,7 +309,7 @@ public async Task FilterCanHandleExceptionAsync() var chatCompletion = new AzureOpenAIChatCompletionService("test-deployment", "https://endpoint", "test-api-key", "test-model-id", this._httpClient); - var executionSettings = new AzureOpenAIChatCompletionExecutionSettings { ToolCallBehavior = AzureOpenAIToolCallBehavior.AutoInvokeKernelFunctions }; + var executionSettings = new AzureOpenAIPromptExecutionSettings { ToolCallBehavior = AzureOpenAIToolCallBehavior.AutoInvokeKernelFunctions }; var chatHistory = new ChatHistory(); chatHistory.AddSystemMessage("System message"); @@ -350,7 +350,7 @@ public async Task FilterCanHandleExceptionOnStreamingAsync() var chatCompletion = new AzureOpenAIChatCompletionService("test-deployment", "https://endpoint", "test-api-key", "test-model-id", this._httpClient); var chatHistory = new ChatHistory(); - var executionSettings = new AzureOpenAIChatCompletionExecutionSettings { ToolCallBehavior = AzureOpenAIToolCallBehavior.AutoInvokeKernelFunctions }; + var executionSettings = new AzureOpenAIPromptExecutionSettings { ToolCallBehavior = AzureOpenAIToolCallBehavior.AutoInvokeKernelFunctions }; // Act await foreach (var item in chatCompletion.GetStreamingChatMessageContentsAsync(chatHistory, executionSettings, kernel)) @@ -394,7 +394,7 @@ public async Task FiltersCanSkipFunctionExecutionAsync() this._messageHandlerStub.ResponsesToReturn = [response1, response2]; // Act - var result = await kernel.InvokePromptAsync("Test prompt", new(new AzureOpenAIChatCompletionExecutionSettings + var result = await kernel.InvokePromptAsync("Test prompt", new(new AzureOpenAIPromptExecutionSettings { ToolCallBehavior = AzureOpenAIToolCallBehavior.AutoInvokeKernelFunctions })); @@ -428,7 +428,7 @@ public async Task PreFilterCanTerminateOperationAsync() this._messageHandlerStub.ResponsesToReturn = GetFunctionCallingResponses(); // Act - await kernel.InvokePromptAsync("Test prompt", new(new AzureOpenAIChatCompletionExecutionSettings + await kernel.InvokePromptAsync("Test prompt", new(new AzureOpenAIPromptExecutionSettings { ToolCallBehavior = AzureOpenAIToolCallBehavior.AutoInvokeKernelFunctions })); @@ -460,7 +460,7 @@ public async Task PreFilterCanTerminateOperationOnStreamingAsync() this._messageHandlerStub.ResponsesToReturn = GetFunctionCallingStreamingResponses(); - var executionSettings = new AzureOpenAIChatCompletionExecutionSettings { ToolCallBehavior = AzureOpenAIToolCallBehavior.AutoInvokeKernelFunctions }; + var executionSettings = new AzureOpenAIPromptExecutionSettings { ToolCallBehavior = AzureOpenAIToolCallBehavior.AutoInvokeKernelFunctions }; // Act await foreach (var item in kernel.InvokePromptStreamingAsync("Test prompt", new(executionSettings))) @@ -499,7 +499,7 @@ public async Task PostFilterCanTerminateOperationAsync() this._messageHandlerStub.ResponsesToReturn = GetFunctionCallingResponses(); // Act - var result = await kernel.InvokePromptAsync("Test prompt", new(new AzureOpenAIChatCompletionExecutionSettings + var result = await kernel.InvokePromptAsync("Test prompt", new(new AzureOpenAIPromptExecutionSettings { ToolCallBehavior = AzureOpenAIToolCallBehavior.AutoInvokeKernelFunctions })); @@ -545,7 +545,7 @@ public async Task PostFilterCanTerminateOperationOnStreamingAsync() this._messageHandlerStub.ResponsesToReturn = GetFunctionCallingStreamingResponses(); - var executionSettings = new AzureOpenAIChatCompletionExecutionSettings { ToolCallBehavior = AzureOpenAIToolCallBehavior.AutoInvokeKernelFunctions }; + var executionSettings = new AzureOpenAIPromptExecutionSettings { ToolCallBehavior = AzureOpenAIToolCallBehavior.AutoInvokeKernelFunctions }; List streamingContent = []; diff --git a/dotnet/src/Connectors/Connectors.AzureOpenAI/AzureOpenAIChatCompletionExecutionSettings.cs b/dotnet/src/Connectors/Connectors.AzureOpenAI/AzureOpenAIPromptExecutionSettings.cs similarity index 94% rename from dotnet/src/Connectors/Connectors.AzureOpenAI/AzureOpenAIChatCompletionExecutionSettings.cs rename to dotnet/src/Connectors/Connectors.AzureOpenAI/AzureOpenAIPromptExecutionSettings.cs index dd787c915166..22141ee8aee0 100644 --- a/dotnet/src/Connectors/Connectors.AzureOpenAI/AzureOpenAIChatCompletionExecutionSettings.cs +++ b/dotnet/src/Connectors/Connectors.AzureOpenAI/AzureOpenAIPromptExecutionSettings.cs @@ -17,7 +17,7 @@ namespace Microsoft.SemanticKernel.Connectors.AzureOpenAI; /// Execution settings for an AzureOpenAI completion request. /// [JsonNumberHandling(JsonNumberHandling.AllowReadingFromString)] -public sealed class AzureOpenAIChatCompletionExecutionSettings : PromptExecutionSettings +public sealed class AzureOpenAIPromptExecutionSettings : PromptExecutionSettings { /// /// Temperature controls the randomness of the completion. @@ -312,7 +312,7 @@ public override void Freeze() /// public override PromptExecutionSettings Clone() { - return new AzureOpenAIChatCompletionExecutionSettings() + return new AzureOpenAIPromptExecutionSettings() { ModelId = this.ModelId, ExtensionData = this.ExtensionData is not null ? new Dictionary(this.ExtensionData) : null, @@ -345,30 +345,30 @@ public override PromptExecutionSettings Clone() /// Template configuration /// Default max tokens /// An instance of OpenAIPromptExecutionSettings - public static AzureOpenAIChatCompletionExecutionSettings FromExecutionSettings(PromptExecutionSettings? executionSettings, int? defaultMaxTokens = null) + public static AzureOpenAIPromptExecutionSettings FromExecutionSettings(PromptExecutionSettings? executionSettings, int? defaultMaxTokens = null) { if (executionSettings is null) { - return new AzureOpenAIChatCompletionExecutionSettings() + return new AzureOpenAIPromptExecutionSettings() { MaxTokens = defaultMaxTokens }; } - if (executionSettings is AzureOpenAIChatCompletionExecutionSettings settings) + if (executionSettings is AzureOpenAIPromptExecutionSettings settings) { return settings; } var json = JsonSerializer.Serialize(executionSettings); - var openAIExecutionSettings = JsonSerializer.Deserialize(json, JsonOptionsCache.ReadPermissive); + var openAIExecutionSettings = JsonSerializer.Deserialize(json, JsonOptionsCache.ReadPermissive); if (openAIExecutionSettings is not null) { return openAIExecutionSettings; } - throw new ArgumentException($"Invalid execution settings, cannot convert to {nameof(AzureOpenAIChatCompletionExecutionSettings)}", nameof(executionSettings)); + throw new ArgumentException($"Invalid execution settings, cannot convert to {nameof(AzureOpenAIPromptExecutionSettings)}", nameof(executionSettings)); } /// @@ -378,7 +378,7 @@ public static AzureOpenAIChatCompletionExecutionSettings FromExecutionSettings(P /// Default max tokens /// An instance of OpenAIPromptExecutionSettings [Obsolete("This method is deprecated in favor of OpenAIPromptExecutionSettings.AzureChatExtensionsOptions")] - public static AzureOpenAIChatCompletionExecutionSettings FromExecutionSettingsWithData(PromptExecutionSettings? executionSettings, int? defaultMaxTokens = null) + public static AzureOpenAIPromptExecutionSettings FromExecutionSettingsWithData(PromptExecutionSettings? executionSettings, int? defaultMaxTokens = null) { var settings = FromExecutionSettings(executionSettings, defaultMaxTokens); diff --git a/dotnet/src/Connectors/Connectors.AzureOpenAI/AzureOpenAIToolCallBehavior.cs b/dotnet/src/Connectors/Connectors.AzureOpenAI/AzureOpenAIToolCallBehavior.cs index f2b3d6f9f5a0..e9dbd224b2a0 100644 --- a/dotnet/src/Connectors/Connectors.AzureOpenAI/AzureOpenAIToolCallBehavior.cs +++ b/dotnet/src/Connectors/Connectors.AzureOpenAI/AzureOpenAIToolCallBehavior.cs @@ -62,7 +62,7 @@ public abstract class AzureOpenAIToolCallBehavior /// The functions that should be made available to the model. /// true to attempt to automatically handle function call requests; otherwise, false. /// - /// The that may be set into + /// The that may be set into /// to indicate that the specified functions should be made available to the model. /// public static AzureOpenAIToolCallBehavior EnableFunctions(IEnumerable functions, bool autoInvoke = false) @@ -75,7 +75,7 @@ public static AzureOpenAIToolCallBehavior EnableFunctions(IEnumerableThe function the model should request to use. /// true to attempt to automatically handle function call requests; otherwise, false. /// - /// The that may be set into + /// The that may be set into /// to indicate that the specified function should be requested by the model. /// public static AzureOpenAIToolCallBehavior RequireFunction(AzureOpenAIFunction function, bool autoInvoke = false) diff --git a/dotnet/src/Connectors/Connectors.AzureOpenAI/Core/ClientCore.cs b/dotnet/src/Connectors/Connectors.AzureOpenAI/Core/ClientCore.cs index 0388d5ec5b4d..9dea5efb2cf9 100644 --- a/dotnet/src/Connectors/Connectors.AzureOpenAI/Core/ClientCore.cs +++ b/dotnet/src/Connectors/Connectors.AzureOpenAI/Core/ClientCore.cs @@ -261,7 +261,7 @@ internal async Task> GetChatMessageContentsAsy } // Convert the incoming execution settings to OpenAI settings. - AzureOpenAIChatCompletionExecutionSettings chatExecutionSettings = AzureOpenAIChatCompletionExecutionSettings.FromExecutionSettings(executionSettings); + AzureOpenAIPromptExecutionSettings chatExecutionSettings = AzureOpenAIPromptExecutionSettings.FromExecutionSettings(executionSettings); ValidateMaxTokens(chatExecutionSettings.MaxTokens); @@ -454,7 +454,7 @@ internal async IAsyncEnumerable GetStrea JsonSerializer.Serialize(executionSettings)); } - AzureOpenAIChatCompletionExecutionSettings chatExecutionSettings = AzureOpenAIChatCompletionExecutionSettings.FromExecutionSettings(executionSettings); + AzureOpenAIPromptExecutionSettings chatExecutionSettings = AzureOpenAIPromptExecutionSettings.FromExecutionSettings(executionSettings); ValidateMaxTokens(chatExecutionSettings.MaxTokens); @@ -731,7 +731,7 @@ internal async IAsyncEnumerable GetChatAsTextStreamingCont Kernel? kernel, [EnumeratorCancellation] CancellationToken cancellationToken = default) { - AzureOpenAIChatCompletionExecutionSettings chatSettings = AzureOpenAIChatCompletionExecutionSettings.FromExecutionSettings(executionSettings); + AzureOpenAIPromptExecutionSettings chatSettings = AzureOpenAIPromptExecutionSettings.FromExecutionSettings(executionSettings); ChatHistory chat = CreateNewChat(prompt, chatSettings); await foreach (var chatUpdate in this.GetStreamingChatMessageContentsAsync(chat, executionSettings, kernel, cancellationToken).ConfigureAwait(false)) @@ -746,7 +746,7 @@ internal async Task> GetChatAsTextContentsAsync( Kernel? kernel, CancellationToken cancellationToken = default) { - AzureOpenAIChatCompletionExecutionSettings chatSettings = AzureOpenAIChatCompletionExecutionSettings.FromExecutionSettings(executionSettings); + AzureOpenAIPromptExecutionSettings chatSettings = AzureOpenAIPromptExecutionSettings.FromExecutionSettings(executionSettings); ChatHistory chat = CreateNewChat(text, chatSettings); return (await this.GetChatMessageContentsAsync(chat, chatSettings, kernel, cancellationToken).ConfigureAwait(false)) @@ -790,7 +790,7 @@ internal static AzureOpenAIClientOptions GetAzureOpenAIClientOptions(HttpClient? /// Optional chat instructions for the AI service /// Execution settings /// Chat object - private static ChatHistory CreateNewChat(string? text = null, AzureOpenAIChatCompletionExecutionSettings? executionSettings = null) + private static ChatHistory CreateNewChat(string? text = null, AzureOpenAIPromptExecutionSettings? executionSettings = null) { var chat = new ChatHistory(); @@ -812,7 +812,7 @@ private static ChatHistory CreateNewChat(string? text = null, AzureOpenAIChatCom } private ChatCompletionOptions CreateChatCompletionOptions( - AzureOpenAIChatCompletionExecutionSettings executionSettings, + AzureOpenAIPromptExecutionSettings executionSettings, ChatHistory chatHistory, ToolCallingConfig toolCallingConfig, Kernel? kernel) @@ -863,7 +863,7 @@ private ChatCompletionOptions CreateChatCompletionOptions( return options; } - private static List CreateChatCompletionMessages(AzureOpenAIChatCompletionExecutionSettings executionSettings, ChatHistory chatHistory) + private static List CreateChatCompletionMessages(AzureOpenAIPromptExecutionSettings executionSettings, ChatHistory chatHistory) { List messages = []; @@ -1291,7 +1291,7 @@ await autoFunctionInvocationFilters[index].OnAutoFunctionInvocationAsync(context } } - private ToolCallingConfig GetToolCallingConfiguration(Kernel? kernel, AzureOpenAIChatCompletionExecutionSettings executionSettings, int requestIndex) + private ToolCallingConfig GetToolCallingConfiguration(Kernel? kernel, AzureOpenAIPromptExecutionSettings executionSettings, int requestIndex) { if (executionSettings.ToolCallBehavior is null) { @@ -1331,7 +1331,7 @@ private ToolCallingConfig GetToolCallingConfiguration(Kernel? kernel, AzureOpenA AutoInvoke: autoInvoke); } - private static ChatResponseFormat? GetResponseFormat(AzureOpenAIChatCompletionExecutionSettings executionSettings) + private static ChatResponseFormat? GetResponseFormat(AzureOpenAIPromptExecutionSettings executionSettings) { switch (executionSettings.ResponseFormat) { diff --git a/dotnet/src/IntegrationTestsV2/Connectors/AzureOpenAI/AzureOpenAIChatCompletionTests.cs b/dotnet/src/IntegrationTestsV2/Connectors/AzureOpenAI/AzureOpenAIChatCompletionTests.cs index 4ec42f96ddfd..69509508af98 100644 --- a/dotnet/src/IntegrationTestsV2/Connectors/AzureOpenAI/AzureOpenAIChatCompletionTests.cs +++ b/dotnet/src/IntegrationTestsV2/Connectors/AzureOpenAI/AzureOpenAIChatCompletionTests.cs @@ -33,7 +33,7 @@ public async Task ItCanUseAzureOpenAiChatForTextGenerationAsync() var func = kernel.CreateFunctionFromPrompt( "List the two planets after '{{$input}}', excluding moons, using bullet points.", - new AzureOpenAIChatCompletionExecutionSettings()); + new AzureOpenAIPromptExecutionSettings()); // Act var result = await func.InvokeAsync(kernel, new() { [InputParameterName] = "Jupiter" }); @@ -169,7 +169,7 @@ public async Task ChatSystemPromptIsNotIgnoredAsync() // Arrange var kernel = this.CreateAndInitializeKernel(); - var settings = new AzureOpenAIChatCompletionExecutionSettings { ChatSystemPrompt = "Reply \"I don't know\" to every question." }; + var settings = new AzureOpenAIPromptExecutionSettings { ChatSystemPrompt = "Reply \"I don't know\" to every question." }; // Act var result = await kernel.InvokePromptAsync("Where is the most famous fish market in Seattle, Washington, USA?", new(settings)); @@ -205,7 +205,7 @@ public async Task SemanticKernelVersionHeaderIsSentAsync() public async Task LogProbsDataIsReturnedWhenRequestedAsync(bool? logprobs, int? topLogprobs) { // Arrange - var settings = new AzureOpenAIChatCompletionExecutionSettings { Logprobs = logprobs, TopLogprobs = topLogprobs }; + var settings = new AzureOpenAIPromptExecutionSettings { Logprobs = logprobs, TopLogprobs = topLogprobs }; var kernel = this.CreateAndInitializeKernel(); diff --git a/dotnet/src/IntegrationTestsV2/Connectors/AzureOpenAI/AzureOpenAIChatCompletion_FunctionCallingTests.cs b/dotnet/src/IntegrationTestsV2/Connectors/AzureOpenAI/AzureOpenAIChatCompletion_FunctionCallingTests.cs index ac5347d82e07..f90102d62834 100644 --- a/dotnet/src/IntegrationTestsV2/Connectors/AzureOpenAI/AzureOpenAIChatCompletion_FunctionCallingTests.cs +++ b/dotnet/src/IntegrationTestsV2/Connectors/AzureOpenAI/AzureOpenAIChatCompletion_FunctionCallingTests.cs @@ -33,7 +33,7 @@ public async Task CanAutoInvokeKernelFunctionsAsync() var kernel = this.CreateAndInitializeKernel(importHelperPlugin: true); kernel.FunctionInvocationFilters.Add(filter); - AzureOpenAIChatCompletionExecutionSettings settings = new() { ToolCallBehavior = AzureOpenAIToolCallBehavior.AutoInvokeKernelFunctions }; + AzureOpenAIPromptExecutionSettings settings = new() { ToolCallBehavior = AzureOpenAIToolCallBehavior.AutoInvokeKernelFunctions }; // Act var result = await kernel.InvokePromptAsync("Given the current time of day and weather, what is the likely color of the sky in Boston?", new(settings)); @@ -59,7 +59,7 @@ public async Task CanAutoInvokeKernelFunctionsStreamingAsync() var kernel = this.CreateAndInitializeKernel(importHelperPlugin: true); kernel.FunctionInvocationFilters.Add(filter); - AzureOpenAIChatCompletionExecutionSettings settings = new() { ToolCallBehavior = AzureOpenAIToolCallBehavior.AutoInvokeKernelFunctions }; + AzureOpenAIPromptExecutionSettings settings = new() { ToolCallBehavior = AzureOpenAIToolCallBehavior.AutoInvokeKernelFunctions }; var stringBuilder = new StringBuilder(); @@ -81,7 +81,7 @@ public async Task CanAutoInvokeKernelFunctionsWithComplexTypeParametersAsync() // Arrange var kernel = this.CreateAndInitializeKernel(importHelperPlugin: true); - AzureOpenAIChatCompletionExecutionSettings settings = new() { ToolCallBehavior = AzureOpenAIToolCallBehavior.AutoInvokeKernelFunctions }; + AzureOpenAIPromptExecutionSettings settings = new() { ToolCallBehavior = AzureOpenAIToolCallBehavior.AutoInvokeKernelFunctions }; // Act var result = await kernel.InvokePromptAsync("What is the current temperature in Dublin, Ireland, in Fahrenheit?", new(settings)); @@ -97,7 +97,7 @@ public async Task CanAutoInvokeKernelFunctionsWithPrimitiveTypeParametersAsync() // Arrange var kernel = this.CreateAndInitializeKernel(importHelperPlugin: true); - AzureOpenAIChatCompletionExecutionSettings settings = new() { ToolCallBehavior = AzureOpenAIToolCallBehavior.AutoInvokeKernelFunctions }; + AzureOpenAIPromptExecutionSettings settings = new() { ToolCallBehavior = AzureOpenAIToolCallBehavior.AutoInvokeKernelFunctions }; // Act var result = await kernel.InvokePromptAsync("Convert 50 degrees Fahrenheit to Celsius.", new(settings)); @@ -113,7 +113,7 @@ public async Task CanAutoInvokeKernelFunctionsWithEnumTypeParametersAsync() // Arrange var kernel = this.CreateAndInitializeKernel(importHelperPlugin: true); - AzureOpenAIChatCompletionExecutionSettings settings = new() { ToolCallBehavior = AzureOpenAIToolCallBehavior.AutoInvokeKernelFunctions }; + AzureOpenAIPromptExecutionSettings settings = new() { ToolCallBehavior = AzureOpenAIToolCallBehavior.AutoInvokeKernelFunctions }; // Act var result = await kernel.InvokePromptAsync("Given the current time of day and weather, what is the likely color of the sky in Boston?", new(settings)); @@ -139,7 +139,7 @@ public async Task CanAutoInvokeKernelFunctionFromPromptAsync() "Delivers up-to-date news content.", [promptFunction])); - AzureOpenAIChatCompletionExecutionSettings settings = new() { ToolCallBehavior = AzureOpenAIToolCallBehavior.AutoInvokeKernelFunctions }; + AzureOpenAIPromptExecutionSettings settings = new() { ToolCallBehavior = AzureOpenAIToolCallBehavior.AutoInvokeKernelFunctions }; // Act var result = await kernel.InvokePromptAsync("Show me the latest news as they are.", new(settings)); @@ -165,7 +165,7 @@ public async Task CanAutoInvokeKernelFunctionFromPromptStreamingAsync() "Delivers up-to-date news content.", [promptFunction])); - AzureOpenAIChatCompletionExecutionSettings settings = new() { ToolCallBehavior = AzureOpenAIToolCallBehavior.AutoInvokeKernelFunctions }; + AzureOpenAIPromptExecutionSettings settings = new() { ToolCallBehavior = AzureOpenAIToolCallBehavior.AutoInvokeKernelFunctions }; // Act var streamingResult = kernel.InvokePromptStreamingAsync("Show me the latest news as they are.", new(settings)); @@ -193,7 +193,7 @@ public async Task ConnectorSpecificChatMessageContentClassesCanBeUsedForManualFu var chatHistory = new ChatHistory(); chatHistory.AddUserMessage("Given the current time of day and weather, what is the likely color of the sky in Boston?"); - var settings = new AzureOpenAIChatCompletionExecutionSettings() { ToolCallBehavior = AzureOpenAIToolCallBehavior.EnableKernelFunctions }; + var settings = new AzureOpenAIPromptExecutionSettings() { ToolCallBehavior = AzureOpenAIToolCallBehavior.EnableKernelFunctions }; var sut = kernel.GetRequiredService(); @@ -240,7 +240,7 @@ public async Task ConnectorAgnosticFunctionCallingModelClassesCanBeUsedForManual var chatHistory = new ChatHistory(); chatHistory.AddUserMessage("Given the current time of day and weather, what is the likely color of the sky in Boston?"); - var settings = new AzureOpenAIChatCompletionExecutionSettings() { ToolCallBehavior = AzureOpenAIToolCallBehavior.EnableKernelFunctions }; + var settings = new AzureOpenAIPromptExecutionSettings() { ToolCallBehavior = AzureOpenAIToolCallBehavior.EnableKernelFunctions }; var sut = kernel.GetRequiredService(); @@ -281,7 +281,7 @@ public async Task ConnectorAgnosticFunctionCallingModelClassesCanPassFunctionExc chatHistory.AddSystemMessage("Add the \"Error\" keyword to the response, if you are unable to answer a question or an error has happen."); chatHistory.AddUserMessage("Given the current time of day and weather, what is the likely color of the sky in Boston?"); - var settings = new AzureOpenAIChatCompletionExecutionSettings() { ToolCallBehavior = AzureOpenAIToolCallBehavior.EnableKernelFunctions }; + var settings = new AzureOpenAIPromptExecutionSettings() { ToolCallBehavior = AzureOpenAIToolCallBehavior.EnableKernelFunctions }; var completionService = kernel.GetRequiredService(); @@ -325,7 +325,7 @@ public async Task ConnectorAgnosticFunctionCallingModelClassesSupportSimulatedFu chatHistory.AddSystemMessage("if there's a tornado warning, please add the 'tornado' keyword to the response."); chatHistory.AddUserMessage("Given the current time of day and weather, what is the likely color of the sky in Boston?"); - var settings = new AzureOpenAIChatCompletionExecutionSettings() { ToolCallBehavior = AzureOpenAIToolCallBehavior.EnableKernelFunctions }; + var settings = new AzureOpenAIPromptExecutionSettings() { ToolCallBehavior = AzureOpenAIToolCallBehavior.EnableKernelFunctions }; var completionService = kernel.GetRequiredService(); @@ -373,7 +373,7 @@ public async Task ItFailsIfNoFunctionResultProvidedAsync() var chatHistory = new ChatHistory(); chatHistory.AddUserMessage("Given the current time of day and weather, what is the likely color of the sky in Boston?"); - var settings = new AzureOpenAIChatCompletionExecutionSettings() { ToolCallBehavior = AzureOpenAIToolCallBehavior.EnableKernelFunctions }; + var settings = new AzureOpenAIPromptExecutionSettings() { ToolCallBehavior = AzureOpenAIToolCallBehavior.EnableKernelFunctions }; var completionService = kernel.GetRequiredService(); @@ -397,7 +397,7 @@ public async Task ConnectorAgnosticFunctionCallingModelClassesCanBeUsedForAutoFu var chatHistory = new ChatHistory(); chatHistory.AddUserMessage("Given the current time of day and weather, what is the likely color of the sky in Boston?"); - var settings = new AzureOpenAIChatCompletionExecutionSettings() { ToolCallBehavior = AzureOpenAIToolCallBehavior.AutoInvokeKernelFunctions }; + var settings = new AzureOpenAIPromptExecutionSettings() { ToolCallBehavior = AzureOpenAIToolCallBehavior.AutoInvokeKernelFunctions }; var sut = kernel.GetRequiredService(); @@ -457,7 +457,7 @@ public async Task ConnectorAgnosticFunctionCallingModelClassesCanBeUsedForManual // Arrange var kernel = this.CreateAndInitializeKernel(importHelperPlugin: true); - var settings = new AzureOpenAIChatCompletionExecutionSettings() { ToolCallBehavior = AzureOpenAIToolCallBehavior.EnableKernelFunctions }; + var settings = new AzureOpenAIPromptExecutionSettings() { ToolCallBehavior = AzureOpenAIToolCallBehavior.EnableKernelFunctions }; var sut = kernel.GetRequiredService(); @@ -516,7 +516,7 @@ public async Task ConnectorAgnosticFunctionCallingModelClassesCanBeUsedForAutoFu var chatHistory = new ChatHistory(); chatHistory.AddUserMessage("Given the current time of day and weather, what is the likely color of the sky in Boston?"); - var settings = new AzureOpenAIChatCompletionExecutionSettings() { ToolCallBehavior = AzureOpenAIToolCallBehavior.AutoInvokeKernelFunctions }; + var settings = new AzureOpenAIPromptExecutionSettings() { ToolCallBehavior = AzureOpenAIToolCallBehavior.AutoInvokeKernelFunctions }; var sut = kernel.GetRequiredService(); @@ -581,7 +581,7 @@ public async Task ConnectorAgnosticFunctionCallingModelClassesCanPassFunctionExc // Arrange var kernel = this.CreateAndInitializeKernel(importHelperPlugin: true); - var settings = new AzureOpenAIChatCompletionExecutionSettings() { ToolCallBehavior = AzureOpenAIToolCallBehavior.EnableKernelFunctions }; + var settings = new AzureOpenAIPromptExecutionSettings() { ToolCallBehavior = AzureOpenAIToolCallBehavior.EnableKernelFunctions }; var sut = kernel.GetRequiredService(); @@ -639,7 +639,7 @@ public async Task ConnectorAgnosticFunctionCallingModelClassesSupportSimulatedFu // Arrange var kernel = this.CreateAndInitializeKernel(importHelperPlugin: true); - var settings = new AzureOpenAIChatCompletionExecutionSettings() { ToolCallBehavior = AzureOpenAIToolCallBehavior.EnableKernelFunctions }; + var settings = new AzureOpenAIPromptExecutionSettings() { ToolCallBehavior = AzureOpenAIToolCallBehavior.EnableKernelFunctions }; var sut = kernel.GetRequiredService(); diff --git a/dotnet/src/IntegrationTestsV2/Connectors/AzureOpenAI/AzureOpenAIChatCompletion_NonStreamingTests.cs b/dotnet/src/IntegrationTestsV2/Connectors/AzureOpenAI/AzureOpenAIChatCompletion_NonStreamingTests.cs index 9a011541ebab..5847ad29a6d1 100644 --- a/dotnet/src/IntegrationTestsV2/Connectors/AzureOpenAI/AzureOpenAIChatCompletion_NonStreamingTests.cs +++ b/dotnet/src/IntegrationTestsV2/Connectors/AzureOpenAI/AzureOpenAIChatCompletion_NonStreamingTests.cs @@ -27,7 +27,7 @@ public async Task ChatCompletionShouldUseChatSystemPromptAsync() var chatCompletion = kernel.Services.GetRequiredService(); - var settings = new AzureOpenAIChatCompletionExecutionSettings { ChatSystemPrompt = "Reply \"I don't know\" to every question." }; + var settings = new AzureOpenAIPromptExecutionSettings { ChatSystemPrompt = "Reply \"I don't know\" to every question." }; // Act var result = await chatCompletion.GetChatMessageContentAsync("What is the capital of France?", settings, kernel); @@ -93,7 +93,7 @@ public async Task TextGenerationShouldUseChatSystemPromptAsync() var textGeneration = kernel.Services.GetRequiredService(); - var settings = new AzureOpenAIChatCompletionExecutionSettings { ChatSystemPrompt = "Reply \"I don't know\" to every question." }; + var settings = new AzureOpenAIPromptExecutionSettings { ChatSystemPrompt = "Reply \"I don't know\" to every question." }; // Act var result = await textGeneration.GetTextContentAsync("What is the capital of France?", settings, kernel); diff --git a/dotnet/src/IntegrationTestsV2/Connectors/AzureOpenAI/AzureOpenAIChatCompletion_StreamingTests.cs b/dotnet/src/IntegrationTestsV2/Connectors/AzureOpenAI/AzureOpenAIChatCompletion_StreamingTests.cs index 03650720547b..f340064b2ee3 100644 --- a/dotnet/src/IntegrationTestsV2/Connectors/AzureOpenAI/AzureOpenAIChatCompletion_StreamingTests.cs +++ b/dotnet/src/IntegrationTestsV2/Connectors/AzureOpenAI/AzureOpenAIChatCompletion_StreamingTests.cs @@ -26,7 +26,7 @@ public async Task ChatCompletionShouldUseChatSystemPromptAsync() var chatCompletion = kernel.Services.GetRequiredService(); - var settings = new AzureOpenAIChatCompletionExecutionSettings { ChatSystemPrompt = "Reply \"I don't know\" to every question." }; + var settings = new AzureOpenAIPromptExecutionSettings { ChatSystemPrompt = "Reply \"I don't know\" to every question." }; var stringBuilder = new StringBuilder(); @@ -89,7 +89,7 @@ public async Task TextGenerationShouldUseChatSystemPromptAsync() var textGeneration = kernel.Services.GetRequiredService(); - var settings = new AzureOpenAIChatCompletionExecutionSettings { ChatSystemPrompt = "Reply \"I don't know\" to every question." }; + var settings = new AzureOpenAIPromptExecutionSettings { ChatSystemPrompt = "Reply \"I don't know\" to every question." }; var stringBuilder = new StringBuilder();