diff --git a/dotnet/src/Connectors/Connectors.OpenAI.UnitTests/Settings/OpenAIPromptExecutionSettingsTests.cs b/dotnet/src/Connectors/Connectors.OpenAI.UnitTests/Settings/OpenAIPromptExecutionSettingsTests.cs index 96325d3b7ac7..d3dd40ce8f43 100644 --- a/dotnet/src/Connectors/Connectors.OpenAI.UnitTests/Settings/OpenAIPromptExecutionSettingsTests.cs +++ b/dotnet/src/Connectors/Connectors.OpenAI.UnitTests/Settings/OpenAIPromptExecutionSettingsTests.cs @@ -3,6 +3,7 @@ using System; using System.Collections.Generic; using System.Text.Json; +using Microsoft.Extensions.AI; using Microsoft.SemanticKernel; using Microsoft.SemanticKernel.ChatCompletion; using Microsoft.SemanticKernel.Connectors.OpenAI; @@ -88,6 +89,37 @@ public void ItUsesExistingOpenAIExecutionSettings() Assert.Equal(actualSettings.Modalities, executionSettings.Modalities); } + [Fact] + public void ItPropagatesValuesToChatOptions() + { + // Arrange + OpenAIPromptExecutionSettings actualSettings = new() + { + ChatSystemPrompt = "chat system prompt", + FrequencyPenalty = 0.7, + MaxTokens = 128, + PresencePenalty = 0.7, + Seed = 123456, + StopSequences = ["foo", "bar"], + Temperature = 0.7, + TopP = 0.7, + }; + + // Act + ChatOptions? actualOptions = actualSettings.ToChatOptions(null); + + // Assert + Assert.NotNull(actualOptions); + Assert.Equal((float)actualSettings.Temperature, (float)actualOptions.Temperature!, 3); + Assert.Equal((float)actualSettings.TopP, (float)actualOptions.TopP!, 3); + Assert.Equal((float)actualSettings.FrequencyPenalty, (float)actualOptions.FrequencyPenalty!, 3); + Assert.Equal((float)actualSettings.PresencePenalty, (float)actualOptions.PresencePenalty!); + Assert.Equal(actualSettings.StopSequences, actualOptions.StopSequences); + Assert.Equal(actualSettings.ChatSystemPrompt, actualOptions.Instructions); + Assert.Equal(actualSettings.MaxTokens, actualOptions.MaxOutputTokens); + Assert.Equal(actualSettings.Seed, actualOptions.Seed); + } + [Fact] public void ItCanUseOpenAIExecutionSettings() { diff --git a/dotnet/src/SemanticKernel.Abstractions/AI/PromptExecutionSettingsExtensions.cs b/dotnet/src/SemanticKernel.Abstractions/AI/PromptExecutionSettingsExtensions.cs index 4639f7f16e8b..55213682d173 100644 --- a/dotnet/src/SemanticKernel.Abstractions/AI/PromptExecutionSettingsExtensions.cs +++ b/dotnet/src/SemanticKernel.Abstractions/AI/PromptExecutionSettingsExtensions.cs @@ -15,6 +15,7 @@ namespace Microsoft.SemanticKernel; public static class PromptExecutionSettingsExtensions { /// Converts a pair of and to a . + [return: NotNullIfNotNull(nameof(settings))] public static ChatOptions? ToChatOptions(this PromptExecutionSettings? settings, Kernel? kernel) { if (settings is null) @@ -88,6 +89,13 @@ public static class PromptExecutionSettingsExtensions { options.StopSequences = stopSequences; } + else if ((entry.Key.Equals("chat_system_prompt", StringComparison.OrdinalIgnoreCase) || + entry.Key.Equals("chat_developer_prompt", StringComparison.OrdinalIgnoreCase) || + entry.Key.Equals("systemInstruction", StringComparison.OrdinalIgnoreCase)) && + TryConvert(entry.Value, out string? systemInstructions)) + { + options.Instructions = systemInstructions; + } else if (entry.Key.Equals("response_format", StringComparison.OrdinalIgnoreCase) && entry.Value is { } responseFormat) {