diff --git a/README.md b/README.md index 59d396eef3a0..070e3a14a4bb 100644 --- a/README.md +++ b/README.md @@ -97,27 +97,32 @@ Here is a quick example of how to use Semantic Kernel from a C# console app. ```csharp using Microsoft.SemanticKernel; -using Microsoft.SemanticKernel.Configuration; -using Microsoft.SemanticKernel.KernelExtensions; var kernel = Kernel.Builder.Build(); -// For Azure Open AI service endpoint and keys please see +// For Azure Open AI details please see // https://learn.microsoft.com/azure/cognitive-services/openai/quickstart?pivots=rest-api -kernel.Config.AddAzureOpenAITextCompletion( - "davinci-backend", // Alias used by the kernel +kernel.Config.AddAzureOpenAITextCompletionService( + "davinci-azure", // Alias used by the kernel "text-davinci-003", // Azure OpenAI *Deployment ID* "https://contoso.openai.azure.com/", // Azure OpenAI *Endpoint* "...your Azure OpenAI Key..." // Azure OpenAI *Key* ); -string skPrompt = @" +string summarizePrompt = @" {{$input}} -Give me the TLDR in 5 words. -"; +Give me the a TLDR in 5 words."; -string textToSummarize = @" +string haikuPrompt = @" +{{$input}} + +Write a futuristic haiku about it."; + +var summarize = kernel.CreateSemanticFunction(summarizePrompt); +var haikuWriter = kernel.CreateSemanticFunction(haikuPrompt); + +string inputText = @" 1) A robot may not injure a human being or, through inaction, allow a human being to come to harm. @@ -125,16 +130,15 @@ allow a human being to come to harm. such orders would conflict with the First Law. 3) A robot must protect its own existence as long as such protection -does not conflict with the First or Second Law. -"; - -var tldrFunction = kernel.CreateSemanticFunction(skPrompt); +does not conflict with the First or Second Law."; -var summary = await kernel.RunAsync(textToSummarize, tldrFunction); +var output = await kernel.RunAsync(inputText, summarize, haikuWriter); -Console.WriteLine(summary); +Console.WriteLine(output); -// Output => Protect humans, follow orders, survive. +// Output => Robots protect us all +// No harm to humans they bring +// Peaceful coexistence ``` ## Contributing and Community diff --git a/dotnet/SK-dotnet.sln b/dotnet/SK-dotnet.sln index eeb188849940..f81251b11f17 100644 --- a/dotnet/SK-dotnet.sln +++ b/dotnet/SK-dotnet.sln @@ -56,6 +56,10 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Skills.Memory.Qdrant", "src EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "GitHubSkills", "..\samples\dotnet\github-skills\GitHubSkills.csproj", "{39E5F0F6-8B36-4ECA-A5F6-FC7522DC2ECF}" EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "connectors", "connectors", "{0247C2C9-86C3-45BA-8873-28B0948EDC0C}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Connectors.UnitTests", "src\Connectors\Connectors.UnitTests\Connectors.UnitTests.csproj", "{EB3FC57F-E591-4C88-BCD5-B6A1BC635168}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -122,6 +126,10 @@ Global {39E5F0F6-8B36-4ECA-A5F6-FC7522DC2ECF}.Debug|Any CPU.Build.0 = Debug|Any CPU {39E5F0F6-8B36-4ECA-A5F6-FC7522DC2ECF}.Release|Any CPU.ActiveCfg = Release|Any CPU {39E5F0F6-8B36-4ECA-A5F6-FC7522DC2ECF}.Release|Any CPU.Build.0 = Release|Any CPU + {EB3FC57F-E591-4C88-BCD5-B6A1BC635168}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {EB3FC57F-E591-4C88-BCD5-B6A1BC635168}.Debug|Any CPU.Build.0 = Debug|Any CPU + {EB3FC57F-E591-4C88-BCD5-B6A1BC635168}.Release|Any CPU.ActiveCfg = Release|Any CPU + {EB3FC57F-E591-4C88-BCD5-B6A1BC635168}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -144,6 +152,8 @@ Global {A52818AC-57FB-495F-818F-9E1E7BC5618C} = {FA3720F1-C99A-49B2-9577-A940257098BF} {3E0FEA85-5B6F-431B-AD62-D2D0114F65CC} = {9ECD1AA0-75B3-4E25-B0B5-9F0945B64974} {39E5F0F6-8B36-4ECA-A5F6-FC7522DC2ECF} = {FA3720F1-C99A-49B2-9577-A940257098BF} + {0247C2C9-86C3-45BA-8873-28B0948EDC0C} = {831DDCA2-7D2C-4C31-80DB-6BDB3E1F7AE0} + {EB3FC57F-E591-4C88-BCD5-B6A1BC635168} = {0247C2C9-86C3-45BA-8873-28B0948EDC0C} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {FBDC56A3-86AD-4323-AA0F-201E59123B83} diff --git a/dotnet/SK-dotnet.sln.DotSettings b/dotnet/SK-dotnet.sln.DotSettings index 5c8b6b02ecb7..272314ff727b 100644 --- a/dotnet/SK-dotnet.sln.DotSettings +++ b/dotnet/SK-dotnet.sln.DotSettings @@ -174,11 +174,13 @@ public void It$SOMENAME$() True True + True True True True True True + True True True True diff --git a/dotnet/nuget/nuget-package.props b/dotnet/nuget/nuget-package.props index 24e4f41f93fe..b5905fdf928d 100644 --- a/dotnet/nuget/nuget-package.props +++ b/dotnet/nuget/nuget-package.props @@ -3,7 +3,7 @@ true true - 0.9 + 0.10 diff --git a/dotnet/src/Connectors/Connectors.UnitTests/Connectors.UnitTests.csproj b/dotnet/src/Connectors/Connectors.UnitTests/Connectors.UnitTests.csproj new file mode 100644 index 000000000000..408c2da4a266 --- /dev/null +++ b/dotnet/src/Connectors/Connectors.UnitTests/Connectors.UnitTests.csproj @@ -0,0 +1,27 @@ + + + + SemanticKernel.Connectors.UnitTests + SemanticKernel.Connectors.UnitTests + net6.0 + 10 + enable + disable + false + + + + + + + + runtime; build; native; contentfiles; analyzers; buildtransitive + all + + + + + + + + diff --git a/dotnet/src/Connectors/Connectors.UnitTests/OpenAI/KernelConfigOpenAIExtensionsTests.cs b/dotnet/src/Connectors/Connectors.UnitTests/OpenAI/KernelConfigOpenAIExtensionsTests.cs new file mode 100644 index 000000000000..d81e0fe6c3f5 --- /dev/null +++ b/dotnet/src/Connectors/Connectors.UnitTests/OpenAI/KernelConfigOpenAIExtensionsTests.cs @@ -0,0 +1,296 @@ +// Copyright (c) Microsoft. All rights reserved. + +using System.Linq; +using Microsoft.SemanticKernel; +using Moq; +using Xunit; + +namespace SemanticKernel.Connectors.UnitTests.OpenAI; + +/// +/// Unit tests of . +/// +public class KernelConfigOpenAIExtensionsTests +{ + [Fact] + public void ItFailsWhenAddingTextCompletionServicesWithSameId() + { + var target = new KernelConfig(); + target.AddAzureOpenAITextCompletionService("azure", "depl", "https://url", "key"); + + var exception = Assert.Throws(() => + { + target.AddAzureOpenAITextCompletionService("azure", "depl2", "https://url", "key"); + }); + Assert.Equal(KernelException.ErrorCodes.InvalidServiceConfiguration, exception.ErrorCode); + } + + [Fact] + public void ItFailsWhenAddingEmbeddingGenerationServicesWithSameId() + { + var target = new KernelConfig(); + target.AddAzureOpenAIEmbeddingGenerationService("azure", "depl", "https://url", "key"); + + var exception = Assert.Throws(() => + { + target.AddAzureOpenAIEmbeddingGenerationService("azure", "depl2", "https://url", "key"); + }); + Assert.Equal(KernelException.ErrorCodes.InvalidServiceConfiguration, exception.ErrorCode); + } + + [Fact] + public void ItSucceedsWhenAddingDifferentServiceTypeWithSameId() + { + var target = new KernelConfig(); + target.AddAzureOpenAITextCompletionService("azure", "depl", "https://url", "key"); + target.AddAzureOpenAIEmbeddingGenerationService("azure", "depl2", "https://url", "key"); + + Assert.True(target.TextCompletionServices.ContainsKey("azure")); + Assert.True(target.TextEmbeddingGenerationServices.ContainsKey("azure")); + } + + [Fact] + public void ItTellsIfAServiceIsAvailable() + { + // Arrange + var target = new KernelConfig(); + target.AddAzureOpenAITextCompletionService("azure", "depl", "https://url", "key"); + target.AddOpenAITextCompletionService("oai", "model", "apikey"); + target.AddAzureOpenAIEmbeddingGenerationService("azure", "depl2", "https://url2", "key"); + target.AddOpenAIEmbeddingGenerationService("oai2", "model2", "apikey2"); + + // Assert + Assert.True(target.TextCompletionServices.ContainsKey("azure")); + Assert.True(target.TextCompletionServices.ContainsKey("oai")); + Assert.True(target.TextEmbeddingGenerationServices.ContainsKey("azure")); + Assert.True(target.TextEmbeddingGenerationServices.ContainsKey("oai2")); + + Assert.False(target.TextCompletionServices.ContainsKey("azure2")); + Assert.False(target.TextCompletionServices.ContainsKey("oai2")); + Assert.False(target.TextEmbeddingGenerationServices.ContainsKey("azure1")); + Assert.False(target.TextEmbeddingGenerationServices.ContainsKey("oai")); + } + + [Fact] + public void ItCanOverwriteServices() + { + // Arrange + var target = new KernelConfig(); + + // Act - Assert no exception occurs + target.AddAzureOpenAITextCompletionService("one", "dep", "https://localhost", "key", overwrite: true); + target.AddAzureOpenAITextCompletionService("one", "dep", "https://localhost", "key", overwrite: true); + target.AddOpenAITextCompletionService("one", "model", "key", overwrite: true); + target.AddOpenAITextCompletionService("one", "model", "key", overwrite: true); + target.AddAzureOpenAIEmbeddingGenerationService("one", "dep", "https://localhost", "key", overwrite: true); + target.AddAzureOpenAIEmbeddingGenerationService("one", "dep", "https://localhost", "key", overwrite: true); + target.AddOpenAIEmbeddingGenerationService("one", "model", "key", overwrite: true); + target.AddOpenAIEmbeddingGenerationService("one", "model", "key", overwrite: true); + } + + [Fact] + public void ItCanRemoveAllServices() + { + // Arrange + var target = new KernelConfig(); + target.AddAzureOpenAITextCompletionService("one", "dep", "https://localhost", "key"); + target.AddAzureOpenAITextCompletionService("2", "dep", "https://localhost", "key"); + target.AddOpenAITextCompletionService("3", "model", "key"); + target.AddOpenAITextCompletionService("4", "model", "key"); + target.AddAzureOpenAIEmbeddingGenerationService("5", "dep", "https://localhost", "key"); + target.AddAzureOpenAIEmbeddingGenerationService("6", "dep", "https://localhost", "key"); + target.AddOpenAIEmbeddingGenerationService("7", "model", "key"); + target.AddOpenAIEmbeddingGenerationService("8", "model", "key"); + + // Act + target.RemoveAllTextCompletionServices(); + target.RemoveAllTextEmbeddingGenerationServices(); + + // Assert + Assert.Empty(target.AllTextEmbeddingGenerationServiceIds); + Assert.Empty(target.AllTextCompletionServiceIds); + } + + [Fact] + public void ItCanRemoveAllTextCompletionServices() + { + // Arrange + var target = new KernelConfig(); + target.AddAzureOpenAITextCompletionService("one", "dep", "https://localhost", "key"); + target.AddAzureOpenAITextCompletionService("2", "dep", "https://localhost", "key"); + target.AddOpenAITextCompletionService("3", "model", "key"); + target.AddOpenAITextCompletionService("4", "model", "key"); + target.AddAzureOpenAIEmbeddingGenerationService("5", "dep", "https://localhost", "key"); + target.AddAzureOpenAIEmbeddingGenerationService("6", "dep", "https://localhost", "key"); + target.AddOpenAIEmbeddingGenerationService("7", "model", "key"); + target.AddOpenAIEmbeddingGenerationService("8", "model", "key"); + + // Act + target.RemoveAllTextCompletionServices(); + + // Assert + Assert.Equal(4, target.AllTextEmbeddingGenerationServiceIds.Count()); + Assert.Empty(target.AllTextCompletionServiceIds); + } + + [Fact] + public void ItCanRemoveAllTextEmbeddingGenerationServices() + { + // Arrange + var target = new KernelConfig(); + target.AddAzureOpenAITextCompletionService("one", "dep", "https://localhost", "key"); + target.AddAzureOpenAITextCompletionService("2", "dep", "https://localhost", "key"); + target.AddOpenAITextCompletionService("3", "model", "key"); + target.AddOpenAITextCompletionService("4", "model", "key"); + target.AddAzureOpenAIEmbeddingGenerationService("5", "dep", "https://localhost", "key"); + target.AddAzureOpenAIEmbeddingGenerationService("6", "dep", "https://localhost", "key"); + target.AddOpenAIEmbeddingGenerationService("7", "model", "key"); + target.AddOpenAIEmbeddingGenerationService("8", "model", "key"); + + // Act + target.RemoveAllTextEmbeddingGenerationServices(); + + // Assert + Assert.Equal(4, target.AllTextCompletionServiceIds.Count()); + Assert.Empty(target.AllTextEmbeddingGenerationServiceIds); + } + + [Fact] + public void ItCanRemoveOneCompletionService() + { + // Arrange + var target = new KernelConfig(); + target.AddAzureOpenAITextCompletionService("1", "dep", "https://localhost", "key"); + target.AddAzureOpenAITextCompletionService("2", "dep", "https://localhost", "key"); + target.AddOpenAITextCompletionService("3", "model", "key"); + Assert.Equal("1", target.DefaultTextCompletionServiceId); + + // Act - Assert + target.RemoveTextCompletionService("1"); + Assert.Equal("2", target.DefaultTextCompletionServiceId); + target.RemoveTextCompletionService("2"); + Assert.Equal("3", target.DefaultTextCompletionServiceId); + target.RemoveTextCompletionService("3"); + Assert.Null(target.DefaultTextCompletionServiceId); + } + + [Fact] + public void ItCanRemoveOneTextEmbeddingGenerationService() + { + // Arrange + var target = new KernelConfig(); + target.AddAzureOpenAIEmbeddingGenerationService("1", "dep", "https://localhost", "key"); + target.AddAzureOpenAIEmbeddingGenerationService("2", "dep", "https://localhost", "key"); + target.AddOpenAIEmbeddingGenerationService("3", "model", "key"); + Assert.Equal("1", target.DefaultTextEmbeddingGenerationServiceId); + + // Act - Assert + target.RemoveTextEmbeddingGenerationService("1"); + Assert.Equal("2", target.DefaultTextEmbeddingGenerationServiceId); + target.RemoveTextEmbeddingGenerationService("2"); + Assert.Equal("3", target.DefaultTextEmbeddingGenerationServiceId); + target.RemoveTextEmbeddingGenerationService("3"); + Assert.Null(target.DefaultTextEmbeddingGenerationServiceId); + } + + [Fact] + public void GetTextEmbeddingGenerationServiceItReturnsDefaultWhenNonExistingIdIsProvided() + { + // Arrange + var target = new KernelConfig(); + target.AddOpenAIEmbeddingGenerationService("1", "dep", "https://localhost", "key"); + target.AddAzureOpenAIEmbeddingGenerationService("2", "dep", "https://localhost", "key"); + target.SetDefaultTextEmbeddingGenerationService("2"); + + // Act + var result = target.GetTextEmbeddingGenerationServiceIdOrDefault("test"); + + // Assert + Assert.Equal("2", result); + } + + [Fact] + public void GetEmbeddingServiceReturnsSpecificWhenExistingIdIsProvided() + { + // Arrange + var kernel = new Mock(); + var target = new KernelConfig(); + target.AddOpenAIEmbeddingGenerationService("1", "dep", "https://localhost", "key"); + target.AddAzureOpenAIEmbeddingGenerationService("2", "dep", "https://localhost", "key"); + target.SetDefaultTextEmbeddingGenerationService("2"); + + // Act + var result = target.GetTextEmbeddingGenerationServiceIdOrDefault("1"); + + // Assert + Assert.Equal("1", result); + } + + [Fact] + public void GetEmbeddingServiceReturnsDefaultWhenNoIdIsProvided() + { + // Arrange + var kernel = new Mock(); + var target = new KernelConfig(); + target.AddOpenAIEmbeddingGenerationService("1", "dep", "https://localhost", "key"); + target.AddAzureOpenAIEmbeddingGenerationService("2", "dep", "https://localhost", "key"); + target.SetDefaultTextEmbeddingGenerationService("2"); + + // Act + var result = target.GetTextEmbeddingGenerationServiceIdOrDefault(); + + // Assert + Assert.Equal("2", result); + } + + [Fact] + public void GetTextCompletionServiceReturnsDefaultWhenNonExistingIdIsProvided() + { + // Arrange + var kernel = new Mock(); + var target = new KernelConfig(); + target.AddOpenAITextCompletionService("1", "dep", "https://localhost", "key"); + target.AddAzureOpenAITextCompletionService("2", "dep", "https://localhost", "key"); + target.SetDefaultTextCompletionService("2"); + + // Act + var result = target.GetTextCompletionServiceIdOrDefault("345"); + + // Assert + Assert.Equal("2", result); + } + + [Fact] + public void GetTextCompletionServiceReturnsSpecificWhenExistingIdIsProvided() + { + // Arrange + var kernel = new Mock(); + var target = new KernelConfig(); + target.AddOpenAITextCompletionService("1", "dep", "https://localhost", "key"); + target.AddAzureOpenAITextCompletionService("2", "dep", "https://localhost", "key"); + target.SetDefaultTextCompletionService("2"); + + // Act + var result = target.GetTextCompletionServiceIdOrDefault("1"); + + // Assert + Assert.Equal("1", result); + } + + [Fact] + public void GetTextCompletionServiceItReturnsDefaultWhenNoIdIsProvided() + { + // Arrange + var kernel = new Mock(); + var target = new KernelConfig(); + target.AddOpenAITextCompletionService("1", "dep", "https://localhost", "key"); + target.AddAzureOpenAITextCompletionService("2", "dep", "https://localhost", "key"); + target.SetDefaultTextCompletionService("2"); + + // Act + var result = target.GetTextCompletionServiceIdOrDefault(); + + // Assert + Assert.Equal("2", result); + } +} diff --git a/dotnet/src/SemanticKernel.UnitTests/AI/OpenAI/Tokenizers/GPT3TokenizerTests.cs b/dotnet/src/Connectors/Connectors.UnitTests/OpenAI/Tokenizers/GPT3TokenizerTests.cs similarity index 98% rename from dotnet/src/SemanticKernel.UnitTests/AI/OpenAI/Tokenizers/GPT3TokenizerTests.cs rename to dotnet/src/Connectors/Connectors.UnitTests/OpenAI/Tokenizers/GPT3TokenizerTests.cs index 32b633290910..2124a832649d 100644 --- a/dotnet/src/SemanticKernel.UnitTests/AI/OpenAI/Tokenizers/GPT3TokenizerTests.cs +++ b/dotnet/src/Connectors/Connectors.UnitTests/OpenAI/Tokenizers/GPT3TokenizerTests.cs @@ -6,11 +6,11 @@ using System.Linq; using System.Text; using System.Text.Json; -using Microsoft.SemanticKernel.AI.OpenAI.Tokenizers; +using Microsoft.SemanticKernel.Connectors.OpenAI.Tokenizers; using Xunit; using Xunit.Abstractions; -namespace SemanticKernel.UnitTests.AI.OpenAI.Tokenizers; +namespace SemanticKernel.Connectors.UnitTests.OpenAI.Tokenizers; #pragma warning disable CA5394 public class GPT3TokenizerTests diff --git a/dotnet/src/SemanticKernel.IntegrationTests/AI/AIServiceType.cs b/dotnet/src/SemanticKernel.IntegrationTests/Connectors/OpenAI/AIServiceType.cs similarity index 84% rename from dotnet/src/SemanticKernel.IntegrationTests/AI/AIServiceType.cs rename to dotnet/src/SemanticKernel.IntegrationTests/Connectors/OpenAI/AIServiceType.cs index 901903634e02..b09a7a5ef635 100644 --- a/dotnet/src/SemanticKernel.IntegrationTests/AI/AIServiceType.cs +++ b/dotnet/src/SemanticKernel.IntegrationTests/Connectors/OpenAI/AIServiceType.cs @@ -1,6 +1,6 @@ // Copyright (c) Microsoft. All rights reserved. -namespace SemanticKernel.IntegrationTests.AI; +namespace SemanticKernel.IntegrationTests.Connectors.OpenAI; /// /// Enumeration to run integration tests for different AI services diff --git a/dotnet/src/SemanticKernel.IntegrationTests/AI/OpenAICompletionTests.cs b/dotnet/src/SemanticKernel.IntegrationTests/Connectors/OpenAI/OpenAICompletionTests.cs similarity index 92% rename from dotnet/src/SemanticKernel.IntegrationTests/AI/OpenAICompletionTests.cs rename to dotnet/src/SemanticKernel.IntegrationTests/Connectors/OpenAI/OpenAICompletionTests.cs index 63351caec1f9..5e7da573f27d 100644 --- a/dotnet/src/SemanticKernel.IntegrationTests/AI/OpenAICompletionTests.cs +++ b/dotnet/src/SemanticKernel.IntegrationTests/Connectors/OpenAI/OpenAICompletionTests.cs @@ -2,17 +2,17 @@ using System; using System.Collections.Generic; +using System.Net; using System.Threading.Tasks; using Microsoft.Extensions.Configuration; using Microsoft.SemanticKernel; -using Microsoft.SemanticKernel.Configuration; using Microsoft.SemanticKernel.Orchestration; using Microsoft.SemanticKernel.Reliability; using SemanticKernel.IntegrationTests.TestSettings; using Xunit; using Xunit.Abstractions; -namespace SemanticKernel.IntegrationTests.AI; +namespace SemanticKernel.IntegrationTests.Connectors.OpenAI; public sealed class OpenAICompletionTests : IDisposable { @@ -81,15 +81,15 @@ public async Task OpenAIHttpRetryPolicyTestAsync(string prompt, string expectedO { // Arrange var retryConfig = new HttpRetryConfig(); - retryConfig.RetryableStatusCodes.Add(System.Net.HttpStatusCode.Unauthorized); + retryConfig.RetryableStatusCodes.Add(HttpStatusCode.Unauthorized); IKernel target = Kernel.Builder.WithLogger(this._testOutputHelper).Configure(c => c.SetDefaultHttpRetryConfig(retryConfig)).Build(); OpenAIConfiguration? openAIConfiguration = this._configuration.GetSection("OpenAI").Get(); Assert.NotNull(openAIConfiguration); // Use an invalid API key to force a 401 Unauthorized response - target.Config.AddOpenAITextCompletion( - serviceId: openAIConfiguration.Label, + target.Config.AddOpenAITextCompletionService( + serviceId: openAIConfiguration.ServiceId, modelId: openAIConfiguration.ModelId, apiKey: "INVALID_KEY"); @@ -163,12 +163,12 @@ private void ConfigureOpenAI(IKernel kernel) Assert.NotNull(openAIConfiguration); - kernel.Config.AddOpenAITextCompletion( - serviceId: openAIConfiguration.Label, + kernel.Config.AddOpenAITextCompletionService( + serviceId: openAIConfiguration.ServiceId, modelId: openAIConfiguration.ModelId, apiKey: openAIConfiguration.ApiKey); - kernel.Config.SetDefaultTextCompletionService(openAIConfiguration.Label); + kernel.Config.SetDefaultTextCompletionService(openAIConfiguration.ServiceId); } private void ConfigureAzureOpenAI(IKernel kernel) @@ -177,13 +177,13 @@ private void ConfigureAzureOpenAI(IKernel kernel) Assert.NotNull(azureOpenAIConfiguration); - kernel.Config.AddAzureOpenAITextCompletion( - serviceId: azureOpenAIConfiguration.Label, + kernel.Config.AddAzureOpenAITextCompletionService( + serviceId: azureOpenAIConfiguration.ServiceId, deploymentName: azureOpenAIConfiguration.DeploymentName, endpoint: azureOpenAIConfiguration.Endpoint, apiKey: azureOpenAIConfiguration.ApiKey); - kernel.Config.SetDefaultTextCompletionService(azureOpenAIConfiguration.Label); + kernel.Config.SetDefaultTextCompletionService(azureOpenAIConfiguration.ServiceId); } #endregion diff --git a/dotnet/src/SemanticKernel.IntegrationTests/AI/OpenAIEmbeddingTests.cs b/dotnet/src/SemanticKernel.IntegrationTests/Connectors/OpenAI/OpenAITextEmbeddingTests.cs similarity index 83% rename from dotnet/src/SemanticKernel.IntegrationTests/AI/OpenAIEmbeddingTests.cs rename to dotnet/src/SemanticKernel.IntegrationTests/Connectors/OpenAI/OpenAITextEmbeddingTests.cs index fb1bf66d5264..b6fa92882cec 100644 --- a/dotnet/src/SemanticKernel.IntegrationTests/AI/OpenAIEmbeddingTests.cs +++ b/dotnet/src/SemanticKernel.IntegrationTests/Connectors/OpenAI/OpenAITextEmbeddingTests.cs @@ -5,19 +5,19 @@ using System.Threading.Tasks; using Microsoft.Extensions.Configuration; using Microsoft.SemanticKernel.AI.Embeddings; -using Microsoft.SemanticKernel.AI.OpenAI.Services; +using Microsoft.SemanticKernel.Connectors.OpenAI.TextEmbedding; using SemanticKernel.IntegrationTests.TestSettings; using Xunit; using Xunit.Abstractions; -namespace SemanticKernel.IntegrationTests.AI; +namespace SemanticKernel.IntegrationTests.Connectors.OpenAI; -public sealed class OpenAIEmbeddingTests : IDisposable +public sealed class OpenAITextEmbeddingTests : IDisposable { private const int AdaVectorLength = 1536; private readonly IConfigurationRoot _configuration; - public OpenAIEmbeddingTests(ITestOutputHelper output) + public OpenAITextEmbeddingTests(ITestOutputHelper output) { this._testOutputHelper = new RedirectOutput(output); Console.SetOut(this._testOutputHelper); @@ -27,7 +27,7 @@ public OpenAIEmbeddingTests(ITestOutputHelper output) .AddJsonFile(path: "testsettings.json", optional: false, reloadOnChange: true) .AddJsonFile(path: "testsettings.development.json", optional: true, reloadOnChange: true) .AddEnvironmentVariables() - .AddUserSecrets() + .AddUserSecrets() .Build(); } @@ -39,7 +39,7 @@ public async Task OpenAITestAsync(string testInputString) OpenAIConfiguration? openAIConfiguration = this._configuration.GetSection("OpenAIEmbeddings").Get(); Assert.NotNull(openAIConfiguration); - OpenAITextEmbeddings embeddingGenerator = new OpenAITextEmbeddings(openAIConfiguration.ModelId, openAIConfiguration.ApiKey); + var embeddingGenerator = new OpenAITextEmbeddingGeneration(openAIConfiguration.ModelId, openAIConfiguration.ApiKey); // Act var singleResult = await embeddingGenerator.GenerateEmbeddingAsync(testInputString); @@ -60,7 +60,7 @@ public async Task AzureOpenAITestAsync(string testInputString) AzureOpenAIConfiguration? azureOpenAIConfiguration = this._configuration.GetSection("AzureOpenAIEmbeddings").Get(); Assert.NotNull(azureOpenAIConfiguration); - AzureTextEmbeddings embeddingGenerator = new AzureTextEmbeddings(azureOpenAIConfiguration.DeploymentName, + var embeddingGenerator = new AzureTextEmbeddingGeneration(azureOpenAIConfiguration.DeploymentName, azureOpenAIConfiguration.Endpoint, azureOpenAIConfiguration.ApiKey, "2022-12-01"); @@ -86,7 +86,7 @@ public void Dispose() GC.SuppressFinalize(this); } - ~OpenAIEmbeddingTests() + ~OpenAITextEmbeddingTests() { this.Dispose(false); } diff --git a/dotnet/src/SemanticKernel.IntegrationTests/CoreSkills/PlannerSkillTests.cs b/dotnet/src/SemanticKernel.IntegrationTests/CoreSkills/PlannerSkillTests.cs index f04ebdf7e059..7403f620d10b 100644 --- a/dotnet/src/SemanticKernel.IntegrationTests/CoreSkills/PlannerSkillTests.cs +++ b/dotnet/src/SemanticKernel.IntegrationTests/CoreSkills/PlannerSkillTests.cs @@ -5,12 +5,11 @@ using Microsoft.Extensions.Configuration; using Microsoft.Extensions.Logging; using Microsoft.SemanticKernel; -using Microsoft.SemanticKernel.Configuration; using Microsoft.SemanticKernel.CoreSkills; using Microsoft.SemanticKernel.Memory; using Microsoft.SemanticKernel.Orchestration; using Microsoft.SemanticKernel.SkillDefinition; -using SemanticKernel.IntegrationTests.AI; +using SemanticKernel.IntegrationTests.Connectors.OpenAI; using SemanticKernel.IntegrationTests.TestSettings; using Xunit; using Xunit.Abstractions; @@ -48,19 +47,19 @@ public async Task CreatePlanWithEmbeddingsTestAsync(string prompt, string expect .WithLogger(this._logger) .Configure(config => { - config.AddAzureOpenAITextCompletion( - serviceId: azureOpenAIConfiguration.Label, + config.AddAzureOpenAITextCompletionService( + serviceId: azureOpenAIConfiguration.ServiceId, deploymentName: azureOpenAIConfiguration.DeploymentName, endpoint: azureOpenAIConfiguration.Endpoint, apiKey: azureOpenAIConfiguration.ApiKey); - config.AddAzureOpenAIEmbeddingGeneration( - serviceId: azureOpenAIEmbeddingsConfiguration.Label, + config.AddAzureOpenAIEmbeddingGenerationService( + serviceId: azureOpenAIEmbeddingsConfiguration.ServiceId, deploymentName: azureOpenAIEmbeddingsConfiguration.DeploymentName, endpoint: azureOpenAIEmbeddingsConfiguration.Endpoint, apiKey: azureOpenAIEmbeddingsConfiguration.ApiKey); - config.SetDefaultTextCompletionService(azureOpenAIConfiguration.Label); + config.SetDefaultTextCompletionService(azureOpenAIConfiguration.ServiceId); }) .WithMemoryStorage(new VolatileMemoryStore()) .Build(); diff --git a/dotnet/src/SemanticKernel.IntegrationTests/README.md b/dotnet/src/SemanticKernel.IntegrationTests/README.md index c45d5879d1bc..ba4b0ed94ef3 100644 --- a/dotnet/src/SemanticKernel.IntegrationTests/README.md +++ b/dotnet/src/SemanticKernel.IntegrationTests/README.md @@ -21,23 +21,23 @@ For example: ```json { "OpenAI": { - "Label": "text-davinci-003", + "ServiceId": "text-davinci-003", "ModelId": "text-davinci-003", "ApiKey": "sk-...." }, "AzureOpenAI": { - "Label": "azure-text-davinci-003", + "ServiceId": "azure-text-davinci-003", "DeploymentName": "text-davinci-003", "Endpoint": "https://contoso.openai.azure.com/", "ApiKey": "...." }, "OpenAIEmbeddings": { - "Label": "text-embedding-ada-002", + "ServiceId": "text-embedding-ada-002", "ModelId": "text-embedding-ada-002", "ApiKey": "sk-...." }, "AzureOpenAIEmbeddings": { - "Label": "azure-text-embedding-ada-002", + "ServiceId": "azure-text-embedding-ada-002", "DeploymentName": "text-embedding-ada-002", "Endpoint": "https://contoso.openai.azure.com/", "ApiKey": "...." diff --git a/dotnet/src/SemanticKernel.IntegrationTests/TestSettings/AzureOpenAIConfiguration.cs b/dotnet/src/SemanticKernel.IntegrationTests/TestSettings/AzureOpenAIConfiguration.cs index fab4dbd4ad77..e8678489f3b5 100644 --- a/dotnet/src/SemanticKernel.IntegrationTests/TestSettings/AzureOpenAIConfiguration.cs +++ b/dotnet/src/SemanticKernel.IntegrationTests/TestSettings/AzureOpenAIConfiguration.cs @@ -8,7 +8,7 @@ namespace SemanticKernel.IntegrationTests.TestSettings; Justification = "Configuration classes are instantiated through IConfiguration.")] internal sealed class AzureOpenAIConfiguration { - public string Label { get; set; } + public string ServiceId { get; set; } public string DeploymentName { get; set; } @@ -16,9 +16,9 @@ internal sealed class AzureOpenAIConfiguration public string ApiKey { get; set; } - public AzureOpenAIConfiguration(string label, string deploymentName, string endpoint, string apiKey) + public AzureOpenAIConfiguration(string serviceId, string deploymentName, string endpoint, string apiKey) { - this.Label = label; + this.ServiceId = serviceId; this.DeploymentName = deploymentName; this.Endpoint = endpoint; this.ApiKey = apiKey; diff --git a/dotnet/src/SemanticKernel.IntegrationTests/TestSettings/OpenAIConfiguration.cs b/dotnet/src/SemanticKernel.IntegrationTests/TestSettings/OpenAIConfiguration.cs index c4353bab49da..ee4283d808f6 100644 --- a/dotnet/src/SemanticKernel.IntegrationTests/TestSettings/OpenAIConfiguration.cs +++ b/dotnet/src/SemanticKernel.IntegrationTests/TestSettings/OpenAIConfiguration.cs @@ -8,13 +8,13 @@ namespace SemanticKernel.IntegrationTests.TestSettings; Justification = "Configuration classes are instantiated through IConfiguration.")] internal sealed class OpenAIConfiguration { - public string Label { get; set; } + public string ServiceId { get; set; } public string ModelId { get; set; } public string ApiKey { get; set; } - public OpenAIConfiguration(string label, string modelId, string apiKey) + public OpenAIConfiguration(string serviceId, string modelId, string apiKey) { - this.Label = label; + this.ServiceId = serviceId; this.ModelId = modelId; this.ApiKey = apiKey; } diff --git a/dotnet/src/SemanticKernel.IntegrationTests/testsettings.json b/dotnet/src/SemanticKernel.IntegrationTests/testsettings.json index dd4fbd59d186..2954fa8de7d1 100644 --- a/dotnet/src/SemanticKernel.IntegrationTests/testsettings.json +++ b/dotnet/src/SemanticKernel.IntegrationTests/testsettings.json @@ -1,22 +1,22 @@ { "OpenAI": { - "Label": "text-davinci-002", + "ServiceId": "text-davinci-002", "ModelId": "text-davinci-002", "ApiKey": "" }, "AzureOpenAI": { - "Label": "azure-text-davinci-002", + "ServiceId": "azure-text-davinci-002", "DeploymentName": "text-davinci-002", "Endpoint": "", "ApiKey": "" }, "OpenAIEmbeddings": { - "Label": "text-embedding-ada-002", + "ServiceId": "text-embedding-ada-002", "ModelId": "text-embedding-ada-002", "ApiKey": "" }, "AzureOpenAIEmbeddings": { - "Label": "azure-text-embedding-ada-002", + "ServiceId": "azure-text-embedding-ada-002", "DeploymentName": "text-embedding-ada-002", "Endpoint": "", "ApiKey": "" diff --git a/dotnet/src/SemanticKernel.Skills/Skills.Memory.Qdrant/Diagnostics/IValidatable.cs b/dotnet/src/SemanticKernel.Skills/Skills.Memory.Qdrant/Diagnostics/IValidatable.cs index 0ed85bc86fc7..168708e8e6f3 100644 --- a/dotnet/src/SemanticKernel.Skills/Skills.Memory.Qdrant/Diagnostics/IValidatable.cs +++ b/dotnet/src/SemanticKernel.Skills/Skills.Memory.Qdrant/Diagnostics/IValidatable.cs @@ -1,86 +1,8 @@ // Copyright (c) Microsoft. All rights reserved. -using System.Collections.Generic; -using System.Diagnostics.CodeAnalysis; -using System.Linq; - namespace Microsoft.SemanticKernel.Skills.Memory.Qdrant.Diagnostics; -public interface IValidatable +internal interface IValidatable { void Validate(); } - -internal static class ValidateExtensions -{ - public static void Validate(IValidatable target) - { - target?.Validate(); - } - - public static void Validate(params IValidatable[] targets) - { - foreach (var t in targets ?? Enumerable.Empty()) - { - Validate(t); - } - } - - public static void ValidateRequired(this IValidatable item, string arg) - { - Verify.NotNull(item, arg); - item.Validate(); - } - - public static void ValidateRequired(this object item, string arg) - { - if (item is IValidatable v) - { - v.ValidateRequired(arg); - } - else - { - Verify.NotNull(item, arg); - } - } - - public static void ValidateRequired(this string item, string arg) - { - Verify.NotNullOrEmpty(item, arg); - } - - public static void ValidateOptional(this IValidatable item, string arg) - { - if (item == null) - { - return; - } - - item.ValidateRequired(arg); - } - - [SuppressMessage("Design", "CA1031:Modify to catch a more specific allowed exception type, or rethrow exception", - Justification = "Does not throw an exception by design.")] - public static bool IsValid(this IValidatable target) - { - try - { - target.ValidateRequired("target"); - return true; - } - catch - { - } - - return false; - } - - public static void ValidateRequired(this IEnumerable list, string arg) - { - Verify.NotNull(list, nameof(list)); - foreach (T item in list) - { - item?.ValidateRequired(arg); - } - } -} diff --git a/dotnet/src/SemanticKernel.Skills/Skills.Memory.Qdrant/Diagnostics/ValidateExtensions.cs b/dotnet/src/SemanticKernel.Skills/Skills.Memory.Qdrant/Diagnostics/ValidateExtensions.cs new file mode 100644 index 000000000000..3df0519f86ec --- /dev/null +++ b/dotnet/src/SemanticKernel.Skills/Skills.Memory.Qdrant/Diagnostics/ValidateExtensions.cs @@ -0,0 +1,81 @@ +// Copyright (c) Microsoft. All rights reserved. + +using System.Collections.Generic; +using System.Diagnostics.CodeAnalysis; +using System.Linq; + +namespace Microsoft.SemanticKernel.Skills.Memory.Qdrant.Diagnostics; + +internal static class ValidateExtensions +{ + public static void Validate(IValidatable target) + { + target?.Validate(); + } + + public static void Validate(params IValidatable[] targets) + { + foreach (var t in targets ?? Enumerable.Empty()) + { + Validate(t); + } + } + + public static void ValidateRequired(this IValidatable item, string arg) + { + Verify.NotNull(item, arg); + item.Validate(); + } + + public static void ValidateRequired(this object item, string arg) + { + if (item is IValidatable v) + { + v.ValidateRequired(arg); + } + else + { + Verify.NotNull(item, arg); + } + } + + public static void ValidateRequired(this string item, string arg) + { + Verify.NotNullOrEmpty(item, arg); + } + + public static void ValidateOptional(this IValidatable item, string arg) + { + if (item == null) + { + return; + } + + item.ValidateRequired(arg); + } + + [SuppressMessage("Design", "CA1031:Modify to catch a more specific allowed exception type, or rethrow exception", + Justification = "Does not throw an exception by design.")] + public static bool IsValid(this IValidatable target) + { + try + { + target.ValidateRequired("target"); + return true; + } + catch + { + } + + return false; + } + + public static void ValidateRequired(this IEnumerable list, string arg) + { + Verify.NotNull(list, nameof(list)); + foreach (T item in list) + { + item?.ValidateRequired(arg); + } + } +} diff --git a/dotnet/src/SemanticKernel.Skills/Skills.Memory.Qdrant/Skills.Memory.Qdrant.csproj b/dotnet/src/SemanticKernel.Skills/Skills.Memory.Qdrant/Skills.Memory.Qdrant.csproj index fbc869c52f97..a8600afb0538 100644 --- a/dotnet/src/SemanticKernel.Skills/Skills.Memory.Qdrant/Skills.Memory.Qdrant.csproj +++ b/dotnet/src/SemanticKernel.Skills/Skills.Memory.Qdrant/Skills.Memory.Qdrant.csproj @@ -2,7 +2,7 @@ $([System.IO.Path]::GetDirectoryName($([MSBuild]::GetPathOfFileAbove('.gitignore', '$(MSBuildThisFileDirectory)')))) - + Microsoft.SemanticKernel.Skills.Memory.Qdrant @@ -10,11 +10,12 @@ netstandard2.1 - - - Microsoft.SemanticKernel.Skills.Memory.Qdrant - Semantic Kernel - Qdrant Connector - + + + + + + diff --git a/dotnet/src/SemanticKernel.UnitTests/AI/OpenAI/Services/AzureOpenAIConfigTests.cs b/dotnet/src/SemanticKernel.UnitTests/AI/OpenAI/Services/AzureOpenAIConfigTests.cs deleted file mode 100644 index 7f0c33820c05..000000000000 --- a/dotnet/src/SemanticKernel.UnitTests/AI/OpenAI/Services/AzureOpenAIConfigTests.cs +++ /dev/null @@ -1,73 +0,0 @@ -// Copyright (c) Microsoft. All rights reserved. - -using Microsoft.SemanticKernel.AI.OpenAI.Services; -using Microsoft.SemanticKernel.Diagnostics; -using Xunit; - -namespace SemanticKernel.UnitTests.AI.OpenAI.Services; - -public class AzureOpenAIConfigTests -{ - [Fact] - public void ConstructorWithValidParametersSetsProperties() - { - // Arrange - string label = "testLabel"; - string deploymentName = "testDeploymentName"; - string endpoint = "https://testEndpoint.com"; - string apiKey = "testApiKey"; - string apiVersion = "testApiVersion"; - - // Act - var config = new AzureOpenAIConfig(label, deploymentName, endpoint, apiKey, apiVersion); - - // Assert - Assert.Equal(label, config.Label); - Assert.Equal(deploymentName, config.DeploymentName); - Assert.Equal(endpoint, config.Endpoint); - Assert.Equal(apiKey, config.APIKey); - Assert.Equal(apiVersion, config.APIVersion); - } - - [Theory] - [InlineData("", "testDeploymentName", "https://testEndpoint.com", "testApiKey", "testApiVersion")] - [InlineData("testLabel", "", "https://testEndpoint.com", "testApiKey", "testApiVersion")] - [InlineData("testLabel", "testDeploymentName", "", "testApiKey", "testApiVersion")] - [InlineData("testLabel", "testDeploymentName", "https://testEndpoint.com", "", "testApiVersion")] - public void ConstructorWithEmptyParametersThrowsValidationException( - string label, string deploymentName, string endpoint, string apiKey, string apiVersion) - { - // Act + Assert - var exception = Assert.Throws(() => new AzureOpenAIConfig(label, deploymentName, endpoint, apiKey, apiVersion)); - Assert.Equal(ValidationException.ErrorCodes.EmptyValue, exception?.ErrorCode); - } - - [Theory] - [InlineData("testLabel", "testDeploymentName", "http://testEndpoint.com", "testApiKey", "testApiVersion")] - [InlineData("testLabel", "testDeploymentName", "testEndpoint.com", "testApiKey", "testApiVersion")] - [InlineData("testLabel", "testDeploymentName", "testEndpoint", "testApiKey", "testApiVersion")] - public void ConstructorWithMissingPrefixParametersThrowsValidationException( - string label, string deploymentName, string endpoint, string apiKey, string apiVersion) - { - // Act + Assert - var exception = Assert.Throws(() => new AzureOpenAIConfig(label, deploymentName, endpoint, apiKey, apiVersion)); - Assert.Equal(ValidationException.ErrorCodes.MissingPrefix, exception?.ErrorCode); - } - - [Fact] - public void EndpointWithValidValueDoesNotThrow() - { - // Arrange - string label = "testLabel"; - string deploymentName = "testDeploymentName"; - string endpoint = "https://testEndpoint.com"; - string apiKey = "testApiKey"; - string apiVersion = "testApiVersion"; - - // Act - var config = new AzureOpenAIConfig(label, deploymentName, endpoint, apiKey, apiVersion); - - // Assert - Assert.Equal(endpoint, config.Endpoint); - } -} diff --git a/dotnet/src/SemanticKernel.UnitTests/AI/OpenAI/Services/OpenAIConfigTests.cs b/dotnet/src/SemanticKernel.UnitTests/AI/OpenAI/Services/OpenAIConfigTests.cs deleted file mode 100644 index c7bdb1b6a045..000000000000 --- a/dotnet/src/SemanticKernel.UnitTests/AI/OpenAI/Services/OpenAIConfigTests.cs +++ /dev/null @@ -1,60 +0,0 @@ -// Copyright (c) Microsoft. All rights reserved. - -using Microsoft.SemanticKernel.AI.OpenAI.Services; -using Microsoft.SemanticKernel.Diagnostics; -using Xunit; - -namespace SemanticKernel.UnitTests.AI.OpenAI.Services; - -/// -/// Unit tests of -/// -public class OpenAIConfigTests -{ - [Fact] - public void ConstructorWithValidParametersSetsProperties() - { - // Arrange - string label = "testLabel"; - string modelId = "testModelId"; - string apiKey = "testApiKey"; - string orgId = "testOrgId"; - - // Act - var config = new OpenAIConfig(label, modelId, apiKey, orgId); - - // Assert - Assert.Equal(label, config.Label); - Assert.Equal(modelId, config.ModelId); - Assert.Equal(apiKey, config.APIKey); - Assert.Equal(orgId, config.OrgId); - } - - [Theory] - [InlineData("", "testModelId", "testApiKey", "testOrgId")] - [InlineData("testLabel", "", "testApiKey", "testOrgId")] - [InlineData("testLabel", "testModelId", "", "testOrgId")] - public void ConstructorWithEmptyRequiredParameterThrowsArgumentException( - string label, string modelId, string apiKey, string orgId) - { - // Act + Assert - var exception = Assert.Throws(() => new OpenAIConfig(label, modelId, apiKey, orgId)); - - Assert.Equal(ValidationException.ErrorCodes.EmptyValue, exception?.ErrorCode); - } - - [Fact] - public void OrgIdWithNullValueDoesNotThrow() - { - // Arrange - string label = "testLabel"; - string modelId = "testModelId"; - string apiKey = "testApiKey"; - - // Act - var config = new OpenAIConfig(label, modelId, apiKey, null); - - // Assert - Assert.Null(config.OrgId); - } -} diff --git a/dotnet/src/SemanticKernel.UnitTests/Configuration/KernelConfigTests.cs b/dotnet/src/SemanticKernel.UnitTests/Configuration/KernelConfigTests.cs deleted file mode 100644 index 9d557bc543d9..000000000000 --- a/dotnet/src/SemanticKernel.UnitTests/Configuration/KernelConfigTests.cs +++ /dev/null @@ -1,383 +0,0 @@ -// Copyright (c) Microsoft. All rights reserved. - -using System.Linq; -using Microsoft.Extensions.Logging.Abstractions; -using Microsoft.SemanticKernel; -using Microsoft.SemanticKernel.Configuration; -using Microsoft.SemanticKernel.Reliability; -using Moq; -using Xunit; - -namespace SemanticKernel.UnitTests.Configuration; - -/// -/// Unit tests of . -/// -public class KernelConfigTests -{ - private readonly Mock _kernel; - - public KernelConfigTests() - { - var kernelConfig = new KernelConfig(); - this._kernel = new Mock(); - this._kernel.SetupGet(x => x.Log).Returns(NullLogger.Instance); - this._kernel.SetupGet(x => x.Config).Returns(kernelConfig); - } - - [Fact] - public void HttpRetryHandlerFactoryIsSet() - { - // Arrange - var retry = new NullHttpRetryHandlerFactory(); - var config = new KernelConfig(); - - // Act - config.SetHttpRetryHandlerFactory(retry); - - // Assert - Assert.Equal(retry, config.HttpHandlerFactory); - } - - [Fact] - public void HttpRetryHandlerFactoryIsSetWithCustomImplementation() - { - // Arrange - var retry = new Mock(); - var config = new KernelConfig(); - - // Act - config.SetHttpRetryHandlerFactory(retry.Object); - - // Assert - Assert.Equal(retry.Object, config.HttpHandlerFactory); - } - - [Fact] - public void HttpRetryHandlerFactoryIsSetToDefaultHttpRetryHandlerFactoryIfNull() - { - // Arrange - var config = new KernelConfig(); - - // Act - config.SetHttpRetryHandlerFactory(null); - - // Assert - Assert.IsType(config.HttpHandlerFactory); - } - - [Fact] - public void HttpRetryHandlerFactoryIsSetToDefaultHttpRetryHandlerFactoryIfNotSet() - { - // Arrange - var config = new KernelConfig(); - - // Act - // Assert - Assert.IsType(config.HttpHandlerFactory); - } - - [Fact] - public void ItFailsWhenAddingTextCompletionServicesWithSameLabel() - { - var target = new KernelConfig(); - target.AddAzureOpenAITextCompletion("azure", "depl", "https://url", "key"); - - var exception = Assert.Throws(() => - { - target.AddAzureOpenAITextCompletion("azure", "depl2", "https://url", "key"); - }); - Assert.Equal(KernelException.ErrorCodes.InvalidServiceConfiguration, exception.ErrorCode); - } - - [Fact] - public void ItFailsWhenAddingEmbeddingGenerationServicesWithSameLabel() - { - var target = new KernelConfig(); - target.AddAzureOpenAIEmbeddingGeneration("azure", "depl", "https://url", "key"); - - var exception = Assert.Throws(() => - { - target.AddAzureOpenAIEmbeddingGeneration("azure", "depl2", "https://url", "key"); - }); - Assert.Equal(KernelException.ErrorCodes.InvalidServiceConfiguration, exception.ErrorCode); - } - - [Fact] - public void ItSucceedsWhenAddingDifferentServiceTypeWithSameLabel() - { - var target = new KernelConfig(); - target.AddAzureOpenAITextCompletion("azure", "depl", "https://url", "key"); - target.AddAzureOpenAIEmbeddingGeneration("azure", "depl2", "https://url", "key"); - - Assert.True(target.TextCompletionServices.ContainsKey("azure")); - Assert.True(target.TextEmbeddingServices.ContainsKey("azure")); - } - - [Fact] - public void ItFailsWhenSetNonExistentTextCompletionService() - { - var target = new KernelConfig(); - var exception = Assert.Throws(() => - { - target.SetDefaultTextCompletionService("azure"); - }); - Assert.Equal(KernelException.ErrorCodes.ServiceNotFound, exception.ErrorCode); - } - - [Fact] - public void ItFailsWhenSetNonExistentEmbeddingService() - { - var target = new KernelConfig(); - var exception = Assert.Throws(() => - { - target.SetDefaultEmbeddingService("azure"); - }); - Assert.Equal(KernelException.ErrorCodes.ServiceNotFound, exception.ErrorCode); - } - - [Fact] - public void ItTellsIfAServiceIsAvailable() - { - // Arrange - var target = new KernelConfig(); - target.AddAzureOpenAITextCompletion("azure", "depl", "https://url", "key"); - target.AddOpenAITextCompletion("oai", "model", "apikey"); - target.AddAzureOpenAIEmbeddingGeneration("azure", "depl2", "https://url2", "key"); - target.AddOpenAIEmbeddingGeneration("oai2", "model2", "apikey2"); - - // Assert - Assert.True(target.TextCompletionServices.ContainsKey("azure")); - Assert.True(target.TextCompletionServices.ContainsKey("oai")); - Assert.True(target.TextEmbeddingServices.ContainsKey("azure")); - Assert.True(target.TextEmbeddingServices.ContainsKey("oai2")); - - Assert.False(target.TextCompletionServices.ContainsKey("azure2")); - Assert.False(target.TextCompletionServices.ContainsKey("oai2")); - Assert.False(target.TextEmbeddingServices.ContainsKey("azure1")); - Assert.False(target.TextEmbeddingServices.ContainsKey("oai")); - } - - [Fact] - public void ItCanOverwriteServices() - { - // Arrange - var target = new KernelConfig(); - - // Act - Assert no exception occurs - target.AddAzureOpenAITextCompletion("one", "dep", "https://localhost", "key", overwrite: true); - target.AddAzureOpenAITextCompletion("one", "dep", "https://localhost", "key", overwrite: true); - target.AddOpenAITextCompletion("one", "model", "key", overwrite: true); - target.AddOpenAITextCompletion("one", "model", "key", overwrite: true); - target.AddAzureOpenAIEmbeddingGeneration("one", "dep", "https://localhost", "key", overwrite: true); - target.AddAzureOpenAIEmbeddingGeneration("one", "dep", "https://localhost", "key", overwrite: true); - target.AddOpenAIEmbeddingGeneration("one", "model", "key", overwrite: true); - target.AddOpenAIEmbeddingGeneration("one", "model", "key", overwrite: true); - } - - [Fact] - public void ItCanRemoveAllServices() - { - // Arrange - var target = new KernelConfig(); - target.AddAzureOpenAITextCompletion("one", "dep", "https://localhost", "key"); - target.AddAzureOpenAITextCompletion("2", "dep", "https://localhost", "key"); - target.AddOpenAITextCompletion("3", "model", "key"); - target.AddOpenAITextCompletion("4", "model", "key"); - target.AddAzureOpenAIEmbeddingGeneration("5", "dep", "https://localhost", "key"); - target.AddAzureOpenAIEmbeddingGeneration("6", "dep", "https://localhost", "key"); - target.AddOpenAIEmbeddingGeneration("7", "model", "key"); - target.AddOpenAIEmbeddingGeneration("8", "model", "key"); - - // Act - target.RemoveAllTextCompletionServices(); - target.RemoveAllTextEmbeddingServices(); - - // Assert - Assert.Empty(target.AllTextEmbeddingServices); - Assert.Empty(target.AllTextCompletionServices); - } - - [Fact] - public void ItCanRemoveAllTextCompletionServices() - { - // Arrange - var target = new KernelConfig(); - target.AddAzureOpenAITextCompletion("one", "dep", "https://localhost", "key"); - target.AddAzureOpenAITextCompletion("2", "dep", "https://localhost", "key"); - target.AddOpenAITextCompletion("3", "model", "key"); - target.AddOpenAITextCompletion("4", "model", "key"); - target.AddAzureOpenAIEmbeddingGeneration("5", "dep", "https://localhost", "key"); - target.AddAzureOpenAIEmbeddingGeneration("6", "dep", "https://localhost", "key"); - target.AddOpenAIEmbeddingGeneration("7", "model", "key"); - target.AddOpenAIEmbeddingGeneration("8", "model", "key"); - - // Act - target.RemoveAllTextCompletionServices(); - - // Assert - Assert.Equal(4, target.AllTextEmbeddingServices.Count()); - Assert.Empty(target.AllTextCompletionServices); - } - - [Fact] - public void ItCanRemoveAllEmbeddingServices() - { - // Arrange - var target = new KernelConfig(); - target.AddAzureOpenAITextCompletion("one", "dep", "https://localhost", "key"); - target.AddAzureOpenAITextCompletion("2", "dep", "https://localhost", "key"); - target.AddOpenAITextCompletion("3", "model", "key"); - target.AddOpenAITextCompletion("4", "model", "key"); - target.AddAzureOpenAIEmbeddingGeneration("5", "dep", "https://localhost", "key"); - target.AddAzureOpenAIEmbeddingGeneration("6", "dep", "https://localhost", "key"); - target.AddOpenAIEmbeddingGeneration("7", "model", "key"); - target.AddOpenAIEmbeddingGeneration("8", "model", "key"); - - // Act - target.RemoveAllTextEmbeddingServices(); - - // Assert - Assert.Equal(4, target.AllTextCompletionServices.Count()); - Assert.Empty(target.AllTextEmbeddingServices); - } - - [Fact] - public void ItCanRemoveOneCompletionService() - { - // Arrange - var target = new KernelConfig(); - target.AddAzureOpenAITextCompletion("1", "dep", "https://localhost", "key"); - target.AddAzureOpenAITextCompletion("2", "dep", "https://localhost", "key"); - target.AddOpenAITextCompletion("3", "model", "key"); - Assert.Equal("1", target.DefaultTextCompletionServiceId); - - // Act - Assert - target.RemoveTextCompletionService("1"); - Assert.Equal("2", target.DefaultTextCompletionServiceId); - target.RemoveTextCompletionService("2"); - Assert.Equal("3", target.DefaultTextCompletionServiceId); - target.RemoveTextCompletionService("3"); - Assert.Null(target.DefaultTextCompletionServiceId); - } - - [Fact] - public void ItCanRemoveOneEmbeddingService() - { - // Arrange - var target = new KernelConfig(); - target.AddAzureOpenAIEmbeddingGeneration("1", "dep", "https://localhost", "key"); - target.AddAzureOpenAIEmbeddingGeneration("2", "dep", "https://localhost", "key"); - target.AddOpenAIEmbeddingGeneration("3", "model", "key"); - Assert.Equal("1", target.DefaultTextEmbeddingServiceId); - - // Act - Assert - target.RemoveTextEmbeddingService("1"); - Assert.Equal("2", target.DefaultTextEmbeddingServiceId); - target.RemoveTextEmbeddingService("2"); - Assert.Equal("3", target.DefaultTextEmbeddingServiceId); - target.RemoveTextEmbeddingService("3"); - Assert.Null(target.DefaultTextEmbeddingServiceId); - } - - [Fact] - public void GetEmbeddingServiceItReturnsDefaultWhenNonExistingLabelIsProvided() - { - // Arrange - var target = new KernelConfig(); - target.AddOpenAIEmbeddingGeneration("1", "dep", "https://localhost", "key"); - target.AddAzureOpenAIEmbeddingGeneration("2", "dep", "https://localhost", "key"); - target.SetDefaultEmbeddingService("2"); - - // Act - var result = target.GetTextEmbeddingServiceIdOrDefault("test"); - - // Assert - Assert.Equal("2", result); - } - - [Fact] - public void GetEmbeddingServiceReturnsSpecificWhenExistingLabelIsProvided() - { - // Arrange - var kernel = new Mock(); - var target = new KernelConfig(); - target.AddOpenAIEmbeddingGeneration("1", "dep", "https://localhost", "key"); - target.AddAzureOpenAIEmbeddingGeneration("2", "dep", "https://localhost", "key"); - target.SetDefaultEmbeddingService("2"); - - // Act - var result = target.GetTextEmbeddingServiceIdOrDefault("1"); - - // Assert - Assert.Equal("1", result); - } - - [Fact] - public void GetEmbeddingServiceReturnsDefaultWhenNoLabelIsProvided() - { - // Arrange - var kernel = new Mock(); - var target = new KernelConfig(); - target.AddOpenAIEmbeddingGeneration("1", "dep", "https://localhost", "key"); - target.AddAzureOpenAIEmbeddingGeneration("2", "dep", "https://localhost", "key"); - target.SetDefaultEmbeddingService("2"); - - // Act - var result = target.GetTextEmbeddingServiceIdOrDefault(); - - // Assert - Assert.Equal("2", result); - } - - [Fact] - public void GetTextCompletionServiceReturnsDefaultWhenNonExistingLabelIsProvided() - { - // Arrange - var kernel = new Mock(); - var target = new KernelConfig(); - target.AddOpenAITextCompletion("1", "dep", "https://localhost", "key"); - target.AddAzureOpenAITextCompletion("2", "dep", "https://localhost", "key"); - target.SetDefaultTextCompletionService("2"); - - // Act - var result = target.GetTextCompletionServiceIdOrDefault("345"); - - // Assert - Assert.Equal("2", result); - } - - [Fact] - public void GetTextCompletionServiceReturnsSpecificWhenExistingLabelIsProvided() - { - // Arrange - var kernel = new Mock(); - var target = new KernelConfig(); - target.AddOpenAITextCompletion("1", "dep", "https://localhost", "key"); - target.AddAzureOpenAITextCompletion("2", "dep", "https://localhost", "key"); - target.SetDefaultTextCompletionService("2"); - - // Act - var result = target.GetTextCompletionServiceIdOrDefault("1"); - - // Assert - Assert.Equal("1", result); - } - - [Fact] - public void GetTextCompletionServiceItReturnsDefaultWhenNoLabelIsProvided() - { - // Arrange - var kernel = new Mock(); - var target = new KernelConfig(); - target.AddOpenAITextCompletion("1", "dep", "https://localhost", "key"); - target.AddAzureOpenAITextCompletion("2", "dep", "https://localhost", "key"); - target.SetDefaultTextCompletionService("2"); - - // Act - var result = target.GetTextCompletionServiceIdOrDefault(); - - // Assert - Assert.Equal("2", result); - } -} diff --git a/dotnet/src/SemanticKernel.UnitTests/CoreSkills/PlannerSkillTests.cs b/dotnet/src/SemanticKernel.UnitTests/CoreSkills/PlannerSkillTests.cs index 7e55e5e9cac4..c6636d8696d8 100644 --- a/dotnet/src/SemanticKernel.UnitTests/CoreSkills/PlannerSkillTests.cs +++ b/dotnet/src/SemanticKernel.UnitTests/CoreSkills/PlannerSkillTests.cs @@ -3,12 +3,12 @@ using System; using System.Threading.Tasks; using Microsoft.SemanticKernel; -using Microsoft.SemanticKernel.Configuration; +using Microsoft.SemanticKernel.AI.TextCompletion; using Microsoft.SemanticKernel.CoreSkills; using Microsoft.SemanticKernel.Orchestration; -using Microsoft.SemanticKernel.Orchestration.Extensions; using Microsoft.SemanticKernel.Planning; using Microsoft.SemanticKernel.SkillDefinition; +using Moq; using Xunit; using Xunit.Abstractions; @@ -40,7 +40,8 @@ public void ItCanBeInstantiated() { // Arrange var kernel = KernelBuilder.Create(); - _ = kernel.Config.AddOpenAITextCompletion("test", "test", "test"); + var factory = new Mock>(); + kernel.Config.AddTextCompletionService("test", factory.Object, true); // Act - Assert no exception occurs _ = new PlannerSkill(kernel); @@ -51,38 +52,43 @@ public void ItCanBeImported() { // Arrange var kernel = KernelBuilder.Create(); - _ = kernel.Config.AddOpenAITextCompletion("test", "test", "test"); + var factory = new Mock>(); + kernel.Config.AddTextCompletionService("test", factory.Object, true); // Act - Assert no exception occurs e.g. due to reflection _ = kernel.ImportSkill(new PlannerSkill(kernel), "planner"); } - [Fact] - public async Task ItCanCreatePlanAsync() - { - // Arrange - var kernel = KernelBuilder.Create(); - _ = kernel.Config.AddOpenAITextCompletion("test", "test", "test"); - var plannerSkill = new PlannerSkill(kernel); - var planner = kernel.ImportSkill(plannerSkill, "planner"); - - // Act - var context = await kernel.RunAsync(GoalText, planner["CreatePlan"]); - - // Assert - var plan = context.Variables.ToPlan(); - Assert.NotNull(plan); - Assert.NotNull(plan.Id); - Assert.Equal(GoalText, plan.Goal); - Assert.StartsWith("\nSolve the equation x^2 = 2.\n", plan.PlanString, StringComparison.OrdinalIgnoreCase); - } + // TODO: fix the tests - they are not mocking the AI connector and should have been failing. + // Looks like they've been passing only because the planner is swallowing HTTP errors. + // [Fact] + // public async Task ItCanCreatePlanAsync() + // { + // // Arrange + // var kernel = KernelBuilder.Create(); + // var factory = new Mock>(); + // kernel.Config.AddTextCompletion("test", factory.Object, true); + // var plannerSkill = new PlannerSkill(kernel); + // var planner = kernel.ImportSkill(plannerSkill, "planner"); + // + // // Act + // var context = await kernel.RunAsync(GoalText, planner["CreatePlan"]); + // + // // Assert + // var plan = context.Variables.ToPlan(); + // Assert.NotNull(plan); + // Assert.NotNull(plan.Id); + // Assert.Equal(GoalText, plan.Goal); + // Assert.StartsWith("\nSolve the equation x^2 = 2.\n", plan.PlanString, StringComparison.OrdinalIgnoreCase); + // } [Fact] public async Task ItCanExecutePlanTextAsync() { // Arrange var kernel = KernelBuilder.Create(); - _ = kernel.Config.AddOpenAITextCompletion("test", "test", "test"); + var factory = new Mock>(); + kernel.Config.AddTextCompletionService("test", factory.Object, true); var plannerSkill = kernel.ImportSkill(new PlannerSkill(kernel)); // Act @@ -103,7 +109,8 @@ public async Task ItCanExecutePlanAsync() { // Arrange var kernel = KernelBuilder.Create(); - _ = kernel.Config.AddOpenAITextCompletion("test", "test", "test"); + var factory = new Mock>(); + kernel.Config.AddTextCompletionService("test", factory.Object, true); var plannerSkill = kernel.ImportSkill(new PlannerSkill(kernel)); Plan createdPlan = new() { @@ -123,31 +130,35 @@ public async Task ItCanExecutePlanAsync() Assert.Equal(GoalText, plan.Goal); } - [Fact] - public async Task ItCanCreateSkillPlanAsync() - { - // Arrange - var kernel = KernelBuilder.Create(); - _ = kernel.Config.AddOpenAITextCompletion("test", "test", "test"); - var plannerSkill = kernel.ImportSkill(new PlannerSkill(kernel)); - - // Act - var context = await kernel.RunAsync(GoalText, plannerSkill["CreatePlan"]); - - // Assert - var plan = context.Variables.ToPlan(); - Assert.NotNull(plan); - Assert.NotNull(plan.Id); - Assert.Equal(GoalText, plan.Goal); - Assert.StartsWith("\nSolve the equation x^2 = 2.\n", plan.PlanString, StringComparison.OrdinalIgnoreCase); - } + // TODO: fix the tests - they are not mocking the AI connector and should have been failing. + // Looks like they've been passing only because the planner is swallowing HTTP errors. + // [Fact] + // public async Task ItCanCreateSkillPlanAsync() + // { + // // Arrange + // var kernel = KernelBuilder.Create(); + // var factory = new Mock>(); + // kernel.Config.AddTextCompletion("test", factory.Object, true); + // var plannerSkill = kernel.ImportSkill(new PlannerSkill(kernel)); + // + // // Act + // var context = await kernel.RunAsync(GoalText, plannerSkill["CreatePlan"]); + // + // // Assert + // var plan = context.Variables.ToPlan(); + // Assert.NotNull(plan); + // Assert.NotNull(plan.Id); + // Assert.Equal(GoalText, plan.Goal); + // Assert.StartsWith("\nSolve the equation x^2 = 2.\n", plan.PlanString, StringComparison.OrdinalIgnoreCase); + // } [Fact] public async Task ItCanExecutePlanJsonAsync() { // Arrange var kernel = KernelBuilder.Create(); - _ = kernel.Config.AddOpenAITextCompletion("test", "test", "test"); + var factory = new Mock>(); + kernel.Config.AddTextCompletionService("test", factory.Object, true); var plannerSkill = kernel.ImportSkill(new PlannerSkill(kernel)); Plan createdPlan = new() { @@ -170,7 +181,8 @@ public async Task NoGoalExecutePlanReturnsInvalidResultAsync() { // Arrange var kernel = KernelBuilder.Create(); - _ = kernel.Config.AddOpenAITextCompletion("test", "test", "test"); + var factory = new Mock>(); + kernel.Config.AddTextCompletionService("test", factory.Object, true); var plannerSkill = kernel.ImportSkill(new PlannerSkill(kernel)); // Act @@ -192,7 +204,8 @@ public async Task InvalidPlanExecutePlanReturnsInvalidResultAsync() { // Arrange var kernel = KernelBuilder.Create(); - _ = kernel.Config.AddOpenAITextCompletion("test", "test", "test"); + var factory = new Mock>(); + kernel.Config.AddTextCompletionService("test", factory.Object, true); var plannerSkill = kernel.ImportSkill(new PlannerSkill(kernel)); // Act @@ -221,7 +234,8 @@ public async Task ExecutePlanCanCallFunctionAsync(string goalText, string planTe { // Arrange var kernel = KernelBuilder.Create(); - _ = kernel.Config.AddOpenAITextCompletion("test", "test", "test"); + var factory = new Mock>(); + kernel.Config.AddTextCompletionService("test", factory.Object, true); var plannerSkill = kernel.ImportSkill(new PlannerSkill(kernel)); _ = kernel.ImportSkill(new MockSkill(this._testOutputHelper), "MockSkill"); Plan createdPlan = new() @@ -254,7 +268,8 @@ public async Task ExecutePlanCanCallFunctionWithTextAsync(string goalText, strin { // Arrange var kernel = KernelBuilder.Create(); - _ = kernel.Config.AddOpenAITextCompletion("test", "test", "test"); + var factory = new Mock>(); + kernel.Config.AddTextCompletionService("test", factory.Object, true); var plannerSkill = kernel.ImportSkill(new PlannerSkill(kernel)); _ = kernel.ImportSkill(new MockSkill(this._testOutputHelper), "MockSkill"); Plan createdPlan = new() @@ -289,7 +304,8 @@ public async Task ExecutePlanCanCallFunctionWithVariablesAsync(string goalText, { // Arrange var kernel = KernelBuilder.Create(); - _ = kernel.Config.AddOpenAITextCompletion("test", "test", "test"); + var factory = new Mock>(); + kernel.Config.AddTextCompletionService("test", factory.Object, true); var plannerSkill = kernel.ImportSkill(new PlannerSkill(kernel)); _ = kernel.ImportSkill(new MockSkill(this._testOutputHelper), "MockSkill"); Plan createdPlan = new() @@ -328,7 +344,8 @@ public async Task ExecutePlanCanCallFunctionWithVariablesAndResultAsync(string g { // Arrange var kernel = KernelBuilder.Create(); - _ = kernel.Config.AddOpenAITextCompletion("test", "test", "test"); + var factory = new Mock>(); + kernel.Config.AddTextCompletionService("test", factory.Object, true); var plannerSkill = kernel.ImportSkill(new PlannerSkill(kernel)); _ = kernel.ImportSkill(new MockSkill(this._testOutputHelper), "MockSkill"); Plan createdPlan = new() @@ -370,7 +387,8 @@ public async Task ExecutePlanCanCallFunctionWithChainedVariablesAsync(string goa { // Arrange var kernel = KernelBuilder.Create(); - _ = kernel.Config.AddOpenAITextCompletion("test", "test", "test"); + var factory = new Mock>(); + kernel.Config.AddTextCompletionService("test", factory.Object, true); var plannerSkill = kernel.ImportSkill(new PlannerSkill(kernel)); _ = kernel.ImportSkill(new MockSkill(this._testOutputHelper), "MockSkill"); Plan createdPlan = new() @@ -408,7 +426,8 @@ public async Task ExecutePlanCanSkipTagsAsync(string goalText, string planText) { // Arrange var kernel = KernelBuilder.Create(); - _ = kernel.Config.AddOpenAITextCompletion("test", "test", "test"); + var factory = new Mock>(); + kernel.Config.AddTextCompletionService("test", factory.Object, true); var plannerSkill = kernel.ImportSkill(new PlannerSkill(kernel)); _ = kernel.ImportSkill(new MockSkill(this._testOutputHelper), "MockSkill"); Plan createdPlan = new() @@ -441,7 +460,8 @@ public async Task ExecutePlanCanSkipOutputAsync(string goalText, string planText { // Arrange var kernel = KernelBuilder.Create(); - _ = kernel.Config.AddOpenAITextCompletion("test", "test", "test"); + var factory = new Mock>(); + kernel.Config.AddTextCompletionService("test", factory.Object, true); var plannerSkill = kernel.ImportSkill(new PlannerSkill(kernel)); _ = kernel.ImportSkill(new MockSkill(this._testOutputHelper), "MockSkill"); Plan createdPlan = new() diff --git a/dotnet/src/SemanticKernel.UnitTests/KernelConfigTests.cs b/dotnet/src/SemanticKernel.UnitTests/KernelConfigTests.cs new file mode 100644 index 000000000000..50ecb9ce1ae3 --- /dev/null +++ b/dotnet/src/SemanticKernel.UnitTests/KernelConfigTests.cs @@ -0,0 +1,99 @@ +// Copyright (c) Microsoft. All rights reserved. + +using Microsoft.Extensions.Logging.Abstractions; +using Microsoft.SemanticKernel; +using Microsoft.SemanticKernel.Reliability; +using Moq; +using Xunit; + +namespace SemanticKernel.UnitTests; + +/// +/// Unit tests of . +/// +public class KernelConfigTests +{ + private readonly Mock _kernel; + + public KernelConfigTests() + { + var kernelConfig = new KernelConfig(); + this._kernel = new Mock(); + this._kernel.SetupGet(x => x.Log).Returns(NullLogger.Instance); + this._kernel.SetupGet(x => x.Config).Returns(kernelConfig); + } + + [Fact] + public void HttpRetryHandlerFactoryIsSet() + { + // Arrange + var retry = new NullHttpRetryHandlerFactory(); + var config = new KernelConfig(); + + // Act + config.SetHttpRetryHandlerFactory(retry); + + // Assert + Assert.Equal(retry, config.HttpHandlerFactory); + } + + [Fact] + public void HttpRetryHandlerFactoryIsSetWithCustomImplementation() + { + // Arrange + var retry = new Mock(); + var config = new KernelConfig(); + + // Act + config.SetHttpRetryHandlerFactory(retry.Object); + + // Assert + Assert.Equal(retry.Object, config.HttpHandlerFactory); + } + + [Fact] + public void HttpRetryHandlerFactoryIsSetToDefaultHttpRetryHandlerFactoryIfNull() + { + // Arrange + var config = new KernelConfig(); + + // Act + config.SetHttpRetryHandlerFactory(null); + + // Assert + Assert.IsType(config.HttpHandlerFactory); + } + + [Fact] + public void HttpRetryHandlerFactoryIsSetToDefaultHttpRetryHandlerFactoryIfNotSet() + { + // Arrange + var config = new KernelConfig(); + + // Act + // Assert + Assert.IsType(config.HttpHandlerFactory); + } + + [Fact] + public void ItFailsWhenSetNonExistentTextCompletionService() + { + var target = new KernelConfig(); + var exception = Assert.Throws(() => + { + target.SetDefaultTextCompletionService("azure"); + }); + Assert.Equal(KernelException.ErrorCodes.ServiceNotFound, exception.ErrorCode); + } + + [Fact] + public void ItFailsWhenSetNonExistentEmbeddingService() + { + var target = new KernelConfig(); + var exception = Assert.Throws(() => + { + target.SetDefaultTextEmbeddingGenerationService("azure"); + }); + Assert.Equal(KernelException.ErrorCodes.ServiceNotFound, exception.ErrorCode); + } +} diff --git a/dotnet/src/SemanticKernel.UnitTests/KernelTests.cs b/dotnet/src/SemanticKernel.UnitTests/KernelTests.cs index 2b1ecf0afe88..5d57678102bc 100644 --- a/dotnet/src/SemanticKernel.UnitTests/KernelTests.cs +++ b/dotnet/src/SemanticKernel.UnitTests/KernelTests.cs @@ -5,11 +5,10 @@ using System.Threading; using System.Threading.Tasks; using Microsoft.SemanticKernel; -using Microsoft.SemanticKernel.Configuration; -using Microsoft.SemanticKernel.KernelExtensions; +using Microsoft.SemanticKernel.AI.TextCompletion; using Microsoft.SemanticKernel.Orchestration; -using Microsoft.SemanticKernel.Orchestration.Extensions; using Microsoft.SemanticKernel.SkillDefinition; +using Moq; using Xunit; // ReSharper disable StringLiteralTypo @@ -23,7 +22,8 @@ public void ItProvidesAccessToFunctionsViaSkillCollection() { // Arrange var kernel = KernelBuilder.Create(); - kernel.Config.AddOpenAITextCompletion("x", "y", "z"); + var factory = new Mock>(); + kernel.Config.AddTextCompletionService("x", factory.Object, true); var nativeSkill = new MySkill(); kernel.CreateSemanticFunction(promptTemplate: "Tell me a joke", functionName: "joker", skillName: "jk", description: "Nice fun"); @@ -50,7 +50,8 @@ public async Task ItProvidesAccessToFunctionsViaSKContextAsync() { // Arrange var kernel = KernelBuilder.Create(); - kernel.Config.AddOpenAITextCompletion("x", "y", "z"); + var factory = new Mock>(); + kernel.Config.AddTextCompletionService("x", factory.Object, true); var nativeSkill = new MySkill(); kernel.CreateSemanticFunction("Tell me a joke", functionName: "joker", skillName: "jk", description: "Nice fun"); @@ -135,12 +136,13 @@ public void ItAllowsToImportSkillsInTheGlobalNamespace() } [Fact] - public void ItFailsIfCompletionBackendConfigIsNotSet() + public void ItFailsIfTextCompletionServiceConfigIsNotSet() { // Arrange var kernel = KernelBuilder.Create(); - var exception = Assert.Throws(() => kernel.CreateSemanticFunction(promptTemplate: "Tell me a joke", functionName: "joker", skillName: "jk", description: "Nice fun")); + var exception = Assert.Throws( + () => kernel.CreateSemanticFunction(promptTemplate: "Tell me a joke", functionName: "joker", skillName: "jk", description: "Nice fun")); } public class MySkill diff --git a/dotnet/src/SemanticKernel.UnitTests/Planning/SKContextExtensionsTests.cs b/dotnet/src/SemanticKernel.UnitTests/Planning/SKContextExtensionsTests.cs index 32c108385531..9f08b5ddf1ce 100644 --- a/dotnet/src/SemanticKernel.UnitTests/Planning/SKContextExtensionsTests.cs +++ b/dotnet/src/SemanticKernel.UnitTests/Planning/SKContextExtensionsTests.cs @@ -6,7 +6,6 @@ using System.Threading.Tasks; using Microsoft.SemanticKernel.Memory; using Microsoft.SemanticKernel.Orchestration; -using Microsoft.SemanticKernel.Planning; using Microsoft.SemanticKernel.SkillDefinition; using Moq; using SemanticKernel.UnitTests.XunitHelpers; diff --git a/dotnet/src/SemanticKernel.UnitTests/Reliability/HttpRetryConfigTests.cs b/dotnet/src/SemanticKernel.UnitTests/Reliability/HttpRetryConfigTests.cs index e57c238df8d3..2501217a46a4 100644 --- a/dotnet/src/SemanticKernel.UnitTests/Reliability/HttpRetryConfigTests.cs +++ b/dotnet/src/SemanticKernel.UnitTests/Reliability/HttpRetryConfigTests.cs @@ -1,7 +1,7 @@ // Copyright (c) Microsoft. All rights reserved. using System.Threading.Tasks; -using Microsoft.SemanticKernel.Configuration; +using Microsoft.SemanticKernel; using Microsoft.SemanticKernel.Reliability; using Xunit; diff --git a/dotnet/src/SemanticKernel.UnitTests/AI/OpenAI/Services/BackendConfigTests.cs b/dotnet/src/SemanticKernel.UnitTests/Services/ServiceConfigTests.cs similarity index 56% rename from dotnet/src/SemanticKernel.UnitTests/AI/OpenAI/Services/BackendConfigTests.cs rename to dotnet/src/SemanticKernel.UnitTests/Services/ServiceConfigTests.cs index 3f93cff683f0..f07750563d9c 100644 --- a/dotnet/src/SemanticKernel.UnitTests/AI/OpenAI/Services/BackendConfigTests.cs +++ b/dotnet/src/SemanticKernel.UnitTests/Services/ServiceConfigTests.cs @@ -1,38 +1,38 @@ // Copyright (c) Microsoft. All rights reserved. -using Microsoft.SemanticKernel.AI.OpenAI.Services; using Microsoft.SemanticKernel.Diagnostics; +using Microsoft.SemanticKernel.Services; using Xunit; -namespace SemanticKernel.UnitTests.AI.OpenAI.Services; +namespace SemanticKernel.UnitTests.Services; -public class BackendConfigTests +public class ServiceConfigTests { [Fact] public void ConstructorWithValidParametersSetsProperties() { // Arrange - string label = "testLabel"; + string serviceId = "testId"; // Act - var config = new FakeBackendConfig(label); + var config = new FakeAIServiceConfig(serviceId); // Assert - Assert.Equal(label, config.Label); + Assert.Equal(serviceId, config.ServiceId); } [Fact] public void ConstructorWithEmptyRequiredParameterThrowsArgumentException() { // Act + Assert - var exception = Assert.Throws(() => new FakeBackendConfig(string.Empty)); + var exception = Assert.Throws(() => new FakeAIServiceConfig(string.Empty)); Assert.Equal(ValidationException.ErrorCodes.EmptyValue, exception?.ErrorCode); } - private class FakeBackendConfig : BackendConfig + private class FakeAIServiceConfig : ServiceConfig { - public FakeBackendConfig(string label) : base(label) + public FakeAIServiceConfig(string serviceId) : base(serviceId) { } } diff --git a/dotnet/src/SemanticKernel.UnitTests/Text/StringExtensionsTests.cs b/dotnet/src/SemanticKernel.UnitTests/Text/StringExtensionsTests.cs index c5b7a1cd5889..5d900a15bb53 100644 --- a/dotnet/src/SemanticKernel.UnitTests/Text/StringExtensionsTests.cs +++ b/dotnet/src/SemanticKernel.UnitTests/Text/StringExtensionsTests.cs @@ -1,6 +1,5 @@ // Copyright (c) Microsoft. All rights reserved. -using System; using Microsoft.SemanticKernel.Text; using Xunit; diff --git a/dotnet/src/SemanticKernel/AI/ChatCompletion/ChatHistory.cs b/dotnet/src/SemanticKernel/AI/ChatCompletion/ChatHistory.cs index a2ed98eb41ea..15f46f58e295 100644 --- a/dotnet/src/SemanticKernel/AI/ChatCompletion/ChatHistory.cs +++ b/dotnet/src/SemanticKernel/AI/ChatCompletion/ChatHistory.cs @@ -1,8 +1,6 @@ // Copyright (c) Microsoft. All rights reserved. using System.Collections.Generic; -using System.Linq; -using Microsoft.SemanticKernel.AI.OpenAI.HttpSchema; namespace Microsoft.SemanticKernel.AI.ChatCompletion; @@ -57,15 +55,4 @@ public void AddMessage(string authorRole, string content) { this.Messages.Add(new Message(authorRole, content)); } - - /// - /// Map internal data to HTTP schema used with LLM - /// - /// Returns list of chat messages - public IList ToHttpSchema() - { - return this.Messages - .Select(msg => new ChatCompletionRequest.Message(msg.AuthorRole, msg.Content)) - .ToList(); - } } diff --git a/dotnet/src/SemanticKernel/AI/ChatCompletion/IChatCompletion.cs b/dotnet/src/SemanticKernel/AI/ChatCompletion/IChatCompletion.cs index ba757c6d6c9c..f49d6574a479 100644 --- a/dotnet/src/SemanticKernel/AI/ChatCompletion/IChatCompletion.cs +++ b/dotnet/src/SemanticKernel/AI/ChatCompletion/IChatCompletion.cs @@ -22,7 +22,7 @@ public Task GenerateMessageAsync( /// /// Create a new empty chat instance /// - /// Optional chat instructions for the backend + /// Optional chat instructions for the AI service /// Chat object public ChatHistory CreateNewChat(string instructions = ""); } diff --git a/dotnet/src/SemanticKernel/AI/Embeddings/IEmbeddingGenerator.cs b/dotnet/src/SemanticKernel/AI/Embeddings/IEmbeddingGeneration.cs similarity index 88% rename from dotnet/src/SemanticKernel/AI/Embeddings/IEmbeddingGenerator.cs rename to dotnet/src/SemanticKernel/AI/Embeddings/IEmbeddingGeneration.cs index 7939d80a4222..d1a603b80c5f 100644 --- a/dotnet/src/SemanticKernel/AI/Embeddings/IEmbeddingGenerator.cs +++ b/dotnet/src/SemanticKernel/AI/Embeddings/IEmbeddingGeneration.cs @@ -12,7 +12,7 @@ namespace Microsoft.SemanticKernel.AI.Embeddings; /// /// The type from which embeddings will be generated. /// The numeric type of the embedding data. -public interface IEmbeddingGenerator +public interface IEmbeddingGeneration where TEmbedding : unmanaged { /// @@ -24,9 +24,9 @@ public interface IEmbeddingGenerator } /// -/// Provides a collection of static methods for operating on objects. +/// Provides a collection of static methods for operating on objects. /// -public static class EmbeddingGeneratorExtensions +public static class EmbeddingGenerationExtensions { /// /// Generates an embedding from the given . @@ -37,7 +37,7 @@ public static class EmbeddingGeneratorExtensions /// A value from which an will be generated. /// A list of structs representing the input . public static async Task> GenerateEmbeddingAsync - (this IEmbeddingGenerator generator, TValue value) + (this IEmbeddingGeneration generator, TValue value) where TEmbedding : unmanaged { Verify.NotNull(generator, "Embeddings generator cannot be NULL"); diff --git a/dotnet/src/SemanticKernel/AI/OpenAI/Services/AzureOpenAIConfig.cs b/dotnet/src/SemanticKernel/AI/OpenAI/Services/AzureOpenAIConfig.cs deleted file mode 100644 index 5b5574dab518..000000000000 --- a/dotnet/src/SemanticKernel/AI/OpenAI/Services/AzureOpenAIConfig.cs +++ /dev/null @@ -1,54 +0,0 @@ -// Copyright (c) Microsoft. All rights reserved. - -using Microsoft.SemanticKernel.Diagnostics; - -namespace Microsoft.SemanticKernel.AI.OpenAI.Services; - -/// -/// Azure OpenAI configuration. -/// -public sealed class AzureOpenAIConfig : BackendConfig -{ - /// - /// Azure OpenAI deployment name, see https://learn.microsoft.com/azure/cognitive-services/openai/how-to/create-resource - /// - public string DeploymentName { get; set; } - - /// - /// Azure OpenAI deployment URL, see https://learn.microsoft.com/azure/cognitive-services/openai/quickstart - /// - public string Endpoint { get; set; } - - /// - /// Azure OpenAI API key, see https://learn.microsoft.com/azure/cognitive-services/openai/quickstart - /// - public string APIKey { get; set; } - - /// - /// Azure OpenAI API version, see https://learn.microsoft.com/azure/cognitive-services/openai/reference - /// - public string APIVersion { get; set; } - - /// - /// Creates a new with supplied values. - /// - /// An identifier used to map semantic functions to backend, - /// decoupling prompts configurations from the actual model used - /// Azure OpenAI deployment name, see https://learn.microsoft.com/azure/cognitive-services/openai/how-to/create-resource - /// Azure OpenAI deployment URL, see https://learn.microsoft.com/azure/cognitive-services/openai/quickstart - /// Azure OpenAI API key, see https://learn.microsoft.com/azure/cognitive-services/openai/quickstart - /// Azure OpenAI API version, see https://learn.microsoft.com/azure/cognitive-services/openai/reference - public AzureOpenAIConfig(string label, string deploymentName, string endpoint, string apiKey, string apiVersion) - : base(label) - { - Verify.NotEmpty(deploymentName, "The deployment name is empty"); - Verify.NotEmpty(endpoint, "The endpoint is empty"); - Verify.StartsWith(endpoint, "https://", "The endpoint URL must start with https://"); - Verify.NotEmpty(apiKey, "The API key is empty"); - - this.DeploymentName = deploymentName; - this.Endpoint = endpoint; - this.APIKey = apiKey; - this.APIVersion = apiVersion; - } -} diff --git a/dotnet/src/SemanticKernel/AI/OpenAI/Services/BackendConfig.cs b/dotnet/src/SemanticKernel/AI/OpenAI/Services/BackendConfig.cs deleted file mode 100644 index e26fd93539a4..000000000000 --- a/dotnet/src/SemanticKernel/AI/OpenAI/Services/BackendConfig.cs +++ /dev/null @@ -1,25 +0,0 @@ -// Copyright (c) Microsoft. All rights reserved. - -using Microsoft.SemanticKernel.Configuration; -using Microsoft.SemanticKernel.Diagnostics; - -namespace Microsoft.SemanticKernel.AI.OpenAI.Services; - -public abstract class BackendConfig : IBackendConfig -{ - /// - /// An identifier used to map semantic functions to backend, - /// decoupling prompts configurations from the actual model used. - /// - public string Label { get; } - - /// - /// Creates a new with supplied values. - /// - /// An identifier used to map semantic functions to backend. - protected BackendConfig(string label) - { - Verify.NotEmpty(label, "The configuration label is empty"); - this.Label = label; - } -} diff --git a/dotnet/src/SemanticKernel/AI/OpenAI/Services/OpenAIConfig.cs b/dotnet/src/SemanticKernel/AI/OpenAI/Services/OpenAIConfig.cs deleted file mode 100644 index e091d72733b1..000000000000 --- a/dotnet/src/SemanticKernel/AI/OpenAI/Services/OpenAIConfig.cs +++ /dev/null @@ -1,45 +0,0 @@ -// Copyright (c) Microsoft. All rights reserved. - -using Microsoft.SemanticKernel.Diagnostics; - -namespace Microsoft.SemanticKernel.AI.OpenAI.Services; - -/// -/// OpenAI configuration. -/// -public sealed class OpenAIConfig : BackendConfig -{ - /// - /// OpenAI model name, see https://platform.openai.com/docs/models - /// - public string ModelId { get; } - - /// - /// OpenAI API key, see https://platform.openai.com/account/api-keys - /// - public string APIKey { get; } - - /// - /// OpenAI organization id. This is usually optional unless your account belongs to multiple organizations. - /// - public string? OrgId { get; } - - /// - /// Creates a new with supplied values. - /// - /// An identifier used to map semantic functions to backend, - /// decoupling prompts configurations from the actual model used. - /// OpenAI model name, see https://platform.openai.com/docs/models - /// OpenAI API key, see https://platform.openai.com/account/api-keys - /// OpenAI organization id. This is usually optional unless your account belongs to multiple organizations. - public OpenAIConfig(string label, string modelId, string apiKey, string? orgId) - : base(label) - { - Verify.NotEmpty(modelId, "The model ID is empty"); - Verify.NotEmpty(apiKey, "The API key is empty"); - - this.ModelId = modelId; - this.APIKey = apiKey; - this.OrgId = orgId; - } -} diff --git a/dotnet/src/SemanticKernel/AI/TextCompletion/ITextCompletion.cs b/dotnet/src/SemanticKernel/AI/TextCompletion/ITextCompletion.cs index 6fdd6d2c1cc0..67f77974062b 100644 --- a/dotnet/src/SemanticKernel/AI/TextCompletion/ITextCompletion.cs +++ b/dotnet/src/SemanticKernel/AI/TextCompletion/ITextCompletion.cs @@ -6,7 +6,7 @@ namespace Microsoft.SemanticKernel.AI.TextCompletion; /// -/// Interface for text completion backends/services/clients +/// Interface for text completion services /// public interface ITextCompletion { diff --git a/dotnet/src/SemanticKernel/Configuration/IBackendConfig.cs b/dotnet/src/SemanticKernel/Configuration/IBackendConfig.cs deleted file mode 100644 index fce8c1388e2f..000000000000 --- a/dotnet/src/SemanticKernel/Configuration/IBackendConfig.cs +++ /dev/null @@ -1,13 +0,0 @@ -// Copyright (c) Microsoft. All rights reserved. - -namespace Microsoft.SemanticKernel.Configuration; - -/// -/// Backend configuration. -/// -public interface IBackendConfig -{ - /// An identifier used to map semantic functions to backend, - /// decoupling prompts configurations from the actual model used. - public string Label { get; } -} diff --git a/dotnet/src/SemanticKernel/AI/OpenAI/HttpSchema/AzureDeployments.cs b/dotnet/src/SemanticKernel/Connectors/OpenAI/AzureDeployments.cs similarity index 97% rename from dotnet/src/SemanticKernel/AI/OpenAI/HttpSchema/AzureDeployments.cs rename to dotnet/src/SemanticKernel/Connectors/OpenAI/AzureDeployments.cs index 693c0710810b..6db1df9549e9 100644 --- a/dotnet/src/SemanticKernel/AI/OpenAI/HttpSchema/AzureDeployments.cs +++ b/dotnet/src/SemanticKernel/Connectors/OpenAI/AzureDeployments.cs @@ -4,7 +4,7 @@ using System.Diagnostics.CodeAnalysis; using System.Text.Json.Serialization; -namespace Microsoft.SemanticKernel.AI.OpenAI.HttpSchema; +namespace Microsoft.SemanticKernel.Connectors.OpenAI; /// /// Azure OpenAI deployment schema diff --git a/dotnet/src/SemanticKernel/AI/OpenAI/Clients/AzureOpenAIClientAbstract.cs b/dotnet/src/SemanticKernel/Connectors/OpenAI/AzureOpenAIClientAbstract.cs similarity index 98% rename from dotnet/src/SemanticKernel/AI/OpenAI/Clients/AzureOpenAIClientAbstract.cs rename to dotnet/src/SemanticKernel/Connectors/OpenAI/AzureOpenAIClientAbstract.cs index 3ac693ed051f..b03887b45d60 100644 --- a/dotnet/src/SemanticKernel/AI/OpenAI/Clients/AzureOpenAIClientAbstract.cs +++ b/dotnet/src/SemanticKernel/Connectors/OpenAI/AzureOpenAIClientAbstract.cs @@ -5,11 +5,11 @@ using System.Net.Http; using System.Threading.Tasks; using Microsoft.Extensions.Logging; -using Microsoft.SemanticKernel.AI.OpenAI.HttpSchema; +using Microsoft.SemanticKernel.AI; using Microsoft.SemanticKernel.Reliability; using Microsoft.SemanticKernel.Text; -namespace Microsoft.SemanticKernel.AI.OpenAI.Clients; +namespace Microsoft.SemanticKernel.Connectors.OpenAI; /// /// An abstract Azure OpenAI Client. diff --git a/dotnet/src/SemanticKernel/AI/OpenAI/HttpSchema/ChatCompletionRequest.cs b/dotnet/src/SemanticKernel/Connectors/OpenAI/ChatCompletion/ChatCompletionRequest.cs similarity index 98% rename from dotnet/src/SemanticKernel/AI/OpenAI/HttpSchema/ChatCompletionRequest.cs rename to dotnet/src/SemanticKernel/Connectors/OpenAI/ChatCompletion/ChatCompletionRequest.cs index 1a9032d77da2..f12d2587e952 100644 --- a/dotnet/src/SemanticKernel/AI/OpenAI/HttpSchema/ChatCompletionRequest.cs +++ b/dotnet/src/SemanticKernel/Connectors/OpenAI/ChatCompletion/ChatCompletionRequest.cs @@ -3,7 +3,7 @@ using System.Collections.Generic; using System.Text.Json.Serialization; -namespace Microsoft.SemanticKernel.AI.OpenAI.HttpSchema; +namespace Microsoft.SemanticKernel.Connectors.OpenAI.ChatCompletion; /// /// OpenAI Chat Completion Request diff --git a/dotnet/src/SemanticKernel/AI/OpenAI/HttpSchema/ChatCompletionResponse.cs b/dotnet/src/SemanticKernel/Connectors/OpenAI/ChatCompletion/ChatCompletionResponse.cs similarity index 97% rename from dotnet/src/SemanticKernel/AI/OpenAI/HttpSchema/ChatCompletionResponse.cs rename to dotnet/src/SemanticKernel/Connectors/OpenAI/ChatCompletion/ChatCompletionResponse.cs index fa8e38231014..08f8721fa1f5 100644 --- a/dotnet/src/SemanticKernel/AI/OpenAI/HttpSchema/ChatCompletionResponse.cs +++ b/dotnet/src/SemanticKernel/Connectors/OpenAI/ChatCompletion/ChatCompletionResponse.cs @@ -3,7 +3,7 @@ using System.Collections.Generic; using System.Text.Json.Serialization; -namespace Microsoft.SemanticKernel.AI.OpenAI.HttpSchema; +namespace Microsoft.SemanticKernel.Connectors.OpenAI.ChatCompletion; /// /// Chat completion response diff --git a/dotnet/src/SemanticKernel/AI/OpenAI/Services/OpenAIChatCompletion.cs b/dotnet/src/SemanticKernel/Connectors/OpenAI/ChatCompletion/OpenAIChatCompletion.cs similarity index 82% rename from dotnet/src/SemanticKernel/AI/OpenAI/Services/OpenAIChatCompletion.cs rename to dotnet/src/SemanticKernel/Connectors/OpenAI/ChatCompletion/OpenAIChatCompletion.cs index 3aae9de53868..c76e9d3b31e3 100644 --- a/dotnet/src/SemanticKernel/AI/OpenAI/Services/OpenAIChatCompletion.cs +++ b/dotnet/src/SemanticKernel/Connectors/OpenAI/ChatCompletion/OpenAIChatCompletion.cs @@ -1,17 +1,18 @@ // Copyright (c) Microsoft. All rights reserved. +using System.Collections.Generic; +using System.Linq; using System.Net.Http.Headers; using System.Threading; using System.Threading.Tasks; using Microsoft.Extensions.Logging; +using Microsoft.SemanticKernel.AI; using Microsoft.SemanticKernel.AI.ChatCompletion; -using Microsoft.SemanticKernel.AI.OpenAI.Clients; -using Microsoft.SemanticKernel.AI.OpenAI.HttpSchema; using Microsoft.SemanticKernel.Diagnostics; using Microsoft.SemanticKernel.Reliability; using Microsoft.SemanticKernel.Text; -namespace Microsoft.SemanticKernel.AI.OpenAI.Services; +namespace Microsoft.SemanticKernel.Connectors.OpenAI.ChatCompletion; public class OpenAIChatCompletion : OpenAIClientAbstract, IChatCompletion { @@ -59,7 +60,7 @@ public Task GenerateMessageAsync( var requestBody = Json.Serialize(new ChatCompletionRequest { Model = this._modelId, - Messages = chat.ToHttpSchema(), + Messages = ToHttpSchema(chat), Temperature = requestSettings.Temperature, TopP = requestSettings.TopP, PresencePenalty = requestSettings.PresencePenalty, @@ -76,4 +77,15 @@ public ChatHistory CreateNewChat(string instructions = "") { return new OpenAIChatHistory(instructions); } + + /// + /// Map chat data to HTTP schema used with LLM + /// + /// Returns list of chat messages + private static IList ToHttpSchema(ChatHistory chat) + { + return chat.Messages + .Select(msg => new ChatCompletionRequest.Message(msg.AuthorRole, msg.Content)) + .ToList(); + } } diff --git a/dotnet/src/SemanticKernel/AI/ChatCompletion/OpenAIChatHistory.cs b/dotnet/src/SemanticKernel/Connectors/OpenAI/ChatCompletion/OpenAIChatHistory.cs similarity index 92% rename from dotnet/src/SemanticKernel/AI/ChatCompletion/OpenAIChatHistory.cs rename to dotnet/src/SemanticKernel/Connectors/OpenAI/ChatCompletion/OpenAIChatHistory.cs index b3db8b371374..4ac0297b9886 100644 --- a/dotnet/src/SemanticKernel/AI/ChatCompletion/OpenAIChatHistory.cs +++ b/dotnet/src/SemanticKernel/Connectors/OpenAI/ChatCompletion/OpenAIChatHistory.cs @@ -1,6 +1,8 @@ // Copyright (c) Microsoft. All rights reserved. -namespace Microsoft.SemanticKernel.AI.ChatCompletion; +using Microsoft.SemanticKernel.AI.ChatCompletion; + +namespace Microsoft.SemanticKernel.Connectors.OpenAI.ChatCompletion; /// /// OpenAI Chat content diff --git a/dotnet/src/SemanticKernel/AI/OpenAI/HttpSchema/ImageGenerationRequest.cs b/dotnet/src/SemanticKernel/Connectors/OpenAI/ImageGeneration/ImageGenerationRequest.cs similarity index 92% rename from dotnet/src/SemanticKernel/AI/OpenAI/HttpSchema/ImageGenerationRequest.cs rename to dotnet/src/SemanticKernel/Connectors/OpenAI/ImageGeneration/ImageGenerationRequest.cs index bfb2bf9cf6b9..5432ff746760 100644 --- a/dotnet/src/SemanticKernel/AI/OpenAI/HttpSchema/ImageGenerationRequest.cs +++ b/dotnet/src/SemanticKernel/Connectors/OpenAI/ImageGeneration/ImageGenerationRequest.cs @@ -2,7 +2,7 @@ using System.Text.Json.Serialization; -namespace Microsoft.SemanticKernel.AI.OpenAI.HttpSchema; +namespace Microsoft.SemanticKernel.Connectors.OpenAI.ImageGeneration; /// /// Image generation request diff --git a/dotnet/src/SemanticKernel/AI/OpenAI/HttpSchema/ImageGenerationResponse.cs b/dotnet/src/SemanticKernel/Connectors/OpenAI/ImageGeneration/ImageGenerationResponse.cs similarity index 94% rename from dotnet/src/SemanticKernel/AI/OpenAI/HttpSchema/ImageGenerationResponse.cs rename to dotnet/src/SemanticKernel/Connectors/OpenAI/ImageGeneration/ImageGenerationResponse.cs index a7c2caabb782..8ab2d38385c8 100644 --- a/dotnet/src/SemanticKernel/AI/OpenAI/HttpSchema/ImageGenerationResponse.cs +++ b/dotnet/src/SemanticKernel/Connectors/OpenAI/ImageGeneration/ImageGenerationResponse.cs @@ -4,7 +4,7 @@ using System.Diagnostics.CodeAnalysis; using System.Text.Json.Serialization; -namespace Microsoft.SemanticKernel.AI.OpenAI.HttpSchema; +namespace Microsoft.SemanticKernel.Connectors.OpenAI.ImageGeneration; /// /// Image generation response diff --git a/dotnet/src/SemanticKernel/AI/OpenAI/Services/OpenAIImageGeneration.cs b/dotnet/src/SemanticKernel/Connectors/OpenAI/ImageGeneration/OpenAIImageGeneration.cs similarity index 95% rename from dotnet/src/SemanticKernel/AI/OpenAI/Services/OpenAIImageGeneration.cs rename to dotnet/src/SemanticKernel/Connectors/OpenAI/ImageGeneration/OpenAIImageGeneration.cs index aa42f04e8da5..942aaa7e7312 100644 --- a/dotnet/src/SemanticKernel/AI/OpenAI/Services/OpenAIImageGeneration.cs +++ b/dotnet/src/SemanticKernel/Connectors/OpenAI/ImageGeneration/OpenAIImageGeneration.cs @@ -5,14 +5,13 @@ using System.Threading; using System.Threading.Tasks; using Microsoft.Extensions.Logging; +using Microsoft.SemanticKernel.AI; using Microsoft.SemanticKernel.AI.ImageGeneration; -using Microsoft.SemanticKernel.AI.OpenAI.Clients; -using Microsoft.SemanticKernel.AI.OpenAI.HttpSchema; using Microsoft.SemanticKernel.Diagnostics; using Microsoft.SemanticKernel.Reliability; using Microsoft.SemanticKernel.Text; -namespace Microsoft.SemanticKernel.AI.OpenAI.Services; +namespace Microsoft.SemanticKernel.Connectors.OpenAI.ImageGeneration; public class OpenAIImageGeneration : OpenAIClientAbstract, IImageGeneration { diff --git a/dotnet/src/SemanticKernel/Configuration/KernelConfigExtensions.cs b/dotnet/src/SemanticKernel/Connectors/OpenAI/KernelConfigOpenAIExtensions.cs similarity index 82% rename from dotnet/src/SemanticKernel/Configuration/KernelConfigExtensions.cs rename to dotnet/src/SemanticKernel/Connectors/OpenAI/KernelConfigOpenAIExtensions.cs index 0e997a080085..de523c83713b 100644 --- a/dotnet/src/SemanticKernel/Configuration/KernelConfigExtensions.cs +++ b/dotnet/src/SemanticKernel/Connectors/OpenAI/KernelConfigOpenAIExtensions.cs @@ -3,13 +3,17 @@ using Microsoft.SemanticKernel.AI.ChatCompletion; using Microsoft.SemanticKernel.AI.Embeddings; using Microsoft.SemanticKernel.AI.ImageGeneration; -using Microsoft.SemanticKernel.AI.OpenAI.Services; using Microsoft.SemanticKernel.AI.TextCompletion; +using Microsoft.SemanticKernel.Connectors.OpenAI.ChatCompletion; +using Microsoft.SemanticKernel.Connectors.OpenAI.ImageGeneration; +using Microsoft.SemanticKernel.Connectors.OpenAI.TextCompletion; +using Microsoft.SemanticKernel.Connectors.OpenAI.TextEmbedding; using Microsoft.SemanticKernel.Diagnostics; -namespace Microsoft.SemanticKernel.Configuration; +// ReSharper disable once CheckNamespace // Extension methods +namespace Microsoft.SemanticKernel; -public static class KernelConfigExtensions +public static class KernelConfigOpenAIExtensions { /// /// Adds an Azure OpenAI text completion service to the list. @@ -23,7 +27,7 @@ public static class KernelConfigExtensions /// Azure OpenAI API version, see https://learn.microsoft.com/azure/cognitive-services/openai/reference /// Whether to overwrite an existing configuration if the same id exists /// Self instance - public static KernelConfig AddAzureOpenAITextCompletion(this KernelConfig config, + public static KernelConfig AddAzureOpenAITextCompletionService(this KernelConfig config, string serviceId, string deploymentName, string endpoint, string apiKey, string apiVersion = "2022-12-01", bool overwrite = false) { Verify.NotEmpty(serviceId, "The service Id provided is empty"); @@ -38,7 +42,7 @@ public static KernelConfig AddAzureOpenAITextCompletion(this KernelConfig config ITextCompletion Factory(IKernel kernel) => new AzureTextCompletion( deploymentName, endpoint, apiKey, apiVersion, kernel.Log, kernel.Config.HttpHandlerFactory); - config.AddTextCompletion(serviceId, Factory, overwrite); + config.AddTextCompletionService(serviceId, Factory, overwrite); return config; } @@ -54,7 +58,7 @@ public static KernelConfig AddAzureOpenAITextCompletion(this KernelConfig config /// OpenAI organization id. This is usually optional unless your account belongs to multiple organizations. /// Whether to overwrite an existing configuration if the same name exists /// Self instance - public static KernelConfig AddOpenAITextCompletion(this KernelConfig config, + public static KernelConfig AddOpenAITextCompletionService(this KernelConfig config, string serviceId, string modelId, string apiKey, string? orgId = null, bool overwrite = false) { Verify.NotEmpty(serviceId, "The service Id provided is empty"); @@ -69,7 +73,7 @@ public static KernelConfig AddOpenAITextCompletion(this KernelConfig config, ITextCompletion Factory(IKernel kernel) => new OpenAITextCompletion( modelId, apiKey, orgId, kernel.Log, kernel.Config.HttpHandlerFactory); - config.AddTextCompletion(serviceId, Factory, overwrite); + config.AddTextCompletionService(serviceId, Factory, overwrite); return config; } @@ -86,22 +90,22 @@ public static KernelConfig AddOpenAITextCompletion(this KernelConfig config, /// Azure OpenAI API version, see https://learn.microsoft.com/azure/cognitive-services/openai/reference /// Whether to overwrite an existing configuration if the same id exists /// Self instance - public static KernelConfig AddAzureOpenAIEmbeddingGeneration(this KernelConfig config, + public static KernelConfig AddAzureOpenAIEmbeddingGenerationService(this KernelConfig config, string serviceId, string deploymentName, string endpoint, string apiKey, string apiVersion = "2022-12-01", bool overwrite = false) { Verify.NotEmpty(serviceId, "The service Id provided is empty"); - if (!overwrite && config.TextEmbeddingServices.ContainsKey(serviceId)) + if (!overwrite && config.TextEmbeddingGenerationServices.ContainsKey(serviceId)) { throw new KernelException( KernelException.ErrorCodes.InvalidServiceConfiguration, - $"A text embedding generator with the id '{serviceId}' already exists"); + $"A text embedding service with the id '{serviceId}' already exists"); } - IEmbeddingGenerator Factory(IKernel kernel) => new AzureTextEmbeddings( + IEmbeddingGeneration Factory(IKernel kernel) => new AzureTextEmbeddingGeneration( deploymentName, endpoint, apiKey, apiVersion, kernel.Log, kernel.Config.HttpHandlerFactory); - config.AddTextEmbeddingGeneration(serviceId, Factory, overwrite); + config.AddTextEmbeddingGenerationService(serviceId, Factory, overwrite); return config; } @@ -117,22 +121,22 @@ public static KernelConfig AddAzureOpenAIEmbeddingGeneration(this KernelConfig c /// OpenAI organization id. This is usually optional unless your account belongs to multiple organizations. /// Whether to overwrite an existing configuration if the same id exists /// Self instance - public static KernelConfig AddOpenAIEmbeddingGeneration(this KernelConfig config, + public static KernelConfig AddOpenAIEmbeddingGenerationService(this KernelConfig config, string serviceId, string modelId, string apiKey, string? orgId = null, bool overwrite = false) { Verify.NotEmpty(serviceId, "The service Id provided is empty"); - if (!overwrite && config.TextEmbeddingServices.ContainsKey(serviceId)) + if (!overwrite && config.TextEmbeddingGenerationServices.ContainsKey(serviceId)) { throw new KernelException( KernelException.ErrorCodes.InvalidServiceConfiguration, - $"A text embedding generator with the id '{serviceId}' already exists"); + $"A text embedding service with the id '{serviceId}' already exists"); } - IEmbeddingGenerator Factory(IKernel kernel) => new OpenAITextEmbeddings( + IEmbeddingGeneration Factory(IKernel kernel) => new OpenAITextEmbeddingGeneration( modelId, apiKey, orgId, kernel.Log, kernel.Config.HttpHandlerFactory); - config.AddTextEmbeddingGeneration(serviceId, Factory, overwrite); + config.AddTextEmbeddingGenerationService(serviceId, Factory, overwrite); return config; } @@ -148,7 +152,7 @@ public static KernelConfig AddOpenAIEmbeddingGeneration(this KernelConfig config /// OpenAI organization id. This is usually optional unless your account belongs to multiple organizations. /// Whether to overwrite an existing configuration if the same name exists /// Self instance - public static KernelConfig AddOpenAIChatCompletion(this KernelConfig config, + public static KernelConfig AddOpenAIChatCompletionService(this KernelConfig config, string serviceId, string modelId, string apiKey, string? orgId = null, bool overwrite = false) { Verify.NotEmpty(serviceId, "The service Id provided is empty"); @@ -163,7 +167,7 @@ public static KernelConfig AddOpenAIChatCompletion(this KernelConfig config, IChatCompletion Factory(IKernel kernel) => new OpenAIChatCompletion( modelId, apiKey, orgId, kernel.Log, kernel.Config.HttpHandlerFactory); - config.AddChatCompletion(serviceId, Factory, overwrite); + config.AddChatCompletionService(serviceId, Factory, overwrite); return config; } @@ -177,7 +181,7 @@ public static KernelConfig AddOpenAIChatCompletion(this KernelConfig config, /// OpenAI organization id. This is usually optional unless your account belongs to multiple organizations. /// Whether to overwrite an existing configuration if the same name exists /// Self instance - public static KernelConfig AddOpenAIImageGeneration(this KernelConfig config, + public static KernelConfig AddOpenAIImageGenerationService(this KernelConfig config, string serviceId, string apiKey, string? orgId = null, bool overwrite = false) { Verify.NotEmpty(serviceId, "The service Id provided is empty"); @@ -192,7 +196,7 @@ public static KernelConfig AddOpenAIImageGeneration(this KernelConfig config, IImageGeneration Factory(IKernel kernel) => new OpenAIImageGeneration( apiKey, orgId, kernel.Log, kernel.Config.HttpHandlerFactory); - config.AddImageGeneration(serviceId, Factory, overwrite); + config.AddImageGenerationService(serviceId, Factory, overwrite); return config; } diff --git a/dotnet/src/SemanticKernel/AI/OpenAI/Clients/OpenAIClientAbstract.cs b/dotnet/src/SemanticKernel/Connectors/OpenAI/OpenAIClientAbstract.cs similarity index 97% rename from dotnet/src/SemanticKernel/AI/OpenAI/Clients/OpenAIClientAbstract.cs rename to dotnet/src/SemanticKernel/Connectors/OpenAI/OpenAIClientAbstract.cs index 944b8b2978e4..5f82462cff43 100644 --- a/dotnet/src/SemanticKernel/AI/OpenAI/Clients/OpenAIClientAbstract.cs +++ b/dotnet/src/SemanticKernel/Connectors/OpenAI/OpenAIClientAbstract.cs @@ -12,12 +12,16 @@ using System.Threading.Tasks; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging.Abstractions; +using Microsoft.SemanticKernel.AI; using Microsoft.SemanticKernel.AI.Embeddings; -using Microsoft.SemanticKernel.AI.OpenAI.HttpSchema; +using Microsoft.SemanticKernel.Connectors.OpenAI.ChatCompletion; +using Microsoft.SemanticKernel.Connectors.OpenAI.ImageGeneration; +using Microsoft.SemanticKernel.Connectors.OpenAI.TextCompletion; +using Microsoft.SemanticKernel.Connectors.OpenAI.TextEmbedding; using Microsoft.SemanticKernel.Reliability; using Microsoft.SemanticKernel.Text; -namespace Microsoft.SemanticKernel.AI.OpenAI.Clients; +namespace Microsoft.SemanticKernel.Connectors.OpenAI; /// /// An abstract OpenAI Client. diff --git a/dotnet/src/SemanticKernel/AI/OpenAI/Services/AzureTextCompletion.cs b/dotnet/src/SemanticKernel/Connectors/OpenAI/TextCompletion/AzureTextCompletion.cs similarity index 96% rename from dotnet/src/SemanticKernel/AI/OpenAI/Services/AzureTextCompletion.cs rename to dotnet/src/SemanticKernel/Connectors/OpenAI/TextCompletion/AzureTextCompletion.cs index ad3d31614649..8ee95f436258 100644 --- a/dotnet/src/SemanticKernel/AI/OpenAI/Services/AzureTextCompletion.cs +++ b/dotnet/src/SemanticKernel/Connectors/OpenAI/TextCompletion/AzureTextCompletion.cs @@ -3,14 +3,13 @@ using System.Threading; using System.Threading.Tasks; using Microsoft.Extensions.Logging; -using Microsoft.SemanticKernel.AI.OpenAI.Clients; -using Microsoft.SemanticKernel.AI.OpenAI.HttpSchema; +using Microsoft.SemanticKernel.AI; using Microsoft.SemanticKernel.AI.TextCompletion; using Microsoft.SemanticKernel.Diagnostics; using Microsoft.SemanticKernel.Reliability; using Microsoft.SemanticKernel.Text; -namespace Microsoft.SemanticKernel.AI.OpenAI.Services; +namespace Microsoft.SemanticKernel.Connectors.OpenAI.TextCompletion; /// /// Azure OpenAI text completion client. diff --git a/dotnet/src/SemanticKernel/AI/OpenAI/Services/OpenAITextCompletion.cs b/dotnet/src/SemanticKernel/Connectors/OpenAI/TextCompletion/OpenAITextCompletion.cs similarity index 95% rename from dotnet/src/SemanticKernel/AI/OpenAI/Services/OpenAITextCompletion.cs rename to dotnet/src/SemanticKernel/Connectors/OpenAI/TextCompletion/OpenAITextCompletion.cs index 96b7ac1f8052..9c2c1fa135f0 100644 --- a/dotnet/src/SemanticKernel/AI/OpenAI/Services/OpenAITextCompletion.cs +++ b/dotnet/src/SemanticKernel/Connectors/OpenAI/TextCompletion/OpenAITextCompletion.cs @@ -4,14 +4,13 @@ using System.Threading; using System.Threading.Tasks; using Microsoft.Extensions.Logging; -using Microsoft.SemanticKernel.AI.OpenAI.Clients; -using Microsoft.SemanticKernel.AI.OpenAI.HttpSchema; +using Microsoft.SemanticKernel.AI; using Microsoft.SemanticKernel.AI.TextCompletion; using Microsoft.SemanticKernel.Diagnostics; using Microsoft.SemanticKernel.Reliability; using Microsoft.SemanticKernel.Text; -namespace Microsoft.SemanticKernel.AI.OpenAI.Services; +namespace Microsoft.SemanticKernel.Connectors.OpenAI.TextCompletion; /// /// OpenAI text completion service. diff --git a/dotnet/src/SemanticKernel/AI/OpenAI/HttpSchema/TextCompletionRequest.cs b/dotnet/src/SemanticKernel/Connectors/OpenAI/TextCompletion/TextCompletionRequest.cs similarity index 98% rename from dotnet/src/SemanticKernel/AI/OpenAI/HttpSchema/TextCompletionRequest.cs rename to dotnet/src/SemanticKernel/Connectors/OpenAI/TextCompletion/TextCompletionRequest.cs index c07a429dd80a..eb7c4cf7fbcd 100644 --- a/dotnet/src/SemanticKernel/AI/OpenAI/HttpSchema/TextCompletionRequest.cs +++ b/dotnet/src/SemanticKernel/Connectors/OpenAI/TextCompletion/TextCompletionRequest.cs @@ -2,7 +2,7 @@ using System.Text.Json.Serialization; -namespace Microsoft.SemanticKernel.AI.OpenAI.HttpSchema; +namespace Microsoft.SemanticKernel.Connectors.OpenAI.TextCompletion; /// /// Text Completion Request diff --git a/dotnet/src/SemanticKernel/AI/OpenAI/HttpSchema/TextCompletionResponse.cs b/dotnet/src/SemanticKernel/Connectors/OpenAI/TextCompletion/TextCompletionResponse.cs similarity index 96% rename from dotnet/src/SemanticKernel/AI/OpenAI/HttpSchema/TextCompletionResponse.cs rename to dotnet/src/SemanticKernel/Connectors/OpenAI/TextCompletion/TextCompletionResponse.cs index eb6408a05944..632b65391296 100644 --- a/dotnet/src/SemanticKernel/AI/OpenAI/HttpSchema/TextCompletionResponse.cs +++ b/dotnet/src/SemanticKernel/Connectors/OpenAI/TextCompletion/TextCompletionResponse.cs @@ -3,7 +3,7 @@ using System.Collections.Generic; using System.Text.Json.Serialization; -namespace Microsoft.SemanticKernel.AI.OpenAI.HttpSchema; +namespace Microsoft.SemanticKernel.Connectors.OpenAI.TextCompletion; /// /// Text completion response diff --git a/dotnet/src/SemanticKernel/AI/OpenAI/Services/AzureTextEmbeddings.cs b/dotnet/src/SemanticKernel/Connectors/OpenAI/TextEmbedding/AzureTextEmbeddingGeneration.cs similarity index 87% rename from dotnet/src/SemanticKernel/AI/OpenAI/Services/AzureTextEmbeddings.cs rename to dotnet/src/SemanticKernel/Connectors/OpenAI/TextEmbedding/AzureTextEmbeddingGeneration.cs index 7e4dffa189f5..533572428431 100644 --- a/dotnet/src/SemanticKernel/AI/OpenAI/Services/AzureTextEmbeddings.cs +++ b/dotnet/src/SemanticKernel/Connectors/OpenAI/TextEmbedding/AzureTextEmbeddingGeneration.cs @@ -4,18 +4,16 @@ using System.Threading.Tasks; using Microsoft.Extensions.Logging; using Microsoft.SemanticKernel.AI.Embeddings; -using Microsoft.SemanticKernel.AI.OpenAI.Clients; -using Microsoft.SemanticKernel.AI.OpenAI.HttpSchema; using Microsoft.SemanticKernel.Diagnostics; using Microsoft.SemanticKernel.Reliability; using Microsoft.SemanticKernel.Text; -namespace Microsoft.SemanticKernel.AI.OpenAI.Services; +namespace Microsoft.SemanticKernel.Connectors.OpenAI.TextEmbedding; /// /// Azure OpenAI text embedding service. /// -public sealed class AzureTextEmbeddings : AzureOpenAIClientAbstract, IEmbeddingGenerator +public sealed class AzureTextEmbeddingGeneration : AzureOpenAIClientAbstract, IEmbeddingGeneration { private readonly string _modelId; @@ -28,7 +26,7 @@ public sealed class AzureTextEmbeddings : AzureOpenAIClientAbstract, IEmbeddingG /// Azure OpenAI API version, see https://learn.microsoft.com/azure/cognitive-services/openai/reference /// Application logger /// An optional HTTP retry handler factory - public AzureTextEmbeddings(string modelId, string endpoint, string apiKey, string apiVersion, ILogger? log = null, + public AzureTextEmbeddingGeneration(string modelId, string endpoint, string apiKey, string apiVersion, ILogger? log = null, IDelegatingHandlerFactory? handlerFactory = null) : base(log, handlerFactory) { diff --git a/dotnet/src/SemanticKernel/AI/OpenAI/Services/OpenAITextEmbeddings.cs b/dotnet/src/SemanticKernel/Connectors/OpenAI/TextEmbedding/OpenAITextEmbeddingGeneration.cs similarity index 84% rename from dotnet/src/SemanticKernel/AI/OpenAI/Services/OpenAITextEmbeddings.cs rename to dotnet/src/SemanticKernel/Connectors/OpenAI/TextEmbedding/OpenAITextEmbeddingGeneration.cs index 6254ff0d36e5..2ac5b6c019bf 100644 --- a/dotnet/src/SemanticKernel/AI/OpenAI/Services/OpenAITextEmbeddings.cs +++ b/dotnet/src/SemanticKernel/Connectors/OpenAI/TextEmbedding/OpenAITextEmbeddingGeneration.cs @@ -5,18 +5,16 @@ using System.Threading.Tasks; using Microsoft.Extensions.Logging; using Microsoft.SemanticKernel.AI.Embeddings; -using Microsoft.SemanticKernel.AI.OpenAI.Clients; -using Microsoft.SemanticKernel.AI.OpenAI.HttpSchema; using Microsoft.SemanticKernel.Diagnostics; using Microsoft.SemanticKernel.Reliability; using Microsoft.SemanticKernel.Text; -namespace Microsoft.SemanticKernel.AI.OpenAI.Services; +namespace Microsoft.SemanticKernel.Connectors.OpenAI.TextEmbedding; /// /// Client to OpenAI.com embedding endpoint, used to generate embeddings. /// -public sealed class OpenAITextEmbeddings : OpenAIClientAbstract, IEmbeddingGenerator +public sealed class OpenAITextEmbeddingGeneration : OpenAIClientAbstract, IEmbeddingGeneration { // 3P OpenAI REST API endpoint private const string OpenaiEndpoint = "https://api.openai.com/v1"; @@ -32,7 +30,7 @@ public sealed class OpenAITextEmbeddings : OpenAIClientAbstract, IEmbeddingGener /// Optional OpenAI organization ID, usually required only if your account belongs to multiple organizations /// Application logger /// Retry handler factory for HTTP requests. - public OpenAITextEmbeddings(string modelId, string apiKey, string? organization = null, ILogger? log = null, + public OpenAITextEmbeddingGeneration(string modelId, string apiKey, string? organization = null, ILogger? log = null, IDelegatingHandlerFactory? handlerFactory = null) : base(log, handlerFactory) { diff --git a/dotnet/src/SemanticKernel/AI/OpenAI/HttpSchema/TextEmbeddingRequest.cs b/dotnet/src/SemanticKernel/Connectors/OpenAI/TextEmbedding/TextEmbeddingRequest.cs similarity index 92% rename from dotnet/src/SemanticKernel/AI/OpenAI/HttpSchema/TextEmbeddingRequest.cs rename to dotnet/src/SemanticKernel/Connectors/OpenAI/TextEmbedding/TextEmbeddingRequest.cs index 753ba14387ca..8ae0ed3410a0 100644 --- a/dotnet/src/SemanticKernel/AI/OpenAI/HttpSchema/TextEmbeddingRequest.cs +++ b/dotnet/src/SemanticKernel/Connectors/OpenAI/TextEmbedding/TextEmbeddingRequest.cs @@ -3,7 +3,7 @@ using System.Collections.Generic; using System.Text.Json.Serialization; -namespace Microsoft.SemanticKernel.AI.OpenAI.HttpSchema; +namespace Microsoft.SemanticKernel.Connectors.OpenAI.TextEmbedding; /// /// A request to create embedding vector representing input text diff --git a/dotnet/src/SemanticKernel/AI/OpenAI/HttpSchema/TextEmbeddingResponse.cs b/dotnet/src/SemanticKernel/Connectors/OpenAI/TextEmbedding/TextEmbeddingResponse.cs similarity index 93% rename from dotnet/src/SemanticKernel/AI/OpenAI/HttpSchema/TextEmbeddingResponse.cs rename to dotnet/src/SemanticKernel/Connectors/OpenAI/TextEmbedding/TextEmbeddingResponse.cs index e08ff4d3fdd2..c87275ba3dd0 100644 --- a/dotnet/src/SemanticKernel/AI/OpenAI/HttpSchema/TextEmbeddingResponse.cs +++ b/dotnet/src/SemanticKernel/Connectors/OpenAI/TextEmbedding/TextEmbeddingResponse.cs @@ -3,7 +3,7 @@ using System.Collections.Generic; using System.Text.Json.Serialization; -namespace Microsoft.SemanticKernel.AI.OpenAI.HttpSchema; +namespace Microsoft.SemanticKernel.Connectors.OpenAI.TextEmbedding; /// /// A response from an embedding request diff --git a/dotnet/src/SemanticKernel/AI/OpenAI/Tokenizers/GPT3Tokenizer.cs b/dotnet/src/SemanticKernel/Connectors/OpenAI/Tokenizers/GPT3Tokenizer.cs similarity index 97% rename from dotnet/src/SemanticKernel/AI/OpenAI/Tokenizers/GPT3Tokenizer.cs rename to dotnet/src/SemanticKernel/Connectors/OpenAI/Tokenizers/GPT3Tokenizer.cs index 2f4e74d14135..8e69d7031747 100644 --- a/dotnet/src/SemanticKernel/AI/OpenAI/Tokenizers/GPT3Tokenizer.cs +++ b/dotnet/src/SemanticKernel/Connectors/OpenAI/Tokenizers/GPT3Tokenizer.cs @@ -6,9 +6,9 @@ using System.Linq; using System.Text; using System.Text.RegularExpressions; -using Microsoft.SemanticKernel.AI.OpenAI.Tokenizers.Settings; +using Microsoft.SemanticKernel.Connectors.OpenAI.Tokenizers.Settings; -namespace Microsoft.SemanticKernel.AI.OpenAI.Tokenizers; +namespace Microsoft.SemanticKernel.Connectors.OpenAI.Tokenizers; /// /// Port of GPT3 Javascript tokenizer recommended by OpenAI. diff --git a/dotnet/src/SemanticKernel/AI/OpenAI/Tokenizers/Settings/EmbeddedResource.cs b/dotnet/src/SemanticKernel/Connectors/OpenAI/Tokenizers/Settings/EmbeddedResource.cs similarity index 95% rename from dotnet/src/SemanticKernel/AI/OpenAI/Tokenizers/Settings/EmbeddedResource.cs rename to dotnet/src/SemanticKernel/Connectors/OpenAI/Tokenizers/Settings/EmbeddedResource.cs index 4846e05ef2fd..30d59479b6a3 100644 --- a/dotnet/src/SemanticKernel/AI/OpenAI/Tokenizers/Settings/EmbeddedResource.cs +++ b/dotnet/src/SemanticKernel/Connectors/OpenAI/Tokenizers/Settings/EmbeddedResource.cs @@ -3,7 +3,7 @@ using System; using System.IO; -namespace Microsoft.SemanticKernel.AI.OpenAI.Tokenizers.Settings; +namespace Microsoft.SemanticKernel.Connectors.OpenAI.Tokenizers.Settings; internal static class EmbeddedResource { diff --git a/dotnet/src/SemanticKernel/AI/OpenAI/Tokenizers/Settings/GPT3Settings.cs b/dotnet/src/SemanticKernel/Connectors/OpenAI/Tokenizers/Settings/GPT3Settings.cs similarity index 95% rename from dotnet/src/SemanticKernel/AI/OpenAI/Tokenizers/Settings/GPT3Settings.cs rename to dotnet/src/SemanticKernel/Connectors/OpenAI/Tokenizers/Settings/GPT3Settings.cs index 3b62cded0a99..74f2e02dbef6 100644 --- a/dotnet/src/SemanticKernel/AI/OpenAI/Tokenizers/Settings/GPT3Settings.cs +++ b/dotnet/src/SemanticKernel/Connectors/OpenAI/Tokenizers/Settings/GPT3Settings.cs @@ -4,8 +4,9 @@ using System.Collections.Generic; using System.Linq; using System.Text.Json; +using Microsoft.SemanticKernel.AI; -namespace Microsoft.SemanticKernel.AI.OpenAI.Tokenizers.Settings; +namespace Microsoft.SemanticKernel.Connectors.OpenAI.Tokenizers.Settings; internal static class GPT3Settings { diff --git a/dotnet/src/SemanticKernel/AI/OpenAI/Tokenizers/Settings/encoder.json b/dotnet/src/SemanticKernel/Connectors/OpenAI/Tokenizers/Settings/encoder.json similarity index 100% rename from dotnet/src/SemanticKernel/AI/OpenAI/Tokenizers/Settings/encoder.json rename to dotnet/src/SemanticKernel/Connectors/OpenAI/Tokenizers/Settings/encoder.json diff --git a/dotnet/src/SemanticKernel/AI/OpenAI/Tokenizers/Settings/vocab.bpe b/dotnet/src/SemanticKernel/Connectors/OpenAI/Tokenizers/Settings/vocab.bpe similarity index 100% rename from dotnet/src/SemanticKernel/AI/OpenAI/Tokenizers/Settings/vocab.bpe rename to dotnet/src/SemanticKernel/Connectors/OpenAI/Tokenizers/Settings/vocab.bpe diff --git a/dotnet/src/SemanticKernel/CoreSkills/ConversationSummarySkill.cs b/dotnet/src/SemanticKernel/CoreSkills/ConversationSummarySkill.cs index 7749532e329f..b66c120012f5 100644 --- a/dotnet/src/SemanticKernel/CoreSkills/ConversationSummarySkill.cs +++ b/dotnet/src/SemanticKernel/CoreSkills/ConversationSummarySkill.cs @@ -1,7 +1,7 @@ // Copyright (c) Microsoft. All rights reserved. +using System.Collections.Generic; using System.Threading.Tasks; -using Microsoft.SemanticKernel.KernelExtensions; using Microsoft.SemanticKernel.Orchestration; using Microsoft.SemanticKernel.SemanticFunctions.Partitioning; using Microsoft.SemanticKernel.SkillDefinition; @@ -69,8 +69,8 @@ public ConversationSummarySkill(IKernel kernel) [SKFunctionInput(Description = "A long conversation transcript.")] public Task SummarizeConversationAsync(string input, SKContext context) { - System.Collections.Generic.List lines = SemanticTextPartitioner.SplitPlainTextLines(input, MaxTokens); - System.Collections.Generic.List paragraphs = SemanticTextPartitioner.SplitPlainTextParagraphs(lines, MaxTokens); + List lines = SemanticTextPartitioner.SplitPlainTextLines(input, MaxTokens); + List paragraphs = SemanticTextPartitioner.SplitPlainTextParagraphs(lines, MaxTokens); return this._summarizeConversationFunction .AggregatePartitionedResultsAsync(paragraphs, context); @@ -86,8 +86,8 @@ public Task SummarizeConversationAsync(string input, SKContext contex [SKFunctionInput(Description = "A long conversation transcript.")] public Task GetConversationActionItemsAsync(string input, SKContext context) { - System.Collections.Generic.List lines = SemanticTextPartitioner.SplitPlainTextLines(input, MaxTokens); - System.Collections.Generic.List paragraphs = SemanticTextPartitioner.SplitPlainTextParagraphs(lines, MaxTokens); + List lines = SemanticTextPartitioner.SplitPlainTextLines(input, MaxTokens); + List paragraphs = SemanticTextPartitioner.SplitPlainTextParagraphs(lines, MaxTokens); return this._conversationActionItemsFunction .AggregatePartitionedResultsAsync(paragraphs, context); @@ -103,8 +103,8 @@ public Task GetConversationActionItemsAsync(string input, SKContext c [SKFunctionInput(Description = "A long conversation transcript.")] public Task GetConversationTopicsAsync(string input, SKContext context) { - System.Collections.Generic.List lines = SemanticTextPartitioner.SplitPlainTextLines(input, MaxTokens); - System.Collections.Generic.List paragraphs = SemanticTextPartitioner.SplitPlainTextParagraphs(lines, MaxTokens); + List lines = SemanticTextPartitioner.SplitPlainTextLines(input, MaxTokens); + List paragraphs = SemanticTextPartitioner.SplitPlainTextParagraphs(lines, MaxTokens); return this._conversationTopicsFunction .AggregatePartitionedResultsAsync(paragraphs, context); diff --git a/dotnet/src/SemanticKernel/CoreSkills/PlannerSkill.cs b/dotnet/src/SemanticKernel/CoreSkills/PlannerSkill.cs index 79877141bb23..ef74990d971c 100644 --- a/dotnet/src/SemanticKernel/CoreSkills/PlannerSkill.cs +++ b/dotnet/src/SemanticKernel/CoreSkills/PlannerSkill.cs @@ -5,10 +5,7 @@ using System.Text.Json; using System.Threading.Tasks; using Microsoft.Extensions.Logging; -using Microsoft.SemanticKernel.Diagnostics; -using Microsoft.SemanticKernel.KernelExtensions; using Microsoft.SemanticKernel.Orchestration; -using Microsoft.SemanticKernel.Orchestration.Extensions; using Microsoft.SemanticKernel.Planning; using Microsoft.SemanticKernel.SkillDefinition; diff --git a/dotnet/src/SemanticKernel/Diagnostics/ExceptionExtensions.cs b/dotnet/src/SemanticKernel/Diagnostics/ExceptionExtensions.cs index 293158ab8bd8..ca53b97d5cb4 100644 --- a/dotnet/src/SemanticKernel/Diagnostics/ExceptionExtensions.cs +++ b/dotnet/src/SemanticKernel/Diagnostics/ExceptionExtensions.cs @@ -1,21 +1,21 @@ // Copyright (c) Microsoft. All rights reserved. -using System; using System.Threading; -namespace Microsoft.SemanticKernel.Diagnostics; +// ReSharper disable once CheckNamespace // Extension methods +namespace System; /// /// Exception extension methods. /// -public static class ExceptionExtensions +internal static class ExceptionExtensions { /// /// Check if an exception is of a type that should not be caught by the kernel. /// /// Exception. /// True if is a critical exception and should not be caught. - public static bool IsCriticalException(this Exception ex) + internal static bool IsCriticalException(this Exception ex) => ex is OutOfMemoryException or ThreadAbortException or AccessViolationException diff --git a/dotnet/src/SemanticKernel/IKernel.cs b/dotnet/src/SemanticKernel/IKernel.cs index c45f10dd0d82..a3d2236f1beb 100644 --- a/dotnet/src/SemanticKernel/IKernel.cs +++ b/dotnet/src/SemanticKernel/IKernel.cs @@ -4,7 +4,6 @@ using System.Threading; using System.Threading.Tasks; using Microsoft.Extensions.Logging; -using Microsoft.SemanticKernel.Configuration; using Microsoft.SemanticKernel.Memory; using Microsoft.SemanticKernel.Orchestration; using Microsoft.SemanticKernel.SemanticFunctions; @@ -158,7 +157,7 @@ Task RunAsync( SKContext CreateNewContext(); /// - /// Get one of the configured services. Currently limited to AI backends. + /// Get one of the configured services. Currently limited to AI services. /// /// Optional name. If the name is not provided, returns the default T available /// Service type diff --git a/dotnet/src/SemanticKernel/Kernel.cs b/dotnet/src/SemanticKernel/Kernel.cs index f085c9c3b5e3..80ca86cd12a2 100644 --- a/dotnet/src/SemanticKernel/Kernel.cs +++ b/dotnet/src/SemanticKernel/Kernel.cs @@ -12,7 +12,6 @@ using Microsoft.SemanticKernel.AI.Embeddings; using Microsoft.SemanticKernel.AI.ImageGeneration; using Microsoft.SemanticKernel.AI.TextCompletion; -using Microsoft.SemanticKernel.Configuration; using Microsoft.SemanticKernel.Diagnostics; using Microsoft.SemanticKernel.Memory; using Microsoft.SemanticKernel.Orchestration; @@ -235,10 +234,10 @@ public T GetService(string? name = "") return (T)service; } - if (typeof(T) == typeof(IEmbeddingGenerator)) + if (typeof(T) == typeof(IEmbeddingGeneration)) { - name = this.Config.GetTextEmbeddingServiceIdOrDefault(name); - if (!this.Config.TextEmbeddingServices.TryGetValue(name, out Func> factory)) + name = this.Config.GetTextEmbeddingGenerationServiceIdOrDefault(name); + if (!this.Config.TextEmbeddingGenerationServices.TryGetValue(name, out Func> factory)) { throw new KernelException(KernelException.ErrorCodes.ServiceNotFound, "No text embedding service available"); } @@ -314,8 +313,8 @@ private ISKFunction CreateSemanticFunction( func.SetAIConfiguration(CompleteRequestSettings.FromCompletionConfig(functionConfig.PromptTemplateConfig.Completion)); - // Note: the backend is instantiated using the kernel configuration state when the function is invoked - func.SetAIBackend(() => this.GetService()); + // Note: the service is instantiated using the kernel configuration state when the function is invoked + func.SetAIService(() => this.GetService()); return func; } diff --git a/dotnet/src/SemanticKernel/KernelBuilder.cs b/dotnet/src/SemanticKernel/KernelBuilder.cs index 33c31c8bae4c..7418c0b03757 100644 --- a/dotnet/src/SemanticKernel/KernelBuilder.cs +++ b/dotnet/src/SemanticKernel/KernelBuilder.cs @@ -4,9 +4,7 @@ using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging.Abstractions; using Microsoft.SemanticKernel.AI.Embeddings; -using Microsoft.SemanticKernel.Configuration; using Microsoft.SemanticKernel.Diagnostics; -using Microsoft.SemanticKernel.KernelExtensions; using Microsoft.SemanticKernel.Memory; using Microsoft.SemanticKernel.Reliability; using Microsoft.SemanticKernel.SkillDefinition; @@ -20,7 +18,7 @@ namespace Microsoft.SemanticKernel; /// public sealed class KernelBuilder { - private KernelConfig _config = new KernelConfig(); + private KernelConfig _config = new(); private ISemanticTextMemory _memory = NullMemory.Instance; private ILogger _log = NullLogger.Instance; private IMemoryStore? _memoryStorage = null; @@ -106,8 +104,8 @@ public KernelBuilder WithMemoryStorage(IMemoryStore storage) /// Storage to add. /// Embedding generator to add. /// Updated kernel builder including the memory storage and embedding generator. - public KernelBuilder WithMemoryStorageAndEmbeddingGenerator( - IMemoryStore storage, IEmbeddingGenerator embeddingGenerator) + public KernelBuilder WithMemoryStorageAndTextEmbeddingGeneration( + IMemoryStore storage, IEmbeddingGeneration embeddingGenerator) { Verify.NotNull(storage, "The memory instance provided is NULL"); Verify.NotNull(embeddingGenerator, "The embedding generator instance provided is NULL"); diff --git a/dotnet/src/SemanticKernel/Configuration/KernelConfig.cs b/dotnet/src/SemanticKernel/KernelConfig.cs similarity index 87% rename from dotnet/src/SemanticKernel/Configuration/KernelConfig.cs rename to dotnet/src/SemanticKernel/KernelConfig.cs index 2929e36f98c3..7c510aca4403 100644 --- a/dotnet/src/SemanticKernel/Configuration/KernelConfig.cs +++ b/dotnet/src/SemanticKernel/KernelConfig.cs @@ -10,7 +10,7 @@ using Microsoft.SemanticKernel.Diagnostics; using Microsoft.SemanticKernel.Reliability; -namespace Microsoft.SemanticKernel.Configuration; +namespace Microsoft.SemanticKernel; /// /// Semantic kernel configuration. @@ -41,7 +41,7 @@ public sealed class KernelConfig /// /// Text embedding generation service factories /// - public Dictionary>> TextEmbeddingServices { get; } = new(); + public Dictionary>> TextEmbeddingGenerationServices { get; } = new(); /// /// Image generation service factories @@ -61,7 +61,7 @@ public sealed class KernelConfig /// /// Default text embedding generation service. /// - public string? DefaultTextEmbeddingServiceId { get; private set; } + public string? DefaultTextEmbeddingGenerationServiceId { get; private set; } /// /// Default image generation service. @@ -72,19 +72,19 @@ public sealed class KernelConfig /// Get all text completion services. /// /// IEnumerable of all completion service Ids in the kernel configuration. - public IEnumerable AllTextCompletionServices => this.TextCompletionServices.Keys; + public IEnumerable AllTextCompletionServiceIds => this.TextCompletionServices.Keys; /// /// Get all chat completion services. /// /// IEnumerable of all completion service Ids in the kernel configuration. - public IEnumerable AllChatCompletionServices => this.ChatCompletionServices.Keys; + public IEnumerable AllChatCompletionServiceIds => this.ChatCompletionServices.Keys; /// /// Get all text embedding generation services. /// /// IEnumerable of all embedding service Ids in the kernel configuration. - public IEnumerable AllTextEmbeddingServices => this.TextEmbeddingServices.Keys; + public IEnumerable AllTextEmbeddingGenerationServiceIds => this.TextEmbeddingGenerationServices.Keys; /// /// Add to the list a service for text completion, e.g. Azure OpenAI Text Completion. @@ -94,7 +94,7 @@ public sealed class KernelConfig /// Whether to overwrite a service having the same id /// Current object instance /// Failure if a service with the same id already exists - public KernelConfig AddTextCompletion( + public KernelConfig AddTextCompletionService( string serviceId, Func serviceFactory, bool overwrite = false) { Verify.NotEmpty(serviceId, "The service id provided is empty"); @@ -124,7 +124,7 @@ public KernelConfig AddTextCompletion( /// Whether to overwrite a service having the same id /// Current object instance /// Failure if a service with the same id already exists - public KernelConfig AddChatCompletion( + public KernelConfig AddChatCompletionService( string serviceId, Func serviceFactory, bool overwrite = false) { Verify.NotEmpty(serviceId, "The service id provided is empty"); @@ -154,23 +154,23 @@ public KernelConfig AddChatCompletion( /// Whether to overwrite a service having the same id /// Current object instance /// Failure if a service with the same id already exists - public KernelConfig AddTextEmbeddingGeneration( - string serviceId, Func> serviceFactory, bool overwrite = false) + public KernelConfig AddTextEmbeddingGenerationService( + string serviceId, Func> serviceFactory, bool overwrite = false) { Verify.NotEmpty(serviceId, "The service id provided is empty"); - if (!overwrite && this.TextEmbeddingServices.ContainsKey(serviceId)) + if (!overwrite && this.TextEmbeddingGenerationServices.ContainsKey(serviceId)) { throw new KernelException( KernelException.ErrorCodes.InvalidServiceConfiguration, - $"An embedding generator with id '{serviceId}' already exists"); + $"An embedding generation service with id '{serviceId}' already exists"); } - this.TextEmbeddingServices[serviceId] = serviceFactory; + this.TextEmbeddingGenerationServices[serviceId] = serviceFactory; - if (this.TextEmbeddingServices.Count == 1) + if (this.TextEmbeddingGenerationServices.Count == 1) { - this.DefaultTextEmbeddingServiceId = serviceId; + this.DefaultTextEmbeddingGenerationServiceId = serviceId; } return this; @@ -184,7 +184,7 @@ public KernelConfig AddTextEmbeddingGeneration( /// Whether to overwrite a service having the same id /// Current object instance /// Failure if a service with the same id already exists - public KernelConfig AddImageGeneration( + public KernelConfig AddImageGenerationService( string serviceId, Func serviceFactory, bool overwrite = false) { Verify.NotEmpty(serviceId, "The service id provided is empty"); @@ -259,16 +259,16 @@ public KernelConfig SetDefaultTextCompletionService(string serviceId) /// Identifier of text embedding service to use. /// The updated kernel configuration. /// Thrown if the requested service doesn't exist. - public KernelConfig SetDefaultEmbeddingService(string serviceId) + public KernelConfig SetDefaultTextEmbeddingGenerationService(string serviceId) { - if (!this.TextEmbeddingServices.ContainsKey(serviceId)) + if (!this.TextEmbeddingGenerationServices.ContainsKey(serviceId)) { throw new KernelException( KernelException.ErrorCodes.ServiceNotFound, $"A text embedding generation service id '{serviceId}' doesn't exist"); } - this.DefaultTextEmbeddingServiceId = serviceId; + this.DefaultTextEmbeddingGenerationServiceId = serviceId; return this; } @@ -324,11 +324,11 @@ public string GetChatCompletionServiceIdOrDefault(string? serviceId = null) /// Optional identifier of the desired service. /// The embedding service id matching the given id or the default. /// Thrown when no suitable service is found. - public string GetTextEmbeddingServiceIdOrDefault(string? serviceId = null) + public string GetTextEmbeddingGenerationServiceIdOrDefault(string? serviceId = null) { - if (string.IsNullOrEmpty(serviceId) || !this.TextEmbeddingServices.ContainsKey(serviceId)) + if (string.IsNullOrEmpty(serviceId) || !this.TextEmbeddingGenerationServices.ContainsKey(serviceId)) { - serviceId = this.DefaultTextEmbeddingServiceId; + serviceId = this.DefaultTextEmbeddingGenerationServiceId; } if (string.IsNullOrEmpty(serviceId)) @@ -401,12 +401,12 @@ public KernelConfig RemoveChatCompletionService(string serviceId) /// /// Identifier of service to remove. /// The updated kernel configuration. - public KernelConfig RemoveTextEmbeddingService(string serviceId) + public KernelConfig RemoveTextEmbeddingGenerationService(string serviceId) { - this.TextEmbeddingServices.Remove(serviceId); - if (this.DefaultTextEmbeddingServiceId == serviceId) + this.TextEmbeddingGenerationServices.Remove(serviceId); + if (this.DefaultTextEmbeddingGenerationServiceId == serviceId) { - this.DefaultTextEmbeddingServiceId = this.TextEmbeddingServices.Keys.FirstOrDefault(); + this.DefaultTextEmbeddingGenerationServiceId = this.TextEmbeddingGenerationServices.Keys.FirstOrDefault(); } return this; @@ -438,10 +438,10 @@ public KernelConfig RemoveAllChatCompletionServices() /// Remove all text embedding generation services. /// /// The updated kernel configuration. - public KernelConfig RemoveAllTextEmbeddingServices() + public KernelConfig RemoveAllTextEmbeddingGenerationServices() { - this.TextEmbeddingServices.Clear(); - this.DefaultTextEmbeddingServiceId = null; + this.TextEmbeddingGenerationServices.Clear(); + this.DefaultTextEmbeddingGenerationServiceId = null; return this; } diff --git a/dotnet/src/SemanticKernel/KernelException.cs b/dotnet/src/SemanticKernel/KernelException.cs index c722f9c1771b..2266831c3daa 100644 --- a/dotnet/src/SemanticKernel/KernelException.cs +++ b/dotnet/src/SemanticKernel/KernelException.cs @@ -46,12 +46,12 @@ public enum ErrorCodes InvalidFunctionType, /// - /// Invalid backend configuration. + /// Invalid service configuration. /// InvalidServiceConfiguration, /// - /// Backend not found. + /// Service not found. /// ServiceNotFound, diff --git a/dotnet/src/SemanticKernel/KernelExtensions/InlineFunctionsDefinitionExtension.cs b/dotnet/src/SemanticKernel/KernelExtensions/InlineFunctionsDefinitionExtension.cs index 8019187e67f6..3d7ef431f329 100644 --- a/dotnet/src/SemanticKernel/KernelExtensions/InlineFunctionsDefinitionExtension.cs +++ b/dotnet/src/SemanticKernel/KernelExtensions/InlineFunctionsDefinitionExtension.cs @@ -7,7 +7,8 @@ using Microsoft.SemanticKernel.Orchestration; using Microsoft.SemanticKernel.SemanticFunctions; -namespace Microsoft.SemanticKernel.KernelExtensions; +// ReSharper disable once CheckNamespace // Extension methods +namespace Microsoft.SemanticKernel; /// /// Class for extensions methods to define semantic functions. diff --git a/dotnet/src/SemanticKernel/KernelExtensions/MemoryConfiguration.cs b/dotnet/src/SemanticKernel/KernelExtensions/MemoryConfiguration.cs index 577738c948d1..1fce5aeaa721 100644 --- a/dotnet/src/SemanticKernel/KernelExtensions/MemoryConfiguration.cs +++ b/dotnet/src/SemanticKernel/KernelExtensions/MemoryConfiguration.cs @@ -5,7 +5,8 @@ using Microsoft.SemanticKernel.Diagnostics; using Microsoft.SemanticKernel.Memory; -namespace Microsoft.SemanticKernel.KernelExtensions; +// ReSharper disable once CheckNamespace // Extension methods +namespace Microsoft.SemanticKernel; /// /// Kernel extension to configure the semantic memory with custom settings @@ -13,28 +14,28 @@ namespace Microsoft.SemanticKernel.KernelExtensions; public static class MemoryConfiguration { /// - /// Set the semantic memory to use the given memory storage. Uses the kernel's default embeddings backend. + /// Set the semantic memory to use the given memory storage. Uses the kernel's default embeddings service. /// /// Kernel instance /// Memory storage public static void UseMemory(this IKernel kernel, IMemoryStore storage) { - UseMemory(kernel, kernel.Config.DefaultTextEmbeddingServiceId, storage); + UseMemory(kernel, kernel.Config.DefaultTextEmbeddingGenerationServiceId, storage); } /// - /// Set the semantic memory to use the given memory storage and embeddings backend. + /// Set the semantic memory to use the given memory storage and embeddings service. /// /// Kernel instance - /// Kernel backend label for embedding generation + /// Kernel service id for embedding generation /// Memory storage [SuppressMessage("Reliability", "CA2000:Dispose objects before losing scope", Justification = "The embeddingGenerator object is disposed by the kernel")] - public static void UseMemory(this IKernel kernel, string? embeddingsBackendLabel, IMemoryStore storage) + public static void UseMemory(this IKernel kernel, string? embeddingsServiceId, IMemoryStore storage) { - Verify.NotEmpty(embeddingsBackendLabel, "The embedding backend label is empty"); + Verify.NotEmpty(embeddingsServiceId, "The embedding service id is empty"); - var embeddingGenerator = kernel.GetService>(); + var embeddingGenerator = kernel.GetService>(); UseMemory(kernel, embeddingGenerator, storage); } @@ -46,7 +47,7 @@ public static void UseMemory(this IKernel kernel, string? embeddingsBackendLabel /// Embedding generator /// Memory storage [SuppressMessage("Reliability", "CA2000:Dispose objects before losing scope", Justification = "The embeddingGenerator object is disposed by the kernel")] - public static void UseMemory(this IKernel kernel, IEmbeddingGenerator embeddingGenerator, IMemoryStore storage) + public static void UseMemory(this IKernel kernel, IEmbeddingGeneration embeddingGenerator, IMemoryStore storage) { Verify.NotNull(storage, "The storage instance provided is NULL"); Verify.NotNull(embeddingGenerator, "The embedding generator is NULL"); diff --git a/dotnet/src/SemanticKernel/Memory/SemanticTextMemory.cs b/dotnet/src/SemanticKernel/Memory/SemanticTextMemory.cs index dffcb8a61f36..98144d8f8ebf 100644 --- a/dotnet/src/SemanticKernel/Memory/SemanticTextMemory.cs +++ b/dotnet/src/SemanticKernel/Memory/SemanticTextMemory.cs @@ -16,12 +16,12 @@ namespace Microsoft.SemanticKernel.Memory; /// public sealed class SemanticTextMemory : ISemanticTextMemory, IDisposable { - private readonly IEmbeddingGenerator _embeddingGenerator; + private readonly IEmbeddingGeneration _embeddingGenerator; private readonly IMemoryStore _storage; public SemanticTextMemory( IMemoryStore storage, - IEmbeddingGenerator embeddingGenerator) + IEmbeddingGeneration embeddingGenerator) { this._embeddingGenerator = embeddingGenerator; this._storage = storage; diff --git a/dotnet/src/SemanticKernel/Orchestration/Extensions/ContextVariablesExtensions.cs b/dotnet/src/SemanticKernel/Orchestration/Extensions/ContextVariablesExtensions.cs index e2c8aeabc02a..4781cef03436 100644 --- a/dotnet/src/SemanticKernel/Orchestration/Extensions/ContextVariablesExtensions.cs +++ b/dotnet/src/SemanticKernel/Orchestration/Extensions/ContextVariablesExtensions.cs @@ -4,7 +4,8 @@ using System.Text.Json; using Microsoft.SemanticKernel.Planning; -namespace Microsoft.SemanticKernel.Orchestration.Extensions; +// ReSharper disable once CheckNamespace // Extension methods +namespace Microsoft.SemanticKernel.Orchestration; /// /// Class that holds extension methods for ContextVariables. diff --git a/dotnet/src/SemanticKernel/Orchestration/Extensions/SKContextExtensions.cs b/dotnet/src/SemanticKernel/Orchestration/Extensions/SKContextExtensions.cs index 0c6c7173380d..0b3231e16354 100644 --- a/dotnet/src/SemanticKernel/Orchestration/Extensions/SKContextExtensions.cs +++ b/dotnet/src/SemanticKernel/Orchestration/Extensions/SKContextExtensions.cs @@ -1,6 +1,8 @@ // Copyright (c) Microsoft. All rights reserved. -namespace Microsoft.SemanticKernel.Orchestration.Extensions; +// ReSharper disable once CheckNamespace // Extension methods + +namespace Microsoft.SemanticKernel.Orchestration; internal static class SKContextExtensions { diff --git a/dotnet/src/SemanticKernel/Orchestration/ISKFunction.cs b/dotnet/src/SemanticKernel/Orchestration/ISKFunction.cs index 2cf051465be4..7e76237473c7 100644 --- a/dotnet/src/SemanticKernel/Orchestration/ISKFunction.cs +++ b/dotnet/src/SemanticKernel/Orchestration/ISKFunction.cs @@ -37,7 +37,7 @@ public interface ISKFunction public bool IsSemantic { get; } /// - /// AI backend settings + /// AI service settings /// public CompleteRequestSettings RequestSettings { get; } @@ -86,12 +86,12 @@ Task InvokeAsync( ISKFunction SetDefaultSkillCollection(IReadOnlySkillCollection skills); /// - /// Set the AI backend used by the semantic function, passing a factory method. + /// Set the AI service used by the semantic function, passing a factory method. /// The factory allows to lazily instantiate the client and to properly handle its disposal. /// - /// AI backend factory + /// AI service factory /// Self instance - ISKFunction SetAIBackend(Func backendFactory); + ISKFunction SetAIService(Func serviceFactory); /// /// Set the AI completion settings used with LLM requests diff --git a/dotnet/src/SemanticKernel/Orchestration/SKFunction.cs b/dotnet/src/SemanticKernel/Orchestration/SKFunction.cs index 08516303608c..2b62cb779cba 100644 --- a/dotnet/src/SemanticKernel/Orchestration/SKFunction.cs +++ b/dotnet/src/SemanticKernel/Orchestration/SKFunction.cs @@ -197,11 +197,11 @@ public ISKFunction SetDefaultSkillCollection(IReadOnlySkillCollection skills) } /// - public ISKFunction SetAIBackend(Func backendFactory) + public ISKFunction SetAIService(Func serviceFactory) { - Verify.NotNull(backendFactory, "AI LLM backed factory is empty"); + Verify.NotNull(serviceFactory, "AI LLM service factory is empty"); this.VerifyIsSemantic(); - this._aiBackend = backendFactory.Invoke(); + this._aiService = serviceFactory.Invoke(); return this; } @@ -237,7 +237,7 @@ public void Dispose() private readonly Delegate _function; private readonly ILogger _log; private IReadOnlySkillCollection? _skillCollection; - private ITextCompletion? _aiBackend = null; + private ITextCompletion? _aiService = null; private CompleteRequestSettings _aiRequestSettings = new(); private struct MethodDetails @@ -303,7 +303,7 @@ private SKFunction( private void ReleaseUnmanagedResources() { - if (this._aiBackend is not IDisposable disposable) { return; } + if (this._aiService is not IDisposable disposable) { return; } disposable.Dispose(); } @@ -332,7 +332,7 @@ private async Task InvokeSemanticAsync(SKContext context, CompleteReq settings ??= this._aiRequestSettings; var callable = (Func>)this._function; - context.Variables.Update((await callable(this._aiBackend, settings, context)).Variables); + context.Variables.Update((await callable(this._aiService, settings, context)).Variables); return context; } diff --git a/dotnet/src/SemanticKernel/Orchestration/SKFunctionExtensions.cs b/dotnet/src/SemanticKernel/Orchestration/SKFunctionExtensions.cs index 336183dd0d0f..82cc261dc3bb 100644 --- a/dotnet/src/SemanticKernel/Orchestration/SKFunctionExtensions.cs +++ b/dotnet/src/SemanticKernel/Orchestration/SKFunctionExtensions.cs @@ -5,7 +5,6 @@ using System.Threading.Tasks; using Microsoft.Extensions.Logging; using Microsoft.SemanticKernel.AI.TextCompletion; -using Microsoft.SemanticKernel.Diagnostics; using Microsoft.SemanticKernel.Memory; using Microsoft.SemanticKernel.SkillDefinition; diff --git a/dotnet/src/SemanticKernel/Planning/FunctionFlowRunner.cs b/dotnet/src/SemanticKernel/Planning/FunctionFlowRunner.cs index 4d6c6dd2a4b2..8bb193b81356 100644 --- a/dotnet/src/SemanticKernel/Planning/FunctionFlowRunner.cs +++ b/dotnet/src/SemanticKernel/Planning/FunctionFlowRunner.cs @@ -9,7 +9,6 @@ using Microsoft.Extensions.Logging; using Microsoft.SemanticKernel.Diagnostics; using Microsoft.SemanticKernel.Orchestration; -using Microsoft.SemanticKernel.Orchestration.Extensions; namespace Microsoft.SemanticKernel.Planning; diff --git a/dotnet/src/SemanticKernel/Planning/FunctionViewExtensions.cs b/dotnet/src/SemanticKernel/Planning/FunctionViewExtensions.cs index 4cc7f2be8c9c..522bc048d8ce 100644 --- a/dotnet/src/SemanticKernel/Planning/FunctionViewExtensions.cs +++ b/dotnet/src/SemanticKernel/Planning/FunctionViewExtensions.cs @@ -1,9 +1,9 @@ // Copyright (c) Microsoft. All rights reserved. using System.Linq; -using Microsoft.SemanticKernel.SkillDefinition; -namespace Microsoft.SemanticKernel.Planning; +// ReSharper disable once CheckNamespace // Extension methods +namespace Microsoft.SemanticKernel.SkillDefinition; internal static class FunctionViewExtensions { diff --git a/dotnet/src/SemanticKernel/Planning/PlanRunner.cs b/dotnet/src/SemanticKernel/Planning/PlanRunner.cs index 5ae058682170..5bb98f4fc274 100644 --- a/dotnet/src/SemanticKernel/Planning/PlanRunner.cs +++ b/dotnet/src/SemanticKernel/Planning/PlanRunner.cs @@ -5,7 +5,6 @@ using System.Threading.Tasks; using System.Xml; using Microsoft.Extensions.Logging; -using Microsoft.SemanticKernel.Diagnostics; using Microsoft.SemanticKernel.Orchestration; namespace Microsoft.SemanticKernel.Planning; diff --git a/dotnet/src/SemanticKernel/Planning/SKContextExtensions.cs b/dotnet/src/SemanticKernel/Planning/SKContextPlanningExtensions.cs similarity index 97% rename from dotnet/src/SemanticKernel/Planning/SKContextExtensions.cs rename to dotnet/src/SemanticKernel/Planning/SKContextPlanningExtensions.cs index f0c5718ee183..249a51e5dea8 100644 --- a/dotnet/src/SemanticKernel/Planning/SKContextExtensions.cs +++ b/dotnet/src/SemanticKernel/Planning/SKContextPlanningExtensions.cs @@ -6,14 +6,13 @@ using System.Threading.Tasks; using Microsoft.Extensions.Logging; using Microsoft.SemanticKernel.Memory; -using Microsoft.SemanticKernel.Orchestration; -using Microsoft.SemanticKernel.Orchestration.Extensions; using Microsoft.SemanticKernel.SkillDefinition; using static Microsoft.SemanticKernel.CoreSkills.PlannerSkill; -namespace Microsoft.SemanticKernel.Planning; +// ReSharper disable once CheckNamespace // Extension methods +namespace Microsoft.SemanticKernel.Orchestration; -internal static class SKContextExtensions +internal static class SKContextPlanningExtensions { internal const string PlannerMemoryCollectionName = "Planning.SKFunctionsManual"; diff --git a/dotnet/src/SemanticKernel/SemanticFunctions/PromptTemplateConfig.cs b/dotnet/src/SemanticKernel/SemanticFunctions/PromptTemplateConfig.cs index a056c65b4f95..1966a71cfb75 100644 --- a/dotnet/src/SemanticKernel/SemanticFunctions/PromptTemplateConfig.cs +++ b/dotnet/src/SemanticKernel/SemanticFunctions/PromptTemplateConfig.cs @@ -59,7 +59,7 @@ public class CompletionConfig public int MaxTokens { get; set; } = 256; /// - /// Stop sequences are optional sequences that tells the backend when to stop generating tokens. + /// Stop sequences are optional sequences that tells the AI model when to stop generating tokens. /// [JsonPropertyName("stop_sequences")] [JsonPropertyOrder(6)] @@ -137,12 +137,12 @@ public class InputConfig public CompletionConfig Completion { get; set; } = new(); /// - /// Default backends to use. + /// Default AI services to use. /// - [JsonPropertyName("default_backends")] + [JsonPropertyName("default_services")] [JsonPropertyOrder(5)] [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)] - public List DefaultBackends { get; set; } = new(); + public List DefaultServices { get; set; } = new(); /// /// Input configuration (that is, list of all input parameters). @@ -163,9 +163,9 @@ public PromptTemplateConfig Compact() this.Completion.StopSequences = null!; } - if (this.DefaultBackends.Count == 0) + if (this.DefaultServices.Count == 0) { - this.DefaultBackends = null!; + this.DefaultServices = null!; } return this; diff --git a/dotnet/src/SemanticKernel/SemanticKernel.csproj b/dotnet/src/SemanticKernel/SemanticKernel.csproj index 838625660201..c784a28f5bcf 100644 --- a/dotnet/src/SemanticKernel/SemanticKernel.csproj +++ b/dotnet/src/SemanticKernel/SemanticKernel.csproj @@ -39,19 +39,22 @@ <_Parameter1>SemanticKernel.UnitTests + + <_Parameter1>Microsoft.SemanticKernel.Connectors.OpenAI + <_Parameter1>DynamicProxyGenAssembly2 - - - Always + + + PreserveNewest - - - Always + + + PreserveNewest \ No newline at end of file diff --git a/dotnet/src/SemanticKernel/Services/IServiceConfig.cs b/dotnet/src/SemanticKernel/Services/IServiceConfig.cs new file mode 100644 index 000000000000..1882ca485667 --- /dev/null +++ b/dotnet/src/SemanticKernel/Services/IServiceConfig.cs @@ -0,0 +1,13 @@ +// Copyright (c) Microsoft. All rights reserved. + +namespace Microsoft.SemanticKernel.Services; + +/// +/// Service configuration. +/// +public interface IServiceConfig +{ + /// An identifier used to map semantic functions to AI connectors, + /// decoupling prompts configurations from the actual model and AI provider used. + public string ServiceId { get; } +} diff --git a/dotnet/src/SemanticKernel/Services/ServiceConfig.cs b/dotnet/src/SemanticKernel/Services/ServiceConfig.cs new file mode 100644 index 000000000000..56149e682818 --- /dev/null +++ b/dotnet/src/SemanticKernel/Services/ServiceConfig.cs @@ -0,0 +1,24 @@ +// Copyright (c) Microsoft. All rights reserved. + +using Microsoft.SemanticKernel.Diagnostics; + +namespace Microsoft.SemanticKernel.Services; + +public abstract class ServiceConfig : IServiceConfig +{ + /// + /// An identifier used to map semantic functions to AI services, + /// decoupling prompts configurations from the actual provider and model used. + /// + public string ServiceId { get; } + + /// + /// Creates a new with supplied values. + /// + /// An identifier used to map semantic functions to AI services and models. + protected ServiceConfig(string serviceId) + { + Verify.NotEmpty(serviceId, "The service Id is empty"); + this.ServiceId = serviceId; + } +} diff --git a/dotnet/src/SemanticKernel/TemplateEngine/Blocks/CodeBlock.cs b/dotnet/src/SemanticKernel/TemplateEngine/Blocks/CodeBlock.cs index f92843ce7c7f..1a298fe3a82d 100644 --- a/dotnet/src/SemanticKernel/TemplateEngine/Blocks/CodeBlock.cs +++ b/dotnet/src/SemanticKernel/TemplateEngine/Blocks/CodeBlock.cs @@ -5,7 +5,6 @@ using System.Threading.Tasks; using Microsoft.Extensions.Logging; using Microsoft.SemanticKernel.Orchestration; -using Microsoft.SemanticKernel.Orchestration.Extensions; using Microsoft.SemanticKernel.SkillDefinition; namespace Microsoft.SemanticKernel.TemplateEngine.Blocks; diff --git a/samples/dotnet/KernelBuilder/GlobalUsings.cs b/samples/dotnet/KernelBuilder/GlobalUsings.cs index bde4d5104cbd..8226d80ee14f 100644 --- a/samples/dotnet/KernelBuilder/GlobalUsings.cs +++ b/samples/dotnet/KernelBuilder/GlobalUsings.cs @@ -4,11 +4,11 @@ global using Microsoft.Extensions.Logging.Abstractions; global using Microsoft.SemanticKernel; global using Microsoft.SemanticKernel.AI; -global using Microsoft.SemanticKernel.AI.OpenAI.Services; -global using Microsoft.SemanticKernel.Configuration; +global using Microsoft.SemanticKernel.Connectors.OpenAI.TextEmbedding; global using Microsoft.SemanticKernel.Memory; global using Microsoft.SemanticKernel.Reliability; global using Microsoft.SemanticKernel.SkillDefinition; global using Microsoft.SemanticKernel.TemplateEngine; global using Polly; global using Polly.Retry; + diff --git a/samples/dotnet/KernelBuilder/Program.cs b/samples/dotnet/KernelBuilder/Program.cs index 74b8f0983432..610da1e60f45 100644 --- a/samples/dotnet/KernelBuilder/Program.cs +++ b/samples/dotnet/KernelBuilder/Program.cs @@ -4,6 +4,9 @@ // The easier way to instantiate the Semantic Kernel is to use KernelBuilder. // You can access the builder using either Kernel.Builder or KernelBuilder. +using Microsoft.SemanticKernel.AI.TextCompletion; +using Microsoft.SemanticKernel.Connectors.OpenAI.TextCompletion; + IKernel kernel1 = KernelBuilder.Create(); IKernel kernel2 = Kernel.Builder.Build(); @@ -37,12 +40,14 @@ // Manually setup all the dependencies used internally by the kernel var logger = NullLogger.Instance; var memoryStorage = new VolatileMemoryStore(); -var embeddingGenerator = new AzureTextEmbeddings("modelId", "https://...", "apiKey", "2022-12-01", logger); -var memory = new SemanticTextMemory(memoryStorage, embeddingGenerator); +var textEmbeddingGenerator = new AzureTextEmbeddingGeneration("modelId", "https://...", "apiKey", "2022-12-01", logger); +var memory = new SemanticTextMemory(memoryStorage, textEmbeddingGenerator); var skills = new SkillCollection(); var templateEngine = new PromptTemplateEngine(logger); var config = new KernelConfig(); -config.AddAzureOpenAITextCompletion("foo", "deploymentName", "https://...", "apiKey", "2022-12-01"); +var httpHandlerFactory = new DefaultHttpRetryHandlerFactory(new HttpRetryConfig()); +ITextCompletion Factory(IKernel kernel) => new AzureTextCompletion("deploymentName", "https://...", "apiKey", "2022-12-01", logger, httpHandlerFactory); +config.AddTextCompletionService("foo", Factory); // Create kernel manually injecting all the dependencies var kernel3 = new Kernel(skills, templateEngine, memory, config, logger); @@ -57,14 +62,14 @@ .WithMemory(memory) .Configure(c => { - c.AddAzureOpenAITextCompletion("foo", "deploymentName", "https://...", "apiKey", "2022-12-01"); + c.AddAzureOpenAITextCompletionService("foo", "deploymentName", "https://...", "apiKey", "2022-12-01"); }) .Build(); // Example: how to use a custom memory storage and custom embedding generator var kernel5 = Kernel.Builder .WithLogger(NullLogger.Instance) - .WithMemoryStorageAndEmbeddingGenerator(memoryStorage, embeddingGenerator) + .WithMemoryStorageAndTextEmbeddingGeneration(memoryStorage, textEmbeddingGenerator) .Build(); // Example: how to use a custom memory storage @@ -74,10 +79,10 @@ .Configure(c => { // This will be used when using AI completions - c.AddAzureOpenAITextCompletion("myName1", "completionDeploymentName", "https://...", "apiKey", "2022-12-01"); + c.AddAzureOpenAITextCompletionService("myName1", "completionDeploymentName", "https://...", "apiKey", "2022-12-01"); // This will be used when indexing memory records - c.AddAzureOpenAIEmbeddingGeneration("myName2", "embeddingsDeploymentName", "https://...", "apiKey", "2022-12-01"); + c.AddAzureOpenAIEmbeddingGenerationService("myName2", "embeddingsDeploymentName", "https://...", "apiKey", "2022-12-01"); }) .Build(); @@ -88,15 +93,18 @@ var kernel7 = Kernel.Builder .Configure(c => { - c.AddAzureOpenAITextCompletion("myName1", "completionDeploymentName", "https://...", "apiKey", "2022-12-01"); + c.AddAzureOpenAITextCompletionService("myName1", "completionDeploymentName", "https://...", "apiKey", "2022-12-01"); + }) + .Configure(c => + { + c.SetDefaultTextEmbeddingGenerationService("myName3"); }) .Build(); kernel7.Config - .AddAzureOpenAIEmbeddingGeneration("myName2", "embeddingsDeploymentName1", "https://...", "apiKey", "2022-12-01") - .AddAzureOpenAIEmbeddingGeneration("myName3", "embeddingsDeploymentName2", "https://...", "apiKey", "2022-12-01") - .AddOpenAITextCompletion("myName4", "text-davinci-003", "sk-...") - .SetDefaultEmbeddingService("myName3"); + .AddAzureOpenAIEmbeddingGenerationService("myName2", "embeddingsDeploymentName1", "https://...", "apiKey", "2022-12-01") + .AddAzureOpenAIEmbeddingGenerationService("myName3", "embeddingsDeploymentName2", "https://...", "apiKey", "2022-12-01") + .AddOpenAITextCompletionService("myName4", "text-davinci-003", "sk-..."); // ========================================================================================================== // When invoking AI, by default the kernel will retry on transient errors, such as throttling and timeouts. diff --git a/samples/dotnet/KernelHttpServer/Config/BackendConfig.cs b/samples/dotnet/KernelHttpServer/Config/AIServiceConfig.cs similarity index 80% rename from samples/dotnet/KernelHttpServer/Config/BackendConfig.cs rename to samples/dotnet/KernelHttpServer/Config/AIServiceConfig.cs index 6f6652624407..c250ef01350b 100644 --- a/samples/dotnet/KernelHttpServer/Config/BackendConfig.cs +++ b/samples/dotnet/KernelHttpServer/Config/AIServiceConfig.cs @@ -2,7 +2,7 @@ namespace KernelHttpServer.Config; -public class BackendConfig +public class AIServiceConfig { public AIService AIService { get; set; } @@ -12,7 +12,7 @@ public class BackendConfig public string Key { get; set; } = string.Empty; - public string Label { get; set; } = string.Empty; + public string ServiceId { get; set; } = string.Empty; public bool IsValid() { @@ -20,13 +20,13 @@ public bool IsValid() { case AIService.OpenAI: return - !string.IsNullOrEmpty(this.Label) && + !string.IsNullOrEmpty(this.ServiceId) && !string.IsNullOrEmpty(this.DeploymentOrModelId) && !string.IsNullOrEmpty(this.Key); case AIService.AzureOpenAI: return !string.IsNullOrEmpty(this.Endpoint) && - !string.IsNullOrEmpty(this.Label) && + !string.IsNullOrEmpty(this.ServiceId) && !string.IsNullOrEmpty(this.DeploymentOrModelId) && !string.IsNullOrEmpty(this.Key); } diff --git a/samples/dotnet/KernelHttpServer/Config/ApiKeyConfig.cs b/samples/dotnet/KernelHttpServer/Config/ApiKeyConfig.cs index 42b5003b56e9..f765d1c24ff9 100644 --- a/samples/dotnet/KernelHttpServer/Config/ApiKeyConfig.cs +++ b/samples/dotnet/KernelHttpServer/Config/ApiKeyConfig.cs @@ -4,7 +4,7 @@ namespace KernelHttpServer.Config; public class ApiKeyConfig { - public BackendConfig CompletionConfig { get; set; } = new(); + public AIServiceConfig CompletionConfig { get; set; } = new(); - public BackendConfig EmbeddingConfig { get; set; } = new(); + public AIServiceConfig EmbeddingConfig { get; set; } = new(); } diff --git a/samples/dotnet/KernelHttpServer/Config/Constants.cs b/samples/dotnet/KernelHttpServer/Config/Constants.cs index e41cc7595b36..6552e8ecf736 100644 --- a/samples/dotnet/KernelHttpServer/Config/Constants.cs +++ b/samples/dotnet/KernelHttpServer/Config/Constants.cs @@ -8,12 +8,12 @@ public class SKHttpHeaders { public const string CompletionModel = "x-ms-sk-completion-model"; public const string CompletionEndpoint = "x-ms-sk-completion-endpoint"; - public const string CompletionBackend = "x-ms-sk-completion-backend"; + public const string CompletionService = "x-ms-sk-completion-backend"; public const string CompletionKey = "x-ms-sk-completion-key"; public const string EmbeddingModel = "x-ms-sk-embedding-model"; public const string EmbeddingEndpoint = "x-ms-sk-embedding-endpoint"; - public const string EmbeddingBackend = "x-ms-sk-embedding-backend"; + public const string EmbeddingService = "x-ms-sk-embedding-backend"; public const string EmbeddingKey = "x-ms-sk-embedding-key"; public const string MSGraph = "x-ms-sk-msgraph"; diff --git a/samples/dotnet/KernelHttpServer/Extensions.cs b/samples/dotnet/KernelHttpServer/Extensions.cs index b80da931f81b..fd923898cff2 100644 --- a/samples/dotnet/KernelHttpServer/Extensions.cs +++ b/samples/dotnet/KernelHttpServer/Extensions.cs @@ -37,7 +37,7 @@ internal static ApiKeyConfig ToApiKeyConfig(this HttpRequestData req) var apiConfig = new ApiKeyConfig(); // completion values - if (req.Headers.TryGetValues(SKHttpHeaders.CompletionBackend, out var completionAIService)) + if (req.Headers.TryGetValues(SKHttpHeaders.CompletionService, out var completionAIService)) { apiConfig.CompletionConfig.AIService = Enum.Parse(completionAIService.First()); } @@ -45,7 +45,7 @@ internal static ApiKeyConfig ToApiKeyConfig(this HttpRequestData req) if (req.Headers.TryGetValues(SKHttpHeaders.CompletionModel, out var completionModelValue)) { apiConfig.CompletionConfig.DeploymentOrModelId = completionModelValue.First(); - apiConfig.CompletionConfig.Label = apiConfig.CompletionConfig.DeploymentOrModelId; + apiConfig.CompletionConfig.ServiceId = apiConfig.CompletionConfig.DeploymentOrModelId; } if (req.Headers.TryGetValues(SKHttpHeaders.CompletionEndpoint, out var completionEndpoint)) @@ -59,7 +59,7 @@ internal static ApiKeyConfig ToApiKeyConfig(this HttpRequestData req) } // embedding values - if (req.Headers.TryGetValues(SKHttpHeaders.EmbeddingBackend, out var embeddingAIService)) + if (req.Headers.TryGetValues(SKHttpHeaders.EmbeddingService, out var embeddingAIService)) { apiConfig.EmbeddingConfig.AIService = Enum.Parse(embeddingAIService.First()); } @@ -67,7 +67,7 @@ internal static ApiKeyConfig ToApiKeyConfig(this HttpRequestData req) if (req.Headers.TryGetValues(SKHttpHeaders.EmbeddingModel, out var embeddingModelValue)) { apiConfig.EmbeddingConfig.DeploymentOrModelId = embeddingModelValue.First(); - apiConfig.EmbeddingConfig.Label = apiConfig.EmbeddingConfig.DeploymentOrModelId; + apiConfig.EmbeddingConfig.ServiceId = apiConfig.EmbeddingConfig.DeploymentOrModelId; } if (req.Headers.TryGetValues(SKHttpHeaders.EmbeddingEndpoint, out var embeddingEndpoint)) diff --git a/samples/dotnet/KernelHttpServer/SemanticKernelEndpoint.cs b/samples/dotnet/KernelHttpServer/SemanticKernelEndpoint.cs index 18a643087cf1..2dc364d064fd 100644 --- a/samples/dotnet/KernelHttpServer/SemanticKernelEndpoint.cs +++ b/samples/dotnet/KernelHttpServer/SemanticKernelEndpoint.cs @@ -10,7 +10,6 @@ using Microsoft.Azure.Functions.Worker.Http; using Microsoft.SemanticKernel.Memory; using Microsoft.SemanticKernel.Orchestration; -using Microsoft.SemanticKernel.Orchestration.Extensions; namespace KernelHttpServer; diff --git a/samples/dotnet/KernelHttpServer/SemanticKernelFactory.cs b/samples/dotnet/KernelHttpServer/SemanticKernelFactory.cs index cb997267b4ea..100a56c6cdec 100644 --- a/samples/dotnet/KernelHttpServer/SemanticKernelFactory.cs +++ b/samples/dotnet/KernelHttpServer/SemanticKernelFactory.cs @@ -7,7 +7,6 @@ using Microsoft.Azure.Functions.Worker.Http; using Microsoft.Extensions.Logging; using Microsoft.SemanticKernel; -using Microsoft.SemanticKernel.Configuration; using Microsoft.SemanticKernel.Memory; using static KernelHttpServer.Config.Constants; @@ -23,18 +22,18 @@ internal static class SemanticKernelFactory { var apiConfig = req.ToApiKeyConfig(); - //must have a completion backend + // must have a completion service if (!apiConfig.CompletionConfig.IsValid()) { - logger.LogError("Completion backend has not been supplied."); + logger.LogError("Text completion service has not been supplied"); return null; } - //embedding backend is optional, don't fail if we were not given the config + // Text embedding service is optional, don't fail if we were not given the config if (memoryStore != null && !apiConfig.EmbeddingConfig.IsValid()) { - logger.LogWarning("Embedding backend has not been supplied."); + logger.LogWarning("Text embedding service has not been supplied"); } KernelBuilder builder = Kernel.Builder; @@ -44,36 +43,35 @@ internal static class SemanticKernelFactory private static KernelBuilder _ConfigureKernelBuilder(ApiKeyConfig config, KernelBuilder builder, IMemoryStore? memoryStore) { - builder = builder - .Configure(c => + return builder.Configure(c => + { + switch (config.CompletionConfig.AIService) + { + case AIService.OpenAI: + c.AddOpenAITextCompletionService(config.CompletionConfig.ServiceId, config.CompletionConfig.DeploymentOrModelId, config.CompletionConfig.Key); + break; + case AIService.AzureOpenAI: + c.AddAzureOpenAITextCompletionService(config.CompletionConfig.ServiceId, config.CompletionConfig.DeploymentOrModelId, config.CompletionConfig.Endpoint, + config.CompletionConfig.Key); + break; + } + + if (memoryStore != null && config.EmbeddingConfig.IsValid()) { - switch (config.CompletionConfig.AIService) + switch (config.EmbeddingConfig.AIService) { case AIService.OpenAI: - c.AddOpenAITextCompletion(config.CompletionConfig.Label, config.CompletionConfig.DeploymentOrModelId, config.CompletionConfig.Key); + c.AddOpenAIEmbeddingGenerationService(config.EmbeddingConfig.ServiceId, config.EmbeddingConfig.DeploymentOrModelId, config.EmbeddingConfig.Key); break; case AIService.AzureOpenAI: - c.AddAzureOpenAITextCompletion(config.CompletionConfig.Label, config.CompletionConfig.DeploymentOrModelId, config.CompletionConfig.Endpoint, config.CompletionConfig.Key); + c.AddAzureOpenAIEmbeddingGenerationService(config.EmbeddingConfig.ServiceId, config.EmbeddingConfig.DeploymentOrModelId, + config.EmbeddingConfig.Endpoint, config.EmbeddingConfig.Key); break; } - if (memoryStore != null && config.EmbeddingConfig.IsValid()) - { - switch (config.EmbeddingConfig.AIService) - { - case AIService.OpenAI: - c.AddOpenAIEmbeddingGeneration(config.EmbeddingConfig.Label, config.EmbeddingConfig.DeploymentOrModelId, config.EmbeddingConfig.Key); - break; - case AIService.AzureOpenAI: - c.AddAzureOpenAIEmbeddingGeneration(config.EmbeddingConfig.Label, config.EmbeddingConfig.DeploymentOrModelId, config.EmbeddingConfig.Endpoint, config.EmbeddingConfig.Key); - break; - } - - builder.WithMemoryStorage(memoryStore); - } - }); - - return builder; + builder.WithMemoryStorage(memoryStore); + } + }); } private static IKernel _CompleteKernelSetup(HttpRequestData req, KernelBuilder builder, ILogger logger, IEnumerable? skillsToLoad = null) @@ -89,7 +87,7 @@ private static IKernel _CompleteKernelSetup(HttpRequestData req, KernelBuilder b kernel.RegisterNativeGraphSkills(graphToken.First()); } - if (kernel.Config.DefaultTextEmbeddingServiceId != null) + if (kernel.Config.DefaultTextEmbeddingGenerationServiceId != null) { kernel.RegisterTextMemory(); } diff --git a/samples/dotnet/github-skills/GitHubSkill.cs b/samples/dotnet/github-skills/GitHubSkill.cs index 8b5c04e0aefb..67fd8b22e907 100644 --- a/samples/dotnet/github-skills/GitHubSkill.cs +++ b/samples/dotnet/github-skills/GitHubSkill.cs @@ -8,7 +8,6 @@ using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging.Abstractions; using Microsoft.SemanticKernel; -using Microsoft.SemanticKernel.KernelExtensions; using Microsoft.SemanticKernel.Memory; using Microsoft.SemanticKernel.Orchestration; using Microsoft.SemanticKernel.SemanticFunctions.Partitioning; diff --git a/samples/dotnet/graph-api-skills/AzureOpenAIConfiguration.cs b/samples/dotnet/graph-api-skills/AzureOpenAIConfiguration.cs index c0f2e8afc656..7c8e9ae1e5e5 100644 --- a/samples/dotnet/graph-api-skills/AzureOpenAIConfiguration.cs +++ b/samples/dotnet/graph-api-skills/AzureOpenAIConfiguration.cs @@ -5,7 +5,7 @@ [SuppressMessage("Performance", "CA1812:class never instantiated", Justification = "Instantiated through IConfiguration")] internal sealed class AzureOpenAIConfiguration { - public string Label { get; set; } + public string ServiceId { get; set; } public string DeploymentName { get; set; } @@ -13,9 +13,9 @@ internal sealed class AzureOpenAIConfiguration public string ApiKey { get; set; } - public AzureOpenAIConfiguration(string label, string deploymentName, string endpoint, string apiKey) + public AzureOpenAIConfiguration(string serviceId, string deploymentName, string endpoint, string apiKey) { - this.Label = label; + this.ServiceId = serviceId; this.DeploymentName = deploymentName; this.Endpoint = endpoint; this.ApiKey = apiKey; diff --git a/samples/dotnet/graph-api-skills/OpenAIConfiguration.cs b/samples/dotnet/graph-api-skills/OpenAIConfiguration.cs index ed0fc2b28417..5459f65c1083 100644 --- a/samples/dotnet/graph-api-skills/OpenAIConfiguration.cs +++ b/samples/dotnet/graph-api-skills/OpenAIConfiguration.cs @@ -6,13 +6,13 @@ Justification = "Configuration classes are instantiated through IConfiguration.")] internal sealed class OpenAIConfiguration { - public string Label { get; set; } + public string ServiceId { get; set; } public string ModelId { get; set; } public string ApiKey { get; set; } - public OpenAIConfiguration(string label, string modelId, string apiKey) + public OpenAIConfiguration(string serviceId, string modelId, string apiKey) { - this.Label = label; + this.ServiceId = serviceId; this.ModelId = modelId; this.ApiKey = apiKey; } diff --git a/samples/dotnet/graph-api-skills/Program.cs b/samples/dotnet/graph-api-skills/Program.cs index 4d29072321d5..561c0ffd2841 100644 --- a/samples/dotnet/graph-api-skills/Program.cs +++ b/samples/dotnet/graph-api-skills/Program.cs @@ -12,7 +12,6 @@ using Microsoft.Extensions.Logging; using Microsoft.Graph; using Microsoft.SemanticKernel; -using Microsoft.SemanticKernel.Configuration; using Microsoft.SemanticKernel.KernelExtensions; using Microsoft.SemanticKernel.Orchestration; using Microsoft.SemanticKernel.Skills.MsGraph; @@ -100,38 +99,38 @@ public static async Task Main() var todo = sk.ImportSkill(todoSkill, "todo"); var outlook = sk.ImportSkill(outlookSkill, "outlook"); - if (configuration.GetSection("AzureOpenAI:Label").Value != null) + if (configuration.GetSection("AzureOpenAI:ServiceId").Value != null) { AzureOpenAIConfiguration? azureOpenAIConfiguration = configuration.GetSection("AzureOpenAI").Get(); if (azureOpenAIConfiguration != null) { - sk.Config.AddAzureOpenAITextCompletion( - serviceId: azureOpenAIConfiguration.Label, + sk.Config.AddAzureOpenAITextCompletionService( + serviceId: azureOpenAIConfiguration.ServiceId, deploymentName: azureOpenAIConfiguration.DeploymentName, endpoint: azureOpenAIConfiguration.Endpoint, apiKey: azureOpenAIConfiguration.ApiKey); } } - if (configuration.GetSection("OpenAI:Label").Value != null) + if (configuration.GetSection("OpenAI:ServiceId").Value != null) { OpenAIConfiguration? openAIConfiguration = configuration.GetSection("OpenAI").Get(); if (openAIConfiguration != null) { - sk.Config.AddOpenAITextCompletion( - serviceId: openAIConfiguration.Label, + sk.Config.AddOpenAITextCompletionService( + serviceId: openAIConfiguration.ServiceId, modelId: openAIConfiguration.ModelId, apiKey: openAIConfiguration.ApiKey); } } - string? defaultCompletionBackendLabel = configuration["DefaultCompletionBackendLabel"]; - if (string.IsNullOrWhiteSpace(defaultCompletionBackendLabel)) + string? defaultCompletionServiceId = configuration["DefaultCompletionServiceId"]; + if (string.IsNullOrWhiteSpace(defaultCompletionServiceId)) { - throw new InvalidOperationException("'DefaultCompletionBackendLabel' is not set in configuration."); + throw new InvalidOperationException("'DefaultCompletionServiceId' is not set in configuration."); } - sk.Config.SetDefaultTextCompletionService(defaultCompletionBackendLabel); + sk.Config.SetDefaultTextCompletionService(defaultCompletionServiceId); string? currentAssemblyDirectory = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location); if (string.IsNullOrWhiteSpace(currentAssemblyDirectory)) diff --git a/samples/dotnet/graph-api-skills/README.md b/samples/dotnet/graph-api-skills/README.md index dabeb358df8d..3d636c8bfe01 100644 --- a/samples/dotnet/graph-api-skills/README.md +++ b/samples/dotnet/graph-api-skills/README.md @@ -8,7 +8,9 @@ This example program demonstrates how to use the Microsoft Graph API skills with - The `appsettings.Development.json` file should be ignored by git and will not be checked in by default. 2. Set your API Keys - This example can use either Azure OpenAI or OpenAI models for summarization. - - In your `appsettings.Development.json` fill out the `OpenAI` and/or `AzureOpenAI` sections with an appropriate label and API key. + - In your `appsettings.Development.json` fill out the `OpenAI` and/or `AzureOpenAI` sections with + a unique service id and your API key (you can use any service id, it's only a string that allows to + distinguish multiple services). 3. If you have not already, [register an application with the Microsoft identity platform](https://learn.microsoft.com/azure/active-directory/develop/quickstart-register-app). - Select **`Mobile and desktop applications`** as platform type, and the Redirect URI will be **`http://localhost`** - It is recommended you use the **`Personal Microsoft accounts`** account type for this sample. @@ -27,11 +29,11 @@ Example `appsettings.Development.json`: }, "OneDrivePathToFile": "Documents/MyFile.txt", "OpenAI": { - "Label": "text-davinci-003", + "ServiceId": "oaidavinci", "ApiKey": "YOUR_OPENAPI_KEY" }, "AzureOpenAI": { - "Label": "azure-text-davinci-003", + "ServiceId": "azuredavinci", "DeploymentName": "azure-text-davinci-003", "Endpoint": "YOUR_AZURE_OPENAI_ENDPOINT (e.g. https://contoso.openai.azure.com/", "ApiKey": "YOUR_AZURE_OPENAPI_KEY" diff --git a/samples/dotnet/graph-api-skills/appsettings.json b/samples/dotnet/graph-api-skills/appsettings.json index ac56b1058231..918eaa05d4e6 100644 --- a/samples/dotnet/graph-api-skills/appsettings.json +++ b/samples/dotnet/graph-api-skills/appsettings.json @@ -20,14 +20,14 @@ "RedirectUri": "http://localhost" }, "OneDrivePathToFile": "", // e.g. "Documents/MyFile.txt" - "DefaultCompletionBackendLabel": "text-davinci-003", + "DefaultCompletionServiceId": "text-davinci-003", "OpenAI": { - // "Label": "text-davinci-003", + // "ServiceId": "text-davinci-003", // "ModelId": "text-davinci-003", // "ApiKey": "" } "AzureOpenAI": { - // "Label": "", + // "ServiceId": "", // "DeploymentName": "", // "Endpoint": "", // "ApiKey": "" diff --git a/samples/dotnet/kernel-extension-load-prompts-from-cloud/SampleExtension.cs b/samples/dotnet/kernel-extension-load-prompts-from-cloud/SampleExtension.cs index 5e5dac6cd106..f7c5ee6e2ce1 100644 --- a/samples/dotnet/kernel-extension-load-prompts-from-cloud/SampleExtension.cs +++ b/samples/dotnet/kernel-extension-load-prompts-from-cloud/SampleExtension.cs @@ -45,8 +45,8 @@ public static async Task> ImportSemanticSkillFr { // Assuming this prompt will be used for completions, set some settings like the number of tokens Completion = new PromptTemplateConfig.CompletionConfig { Temperature = 0.5, MaxTokens = 100, }, - // A list of backend aliases that the consumer should provide when running this prompt - DefaultBackends = new List { "text-davinci-003" } + // A list of service IDs that the consumer should provide when running this prompt + DefaultServices = new List { "text-davinci-003" } }; // Create template diff --git a/samples/dotnet/kernel-syntax-examples/Example05_CombineLLMPromptsAndNativeCode.cs b/samples/dotnet/kernel-syntax-examples/Example05_CombineLLMPromptsAndNativeCode.cs index c68f58f9949e..c98e23160819 100644 --- a/samples/dotnet/kernel-syntax-examples/Example05_CombineLLMPromptsAndNativeCode.cs +++ b/samples/dotnet/kernel-syntax-examples/Example05_CombineLLMPromptsAndNativeCode.cs @@ -3,7 +3,6 @@ using System; using System.Threading.Tasks; using Microsoft.SemanticKernel; -using Microsoft.SemanticKernel.Configuration; using Microsoft.SemanticKernel.KernelExtensions; using Microsoft.SemanticKernel.Skills.Web; using Microsoft.SemanticKernel.Skills.Web.Bing; @@ -19,8 +18,8 @@ public static async Task RunAsync() IKernel kernel = new KernelBuilder().WithLogger(ConsoleLogger.Log).Build(); // OpenAI settings - kernel.Config.AddOpenAITextCompletion("text-davinci-002", "text-davinci-002", Env.Var("OPENAI_API_KEY")); - kernel.Config.AddOpenAITextCompletion("text-davinci-003", "text-davinci-003", Env.Var("OPENAI_API_KEY")); + kernel.Config.AddOpenAITextCompletionService("text-davinci-002", "text-davinci-002", Env.Var("OPENAI_API_KEY")); + kernel.Config.AddOpenAITextCompletionService("text-davinci-003", "text-davinci-003", Env.Var("OPENAI_API_KEY")); kernel.Config.SetDefaultTextCompletionService("text-davinci-003"); // Load native skill diff --git a/samples/dotnet/kernel-syntax-examples/Example06_InlineFunctionDefinition.cs b/samples/dotnet/kernel-syntax-examples/Example06_InlineFunctionDefinition.cs index d4052a3128d4..01450db83618 100644 --- a/samples/dotnet/kernel-syntax-examples/Example06_InlineFunctionDefinition.cs +++ b/samples/dotnet/kernel-syntax-examples/Example06_InlineFunctionDefinition.cs @@ -3,8 +3,6 @@ using System; using System.Threading.Tasks; using Microsoft.SemanticKernel; -using Microsoft.SemanticKernel.Configuration; -using Microsoft.SemanticKernel.KernelExtensions; using RepoUtils; // ReSharper disable once InconsistentNaming @@ -23,7 +21,7 @@ public static async Task RunAsync() IKernel kernel = new KernelBuilder().WithLogger(ConsoleLogger.Log).Build(); // OpenAI settings - kernel.Config.AddOpenAITextCompletion("text-davinci-003", "text-davinci-003", Env.Var("OPENAI_API_KEY")); + kernel.Config.AddOpenAITextCompletionService("text-davinci-003", "text-davinci-003", Env.Var("OPENAI_API_KEY")); // Function defined using few-shot design pattern const string FUNCTION_DEFINITION = @" diff --git a/samples/dotnet/kernel-syntax-examples/Example07_TemplateLanguage.cs b/samples/dotnet/kernel-syntax-examples/Example07_TemplateLanguage.cs index 2e85db8697c3..5965537c0695 100644 --- a/samples/dotnet/kernel-syntax-examples/Example07_TemplateLanguage.cs +++ b/samples/dotnet/kernel-syntax-examples/Example07_TemplateLanguage.cs @@ -3,9 +3,7 @@ using System; using System.Threading.Tasks; using Microsoft.SemanticKernel; -using Microsoft.SemanticKernel.Configuration; using Microsoft.SemanticKernel.CoreSkills; -using Microsoft.SemanticKernel.KernelExtensions; using RepoUtils; // ReSharper disable once InconsistentNaming @@ -20,7 +18,7 @@ public static async Task RunAsync() Console.WriteLine("======== TemplateLanguage ========"); IKernel kernel = Kernel.Builder.WithLogger(ConsoleLogger.Log).Build(); - kernel.Config.AddOpenAITextCompletion("text-davinci-003", "text-davinci-003", Env.Var("OPENAI_API_KEY")); + kernel.Config.AddOpenAITextCompletionService("text-davinci-003", "text-davinci-003", Env.Var("OPENAI_API_KEY")); // Load native skill into the kernel skill collection, sharing its functions with prompt templates // Functions loaded here are available as "time.*" diff --git a/samples/dotnet/kernel-syntax-examples/Example08_RetryHandler.cs b/samples/dotnet/kernel-syntax-examples/Example08_RetryHandler.cs index 3d59d2092233..28aca7c38a4a 100644 --- a/samples/dotnet/kernel-syntax-examples/Example08_RetryHandler.cs +++ b/samples/dotnet/kernel-syntax-examples/Example08_RetryHandler.cs @@ -1,10 +1,10 @@ // Copyright (c) Microsoft. All rights reserved. using System; +using System.Net; using System.Threading.Tasks; using Microsoft.Extensions.Logging; using Microsoft.SemanticKernel; -using Microsoft.SemanticKernel.Configuration; using Microsoft.SemanticKernel.CoreSkills; using Microsoft.SemanticKernel.KernelExtensions; using Microsoft.SemanticKernel.Reliability; @@ -45,10 +45,10 @@ private static async Task RunRetryHandlerConfigAsync(HttpRetryConfig? config = n // Add 401 to the list of retryable status codes // Typically 401 would not be something we retry but for demonstration // purposes we are doing so as it's easy to trigger when using an invalid key. - kernelBuilder = kernelBuilder.Configure(c => c.DefaultHttpRetryConfig.RetryableStatusCodes.Add(System.Net.HttpStatusCode.Unauthorized)); + kernelBuilder = kernelBuilder.Configure(c => c.DefaultHttpRetryConfig.RetryableStatusCodes.Add(HttpStatusCode.Unauthorized)); // OpenAI settings - you can set the OPENAI_API_KEY to an invalid value to see the retry policy in play - kernelBuilder = kernelBuilder.Configure(c => c.AddOpenAITextCompletion("text-davinci-003", "text-davinci-003", "BAD_KEY")); + kernelBuilder = kernelBuilder.Configure(c => c.AddOpenAITextCompletionService("text-davinci-003", "text-davinci-003", "BAD_KEY")); var kernel = kernelBuilder.Build(); @@ -59,7 +59,7 @@ private static IKernel InitializeKernel() { var kernel = Kernel.Builder.WithLogger(InfoLogger.Log).Build(); // OpenAI settings - you can set the OPENAI_API_KEY to an invalid value to see the retry policy in play - kernel.Config.AddOpenAITextCompletion("text-davinci-003", "text-davinci-003", "BAD_KEY"); + kernel.Config.AddOpenAITextCompletionService("text-davinci-003", "text-davinci-003", "BAD_KEY"); return kernel; } @@ -76,7 +76,7 @@ private static async Task RunRetryPolicyBuilderAsync(Type retryHandlerFactoryTyp .WithRetryHandlerFactory((Activator.CreateInstance(retryHandlerFactoryType) as IDelegatingHandlerFactory)!); // OpenAI settings - you can set the OPENAI_API_KEY to an invalid value to see the retry policy in play - kernelBuilder = kernelBuilder.Configure(c => c.AddOpenAITextCompletion("text-davinci-003", "text-davinci-003", "BAD_KEY")); + kernelBuilder = kernelBuilder.Configure(c => c.AddOpenAITextCompletionService("text-davinci-003", "text-davinci-003", "BAD_KEY")); var kernel = kernelBuilder.Build(); diff --git a/samples/dotnet/kernel-syntax-examples/Example09_FunctionTypes.cs b/samples/dotnet/kernel-syntax-examples/Example09_FunctionTypes.cs index 01630ca1c5d5..7b64adbbf4ae 100644 --- a/samples/dotnet/kernel-syntax-examples/Example09_FunctionTypes.cs +++ b/samples/dotnet/kernel-syntax-examples/Example09_FunctionTypes.cs @@ -5,7 +5,6 @@ using System; using System.Threading.Tasks; using Microsoft.SemanticKernel; -using Microsoft.SemanticKernel.Configuration; using Microsoft.SemanticKernel.KernelExtensions; using Microsoft.SemanticKernel.Memory; using Microsoft.SemanticKernel.Orchestration; @@ -22,7 +21,7 @@ public static async Task RunAsync() var fakeContext = new SKContext(new ContextVariables(), NullMemory.Instance, null, ConsoleLogger.Log); var kernel = Kernel.Builder.WithLogger(ConsoleLogger.Log).Build(); - kernel.Config.AddOpenAITextCompletion("text-davinci-003", "text-davinci-003", Env.Var("OPENAI_API_KEY")); + kernel.Config.AddOpenAITextCompletionService("text-davinci-003", "text-davinci-003", Env.Var("OPENAI_API_KEY")); // Load native skill into the kernel skill collection, sharing its functions with prompt templates var test = kernel.ImportSkill(new LocalExampleSkill(), "test"); diff --git a/samples/dotnet/kernel-syntax-examples/Example10_DescribeAllSkillsAndFunctions.cs b/samples/dotnet/kernel-syntax-examples/Example10_DescribeAllSkillsAndFunctions.cs index 02d960b95617..de1f8016e3be 100644 --- a/samples/dotnet/kernel-syntax-examples/Example10_DescribeAllSkillsAndFunctions.cs +++ b/samples/dotnet/kernel-syntax-examples/Example10_DescribeAllSkillsAndFunctions.cs @@ -4,7 +4,6 @@ using System.Collections.Concurrent; using System.Collections.Generic; using Microsoft.SemanticKernel; -using Microsoft.SemanticKernel.Configuration; using Microsoft.SemanticKernel.KernelExtensions; using Microsoft.SemanticKernel.SkillDefinition; using RepoUtils; @@ -23,7 +22,7 @@ public static void Run() Console.WriteLine("======== Describe all skills and functions ========"); var kernel = KernelBuilder.Create(); - kernel.Config.AddOpenAITextCompletion("davinci", "text-davinci-003", "none"); + kernel.Config.AddOpenAITextCompletionService("davinci", "text-davinci-003", "none"); // Import a native skill var skill1 = new StaticTextSkill(); diff --git a/samples/dotnet/kernel-syntax-examples/Example12_Planning.cs b/samples/dotnet/kernel-syntax-examples/Example12_Planning.cs index b5bb0abf896a..0fdc03c2bc3d 100644 --- a/samples/dotnet/kernel-syntax-examples/Example12_Planning.cs +++ b/samples/dotnet/kernel-syntax-examples/Example12_Planning.cs @@ -5,14 +5,13 @@ using System.Diagnostics; using System.Threading.Tasks; using Microsoft.SemanticKernel; -using Microsoft.SemanticKernel.Configuration; using Microsoft.SemanticKernel.CoreSkills; using Microsoft.SemanticKernel.KernelExtensions; using Microsoft.SemanticKernel.Memory; using Microsoft.SemanticKernel.Orchestration; -using Microsoft.SemanticKernel.Orchestration.Extensions; using RepoUtils; using Skills; +using TextSkill = Skills.TextSkill; // ReSharper disable once InconsistentNaming @@ -132,14 +131,14 @@ private static async Task MemorySampleAsync() .Configure( config => { - config.AddAzureOpenAITextCompletion( - Env.Var("AZURE_OPENAI_DEPLOYMENT_LABEL"), + config.AddAzureOpenAITextCompletionService( + Env.Var("AZURE_OPENAI_SERVICE_ID"), Env.Var("AZURE_OPENAI_DEPLOYMENT_NAME"), Env.Var("AZURE_OPENAI_ENDPOINT"), Env.Var("AZURE_OPENAI_KEY")); - config.AddAzureOpenAIEmbeddingGeneration( - Env.Var("AZURE_OPENAI_EMBEDDINGS_DEPLOYMENT_LABEL"), + config.AddAzureOpenAIEmbeddingGenerationService( + Env.Var("AZURE_OPENAI_EMBEDDINGS_SERVICE_ID"), Env.Var("AZURE_OPENAI_EMBEDDINGS_DEPLOYMENT_NAME"), Env.Var("AZURE_OPENAI_EMBEDDINGS_ENDPOINT"), Env.Var("AZURE_OPENAI_EMBEDDINGS_KEY")); @@ -165,7 +164,7 @@ private static async Task MemorySampleAsync() kernel.ImportSkill(new EmailSkill(), "email"); kernel.ImportSkill(new StaticTextSkill(), "statictext"); - kernel.ImportSkill(new Skills.TextSkill(), "text"); + kernel.ImportSkill(new TextSkill(), "text"); kernel.ImportSkill(new Microsoft.SemanticKernel.CoreSkills.TextSkill(), "coretext"); var context = new ContextVariables("Create a book with 3 chapters about a group of kids in a club called 'The Thinking Caps.'"); @@ -180,8 +179,8 @@ private static async Task MemorySampleAsync() private static IKernel InitializeKernelAndPlanner(out IDictionary planner) { var kernel = new KernelBuilder().WithLogger(ConsoleLogger.Log).Build(); - kernel.Config.AddAzureOpenAITextCompletion( - Env.Var("AZURE_OPENAI_DEPLOYMENT_LABEL"), + kernel.Config.AddAzureOpenAITextCompletionService( + Env.Var("AZURE_OPENAI_SERVICE_ID"), Env.Var("AZURE_OPENAI_DEPLOYMENT_NAME"), Env.Var("AZURE_OPENAI_ENDPOINT"), Env.Var("AZURE_OPENAI_KEY")); diff --git a/samples/dotnet/kernel-syntax-examples/Example13_ConversationSummarySkill.cs b/samples/dotnet/kernel-syntax-examples/Example13_ConversationSummarySkill.cs index 413c9b86316f..7d6b022b5572 100644 --- a/samples/dotnet/kernel-syntax-examples/Example13_ConversationSummarySkill.cs +++ b/samples/dotnet/kernel-syntax-examples/Example13_ConversationSummarySkill.cs @@ -4,7 +4,6 @@ using System.Collections.Generic; using System.Threading.Tasks; using Microsoft.SemanticKernel; -using Microsoft.SemanticKernel.Configuration; using Microsoft.SemanticKernel.CoreSkills; using Microsoft.SemanticKernel.Orchestration; using RepoUtils; @@ -179,8 +178,8 @@ private static async Task GetConversationTopicsAsync() private static IKernel InitializeKernel() { IKernel kernel = Kernel.Builder.WithLogger(ConsoleLogger.Log).Build(); - kernel.Config.AddAzureOpenAITextCompletion( - Env.Var("AZURE_OPENAI_DEPLOYMENT_LABEL"), + kernel.Config.AddAzureOpenAITextCompletionService( + Env.Var("AZURE_OPENAI_SERVICE_ID"), Env.Var("AZURE_OPENAI_DEPLOYMENT_NAME"), Env.Var("AZURE_OPENAI_ENDPOINT"), Env.Var("AZURE_OPENAI_KEY")); diff --git a/samples/dotnet/kernel-syntax-examples/Example14_Memory.cs b/samples/dotnet/kernel-syntax-examples/Example14_Memory.cs index 16f77783fdaf..4df195b41ccc 100644 --- a/samples/dotnet/kernel-syntax-examples/Example14_Memory.cs +++ b/samples/dotnet/kernel-syntax-examples/Example14_Memory.cs @@ -4,7 +4,6 @@ using System.Collections.Generic; using System.Threading.Tasks; using Microsoft.SemanticKernel; -using Microsoft.SemanticKernel.Configuration; using Microsoft.SemanticKernel.Memory; using RepoUtils; @@ -35,7 +34,7 @@ public static async Task RunAsync() var kernel = Kernel.Builder .WithLogger(ConsoleLogger.Log) - .Configure(c => c.AddOpenAIEmbeddingGeneration("ada", "text-embedding-ada-002", Env.Var("OPENAI_API_KEY"))) + .Configure(c => c.AddOpenAIEmbeddingGenerationService("ada", "text-embedding-ada-002", Env.Var("OPENAI_API_KEY"))) .WithMemoryStorage(new VolatileMemoryStore()) .Build(); diff --git a/samples/dotnet/kernel-syntax-examples/Example15_MemorySkill.cs b/samples/dotnet/kernel-syntax-examples/Example15_MemorySkill.cs index 59f2687863b6..e12b520c8154 100644 --- a/samples/dotnet/kernel-syntax-examples/Example15_MemorySkill.cs +++ b/samples/dotnet/kernel-syntax-examples/Example15_MemorySkill.cs @@ -3,9 +3,7 @@ using System; using System.Threading.Tasks; using Microsoft.SemanticKernel; -using Microsoft.SemanticKernel.Configuration; using Microsoft.SemanticKernel.CoreSkills; -using Microsoft.SemanticKernel.KernelExtensions; using Microsoft.SemanticKernel.Memory; using RepoUtils; @@ -20,8 +18,8 @@ public static async Task RunAsync() .WithLogger(ConsoleLogger.Log) .Configure(c => { - c.AddOpenAITextCompletion("davinci", "text-davinci-003", Env.Var("OPENAI_API_KEY")); - c.AddOpenAIEmbeddingGeneration("ada", "text-embedding-ada-002", Env.Var("OPENAI_API_KEY")); + c.AddOpenAITextCompletionService("davinci", "text-davinci-003", Env.Var("OPENAI_API_KEY")); + c.AddOpenAIEmbeddingGenerationService("ada", "text-embedding-ada-002", Env.Var("OPENAI_API_KEY")); }) .WithMemoryStorage(new VolatileMemoryStore()) .Build(); diff --git a/samples/dotnet/kernel-syntax-examples/Example16_CustomLLM.cs b/samples/dotnet/kernel-syntax-examples/Example16_CustomLLM.cs index c542bddc584e..eb3f8d77649c 100644 --- a/samples/dotnet/kernel-syntax-examples/Example16_CustomLLM.cs +++ b/samples/dotnet/kernel-syntax-examples/Example16_CustomLLM.cs @@ -5,7 +5,6 @@ using System.Threading.Tasks; using Microsoft.SemanticKernel; using Microsoft.SemanticKernel.AI.TextCompletion; -using Microsoft.SemanticKernel.KernelExtensions; using RepoUtils; /** @@ -16,7 +15,7 @@ * - You are using OpenAI/Azure OpenAI models but the models are behind a web service with a different API schema * - You want to use a local model */ -public class MyBackend : ITextCompletion +public class MyTextCompletionService : ITextCompletion { public async Task CompleteAsync( string text, @@ -42,10 +41,10 @@ public static async Task RunAsync() IKernel kernel = new KernelBuilder().WithLogger(ConsoleLogger.Log).Build(); - ITextCompletion Factory(IKernel k) => new MyBackend(); + ITextCompletion Factory(IKernel k) => new MyTextCompletionService(); - // Add your text completion backend - kernel.Config.AddTextCompletion("myBackend", Factory); + // Add your text completion service + kernel.Config.AddTextCompletionService("myService", Factory); const string FUNCTION_DEFINITION = "Does the text contain grammar errors (Y/N)? Text: {{$input}}"; diff --git a/samples/dotnet/kernel-syntax-examples/Example17_ChatGPT.cs b/samples/dotnet/kernel-syntax-examples/Example17_ChatGPT.cs index da352c27db81..d25cbaf1eab0 100644 --- a/samples/dotnet/kernel-syntax-examples/Example17_ChatGPT.cs +++ b/samples/dotnet/kernel-syntax-examples/Example17_ChatGPT.cs @@ -4,7 +4,7 @@ using System.Threading.Tasks; using Microsoft.SemanticKernel; using Microsoft.SemanticKernel.AI.ChatCompletion; -using Microsoft.SemanticKernel.Configuration; +using Microsoft.SemanticKernel.Connectors.OpenAI.ChatCompletion; using RepoUtils; /** @@ -21,24 +21,24 @@ public static async Task RunAsync() IKernel kernel = new KernelBuilder().WithLogger(ConsoleLogger.Log).Build(); - // Add your chat completion backend - kernel.Config.AddOpenAIChatCompletion("chat", "gpt-3.5-turbo", Env.Var("OPENAI_API_KEY")); + // Add your chat completion service + kernel.Config.AddOpenAIChatCompletionService("chat", "gpt-3.5-turbo", Env.Var("OPENAI_API_KEY")); - IChatCompletion backend = kernel.GetService(); - var chat = (OpenAIChatHistory)backend.CreateNewChat("You are a librarian, expert about books"); + IChatCompletion chatGPT = kernel.GetService(); + var chat = (OpenAIChatHistory)chatGPT.CreateNewChat("You are a librarian, expert about books"); // First user message chat.AddUserMessage("Hi, I'm looking for book suggestions"); // First bot message - string reply = await backend.GenerateMessageAsync(chat, new ChatRequestSettings()); + string reply = await chatGPT.GenerateMessageAsync(chat, new ChatRequestSettings()); chat.AddAssistantMessage(reply); // Second user message chat.AddUserMessage("I love history and philosophy, I'd like to learn something new about Greece, any suggestion?"); // Second bot message - reply = await backend.GenerateMessageAsync(chat, new ChatRequestSettings()); + reply = await chatGPT.GenerateMessageAsync(chat, new ChatRequestSettings()); chat.AddAssistantMessage(reply); Console.WriteLine("Chat content:"); diff --git a/samples/dotnet/kernel-syntax-examples/Example18_DallE.cs b/samples/dotnet/kernel-syntax-examples/Example18_DallE.cs index e116e5a7df66..10d27da92571 100644 --- a/samples/dotnet/kernel-syntax-examples/Example18_DallE.cs +++ b/samples/dotnet/kernel-syntax-examples/Example18_DallE.cs @@ -5,7 +5,7 @@ using Microsoft.SemanticKernel; using Microsoft.SemanticKernel.AI.ChatCompletion; using Microsoft.SemanticKernel.AI.ImageGeneration; -using Microsoft.SemanticKernel.Configuration; +using Microsoft.SemanticKernel.Connectors.OpenAI.ChatCompletion; using RepoUtils; /** @@ -21,8 +21,8 @@ public static async Task RunAsync() IKernel kernel = new KernelBuilder().WithLogger(ConsoleLogger.Log).Build(); - // Add your image generation backend - kernel.Config.AddOpenAIImageGeneration("dallE", Env.Var("OPENAI_API_KEY")); + // Add your image generation service + kernel.Config.AddOpenAIImageGenerationService("dallE", Env.Var("OPENAI_API_KEY")); IImageGeneration dallE = kernel.GetService(); @@ -41,8 +41,8 @@ A cute baby sea otter Console.WriteLine("======== Chat with images ========"); - // Add your chat completion backend - kernel.Config.AddOpenAIChatCompletion("chat", "gpt-3.5-turbo", Env.Var("OPENAI_API_KEY")); + // Add your chat completion service + kernel.Config.AddOpenAIChatCompletionService("chat", "gpt-3.5-turbo", Env.Var("OPENAI_API_KEY")); IChatCompletion chatGPT = kernel.GetService(); var chat = (OpenAIChatHistory)chatGPT.CreateNewChat( diff --git a/samples/dotnet/kernel-syntax-examples/Example19_Qdrant.cs b/samples/dotnet/kernel-syntax-examples/Example19_Qdrant.cs index 816878d630e0..9daf1178b4e3 100644 --- a/samples/dotnet/kernel-syntax-examples/Example19_Qdrant.cs +++ b/samples/dotnet/kernel-syntax-examples/Example19_Qdrant.cs @@ -4,7 +4,6 @@ using System.Globalization; using System.Threading.Tasks; using Microsoft.SemanticKernel; -using Microsoft.SemanticKernel.Configuration; using Microsoft.SemanticKernel.Memory; using Microsoft.SemanticKernel.Skills.Memory.Qdrant; using RepoUtils; @@ -22,8 +21,8 @@ public static async Task RunAsync() .WithLogger(ConsoleLogger.Log) .Configure(c => { - c.AddOpenAITextCompletion("davinci", "text-davinci-003", Env.Var("OPENAI_API_KEY")); - c.AddOpenAIEmbeddingGeneration("ada", "text-embedding-ada-002", Env.Var("OPENAI_API_KEY")); + c.AddOpenAITextCompletionService("davinci", "text-davinci-003", Env.Var("OPENAI_API_KEY")); + c.AddOpenAIEmbeddingGenerationService("ada", "text-embedding-ada-002", Env.Var("OPENAI_API_KEY")); }) .WithMemoryStorage(memoryStore) .Build(); diff --git a/samples/dotnet/kernel-syntax-examples/KernelSyntaxExamples.csproj b/samples/dotnet/kernel-syntax-examples/KernelSyntaxExamples.csproj index 25153d3eb308..387631dd3958 100644 --- a/samples/dotnet/kernel-syntax-examples/KernelSyntaxExamples.csproj +++ b/samples/dotnet/kernel-syntax-examples/KernelSyntaxExamples.csproj @@ -1,12 +1,10 @@  - $([System.IO.Path]::GetDirectoryName($([MSBuild]::GetPathOfFileAbove('.gitignore', '$(MSBuildThisFileDirectory)')))) 5ee045b0-aea3-4f08-8d31-32d1a6f8fed0 - net6.0 @@ -15,22 +13,18 @@ CA1050;CA1707 - - - - \ No newline at end of file diff --git a/samples/dotnet/kernel-syntax-examples/README.md b/samples/dotnet/kernel-syntax-examples/README.md index 804852f3e610..fac7debc0ee9 100644 --- a/samples/dotnet/kernel-syntax-examples/README.md +++ b/samples/dotnet/kernel-syntax-examples/README.md @@ -18,7 +18,7 @@ cd samples/dotnet/kernel-syntax-examples dotnet user-secrets set "BING_API_KEY" "..." dotnet user-secrets set "OPENAI_API_KEY" "..." -dotnet user-secrets set "AZURE_OPENAI_DEPLOYMENT_LABEL" "..." +dotnet user-secrets set "AZURE_OPENAI_SERVICE_ID" "..." dotnet user-secrets set "AZURE_OPENAI_DEPLOYMENT_NAME" "https://... .openai.azure.com/" dotnet user-secrets set "AZURE_OPENAI_ENDPOINT" "..." dotnet user-secrets set "AZURE_OPENAI_KEY" "..." @@ -30,7 +30,7 @@ To set your secrets with environment variables, use these names: * BING_API_KEY * OPENAI_API_KEY -* AZURE_OPENAI_DEPLOYMENT_LABEL +* AZURE_OPENAI_SERVICE_ID * AZURE_OPENAI_DEPLOYMENT_NAME * AZURE_OPENAI_ENDPOINT * AZURE_OPENAI_KEY diff --git a/samples/skills/CalendarSkill/AssistantShowCalendarEvents/config.json b/samples/skills/CalendarSkill/AssistantShowCalendarEvents/config.json index 33ce9d90845c..0ffaa4321766 100644 --- a/samples/skills/CalendarSkill/AssistantShowCalendarEvents/config.json +++ b/samples/skills/CalendarSkill/AssistantShowCalendarEvents/config.json @@ -11,8 +11,5 @@ "stop_sequences": [ "\n" ] - }, - "default_backends": [ - "text-davinci-003" - ] + } } \ No newline at end of file diff --git a/samples/skills/ChatSkill/ChatFilter/config.json b/samples/skills/ChatSkill/ChatFilter/config.json index 5ce40f1a4e61..427dcdf541e2 100644 --- a/samples/skills/ChatSkill/ChatFilter/config.json +++ b/samples/skills/ChatSkill/ChatFilter/config.json @@ -11,8 +11,5 @@ "stop_sequences": [ "" ] - }, - "default_backends": [ - "text-davinci-003" - ] + } } \ No newline at end of file diff --git a/samples/skills/ChatSkill/ChatUser/config.json b/samples/skills/ChatSkill/ChatUser/config.json index 7156a282036d..ce4451cd5a38 100644 --- a/samples/skills/ChatSkill/ChatUser/config.json +++ b/samples/skills/ChatSkill/ChatUser/config.json @@ -12,8 +12,5 @@ "Human:", "AI:" ] - }, - "default_backends": [ - "text-davinci-003" - ] + } } \ No newline at end of file diff --git a/samples/skills/ChatSkill/ChatV2/config.json b/samples/skills/ChatSkill/ChatV2/config.json index 2c24a91339f8..48cdf83fd754 100644 --- a/samples/skills/ChatSkill/ChatV2/config.json +++ b/samples/skills/ChatSkill/ChatV2/config.json @@ -11,8 +11,5 @@ "stop_sequences": [ "" ] - }, - "default_backends": [ - "text-davinci-003" - ] + } } \ No newline at end of file diff --git a/samples/skills/ClassificationSkill/Importance/config.json b/samples/skills/ClassificationSkill/Importance/config.json index 5b535f4a2740..2c58e16b1060 100644 --- a/samples/skills/ClassificationSkill/Importance/config.json +++ b/samples/skills/ClassificationSkill/Importance/config.json @@ -8,8 +8,5 @@ "top_p": 0.0, "presence_penalty": 0.0, "frequency_penalty": 0.0 - }, - "default_backends": [ - "text-davinci-002" - ] + } } \ No newline at end of file diff --git a/samples/skills/ClassificationSkill/Question/config.json b/samples/skills/ClassificationSkill/Question/config.json index d482cd990eb5..820c261c489a 100644 --- a/samples/skills/ClassificationSkill/Question/config.json +++ b/samples/skills/ClassificationSkill/Question/config.json @@ -8,8 +8,5 @@ "top_p": 0.0, "presence_penalty": 0.0, "frequency_penalty": 0.0 - }, - "default_backends": [ - "text-davinci-002" - ] + } } \ No newline at end of file diff --git a/samples/skills/CodingSkill/Code/config.json b/samples/skills/CodingSkill/Code/config.json index 1b17a92a10df..d6d79f17548d 100644 --- a/samples/skills/CodingSkill/Code/config.json +++ b/samples/skills/CodingSkill/Code/config.json @@ -8,8 +8,5 @@ "top_p": 0.0, "presence_penalty": 0.0, "frequency_penalty": 0.0 - }, - "default_backends": [ - "code-davinci-002" - ] + } } \ No newline at end of file diff --git a/samples/skills/CodingSkill/CommandLinePython/config.json b/samples/skills/CodingSkill/CommandLinePython/config.json index f274b5d50737..b2dc899bf4c4 100644 --- a/samples/skills/CodingSkill/CommandLinePython/config.json +++ b/samples/skills/CodingSkill/CommandLinePython/config.json @@ -11,8 +11,5 @@ "stop_sequences": [ "# Done" ] - }, - "default_backends": [ - "code-davinci-002" - ] + } } \ No newline at end of file diff --git a/samples/skills/CodingSkill/DOSScript/config.json b/samples/skills/CodingSkill/DOSScript/config.json index e08c3a38825a..6d26f67d03fc 100644 --- a/samples/skills/CodingSkill/DOSScript/config.json +++ b/samples/skills/CodingSkill/DOSScript/config.json @@ -13,8 +13,5 @@ "exit /b 1", "exit /b 0" ] - }, - "default_backends": [ - "text-davinci-003" - ] + } } \ No newline at end of file diff --git a/samples/skills/CodingSkill/EmailSearch/config.json b/samples/skills/CodingSkill/EmailSearch/config.json index 4a89e0be5058..e645b479b9cb 100644 --- a/samples/skills/CodingSkill/EmailSearch/config.json +++ b/samples/skills/CodingSkill/EmailSearch/config.json @@ -11,8 +11,5 @@ "stop_sequences": [ "[done]" ] - }, - "default_backends": [ - "text-davinci-003" - ] + } } \ No newline at end of file diff --git a/samples/skills/CodingSkill/Entity/config.json b/samples/skills/CodingSkill/Entity/config.json index 44e593592451..0fbb5aa0e8e2 100644 --- a/samples/skills/CodingSkill/Entity/config.json +++ b/samples/skills/CodingSkill/Entity/config.json @@ -11,8 +11,5 @@ "stop_sequences": [ "[done]" ] - }, - "default_backends": [ - "text-davinci-003" - ] + } } \ No newline at end of file diff --git a/samples/skills/FunSkill/Limerick/config.json b/samples/skills/FunSkill/Limerick/config.json index 9aed0a03e40e..59c9f3ffbcdc 100644 --- a/samples/skills/FunSkill/Limerick/config.json +++ b/samples/skills/FunSkill/Limerick/config.json @@ -8,8 +8,5 @@ "top_p": 0.0, "presence_penalty": 0.0, "frequency_penalty": 0.0 - }, - "default_backends": [ - "text-davinci-002" - ] + } } \ No newline at end of file diff --git a/samples/skills/IntentDetectionSkill/AssistantIntent/config.json b/samples/skills/IntentDetectionSkill/AssistantIntent/config.json index 845670f9d036..37dc950d0a8e 100644 --- a/samples/skills/IntentDetectionSkill/AssistantIntent/config.json +++ b/samples/skills/IntentDetectionSkill/AssistantIntent/config.json @@ -8,8 +8,5 @@ "top_p": 1.0, "presence_penalty": 0.0, "frequency_penalty": 0.0 - }, - "default_backends": [ - "text-davinci-003" - ] + } } \ No newline at end of file diff --git a/samples/skills/MiscSkill/Continue/config.json b/samples/skills/MiscSkill/Continue/config.json index 34e71d5b4c75..1b896de87b05 100644 --- a/samples/skills/MiscSkill/Continue/config.json +++ b/samples/skills/MiscSkill/Continue/config.json @@ -8,8 +8,5 @@ "top_p": 0.5, "presence_penalty": 0.0, "frequency_penalty": 0.0 - }, - "default_backends": [ - "text-davinci-003" - ] + } } \ No newline at end of file diff --git a/samples/skills/QASkill/AssistantResults/config.json b/samples/skills/QASkill/AssistantResults/config.json index 0301b87f1e0e..de9577cb7e43 100644 --- a/samples/skills/QASkill/AssistantResults/config.json +++ b/samples/skills/QASkill/AssistantResults/config.json @@ -8,8 +8,5 @@ "top_p": 0.0, "presence_penalty": 0.0, "frequency_penalty": 0.0 - }, - "default_backends": [ - "text-davinci-003" - ] + } } \ No newline at end of file diff --git a/samples/skills/QASkill/ContextQuery/config.json b/samples/skills/QASkill/ContextQuery/config.json index 6a107c3a9b11..63d573b126c1 100644 --- a/samples/skills/QASkill/ContextQuery/config.json +++ b/samples/skills/QASkill/ContextQuery/config.json @@ -11,8 +11,5 @@ "stop_sequences": [ "[done]" ] - }, - "default_backends": [ - "text-davinci-003" - ] + } } \ No newline at end of file diff --git a/samples/skills/QASkill/Form/config.json b/samples/skills/QASkill/Form/config.json index f7b3f89b8c55..e2a672ec7f60 100644 --- a/samples/skills/QASkill/Form/config.json +++ b/samples/skills/QASkill/Form/config.json @@ -11,8 +11,5 @@ "stop_sequences": [ "[done]" ] - }, - "default_backends": [ - "text-davinci-003" - ] + } } \ No newline at end of file diff --git a/samples/skills/QASkill/QNA/config.json b/samples/skills/QASkill/QNA/config.json index 6ea9d508fe35..a345826cf504 100644 --- a/samples/skills/QASkill/QNA/config.json +++ b/samples/skills/QASkill/QNA/config.json @@ -8,8 +8,5 @@ "top_p": 0.0, "presence_penalty": 0.0, "frequency_penalty": 0.0 - }, - "default_backends": [ - "text-davinci-003" - ] + } } \ No newline at end of file diff --git a/samples/skills/SummarizeSkill/MakeAbstractReadable/config.json b/samples/skills/SummarizeSkill/MakeAbstractReadable/config.json index d7d85d06994c..0bd48b77a3e9 100644 --- a/samples/skills/SummarizeSkill/MakeAbstractReadable/config.json +++ b/samples/skills/SummarizeSkill/MakeAbstractReadable/config.json @@ -8,8 +8,5 @@ "top_p": 1.0, "presence_penalty": 0.0, "frequency_penalty": 2.0 - }, - "default_backends": [ - "text-davinci-003" - ] + } } \ No newline at end of file diff --git a/samples/skills/SummarizeSkill/Notegen/config.json b/samples/skills/SummarizeSkill/Notegen/config.json index 7ee7327d6bd1..f7e1c355e2ee 100644 --- a/samples/skills/SummarizeSkill/Notegen/config.json +++ b/samples/skills/SummarizeSkill/Notegen/config.json @@ -8,8 +8,5 @@ "top_p": 0.0, "presence_penalty": 0.0, "frequency_penalty": 0.0 - }, - "default_backends": [ - "text-davinci-002" - ] + } } \ No newline at end of file diff --git a/samples/skills/WriterSkill/Acronym/config.json b/samples/skills/WriterSkill/Acronym/config.json index 2298e33d1216..c484148560e2 100644 --- a/samples/skills/WriterSkill/Acronym/config.json +++ b/samples/skills/WriterSkill/Acronym/config.json @@ -8,8 +8,5 @@ "top_p": 0.0, "presence_penalty": 0.0, "frequency_penalty": 0.0 - }, - "default_backends": [ - "text-davinci-002" - ] + } } \ No newline at end of file diff --git a/samples/skills/WriterSkill/AcronymGenerator/config.json b/samples/skills/WriterSkill/AcronymGenerator/config.json index 367bd8b06701..1dab1fe9f706 100644 --- a/samples/skills/WriterSkill/AcronymGenerator/config.json +++ b/samples/skills/WriterSkill/AcronymGenerator/config.json @@ -11,8 +11,5 @@ "stop_sequences": [ "#" ] - }, - "default_backends": [ - "text-davinci-003" - ] + } } \ No newline at end of file diff --git a/samples/skills/WriterSkill/AcronymReverse/config.json b/samples/skills/WriterSkill/AcronymReverse/config.json index c145a4650510..eed5c51917ef 100644 --- a/samples/skills/WriterSkill/AcronymReverse/config.json +++ b/samples/skills/WriterSkill/AcronymReverse/config.json @@ -11,8 +11,5 @@ "stop_sequences": [ "#END#" ] - }, - "default_backends": [ - "text-davinci-003" - ] + } } \ No newline at end of file diff --git a/samples/skills/WriterSkill/Brainstorm/config.json b/samples/skills/WriterSkill/Brainstorm/config.json index e7a7274a4196..f50a354e7af8 100644 --- a/samples/skills/WriterSkill/Brainstorm/config.json +++ b/samples/skills/WriterSkill/Brainstorm/config.json @@ -18,6 +18,5 @@ "defaultValue": "" } ] - }, - "default_backends": ["text-davinci-003"] + } } diff --git a/samples/skills/WriterSkill/EmailGen/config.json b/samples/skills/WriterSkill/EmailGen/config.json index 0c96b15ef5f9..d43eab348e80 100644 --- a/samples/skills/WriterSkill/EmailGen/config.json +++ b/samples/skills/WriterSkill/EmailGen/config.json @@ -8,8 +8,5 @@ "top_p": 0.0, "presence_penalty": 0.0, "frequency_penalty": 0.0 - }, - "default_backends": [ - "text-davinci-002" - ] + } } \ No newline at end of file diff --git a/samples/skills/WriterSkill/EmailTo/config.json b/samples/skills/WriterSkill/EmailTo/config.json index d82a5ea490e6..5f0d6ee6e45d 100644 --- a/samples/skills/WriterSkill/EmailTo/config.json +++ b/samples/skills/WriterSkill/EmailTo/config.json @@ -8,8 +8,5 @@ "top_p": 0.0, "presence_penalty": 0.0, "frequency_penalty": 0.0 - }, - "default_backends": [ - "text-davinci-002" - ] + } } \ No newline at end of file diff --git a/samples/skills/WriterSkill/NovelChapter/config.json b/samples/skills/WriterSkill/NovelChapter/config.json index ba9f85124942..3568c69557c9 100644 --- a/samples/skills/WriterSkill/NovelChapter/config.json +++ b/samples/skills/WriterSkill/NovelChapter/config.json @@ -32,6 +32,5 @@ "defaultValue": "" } ] - }, - "default_backends": ["text-davinci-003"] + } } diff --git a/samples/skills/WriterSkill/NovelChapterWithNotes/config.json b/samples/skills/WriterSkill/NovelChapterWithNotes/config.json index 1c907abbafac..02b9e613a6d4 100644 --- a/samples/skills/WriterSkill/NovelChapterWithNotes/config.json +++ b/samples/skills/WriterSkill/NovelChapterWithNotes/config.json @@ -37,6 +37,5 @@ "defaultValue": "" } ] - }, - "default_backends": ["text-davinci-003"] + } } diff --git a/samples/skills/WriterSkill/NovelOutline/config.json b/samples/skills/WriterSkill/NovelOutline/config.json index b140987ac812..a34622f7be03 100644 --- a/samples/skills/WriterSkill/NovelOutline/config.json +++ b/samples/skills/WriterSkill/NovelOutline/config.json @@ -27,6 +27,5 @@ "defaultValue": "" } ] - }, - "default_backends": ["text-davinci-003"] + } } diff --git a/samples/skills/WriterSkill/ShortPoem/config.json b/samples/skills/WriterSkill/ShortPoem/config.json index ccee009a140a..5bb2af1a151d 100644 --- a/samples/skills/WriterSkill/ShortPoem/config.json +++ b/samples/skills/WriterSkill/ShortPoem/config.json @@ -8,8 +8,5 @@ "top_p": 0.0, "presence_penalty": 0.0, "frequency_penalty": 0.0 - }, - "default_backends": [ - "text-davinci-002" - ] + } } \ No newline at end of file diff --git a/samples/skills/WriterSkill/Translate/config.json b/samples/skills/WriterSkill/Translate/config.json index fc8e3fb0cd9d..f0e7642ba3e2 100644 --- a/samples/skills/WriterSkill/Translate/config.json +++ b/samples/skills/WriterSkill/Translate/config.json @@ -11,8 +11,5 @@ "stop_sequences": [ "[done]" ] - }, - "default_backends": [ - "text-davinci-002" - ] + } } \ No newline at end of file diff --git a/samples/skills/WriterSkill/TranslateV2/config.json b/samples/skills/WriterSkill/TranslateV2/config.json index 8954d81b2016..a30e95c96c86 100644 --- a/samples/skills/WriterSkill/TranslateV2/config.json +++ b/samples/skills/WriterSkill/TranslateV2/config.json @@ -8,8 +8,5 @@ "top_p": 0.0, "presence_penalty": 0.0, "frequency_penalty": 0.0 - }, - "default_backends": [ - "text-davinci-003" - ] + } } \ No newline at end of file