diff --git a/java/api-test/api-usage-example/src/main/java/InlineFunctionExample.java b/java/api-test/api-usage-example/src/main/java/InlineFunctionExample.java index 5c83485d09df5..b084510a9687b 100644 --- a/java/api-test/api-usage-example/src/main/java/InlineFunctionExample.java +++ b/java/api-test/api-usage-example/src/main/java/InlineFunctionExample.java @@ -107,7 +107,7 @@ public static void main(String[] args) { .addTextCompletionService(MODEL, kernel -> textCompletion) .build(); - Kernel kernel = SKBuilders.kernel().setKernelConfig(kernelConfig).build(); + Kernel kernel = SKBuilders.kernel().withKernelConfig(kernelConfig).build(); CompletionSKFunction summarize = kernel.getSemanticFunctionBuilder() diff --git a/java/api-test/api-usage-example/src/main/java/InlineFunctionWithPreBuiltSkillExample.java b/java/api-test/api-usage-example/src/main/java/InlineFunctionWithPreBuiltSkillExample.java index bdf02ae5fe663..4ba4656fff466 100644 --- a/java/api-test/api-usage-example/src/main/java/InlineFunctionWithPreBuiltSkillExample.java +++ b/java/api-test/api-usage-example/src/main/java/InlineFunctionWithPreBuiltSkillExample.java @@ -108,7 +108,7 @@ public static void main(String[] args) { .addTextCompletionService(MODEL, kernel -> textCompletion) .build(); - Kernel kernel = SKBuilders.kernel().setKernelConfig(kernelConfig).build(); + Kernel kernel = SKBuilders.kernel().withKernelConfig(kernelConfig).build(); CompletionSKFunction summarize = SKBuilders.completionFunctions(kernel) diff --git a/java/api-test/integration-tests/src/test/java/com/microsoft/semantickernel/e2e/AbstractKernelTest.java b/java/api-test/integration-tests/src/test/java/com/microsoft/semantickernel/e2e/AbstractKernelTest.java index 2fd4b1dbb7ce8..7c3ae929f4962 100644 --- a/java/api-test/integration-tests/src/test/java/com/microsoft/semantickernel/e2e/AbstractKernelTest.java +++ b/java/api-test/integration-tests/src/test/java/com/microsoft/semantickernel/e2e/AbstractKernelTest.java @@ -41,7 +41,7 @@ public static Kernel buildTextCompletionKernel() throws IOException { .build(); return SKBuilders.kernel() - .setKernelConfig(kernelConfig) + .withKernelConfig(kernelConfig) .withMemoryStore(new VolatileMemoryStore()) .build(); } diff --git a/java/api-test/integration-tests/src/test/java/com/microsoft/semantickernel/e2e/KernelTest.java b/java/api-test/integration-tests/src/test/java/com/microsoft/semantickernel/e2e/KernelTest.java index e7524e8e5d7e3..4e35bd5fb8ca0 100644 --- a/java/api-test/integration-tests/src/test/java/com/microsoft/semantickernel/e2e/KernelTest.java +++ b/java/api-test/integration-tests/src/test/java/com/microsoft/semantickernel/e2e/KernelTest.java @@ -57,7 +57,7 @@ public static Kernel buildKernel(OpenAIAsyncClient client, String model) { .addTextCompletionService(model, kernel -> textCompletion) .build(); - return SKBuilders.kernel().setKernelConfig(kernelConfig).build(); + return SKBuilders.kernel().withKernelConfig(kernelConfig).build(); } @Test diff --git a/java/samples/sample-code/src/main/java/com/microsoft/semantickernel/Example00_GettingStarted.java b/java/samples/sample-code/src/main/java/com/microsoft/semantickernel/Example00_GettingStarted.java index 641d30367374d..55d6e7e8a78c8 100644 --- a/java/samples/sample-code/src/main/java/com/microsoft/semantickernel/Example00_GettingStarted.java +++ b/java/samples/sample-code/src/main/java/com/microsoft/semantickernel/Example00_GettingStarted.java @@ -36,7 +36,7 @@ public static Kernel getKernel(OpenAIAsyncClient client) { .build(); Kernel kernel = SKBuilders.kernel() - .setKernelConfig(config) + .withKernelConfig(config) .build(); return kernel; diff --git a/java/samples/sample-code/src/main/java/com/microsoft/semantickernel/Example06_MemoryAndEmbeddings.java b/java/samples/sample-code/src/main/java/com/microsoft/semantickernel/Example06_MemoryAndEmbeddings.java index 052191e79d840..d6db2b7a1b3cf 100644 --- a/java/samples/sample-code/src/main/java/com/microsoft/semantickernel/Example06_MemoryAndEmbeddings.java +++ b/java/samples/sample-code/src/main/java/com/microsoft/semantickernel/Example06_MemoryAndEmbeddings.java @@ -16,7 +16,7 @@ public static Kernel getKernel(OpenAIAsyncClient client) { // TODO: Add Volatile memory Kernel kernel = SKBuilders.kernel() - .setKernelConfig(config) + .withKernelConfig(config) .build(); return kernel; diff --git a/java/samples/sample-code/src/main/java/com/microsoft/semantickernel/syntaxexamples/Example02_Pipeline.java b/java/samples/sample-code/src/main/java/com/microsoft/semantickernel/syntaxexamples/Example02_Pipeline.java index 6996c0ed7c573..1969c1e10f077 100644 --- a/java/samples/sample-code/src/main/java/com/microsoft/semantickernel/syntaxexamples/Example02_Pipeline.java +++ b/java/samples/sample-code/src/main/java/com/microsoft/semantickernel/syntaxexamples/Example02_Pipeline.java @@ -11,7 +11,7 @@ public class Example02_Pipeline { public static void main(String[] args) { KernelConfig kernelConfig = SKBuilders.kernelConfig().build(); - Kernel kernel = SKBuilders.kernel().setKernelConfig(kernelConfig).build(); + Kernel kernel = SKBuilders.kernel().withKernelConfig(kernelConfig).build(); // Load native skill ReadOnlyFunctionCollection text = kernel.importSkill(new TextSkill(), null); diff --git a/java/samples/sample-code/src/main/java/com/microsoft/semantickernel/syntaxexamples/Example03_Variables.java b/java/samples/sample-code/src/main/java/com/microsoft/semantickernel/syntaxexamples/Example03_Variables.java index ba12ef73a3e10..54348081066d5 100644 --- a/java/samples/sample-code/src/main/java/com/microsoft/semantickernel/syntaxexamples/Example03_Variables.java +++ b/java/samples/sample-code/src/main/java/com/microsoft/semantickernel/syntaxexamples/Example03_Variables.java @@ -37,7 +37,7 @@ public Mono appendDay( public static void main(String[] args) { KernelConfig kernelConfig = SKBuilders.kernelConfig().build(); - Kernel kernel = SKBuilders.kernel().setKernelConfig(kernelConfig).build(); + Kernel kernel = SKBuilders.kernel().withKernelConfig(kernelConfig).build(); // Load native skill ReadOnlyFunctionCollection functionCollection = diff --git a/java/samples/sample-code/src/main/java/com/microsoft/semantickernel/syntaxexamples/Example04_CombineLLMPromptsAndNativeCode.java b/java/samples/sample-code/src/main/java/com/microsoft/semantickernel/syntaxexamples/Example04_CombineLLMPromptsAndNativeCode.java index 6e37a0bcb8934..f3a46bdb0cdbf 100644 --- a/java/samples/sample-code/src/main/java/com/microsoft/semantickernel/syntaxexamples/Example04_CombineLLMPromptsAndNativeCode.java +++ b/java/samples/sample-code/src/main/java/com/microsoft/semantickernel/syntaxexamples/Example04_CombineLLMPromptsAndNativeCode.java @@ -36,7 +36,7 @@ public static void main(String[] args) throws IOException { .addTextCompletionService("text-davinci-003", kernel -> textCompletion) .build(); - Kernel kernel = SKBuilders.kernel().setKernelConfig(kernelConfig).build(); + Kernel kernel = SKBuilders.kernel().withKernelConfig(kernelConfig).build(); kernel.importSkill(new SearchEngineSkill(), null); kernel.importSkillFromDirectory("SummarizeSkill", "./samples/skills", "SummarizeSkill"); diff --git a/java/samples/sample-code/src/main/java/com/microsoft/semantickernel/syntaxexamples/Example05_InlineFunctionDefinition.java b/java/samples/sample-code/src/main/java/com/microsoft/semantickernel/syntaxexamples/Example05_InlineFunctionDefinition.java index 2906daa35f733..651566aad2960 100644 --- a/java/samples/sample-code/src/main/java/com/microsoft/semantickernel/syntaxexamples/Example05_InlineFunctionDefinition.java +++ b/java/samples/sample-code/src/main/java/com/microsoft/semantickernel/syntaxexamples/Example05_InlineFunctionDefinition.java @@ -25,7 +25,7 @@ public static void main(String[] args) throws IOException { .addTextCompletionService("text-davinci-003", kernel -> textCompletion) .build(); - Kernel kernel = SKBuilders.kernel().setKernelConfig(kernelConfig).build(); + Kernel kernel = SKBuilders.kernel().withKernelConfig(kernelConfig).build(); System.out.println("======== Inline Function Definition ========"); diff --git a/java/samples/sample-code/src/main/java/com/microsoft/semantickernel/syntaxexamples/Example06_TemplateLanguage.java b/java/samples/sample-code/src/main/java/com/microsoft/semantickernel/syntaxexamples/Example06_TemplateLanguage.java index e136edad4cca9..fbdbab0c1db58 100644 --- a/java/samples/sample-code/src/main/java/com/microsoft/semantickernel/syntaxexamples/Example06_TemplateLanguage.java +++ b/java/samples/sample-code/src/main/java/com/microsoft/semantickernel/syntaxexamples/Example06_TemplateLanguage.java @@ -29,7 +29,7 @@ public static void main(String[] args) throws IOException { .build(); Kernel kernel = SKBuilders.kernel() - .setKernelConfig(kernelConfig) + .withKernelConfig(kernelConfig) .build(); // Load native skill into the kernel skill collection, sharing its functions diff --git a/java/samples/sample-code/src/main/java/com/microsoft/semantickernel/syntaxexamples/Example08_RetryHandler.java b/java/samples/sample-code/src/main/java/com/microsoft/semantickernel/syntaxexamples/Example08_RetryHandler.java index 502c79f21fd7c..2cdc45a8468c9 100644 --- a/java/samples/sample-code/src/main/java/com/microsoft/semantickernel/syntaxexamples/Example08_RetryHandler.java +++ b/java/samples/sample-code/src/main/java/com/microsoft/semantickernel/syntaxexamples/Example08_RetryHandler.java @@ -77,7 +77,7 @@ public static void main(String[] args) throws IOException { Kernel kernel = SKBuilders .kernel() - .setKernelConfig(kernelConfig) + .withKernelConfig(kernelConfig) .build(); CompletionSKFunction summarizeFunc = SKBuilders.completionFunctions(kernel) @@ -89,7 +89,6 @@ public static void main(String[] args) throws IOException { new PromptTemplateConfig.CompletionConfig( 0.2, 0.5, 0, 0, 2000)); - kernel.registerSemanticFunction(summarizeFunc); SKContext context = summarizeFunc.invokeAsync(text).block(); diff --git a/java/samples/sample-code/src/main/java/com/microsoft/semantickernel/syntaxexamples/Example09_FunctionTypes.java b/java/samples/sample-code/src/main/java/com/microsoft/semantickernel/syntaxexamples/Example09_FunctionTypes.java index 721aadb8ce29a..51063257ac7d4 100644 --- a/java/samples/sample-code/src/main/java/com/microsoft/semantickernel/syntaxexamples/Example09_FunctionTypes.java +++ b/java/samples/sample-code/src/main/java/com/microsoft/semantickernel/syntaxexamples/Example09_FunctionTypes.java @@ -25,7 +25,7 @@ public static void main(String[] args) throws IOException { .addTextCompletionService("text-davinci-003", kernel -> textCompletion) .build(); - Kernel kernel = SKBuilders.kernel().setKernelConfig(kernelConfig).build(); + Kernel kernel = SKBuilders.kernel().withKernelConfig(kernelConfig).build(); System.out.println("======== Native function types ========"); diff --git a/java/samples/sample-code/src/main/java/com/microsoft/semantickernel/syntaxexamples/Example12_SequentialPlanner.java b/java/samples/sample-code/src/main/java/com/microsoft/semantickernel/syntaxexamples/Example12_SequentialPlanner.java index 735252a632d0d..a6435f29fbc8e 100644 --- a/java/samples/sample-code/src/main/java/com/microsoft/semantickernel/syntaxexamples/Example12_SequentialPlanner.java +++ b/java/samples/sample-code/src/main/java/com/microsoft/semantickernel/syntaxexamples/Example12_SequentialPlanner.java @@ -175,7 +175,7 @@ private static void memorySampleAsync() throws IOException { private static Kernel initializeKernel() throws IOException { OpenAIAsyncClient client = Config.getClient(); var kernel = SKBuilders.kernel() - .setKernelConfig(SKBuilders + .withKernelConfig(SKBuilders .kernelConfig() .addTextCompletionService("text-davinci-003", kernel1 -> SKBuilders.textCompletionService() .build(client, "text-davinci-003")) diff --git a/java/samples/sample-code/src/main/java/com/microsoft/semantickernel/syntaxexamples/Example13_ConversationSummarySkill.java b/java/samples/sample-code/src/main/java/com/microsoft/semantickernel/syntaxexamples/Example13_ConversationSummarySkill.java index 478d72bb86a64..e3c44c9d56536 100644 --- a/java/samples/sample-code/src/main/java/com/microsoft/semantickernel/syntaxexamples/Example13_ConversationSummarySkill.java +++ b/java/samples/sample-code/src/main/java/com/microsoft/semantickernel/syntaxexamples/Example13_ConversationSummarySkill.java @@ -186,9 +186,10 @@ private static Kernel initializeKernel(Config.ClientType clientType) throws IOEx KernelConfig kernelConfig = new KernelConfig.Builder() - .addTextCompletionService("text-davinci-003", kernel -> textCompletion) .build(); - return SKBuilders.kernel().setKernelConfig(kernelConfig).build(); + return SKBuilders.kernel() + .withKernelConfig(kernelConfig) + .withAIService("text-davinci-003", textCompletion, true, TextCompletion.class).build(); } } diff --git a/java/samples/sample-code/src/main/java/com/microsoft/semantickernel/syntaxexamples/Example14_SemanticMemory.java b/java/samples/sample-code/src/main/java/com/microsoft/semantickernel/syntaxexamples/Example14_SemanticMemory.java index 171f307837194..c3f6a4f59d3e0 100644 --- a/java/samples/sample-code/src/main/java/com/microsoft/semantickernel/syntaxexamples/Example14_SemanticMemory.java +++ b/java/samples/sample-code/src/main/java/com/microsoft/semantickernel/syntaxexamples/Example14_SemanticMemory.java @@ -5,7 +5,6 @@ import com.microsoft.semantickernel.Kernel; import com.microsoft.semantickernel.builders.SKBuilders; import com.microsoft.semantickernel.connectors.memory.azurecognitivesearch.AzureCognitiveSearchMemory; -import com.microsoft.semantickernel.memory.SemanticTextMemory; import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; @@ -42,7 +41,7 @@ public static void main(String[] args) throws Exception var kernelConfig = SKBuilders.kernelConfig().build(); var kernelWithACS = SKBuilders.kernel() - .setKernelConfig(kernelConfig) + .withKernelConfig(kernelConfig) .withMemory(new AzureCognitiveSearchMemory(System.getenv("ACS_ENDPOINT"), System.getenv("ACS_API_KEY"))) .build(); @@ -69,7 +68,7 @@ public static void main(String[] args) throws Exception .build(); var kernelWithCustomDb = SKBuilders.kernel() - .setKernelConfig(kernelConfigWithTextEmbedding) + .withKernelConfig(kernelConfigWithTextEmbedding) .withMemoryStore(SKBuilders.memoryStore().build()) .build(); diff --git a/java/samples/sample-code/src/main/java/com/microsoft/semantickernel/syntaxexamples/Example17_ChatGPT.java b/java/samples/sample-code/src/main/java/com/microsoft/semantickernel/syntaxexamples/Example17_ChatGPT.java index a851fb64b3d3a..4eb92b3f6179e 100644 --- a/java/samples/sample-code/src/main/java/com/microsoft/semantickernel/syntaxexamples/Example17_ChatGPT.java +++ b/java/samples/sample-code/src/main/java/com/microsoft/semantickernel/syntaxexamples/Example17_ChatGPT.java @@ -4,7 +4,6 @@ import com.azure.ai.openai.OpenAIAsyncClient; import com.microsoft.semantickernel.Config; import com.microsoft.semantickernel.Kernel; -import com.microsoft.semantickernel.KernelConfig; import com.microsoft.semantickernel.builders.SKBuilders; import com.microsoft.semantickernel.chatcompletion.ChatCompletion; import com.microsoft.semantickernel.chatcompletion.ChatHistory; @@ -21,14 +20,17 @@ public class Example17_ChatGPT { public static void main(String[] args) throws IOException { OpenAIAsyncClient client = Config.ClientType.AZURE_OPEN_AI.getClient(); - KernelConfig kernelConfig = SKBuilders.kernelConfig() - .addChatCompletionService( + Kernel kernel = SKBuilders.kernel() + .withKernelConfig(SKBuilders.kernelConfig() + .build()) + .withAIService( "chat-test", - kernel -> SKBuilders.chatCompletion().build(client, "chat-test")) + SKBuilders.chatCompletion().build(client, "chat-test"), + true, + ChatCompletion.class + ) .build(); - Kernel kernel = SKBuilders.kernel().setKernelConfig(kernelConfig).build(); - ChatCompletion chatGPT = kernel.getService(null, ChatCompletion.class); OpenAIChatHistory chatHistory = chatGPT.createNewChat("You are a librarian, expert about books"); diff --git a/java/samples/sample-code/src/main/java/com/microsoft/semantickernel/syntaxexamples/Example28_ActionPlanner.java b/java/samples/sample-code/src/main/java/com/microsoft/semantickernel/syntaxexamples/Example28_ActionPlanner.java index 533a6b0912f0a..a6f4ad07183a9 100644 --- a/java/samples/sample-code/src/main/java/com/microsoft/semantickernel/syntaxexamples/Example28_ActionPlanner.java +++ b/java/samples/sample-code/src/main/java/com/microsoft/semantickernel/syntaxexamples/Example28_ActionPlanner.java @@ -16,7 +16,7 @@ public static void main(String[] args) throws IOException { System.out.println("======== Action Planner ========"); var kernel = SKBuilders.kernel() - .setKernelConfig(SKBuilders + .withKernelConfig(SKBuilders .kernelConfig() .addTextCompletionService("text-davinci-002", kernel1 -> SKBuilders.textCompletionService() .build(client, "text-davinci-002")) diff --git a/java/semantickernel-api/src/main/java/com/microsoft/semantickernel/Kernel.java b/java/semantickernel-api/src/main/java/com/microsoft/semantickernel/Kernel.java index efa60eb10fec7..3e1dae9686275 100644 --- a/java/semantickernel-api/src/main/java/com/microsoft/semantickernel/Kernel.java +++ b/java/semantickernel-api/src/main/java/com/microsoft/semantickernel/Kernel.java @@ -7,11 +7,17 @@ import com.microsoft.semantickernel.orchestration.ContextVariables; import com.microsoft.semantickernel.orchestration.SKContext; import com.microsoft.semantickernel.orchestration.SKFunction; +import com.microsoft.semantickernel.services.AIService; +import com.microsoft.semantickernel.services.AIServiceCollection; +import com.microsoft.semantickernel.services.AIServiceProvider; import com.microsoft.semantickernel.templateengine.PromptTemplateEngine; import com.microsoft.semantickernel.textcompletion.CompletionSKFunction; import reactor.core.publisher.Mono; +import java.util.function.Function; +import java.util.function.Supplier; + import javax.annotation.Nullable; /** Interface for the semantic kernel. */ @@ -66,7 +72,8 @@ public interface Kernel extends SkillExecutor { CompletionSKFunction.Builder getSemanticFunctionBuilder(); /** Obtains the service with the given name and type */ - T getService(@Nullable String name, Class clazz) throws KernelException; + T getService(@Nullable String name, Class clazz) + throws KernelException; /** Registers a semantic functon on this kernel */ > @@ -80,14 +87,15 @@ class Builder { @Nullable private KernelConfig kernelConfig = null; @Nullable private PromptTemplateEngine promptTemplateEngine = null; @Nullable private MemoryStore memoryStore = null; + @Nullable private AIServiceCollection aiServices = new AIServiceCollection(); @Nullable private SemanticTextMemory memory = null; - public Builder setKernelConfig(KernelConfig kernelConfig) { + public Builder withKernelConfig(KernelConfig kernelConfig) { this.kernelConfig = kernelConfig; return this; } - public Builder setPromptTemplateEngine(PromptTemplateEngine promptTemplateEngine) { + public Builder withPromptTemplateEngine(PromptTemplateEngine promptTemplateEngine) { this.promptTemplateEngine = promptTemplateEngine; return this; } @@ -97,6 +105,65 @@ public Builder withMemoryStore(MemoryStore memoryStore) { return this; } + /** + * Adds an instance to the services collection + * + * @param instance The instance. + * @param clazz The class of the instance. + * @return The builder. + */ + public Builder withDefaultAIService(T instance, Class clazz) { + this.aiServices.setService(instance, clazz); + return this; + } + + /** + * Adds an instance to the services collection + * + * @param serviceId The service ID + * @param instance The instance. + * @param setAsDefault Optional: set as the default AI service for type T + * @param clazz The class of the instance. + */ + public Builder withAIService( + @Nullable String serviceId, T instance, boolean setAsDefault, Class clazz) { + this.aiServices.setService(serviceId, instance, setAsDefault, clazz); + return this; + } + + /** + * Adds a factory method to the services collection + * + * @param factory The factory method that creates the AI service instances of type T. + * @param clazz The class of the instance. + */ + public Builder withDefaultAIService( + Supplier factory, Class clazz) { + this.aiServices.setService(factory, clazz); + return this; + } + + /** + * Adds a factory method to the services collection + * + * @param serviceId The service ID + * @param factory The factory method that creates the AI service instances of type T. + * @param setAsDefault Optional: set as the default AI service for type T + * @param clazz The class of the instance. + */ + public Builder withAIService( + @Nullable String serviceId, + Function factory, + boolean setAsDefault, + Class clazz) { + this.aiServices.setService( + serviceId, + (Supplier) () -> factory.apply(this.kernelConfig), + setAsDefault, + clazz); + return this; + } + public Builder withMemory(SemanticTextMemory memory) { this.memory = memory; return this; @@ -109,7 +176,12 @@ public Kernel build() { return BuildersSingleton.INST .getKernelBuilder() - .build(kernelConfig, promptTemplateEngine, memory, memoryStore); + .build( + kernelConfig, + promptTemplateEngine, + memory, + memoryStore, + aiServices.build()); } } @@ -118,6 +190,7 @@ Kernel build( KernelConfig kernelConfig, @Nullable PromptTemplateEngine promptTemplateEngine, @Nullable SemanticTextMemory memory, - @Nullable MemoryStore memoryStore); + @Nullable MemoryStore memoryStore, + @Nullable AIServiceProvider aiServiceProvider); } } diff --git a/java/semantickernel-api/src/main/java/com/microsoft/semantickernel/ai/embeddings/EmbeddingGeneration.java b/java/semantickernel-api/src/main/java/com/microsoft/semantickernel/ai/embeddings/EmbeddingGeneration.java index 3797975a73759..e8ebb07bbb11f 100644 --- a/java/semantickernel-api/src/main/java/com/microsoft/semantickernel/ai/embeddings/EmbeddingGeneration.java +++ b/java/semantickernel-api/src/main/java/com/microsoft/semantickernel/ai/embeddings/EmbeddingGeneration.java @@ -2,13 +2,14 @@ package com.microsoft.semantickernel.ai.embeddings; import com.azure.ai.openai.OpenAIAsyncClient; +import com.microsoft.semantickernel.services.AIService; import reactor.core.publisher.Mono; import java.util.List; /** Interface for text embedding generation services */ -public interface EmbeddingGeneration { +public interface EmbeddingGeneration extends AIService { /** * Generates a list of embeddings associated to the data * diff --git a/java/semantickernel-api/src/main/java/com/microsoft/semantickernel/chatcompletion/ChatCompletion.java b/java/semantickernel-api/src/main/java/com/microsoft/semantickernel/chatcompletion/ChatCompletion.java index 4ac313d5f107e..487519f6562aa 100644 --- a/java/semantickernel-api/src/main/java/com/microsoft/semantickernel/chatcompletion/ChatCompletion.java +++ b/java/semantickernel-api/src/main/java/com/microsoft/semantickernel/chatcompletion/ChatCompletion.java @@ -2,12 +2,13 @@ package com.microsoft.semantickernel.chatcompletion; import com.azure.ai.openai.OpenAIAsyncClient; +import com.microsoft.semantickernel.services.AIService; import reactor.core.publisher.Mono; import javax.annotation.Nullable; -public interface ChatCompletion { +public interface ChatCompletion extends AIService { /** * Generate a new chat message * diff --git a/java/semantickernel-api/src/main/java/com/microsoft/semantickernel/services/AIService.java b/java/semantickernel-api/src/main/java/com/microsoft/semantickernel/services/AIService.java new file mode 100644 index 0000000000000..8d8b24559dcbc --- /dev/null +++ b/java/semantickernel-api/src/main/java/com/microsoft/semantickernel/services/AIService.java @@ -0,0 +1,5 @@ +// Copyright (c) Microsoft. All rights reserved. +package com.microsoft.semantickernel.services; + +/** Marker interface for AI services */ +public interface AIService {} diff --git a/java/semantickernel-api/src/main/java/com/microsoft/semantickernel/services/AIServiceCollection.java b/java/semantickernel-api/src/main/java/com/microsoft/semantickernel/services/AIServiceCollection.java new file mode 100644 index 0000000000000..f8e443b50e37c --- /dev/null +++ b/java/semantickernel-api/src/main/java/com/microsoft/semantickernel/services/AIServiceCollection.java @@ -0,0 +1,138 @@ +// Copyright (c) Microsoft. All rights reserved. +package com.microsoft.semantickernel.services; + +import com.microsoft.semantickernel.Verify; + +import java.util.Collections; +import java.util.HashMap; +import java.util.Map; +import java.util.function.Supplier; + +import javax.annotation.Nullable; + +/** A collection that can hold AI services */ +public class AIServiceCollection { + // A constant key for the default service + private static final String DefaultKey = "__DEFAULT__"; + + // A dictionary that maps a service type to a nested dictionary of names and service instances + // or factories + // private readonly Dictionary> _services = new(); + private final Map, Map>> + services = new HashMap<>(); + + // A dictionary that maps a service type to the name of the default service + private final Map, String> defaultIds = new HashMap<>(); + + /** + * Registers a singleton service instance with the default name. + * + * @param service The service instance. + * @param serviceType The type of the service. + */ + public void setService(T service, Class serviceType) { + setService(DefaultKey, (Supplier) () -> service, true, serviceType); + } + + /** + * Registers a singleton service instance with an optional name and default flag. + * + * @param name The name of the service, or null for the default service. + * @param service The service instance. + * @param setAsDefault Whether the service should be the default for its type. + * @param serviceType The type of the service. + */ + public void setService( + String name, T service, boolean setAsDefault, Class serviceType) { + setService(name, (Supplier) () -> service, setAsDefault, serviceType); + } + + /** + * Registers a transient service factory with the default name. + * + * @param factory The factory function to create the service instance. + * @param serviceType The type of the service. + */ + public void setService(Supplier factory, Class serviceType) { + setService(DefaultKey, factory, true, serviceType); + } + + /** + * Registers a transient service factory with an optional name and default flag. + * + * @param name The name of the service, or null for the default service. + * @param factory The factory function to create the service instance. + * @param setAsDefault Whether the service should be the default for its type. + * @param serviceType The type of the service. + */ + public void setService( + @Nullable String name, + Supplier factory, + boolean setAsDefault, + Class serviceType) { + // Validate the factory function + if (factory == null) { + throw new IllegalArgumentException(); + } + + // Get or create the nested dictionary for the service type + Map> namedServices = this.services.get(serviceType); + if (namedServices == null) { + namedServices = new HashMap<>(); + services.put(serviceType, namedServices); + } + + // Set as the default if the name is empty, or the default flag is true, + // or there is no default name for the service type. + if (name == null || setAsDefault || !this.hasDefault(serviceType)) { + // Update the default name for the service type + this.defaultIds.put(serviceType, name == null ? DefaultKey : name); + } + + // Register the factory with the given name + namedServices.put(name == null ? DefaultKey : name, factory); + } + + /** + * Builds an AIServiceProvider from the registered services and default names. + * + * @return The AIServiceProvider. + */ + public AIServiceProvider build() { + // Create a clone of the services and defaults Dictionaries to prevent further changes + // by the services provider. + Map, Map>> servicesClone = + cloneServices(services); + + Map defaultsClone = new HashMap<>(defaultIds); + + return new DefaultAIServiceProvider(servicesClone, defaultsClone); + } + + /** + * Creates a clone of the services as a Map. + * + * @param services The services Map. + * @return The clone. + */ + static Map, Map>> cloneServices( + Map, Map>> services) { + return Collections.unmodifiableMap( + services.entrySet().stream() + .reduce( + new HashMap<>(), + (a, b) -> { + a.put(b.getKey(), Collections.unmodifiableMap(b.getValue())); + return a; + }, + (a, b) -> { + a.putAll(b); + return a; + })); + } + + private boolean hasDefault(Class type) { + String defaultName = defaultIds.get(type); + return !Verify.isNullOrEmpty(defaultName); + } +} diff --git a/java/semantickernel-api/src/main/java/com/microsoft/semantickernel/services/AIServiceProvider.java b/java/semantickernel-api/src/main/java/com/microsoft/semantickernel/services/AIServiceProvider.java new file mode 100644 index 0000000000000..0c7727e90cd5a --- /dev/null +++ b/java/semantickernel-api/src/main/java/com/microsoft/semantickernel/services/AIServiceProvider.java @@ -0,0 +1,4 @@ +// Copyright (c) Microsoft. All rights reserved. +package com.microsoft.semantickernel.services; + +public interface AIServiceProvider extends NamedServiceProvider {} diff --git a/java/semantickernel-api/src/main/java/com/microsoft/semantickernel/services/DefaultAIServiceProvider.java b/java/semantickernel-api/src/main/java/com/microsoft/semantickernel/services/DefaultAIServiceProvider.java new file mode 100644 index 0000000000000..4302f0dd090d4 --- /dev/null +++ b/java/semantickernel-api/src/main/java/com/microsoft/semantickernel/services/DefaultAIServiceProvider.java @@ -0,0 +1,15 @@ +// Copyright (c) Microsoft. All rights reserved. +package com.microsoft.semantickernel.services; + +import java.util.Map; +import java.util.function.Supplier; + +/** Default implementation of {@link AIServiceProvider} */ +public class DefaultAIServiceProvider extends DefaultNamedServiceProvider + implements AIServiceProvider { + public DefaultAIServiceProvider( + Map, Map>> services, + Map, String> defaultIds) { + super(services, defaultIds); + } +} diff --git a/java/semantickernel-api/src/main/java/com/microsoft/semantickernel/services/DefaultNamedServiceProvider.java b/java/semantickernel-api/src/main/java/com/microsoft/semantickernel/services/DefaultNamedServiceProvider.java new file mode 100644 index 0000000000000..41c772c5298ed --- /dev/null +++ b/java/semantickernel-api/src/main/java/com/microsoft/semantickernel/services/DefaultNamedServiceProvider.java @@ -0,0 +1,86 @@ +// Copyright (c) Microsoft. All rights reserved. +package com.microsoft.semantickernel.services; + +import com.microsoft.semantickernel.Verify; + +import java.util.HashMap; +import java.util.Map; +import java.util.function.Supplier; + +import javax.annotation.Nullable; + +/** Default implementation of {@link NamedServiceProvider} */ +public class DefaultNamedServiceProvider implements NamedServiceProvider { + + // A dictionary that maps a service type to a nested dictionary of names and service instances + // or factories + // private readonly Dictionary> _services = new(); + private final Map, Map>> services; + + // A dictionary that maps a service type to the name of the default service + private final Map, String> defaultIds; + + public DefaultNamedServiceProvider( + Map, Map>> services, + Map, String> defaultIds) { + this.services = AIServiceCollection.cloneServices(services); + this.defaultIds = new HashMap<>(defaultIds); + } + + /** + * Gets the service of the specified type and name, or null if not found. + * + * @param name The name of the service, or null for the default service. + * @param clazz The type of the service. + * @return The service instance, or null if not found. + */ + @Nullable + @Override + public U getService(@Nullable String name, Class clazz) { + // Return the service, casting or invoking the factory if needed + Supplier factory = this.getServiceFactory(name, clazz); + if (factory != null) { + return factory.get(); + } + + return null; + } + + /** + * Get the default service instance. + * + * @param clazz The type of the service. + * @return The service instance, or null if none. + */ + @Nullable + private String getDefaultServiceName(Class clazz) { + // Returns the name of the default service for the given type, or null if none + String name = this.defaultIds.get(clazz); + if (!Verify.isNullOrEmpty(name)) { + return name; + } + + return null; + } + + @Nullable + private Supplier getServiceFactory(@Nullable String name, Class clazz) { + // Get the nested dictionary for the service type + Map> namedServices = services.get(clazz); + + if (namedServices != null) { + Supplier serviceFactory = null; + + // If the name is not specified, try to load the default factory + name = name == null ? this.getDefaultServiceName(clazz) : name; + if (name != null) { + // Check if there is a service registered with the given name + serviceFactory = (Supplier) namedServices.get(name); + } + + return serviceFactory; + } + + return null; + } +} diff --git a/java/semantickernel-api/src/main/java/com/microsoft/semantickernel/services/NamedServiceProvider.java b/java/semantickernel-api/src/main/java/com/microsoft/semantickernel/services/NamedServiceProvider.java new file mode 100644 index 0000000000000..a7ec5b064fd77 --- /dev/null +++ b/java/semantickernel-api/src/main/java/com/microsoft/semantickernel/services/NamedServiceProvider.java @@ -0,0 +1,16 @@ +// Copyright (c) Microsoft. All rights reserved. +package com.microsoft.semantickernel.services; + +import javax.annotation.Nullable; + +public interface NamedServiceProvider { + /** + * Gets the service of the specified type and name, or null if not found. + * + * @param name The name of the service, or null for the default service. + * @param clazz The type of the service. + * @return The service instance, or null if not found. + */ + @Nullable + public U getService(@Nullable String name, Class clazz); +} diff --git a/java/semantickernel-api/src/main/java/com/microsoft/semantickernel/textcompletion/TextCompletion.java b/java/semantickernel-api/src/main/java/com/microsoft/semantickernel/textcompletion/TextCompletion.java index 98be3970d26bf..2acbda556f997 100644 --- a/java/semantickernel-api/src/main/java/com/microsoft/semantickernel/textcompletion/TextCompletion.java +++ b/java/semantickernel-api/src/main/java/com/microsoft/semantickernel/textcompletion/TextCompletion.java @@ -2,13 +2,14 @@ package com.microsoft.semantickernel.textcompletion; import com.azure.ai.openai.OpenAIAsyncClient; +import com.microsoft.semantickernel.services.AIService; import reactor.core.publisher.Mono; import java.util.List; /** Interface for text completion services */ -public interface TextCompletion { +public interface TextCompletion extends AIService { // TODO: Support Cancellation Token /** diff --git a/java/semantickernel-core/src/main/java/com/microsoft/semantickernel/DefaultKernel.java b/java/semantickernel-core/src/main/java/com/microsoft/semantickernel/DefaultKernel.java index f198f4289629d..3400cd944aa14 100644 --- a/java/semantickernel-core/src/main/java/com/microsoft/semantickernel/DefaultKernel.java +++ b/java/semantickernel-core/src/main/java/com/microsoft/semantickernel/DefaultKernel.java @@ -7,7 +7,6 @@ import com.microsoft.semantickernel.builders.SKBuilders; import com.microsoft.semantickernel.chatcompletion.ChatCompletion; import com.microsoft.semantickernel.coreskills.SkillImporter; -import com.microsoft.semantickernel.exceptions.NotSupportedException; import com.microsoft.semantickernel.exceptions.SkillsNotFoundException; import com.microsoft.semantickernel.extensions.KernelExtensions; import com.microsoft.semantickernel.memory.MemoryConfiguration; @@ -16,6 +15,8 @@ import com.microsoft.semantickernel.memory.SemanticTextMemory; import com.microsoft.semantickernel.orchestration.*; import com.microsoft.semantickernel.semanticfunctions.SemanticFunctionConfig; +import com.microsoft.semantickernel.services.AIService; +import com.microsoft.semantickernel.services.AIServiceProvider; import com.microsoft.semantickernel.skilldefinition.DefaultSkillCollection; import com.microsoft.semantickernel.skilldefinition.FunctionNotFound; import com.microsoft.semantickernel.skilldefinition.ReadOnlyFunctionCollection; @@ -41,18 +42,21 @@ public class DefaultKernel implements Kernel { private final KernelConfig kernelConfig; private final DefaultSkillCollection defaultSkillCollection; private final PromptTemplateEngine promptTemplateEngine; + private final AIServiceProvider aiServiceProvider; private SemanticTextMemory memory; @Inject public DefaultKernel( KernelConfig kernelConfig, PromptTemplateEngine promptTemplateEngine, - @Nullable SemanticTextMemory memoryStore) { + @Nullable SemanticTextMemory memoryStore, + AIServiceProvider aiServiceProvider) { if (kernelConfig == null) { throw new IllegalArgumentException(); } this.kernelConfig = kernelConfig; + this.aiServiceProvider = aiServiceProvider; this.promptTemplateEngine = promptTemplateEngine; this.defaultSkillCollection = new DefaultSkillCollection(); @@ -64,7 +68,14 @@ public DefaultKernel( } @Override - public T getService(@Nullable String serviceId, Class clazz) { + public T getService(String serviceId, Class clazz) { + + T service = aiServiceProvider.getService(serviceId, clazz); + + if (service != null) { + return service; + } + if (TextCompletion.class.isAssignableFrom(clazz)) { Function factory = kernelConfig.getTextCompletionServiceOrDefault(serviceId); @@ -94,11 +105,25 @@ public T getService(@Nullable String serviceId, Class clazz) { "No chat completion service available"); } + return (T) factory.apply(this); + } else if (EmbeddingGeneration.class.isAssignableFrom(clazz)) { + Function> factory = + kernelConfig.getTextEmbeddingGenerationServiceOrDefault(serviceId); + if (factory == null) { + throw new KernelException( + KernelException.ErrorCodes.ServiceNotFound, + "No chat completion service available"); + } + return (T) factory.apply(this); } else { - // TODO correct exception - throw new NotSupportedException( - "The kernel service collection doesn't support the type " + clazz.getName()); + throw new KernelException( + KernelException.ErrorCodes.ServiceNotFound, + "Service of type " + + clazz.getName() + + " and name " + + serviceId + + " not registered"); } } @@ -311,7 +336,8 @@ public Kernel build( KernelConfig kernelConfig, @Nullable PromptTemplateEngine promptTemplateEngine, @Nullable SemanticTextMemory memory, - @Nullable MemoryStore memoryStore) { + @Nullable MemoryStore memoryStore, + @Nullable AIServiceProvider aiServiceProvider) { if (promptTemplateEngine == null) { promptTemplateEngine = new DefaultPromptTemplateEngine(); } @@ -322,7 +348,9 @@ public Kernel build( "It is required to set a kernelConfig to build a kernel"); } - DefaultKernel kernel = new DefaultKernel(kernelConfig, promptTemplateEngine, memory); + DefaultKernel kernel = + new DefaultKernel( + kernelConfig, promptTemplateEngine, memory, aiServiceProvider); if (memoryStore != null) { MemoryConfiguration.useMemory(kernel, memoryStore, null); diff --git a/java/semantickernel-core/src/main/java/com/microsoft/semantickernel/skilldefinition/DefaultSkillCollection.java b/java/semantickernel-core/src/main/java/com/microsoft/semantickernel/skilldefinition/DefaultSkillCollection.java index 8ac6158874749..2a5757abad049 100644 --- a/java/semantickernel-core/src/main/java/com/microsoft/semantickernel/skilldefinition/DefaultSkillCollection.java +++ b/java/semantickernel-core/src/main/java/com/microsoft/semantickernel/skilldefinition/DefaultSkillCollection.java @@ -124,7 +124,7 @@ public DefaultSkillCollection addNativeFunction(SKFunction functionInstance) { return addSemanticFunction(functionInstance); } - public DefaultSkillCollection merge(DefaultSkillCollection in) { + public DefaultSkillCollection merge(ReadOnlySkillCollection in) { in.asMap() .entrySet() .forEach( diff --git a/java/semantickernel-core/src/test/java/com/microsoft/semantickernel/AiServiceRegistryTest.java b/java/semantickernel-core/src/test/java/com/microsoft/semantickernel/AiServiceRegistryTest.java new file mode 100644 index 0000000000000..3de24f011f7bd --- /dev/null +++ b/java/semantickernel-core/src/test/java/com/microsoft/semantickernel/AiServiceRegistryTest.java @@ -0,0 +1,70 @@ +// Copyright (c) Microsoft. All rights reserved. +package com.microsoft.semantickernel; + +import com.microsoft.semantickernel.builders.SKBuilders; +import com.microsoft.semantickernel.textcompletion.CompletionSKFunction; +import com.microsoft.semantickernel.textcompletion.TextCompletion; + +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; +import org.mockito.Mockito; + +import reactor.core.publisher.Mono; + +import java.util.Collections; + +public class AiServiceRegistryTest { + + @Test + public void registeredServicesAreAvailableInTheKernel() { + runFunctionWithAiService(true); + } + + @Test + public void singleServiceIsRegisteredAsDefault() { + runFunctionWithAiService(false); + } + + private static void runFunctionWithAiService(boolean setAsDefault) { + KernelConfig config = SKBuilders.kernelConfig().build(); + TextCompletion service = Mockito.mock(TextCompletion.class); + Mockito.when(service.completeAsync(Mockito.any(), Mockito.any())) + .thenReturn(Mono.just(Collections.singletonList("foo"))); + + Kernel kernel = + SKBuilders.kernel() + .withAIService("a-service", service, setAsDefault, TextCompletion.class) + .withKernelConfig(config) + .build(); + + Assertions.assertSame(kernel.getService("a-service", TextCompletion.class), service); + + CompletionSKFunction function = + kernel.importSkillFromDirectory("FunSkill", "../../samples/skills") + .getFunction("joke", CompletionSKFunction.class); + + function.invokeAsync("time travel to dinosaur age").block(); + + Mockito.verify(service, Mockito.times(1)).completeAsync(Mockito.any(), Mockito.any()); + } + + @Test + public void noServiceThrowsAnError() { + KernelConfig config = SKBuilders.kernelConfig().build(); + + Kernel kernel = SKBuilders.kernel().withKernelConfig(config).build(); + + Assertions.assertThrows( + KernelException.class, () -> kernel.getService("a-service", TextCompletion.class)); + + Assertions.assertThrows( + KernelException.class, + () -> { + CompletionSKFunction function = + kernel.importSkillFromDirectory("FunSkill", "../../samples/skills") + .getFunction("joke", CompletionSKFunction.class); + + function.invokeAsync("time travel to dinosaur age").block(); + }); + } +} diff --git a/java/semantickernel-core/src/test/java/com/microsoft/semantickernel/DefaultKernelTest.java b/java/semantickernel-core/src/test/java/com/microsoft/semantickernel/DefaultKernelTest.java index 03e1470a90295..415121af26f44 100644 --- a/java/semantickernel-core/src/test/java/com/microsoft/semantickernel/DefaultKernelTest.java +++ b/java/semantickernel-core/src/test/java/com/microsoft/semantickernel/DefaultKernelTest.java @@ -119,7 +119,7 @@ public static Kernel buildKernel(String model, OpenAIAsyncClient client) { .addTextCompletionService(model, kernel -> textCompletion) .build(); - return SKBuilders.kernel().setKernelConfig(kernelConfig).build(); + return SKBuilders.kernel().withKernelConfig(kernelConfig).build(); } private static OpenAIAsyncClient mockCompletionOpenAIAsyncClient(String arg, String response) { diff --git a/java/semantickernel-core/src/test/java/com/microsoft/semantickernel/connectors/ai/openai/chatcompletion/OpenAIChatCompletionTest.java b/java/semantickernel-core/src/test/java/com/microsoft/semantickernel/connectors/ai/openai/chatcompletion/OpenAIChatCompletionTest.java index 22aeaa65beced..b994d10910103 100644 --- a/java/semantickernel-core/src/test/java/com/microsoft/semantickernel/connectors/ai/openai/chatcompletion/OpenAIChatCompletionTest.java +++ b/java/semantickernel-core/src/test/java/com/microsoft/semantickernel/connectors/ai/openai/chatcompletion/OpenAIChatCompletionTest.java @@ -46,7 +46,7 @@ private static String getRunExample(OpenAIAsyncClient client, String message) { .build(client, "gpt-3.5-turbo-0301")) .build(); - Kernel kernel = SKBuilders.kernel().setKernelConfig(kernelConfig).build(); + Kernel kernel = SKBuilders.kernel().withKernelConfig(kernelConfig).build(); ChatCompletion chatGPT = kernel.getService(null, ChatCompletion.class); diff --git a/java/semantickernel-core/src/test/java/com/microsoft/semantickernel/connectors/memory/azurecognitivesearch/AzureCognitiveSearchMemoryTests.java b/java/semantickernel-core/src/test/java/com/microsoft/semantickernel/connectors/memory/azurecognitivesearch/AzureCognitiveSearchMemoryTests.java index a9a2551b0bb2b..4c322cf1f8444 100644 --- a/java/semantickernel-core/src/test/java/com/microsoft/semantickernel/connectors/memory/azurecognitivesearch/AzureCognitiveSearchMemoryTests.java +++ b/java/semantickernel-core/src/test/java/com/microsoft/semantickernel/connectors/memory/azurecognitivesearch/AzureCognitiveSearchMemoryTests.java @@ -99,7 +99,7 @@ void setUp() { kernel = SKBuilders.kernel() - .setKernelConfig(SKBuilders.kernelConfig().build()) + .withKernelConfig(SKBuilders.kernelConfig().build()) .withMemory(new AzureCognitiveSearchMemory(searchIndexAsyncClient)) .build(); } diff --git a/java/semantickernel-core/src/test/java/com/microsoft/semantickernel/syntaxexamples/Example04CombineLLMPromptsAndNativeCodeTest.java b/java/semantickernel-core/src/test/java/com/microsoft/semantickernel/syntaxexamples/Example04CombineLLMPromptsAndNativeCodeTest.java index d4cc86f6bf720..0e03b8255f03e 100644 --- a/java/semantickernel-core/src/test/java/com/microsoft/semantickernel/syntaxexamples/Example04CombineLLMPromptsAndNativeCodeTest.java +++ b/java/semantickernel-core/src/test/java/com/microsoft/semantickernel/syntaxexamples/Example04CombineLLMPromptsAndNativeCodeTest.java @@ -38,7 +38,7 @@ public void run() { .setDefaultTextCompletionService("text-davinci-003") .build(); - Kernel kernel = SKBuilders.kernel().setKernelConfig(kernelConfig).build(); + Kernel kernel = SKBuilders.kernel().withKernelConfig(kernelConfig).build(); kernel.importSkill(new SearchEngineSkill(), null); kernel.importSkillFromDirectory("SummarizeSkill", "../../samples/skills", "SummarizeSkill"); diff --git a/java/semantickernel-core/src/test/java/com/microsoft/semantickernel/syntaxexamples/Example05UsingThePlannerTest.java b/java/semantickernel-core/src/test/java/com/microsoft/semantickernel/syntaxexamples/Example05UsingThePlannerTest.java index 57e4e2b82c6aa..5ae57c13f19fa 100644 --- a/java/semantickernel-core/src/test/java/com/microsoft/semantickernel/syntaxexamples/Example05UsingThePlannerTest.java +++ b/java/semantickernel-core/src/test/java/com/microsoft/semantickernel/syntaxexamples/Example05UsingThePlannerTest.java @@ -43,7 +43,7 @@ public void run() { .build(client, "text-davinci-003")) .build(); - Kernel kernel = SKBuilders.kernel().setKernelConfig(config).build(); + Kernel kernel = SKBuilders.kernel().withKernelConfig(config).build(); SequentialPlanner planner = getPlanner(kernel); System.out.println( diff --git a/java/semantickernel-core/src/test/java/com/microsoft/semantickernel/syntaxexamples/Example06TemplateLanguageTest.java b/java/semantickernel-core/src/test/java/com/microsoft/semantickernel/syntaxexamples/Example06TemplateLanguageTest.java index 08f43deb89358..0f2fe493aa5aa 100644 --- a/java/semantickernel-core/src/test/java/com/microsoft/semantickernel/syntaxexamples/Example06TemplateLanguageTest.java +++ b/java/semantickernel-core/src/test/java/com/microsoft/semantickernel/syntaxexamples/Example06TemplateLanguageTest.java @@ -35,7 +35,7 @@ public void run() { .build(client, "text-davinci-003")) .build(); - Kernel kernel = SKBuilders.kernel().setKernelConfig(kernelConfig).build(); + Kernel kernel = SKBuilders.kernel().withKernelConfig(kernelConfig).build(); // Load native skill into the kernel skill collection, sharing its functions // with prompt diff --git a/java/semantickernel-core/src/test/java/com/microsoft/semantickernel/syntaxexamples/Example12SequentialPlannerTest.java b/java/semantickernel-core/src/test/java/com/microsoft/semantickernel/syntaxexamples/Example12SequentialPlannerTest.java index 8ae6afaa09776..292775a520407 100644 --- a/java/semantickernel-core/src/test/java/com/microsoft/semantickernel/syntaxexamples/Example12SequentialPlannerTest.java +++ b/java/semantickernel-core/src/test/java/com/microsoft/semantickernel/syntaxexamples/Example12SequentialPlannerTest.java @@ -80,7 +80,7 @@ private static SequentialPlanner getSequentialPlanner(OpenAIAsyncClient client) private static Kernel getKernel(OpenAIAsyncClient client) { Kernel kernel = SKBuilders.kernel() - .setKernelConfig( + .withKernelConfig( SKBuilders.kernelConfig() .addTextCompletionService( "text-davinci-002", diff --git a/java/semantickernel-core/src/test/java/com/microsoft/semantickernel/syntaxexamples/Example17ChatGPTTest.java b/java/semantickernel-core/src/test/java/com/microsoft/semantickernel/syntaxexamples/Example17ChatGPTTest.java index a994eda0df310..dbefb3dda1272 100644 --- a/java/semantickernel-core/src/test/java/com/microsoft/semantickernel/syntaxexamples/Example17ChatGPTTest.java +++ b/java/semantickernel-core/src/test/java/com/microsoft/semantickernel/syntaxexamples/Example17ChatGPTTest.java @@ -48,7 +48,7 @@ public void azureOpenAIChatSampleAsync() { .build(client, "gpt-3.5-turbo-0301")) .build(); - Kernel kernel = SKBuilders.kernel().setKernelConfig(kernelConfig).build(); + Kernel kernel = SKBuilders.kernel().withKernelConfig(kernelConfig).build(); ChatCompletion chatGPT = kernel.getService(null, ChatCompletion.class); diff --git a/java/semantickernel-core/src/test/java/com/microsoft/semantickernel/syntaxexamples/Example28ActionPlanner.java b/java/semantickernel-core/src/test/java/com/microsoft/semantickernel/syntaxexamples/Example28ActionPlanner.java index 70a3f29ea4554..7f1f0072f2ca8 100644 --- a/java/semantickernel-core/src/test/java/com/microsoft/semantickernel/syntaxexamples/Example28ActionPlanner.java +++ b/java/semantickernel-core/src/test/java/com/microsoft/semantickernel/syntaxexamples/Example28ActionPlanner.java @@ -123,7 +123,7 @@ public void resultIsAnonExistentFunction() { private static ActionPlanner createPlanner(OpenAIAsyncClient client) { Kernel kernel = SKBuilders.kernel() - .setKernelConfig( + .withKernelConfig( SKBuilders.kernelConfig() .addTextCompletionService( "text-davinci-002",