From b2bfff2073cb0502830c1996512a277c29234e0e Mon Sep 17 00:00:00 2001
From: John Oliver <1615532+johnoliver@users.noreply.github.com>
Date: Mon, 12 Feb 2024 21:17:39 +0000
Subject: [PATCH 1/4] Java: Complete rename from skill to plugin (#4971)
Closes #1576
---
.../chatcompletion/OpenAIChatCompletion.java | 2 +-
.../Example01NativeFunctionsTest.java | 2 +-
.../Example03_ArgumentsTest.java | 2 +-
.../plugins/text/TextPlugin.java | 2 +-
.../samples/plugins/TimePlugin.java | 43 -------------------
.../Example01_NativeFunctions.java | 2 +-
.../syntaxexamples/Example03_Arguments.java | 2 +-
.../Example13_ConversationSummaryPlugin.java | 2 +-
.../semantickernel/DefaultKernel.java | 4 +-
.../orchestration/FunctionInvocation.java | 5 ++-
.../orchestration/KernelFunction.java | 4 +-
.../orchestration/ToolCallBehavior.java | 6 +--
.../plugin/KernelPluginFactory.java | 2 +-
.../KernelFunctionFromMethod.java | 4 +-
.../KernelFunctionFromPrompt.java | 2 +-
.../handlebars/HandlebarsPromptTemplate.java | 9 ++--
.../blocks/FunctionIdBlock.java | 2 +-
17 files changed, 26 insertions(+), 69 deletions(-)
diff --git a/java/aiservices/openai/src/main/java/com/microsoft/semantickernel/aiservices/openai/chatcompletion/OpenAIChatCompletion.java b/java/aiservices/openai/src/main/java/com/microsoft/semantickernel/aiservices/openai/chatcompletion/OpenAIChatCompletion.java
index dfd67543b6..9d42a0212b 100644
--- a/java/aiservices/openai/src/main/java/com/microsoft/semantickernel/aiservices/openai/chatcompletion/OpenAIChatCompletion.java
+++ b/java/aiservices/openai/src/main/java/com/microsoft/semantickernel/aiservices/openai/chatcompletion/OpenAIChatCompletion.java
@@ -438,7 +438,7 @@ public class OpenAIChatCompletion implements ChatCompletionService {
}
private static FunctionDefinition toFunctionDefinition(KernelFunction function) {
- String name = String.format("%s-%s", function.getSkillName(), function.getName());
+ String name = String.format("%s-%s", function.getPluginName(), function.getName());
FunctionDefinition functionDefinition = new FunctionDefinition(name);
functionDefinition.setDescription(function.getDescription());
// Example JSON Schema:
diff --git a/java/api-test/integration-tests/src/test/java/com/microsoft/semantickernel/syntaxexamples/Example01NativeFunctionsTest.java b/java/api-test/integration-tests/src/test/java/com/microsoft/semantickernel/syntaxexamples/Example01NativeFunctionsTest.java
index 917e8ee9bf..16b82e7e8a 100644
--- a/java/api-test/integration-tests/src/test/java/com/microsoft/semantickernel/syntaxexamples/Example01NativeFunctionsTest.java
+++ b/java/api-test/integration-tests/src/test/java/com/microsoft/semantickernel/syntaxexamples/Example01NativeFunctionsTest.java
@@ -10,7 +10,7 @@ public class Example01NativeFunctionsTest {
@Test
public void run() {
- // Load native skill
+ // Load native plugin
TextPlugin text = new TextPlugin();
// Use function without kernel
diff --git a/java/api-test/integration-tests/src/test/java/com/microsoft/semantickernel/syntaxexamples/Example03_ArgumentsTest.java b/java/api-test/integration-tests/src/test/java/com/microsoft/semantickernel/syntaxexamples/Example03_ArgumentsTest.java
index 9773890be4..5b084e913d 100644
--- a/java/api-test/integration-tests/src/test/java/com/microsoft/semantickernel/syntaxexamples/Example03_ArgumentsTest.java
+++ b/java/api-test/integration-tests/src/test/java/com/microsoft/semantickernel/syntaxexamples/Example03_ArgumentsTest.java
@@ -20,7 +20,7 @@ public class Example03_ArgumentsTest {
public void main() {
Kernel kernel = Kernel.builder().build();
- // Load native skill
+ // Load native plugin
KernelPlugin functionCollection =
KernelPluginFactory.createFromObject(new StaticTextPlugin(), "text");
diff --git a/java/plugins/semantickernel-plugin-core/src/main/java/com/microsoft/semantickernel/plugins/text/TextPlugin.java b/java/plugins/semantickernel-plugin-core/src/main/java/com/microsoft/semantickernel/plugins/text/TextPlugin.java
index 7844a67e59..31b7965a28 100644
--- a/java/plugins/semantickernel-plugin-core/src/main/java/com/microsoft/semantickernel/plugins/text/TextPlugin.java
+++ b/java/plugins/semantickernel-plugin-core/src/main/java/com/microsoft/semantickernel/plugins/text/TextPlugin.java
@@ -6,7 +6,7 @@ import com.microsoft.semantickernel.plugin.annotations.KernelFunctionParameter;
import java.util.Locale;
/**
- * TextSkill provides a set of functions to manipulate strings.
+ * TextPlugin provides a set of functions to manipulate strings.
*/
public class TextPlugin {
diff --git a/java/samples/sample-code/src/main/java/com/microsoft/semantickernel/samples/plugins/TimePlugin.java b/java/samples/sample-code/src/main/java/com/microsoft/semantickernel/samples/plugins/TimePlugin.java
index 28155fa248..20cd62a6c8 100644
--- a/java/samples/sample-code/src/main/java/com/microsoft/semantickernel/samples/plugins/TimePlugin.java
+++ b/java/samples/sample-code/src/main/java/com/microsoft/semantickernel/samples/plugins/TimePlugin.java
@@ -11,49 +11,6 @@ import java.time.format.DateTimeFormatter;
import java.time.format.TextStyle;
import java.util.Locale;
-/**
- * Description: TimeSkill provides a set of functions to get the current time and date.
- *
- *
Usage: kernel.importSkill(new TimeSkill(), "time");
- *
- *
Examples:
- *
- *
{{time.date}} => Sunday, 12 January, 2031
- *
- *
{{time.today}} => Sunday, 12 January, 2031
- *
- *
{{time.now}} => Sunday, January 12, 2031 9:15 PM
- *
- *
{{time.utcNow}} => Sunday, January 13, 2031 5:15 AM
- *
- *
{{time.time}} => 09:15:07 PM
- *
- *
{{time.year}} => 2031
- *
- *
{{time.month}} => January
- *
- *
{{time.monthNumber}} => 01
- *
- *
{{time.day}} => 12
- *
- *
{{time.dayOfWeek}} => Sunday
- *
- *
{{time.hour}} => 9 PM
- *
- *
{{time.hourNumber}} => 21
- *
- *
{{time.days_ago $days}} => Sunday, 7 May, 2023
- *
- *
{{time.last_matching_day $dayName}} => Sunday, 7 May, 2023
- *
- *
{{time.minute}} => 15
- *
- *
{{time.second}} => 7
- *
- *
{{time.timeZoneOffset}} => -08:00
- *
- *
{{time.timeZoneName}} => Pacific Time
- */
public class TimePlugin {
public static final String DAY_MONTH_DAY_YEAR = "EEEE, MMMM d, yyyy";
diff --git a/java/samples/sample-code/src/main/java/com/microsoft/semantickernel/samples/syntaxexamples/Example01_NativeFunctions.java b/java/samples/sample-code/src/main/java/com/microsoft/semantickernel/samples/syntaxexamples/Example01_NativeFunctions.java
index 2b9d61d919..0bc76d4739 100644
--- a/java/samples/sample-code/src/main/java/com/microsoft/semantickernel/samples/syntaxexamples/Example01_NativeFunctions.java
+++ b/java/samples/sample-code/src/main/java/com/microsoft/semantickernel/samples/syntaxexamples/Example01_NativeFunctions.java
@@ -3,7 +3,7 @@ package com.microsoft.semantickernel.samples.syntaxexamples;
import com.microsoft.semantickernel.plugins.text.TextPlugin;
/**
- * Demonstrates a native function from the {@code com.microsoft.semantickernel.coreskills} package.
+ * Demonstrates a native function.
*/
public class Example01_NativeFunctions {
diff --git a/java/samples/sample-code/src/main/java/com/microsoft/semantickernel/samples/syntaxexamples/Example03_Arguments.java b/java/samples/sample-code/src/main/java/com/microsoft/semantickernel/samples/syntaxexamples/Example03_Arguments.java
index a437468b44..db20a93063 100644
--- a/java/samples/sample-code/src/main/java/com/microsoft/semantickernel/samples/syntaxexamples/Example03_Arguments.java
+++ b/java/samples/sample-code/src/main/java/com/microsoft/semantickernel/samples/syntaxexamples/Example03_Arguments.java
@@ -48,7 +48,7 @@ public class Example03_Arguments {
public static void main(String[] args) {
Kernel kernel = Kernel.builder().build();
- // Load native skill
+ // Load native plugin
KernelPlugin functionCollection =
KernelPluginFactory.createFromObject(new StaticTextPlugin(), "text");
diff --git a/java/samples/sample-code/src/main/java/com/microsoft/semantickernel/samples/syntaxexamples/Example13_ConversationSummaryPlugin.java b/java/samples/sample-code/src/main/java/com/microsoft/semantickernel/samples/syntaxexamples/Example13_ConversationSummaryPlugin.java
index cf056ffec4..03e0050522 100644
--- a/java/samples/sample-code/src/main/java/com/microsoft/semantickernel/samples/syntaxexamples/Example13_ConversationSummaryPlugin.java
+++ b/java/samples/sample-code/src/main/java/com/microsoft/semantickernel/samples/syntaxexamples/Example13_ConversationSummaryPlugin.java
@@ -19,7 +19,7 @@ import com.sun.jna.StringArray;
import reactor.core.publisher.Mono;
/**
- * Demonstrate the {@code com.microsoft.semantickernel.coreskills.ConversationSummarySkill}
+ * Demonstrate the {@see com.microsoft.semantickernel.samples.plugins.ConversationSummaryPlugin} plugin.
*
* Refer to the
diff --git a/java/semantickernel-api/src/main/ignore/java/com/microsoft/semantickernel/DefaultKernel.java b/java/semantickernel-api/src/main/ignore/java/com/microsoft/semantickernel/DefaultKernel.java
index c796cc9258..76fcb99466 100644
--- a/java/semantickernel-api/src/main/ignore/java/com/microsoft/semantickernel/DefaultKernel.java
+++ b/java/semantickernel-api/src/main/ignore/java/com/microsoft/semantickernel/DefaultKernel.java
@@ -109,7 +109,7 @@ public class DefaultKernel implements Kernel {
@Override
public CompletionKernelFunction registerSemanticFunction(
- String skillName, String functionName, SemanticFunctionConfig functionConfig) {
+ String pluginName, String functionName, SemanticFunctionConfig functionConfig) {
// Future-proofing the name not to contain special chars
// Verify.ValidSkillName(skillName);
// Verify.ValidFunctionName(functionName);
@@ -117,7 +117,7 @@ public class DefaultKernel implements Kernel {
return SKBuilders.completionFunctions()
.withSemanticFunctionConfig(functionConfig)
.withFunctionName(functionName)
- .withSkillName(skillName)
+ .withPluginName(pluginName)
.withKernel(this)
.build();
}
diff --git a/java/semantickernel-api/src/main/java/com/microsoft/semantickernel/orchestration/FunctionInvocation.java b/java/semantickernel-api/src/main/java/com/microsoft/semantickernel/orchestration/FunctionInvocation.java
index 2061d348cd..811578e3fe 100644
--- a/java/semantickernel-api/src/main/java/com/microsoft/semantickernel/orchestration/FunctionInvocation.java
+++ b/java/semantickernel-api/src/main/java/com/microsoft/semantickernel/orchestration/FunctionInvocation.java
@@ -9,6 +9,7 @@ import com.microsoft.semantickernel.orchestration.ToolCallBehavior.UnmodifiableT
import com.microsoft.semantickernel.orchestration.contextvariables.ContextVariable;
import com.microsoft.semantickernel.orchestration.contextvariables.ContextVariableType;
import com.microsoft.semantickernel.orchestration.contextvariables.ContextVariableTypes;
+import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
import java.util.function.BiConsumer;
import javax.annotation.Nullable;
import org.slf4j.Logger;
@@ -38,6 +39,7 @@ public class FunctionInvocation extends Mono> {
protected final ContextVariableTypes contextVariableTypes = new ContextVariableTypes();
+ @SuppressFBWarnings("EI_EXPOSE_REP2")
public FunctionInvocation(
Kernel kernel,
KernelFunction function) {
@@ -47,6 +49,7 @@ public class FunctionInvocation extends Mono> {
this.addKernelHooks(kernel.getGlobalKernelHooks());
}
+ @SuppressFBWarnings("EI_EXPOSE_REP2")
public FunctionInvocation(
Kernel kernel,
KernelFunction> function,
@@ -170,7 +173,7 @@ public class FunctionInvocation extends Mono> {
if (variableType == null) {
LOGGER.debug(
"No variable type explicitly specified by calling 'withResultType' for function invocation: "
- + function.getSkillName() + "." + function.getName() + "."
+ + function.getPluginName() + "." + function.getName() + "."
+ " This may cause a runtime error (probably a ClassCastException) if the result type is not compatible with the expected type.");
}
diff --git a/java/semantickernel-api/src/main/java/com/microsoft/semantickernel/orchestration/KernelFunction.java b/java/semantickernel-api/src/main/java/com/microsoft/semantickernel/orchestration/KernelFunction.java
index 052a876376..fc0a814607 100644
--- a/java/semantickernel-api/src/main/java/com/microsoft/semantickernel/orchestration/KernelFunction.java
+++ b/java/semantickernel-api/src/main/java/com/microsoft/semantickernel/orchestration/KernelFunction.java
@@ -53,9 +53,9 @@ public abstract class KernelFunction implements Buildable {
}
/**
- * @return The name of the skill that this function is within
+ * @return The name of the plugin that this function is within
*/
- public String getSkillName() {
+ public String getPluginName() {
return metadata.getName();
}
diff --git a/java/semantickernel-api/src/main/java/com/microsoft/semantickernel/orchestration/ToolCallBehavior.java b/java/semantickernel-api/src/main/java/com/microsoft/semantickernel/orchestration/ToolCallBehavior.java
index 326443688a..7b54ed206c 100644
--- a/java/semantickernel-api/src/main/java/com/microsoft/semantickernel/orchestration/ToolCallBehavior.java
+++ b/java/semantickernel-api/src/main/java/com/microsoft/semantickernel/orchestration/ToolCallBehavior.java
@@ -29,7 +29,7 @@ public class ToolCallBehavior {
}
static String getKey(KernelFunction function) {
- return getKey(function.getSkillName(), function.getName());
+ return getKey(function.getPluginName(), function.getName());
}
static String getKey(String skillName, String functionName) {
@@ -113,7 +113,7 @@ public class ToolCallBehavior {
public boolean functionRequired(KernelFunction function) {
if (function != null) {
- return functionRequired(function.getSkillName(), function.getName());
+ return functionRequired(function.getPluginName(), function.getName());
}
return false;
}
@@ -129,7 +129,7 @@ public class ToolCallBehavior {
public boolean functionEnabled(KernelFunction function) {
if (function != null) {
- return functionEnabled(function.getSkillName(), function.getName());
+ return functionEnabled(function.getPluginName(), function.getName());
}
return functionSettings.isEmpty();
}
diff --git a/java/semantickernel-api/src/main/java/com/microsoft/semantickernel/plugin/KernelPluginFactory.java b/java/semantickernel-api/src/main/java/com/microsoft/semantickernel/plugin/KernelPluginFactory.java
index fd19f354f7..5e6104f22d 100644
--- a/java/semantickernel-api/src/main/java/com/microsoft/semantickernel/plugin/KernelPluginFactory.java
+++ b/java/semantickernel-api/src/main/java/com/microsoft/semantickernel/plugin/KernelPluginFactory.java
@@ -299,7 +299,7 @@ public class KernelPluginFactory {
} catch (IOException e) {
LOGGER.error("Failed to read file " + promptFileName, e);
- throw new SKException("No Skills found in directory " + promptFileName);
+ throw new SKException("No plugins found in directory " + promptFileName);
}
}
diff --git a/java/semantickernel-api/src/main/java/com/microsoft/semantickernel/semanticfunctions/KernelFunctionFromMethod.java b/java/semantickernel-api/src/main/java/com/microsoft/semantickernel/semanticfunctions/KernelFunctionFromMethod.java
index 024cf7aea6..f322daf25e 100644
--- a/java/semantickernel-api/src/main/java/com/microsoft/semantickernel/semanticfunctions/KernelFunctionFromMethod.java
+++ b/java/semantickernel-api/src/main/java/com/microsoft/semantickernel/semanticfunctions/KernelFunctionFromMethod.java
@@ -212,7 +212,7 @@ public class KernelFunctionFromMethod extends KernelFunction {
if (!variableType.getClazz().isAssignableFrom(it.getClass())) {
throw new SKException(String.format(
"Return parameter type from %s.%s does not match the expected type %s",
- function.getSkillName(), function.getName(),
+ function.getPluginName(), function.getName(),
it.getClass().getName()));
}
return new FunctionResult<>(
@@ -244,7 +244,7 @@ public class KernelFunctionFromMethod extends KernelFunction {
// If we get here, then either the returnParameterType doesn't match T
throw new SKException(String.format(
"Return parameter type from %s.%s does not match the expected type %s",
- function.getSkillName(), function.getName(), it.getClass().getName()));
+ function.getPluginName(), function.getName(), it.getClass().getName()));
})
.map(it -> {
diff --git a/java/semantickernel-api/src/main/java/com/microsoft/semantickernel/semanticfunctions/KernelFunctionFromPrompt.java b/java/semantickernel-api/src/main/java/com/microsoft/semantickernel/semanticfunctions/KernelFunctionFromPrompt.java
index 51e8831b51..e9657be9b7 100644
--- a/java/semantickernel-api/src/main/java/com/microsoft/semantickernel/semanticfunctions/KernelFunctionFromPrompt.java
+++ b/java/semantickernel-api/src/main/java/com/microsoft/semantickernel/semanticfunctions/KernelFunctionFromPrompt.java
@@ -265,7 +265,7 @@ public class KernelFunctionFromPrompt extends KernelFunction {
"Something went wrong while rendering the semantic"
+ " function or while executing the text"
+ " completion. Function: {}.{}. Error: {}",
- getSkillName(),
+ getPluginName(),
getName(),
ex.getMessage());
diff --git a/java/semantickernel-api/src/main/java/com/microsoft/semantickernel/templateengine/handlebars/HandlebarsPromptTemplate.java b/java/semantickernel-api/src/main/java/com/microsoft/semantickernel/templateengine/handlebars/HandlebarsPromptTemplate.java
index 1babdd8466..e80877fe2d 100644
--- a/java/semantickernel-api/src/main/java/com/microsoft/semantickernel/templateengine/handlebars/HandlebarsPromptTemplate.java
+++ b/java/semantickernel-api/src/main/java/com/microsoft/semantickernel/templateengine/handlebars/HandlebarsPromptTemplate.java
@@ -16,7 +16,7 @@ import com.microsoft.semantickernel.plugin.KernelParameterMetadata;
import com.microsoft.semantickernel.plugin.KernelPlugin;
import com.microsoft.semantickernel.semanticfunctions.PromptTemplate;
import com.microsoft.semantickernel.semanticfunctions.PromptTemplateConfig;
-
+import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
@@ -27,11 +27,8 @@ import java.util.Locale;
import java.util.Map.Entry;
import java.util.Optional;
import java.util.Set;
-
import javax.annotation.Nonnull;
import javax.annotation.Nullable;
-
-import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
import reactor.core.publisher.Mono;
public class HandlebarsPromptTemplate implements PromptTemplate {
@@ -101,7 +98,7 @@ public class HandlebarsPromptTemplate implements PromptTemplate {
if (context instanceof KernelFunction) {
KernelFunction> function = (KernelFunction>) context;
if ("pluginname".equalsIgnoreCase(name)) {
- return function.getSkillName();
+ return function.getPluginName();
} else if ("name".equalsIgnoreCase(name)) {
return function.getName();
}
@@ -184,7 +181,7 @@ public class HandlebarsPromptTemplate implements PromptTemplate {
private static Handlebars.SafeString handleFunction(KernelFunction> context) {
KernelFunction> function = context;
- String pluginName = function.getSkillName();
+ String pluginName = function.getPluginName();
String functionName = function.getName();
String description = function.getDescription();
StringBuilder sb = new StringBuilder(
diff --git a/java/semantickernel-api/src/main/java/com/microsoft/semantickernel/templateengine/semantickernel/blocks/FunctionIdBlock.java b/java/semantickernel-api/src/main/java/com/microsoft/semantickernel/templateengine/semantickernel/blocks/FunctionIdBlock.java
index 81be9ad3a0..d58d8bf30e 100644
--- a/java/semantickernel-api/src/main/java/com/microsoft/semantickernel/templateengine/semantickernel/blocks/FunctionIdBlock.java
+++ b/java/semantickernel-api/src/main/java/com/microsoft/semantickernel/templateengine/semantickernel/blocks/FunctionIdBlock.java
@@ -16,7 +16,7 @@ public final class FunctionIdBlock extends Block implements TextRendering {
String[] functionNameParts = this.getContent().split("\\.", -1);
if (functionNameParts.length > 2) {
throw new RuntimeException(
- "A function name can contain at most one dot separating the skill name from the"
+ "A function name can contain at most one dot separating the plugin name from the"
+ " function name");
}
From 7e5c36f06ad178a417413f30941d7e77da0371cf Mon Sep 17 00:00:00 2001
From: John Oliver <1615532+johnoliver@users.noreply.github.com>
Date: Tue, 13 Feb 2024 12:07:48 +0000
Subject: [PATCH 2/4] Java: Add header to Java openai call (#4972)
### Motivation and Context
### Description
### Contribution Checklist
- [ ] The code builds clean without any errors or warnings
- [ ] The PR follows the [SK Contribution
Guidelines](https://github.com/microsoft/semantic-kernel/blob/main/CONTRIBUTING.md)
and the [pre-submission formatting
script](https://github.com/microsoft/semantic-kernel/blob/main/CONTRIBUTING.md#development-scripts)
raises no violations
- [ ] All unit tests pass, and I have added new tests where possible
- [ ] I didn't break anyone :smile:
---
java/aiservices/openai/pom.xml | 10 +++-
.../openai/OpenAIRequestSettings.java | 50 +++++++++++++++++++
.../chatcompletion/OpenAIChatCompletion.java | 12 ++++-
.../OpenAITextGenerationService.java | 13 ++++-
.../openai/semantic-kernel-version.properties | 1 +
5 files changed, 82 insertions(+), 4 deletions(-)
create mode 100644 java/aiservices/openai/src/main/java/com/microsoft/semantickernel/aiservices/openai/OpenAIRequestSettings.java
create mode 100644 java/aiservices/openai/src/main/resources/com/microsoft/semantickernel/aiservices/openai/semantic-kernel-version.properties
diff --git a/java/aiservices/openai/pom.xml b/java/aiservices/openai/pom.xml
index e73f63d790..3aa692f4aa 100644
--- a/java/aiservices/openai/pom.xml
+++ b/java/aiservices/openai/pom.xml
@@ -42,7 +42,15 @@
1.0-2
provided
-
+
+
+
+ src/main/resources
+ true
+
+
+
+
diff --git a/java/aiservices/openai/src/main/java/com/microsoft/semantickernel/aiservices/openai/OpenAIRequestSettings.java b/java/aiservices/openai/src/main/java/com/microsoft/semantickernel/aiservices/openai/OpenAIRequestSettings.java
new file mode 100644
index 0000000000..a1666fddc4
--- /dev/null
+++ b/java/aiservices/openai/src/main/java/com/microsoft/semantickernel/aiservices/openai/OpenAIRequestSettings.java
@@ -0,0 +1,50 @@
+package com.microsoft.semantickernel.aiservices.openai;
+
+import com.azure.core.http.HttpHeaderName;
+import com.azure.core.http.rest.RequestOptions;
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.Properties;
+import org.slf4j.Logger;
+
+public final class OpenAIRequestSettings {
+
+ private static final Logger LOGGER = org.slf4j.LoggerFactory.getLogger(
+ OpenAIRequestSettings.class);
+
+ private static final String SEMANTIC_KERNEL_VERSION_PROPERTY_NAME = "semantic-kernel.version";
+ private static final String SEMANTIC_KERNEL_VERSION_PROPERTIES_FILE = "semantic-kernel-version.properties";
+ private static final String version;
+
+
+ static {
+ version = loadVersion();
+ }
+
+ private static String loadVersion() {
+
+ String version = "Java/unknown";
+
+ try (InputStream settingsFile = OpenAIRequestSettings.class.getResourceAsStream(
+ SEMANTIC_KERNEL_VERSION_PROPERTIES_FILE)) {
+
+ Properties props = new Properties();
+ props.load(settingsFile);
+ if (props.containsKey(SEMANTIC_KERNEL_VERSION_PROPERTY_NAME)) {
+ String skVersion = props.getProperty(SEMANTIC_KERNEL_VERSION_PROPERTY_NAME);
+ if (skVersion != null && !skVersion.isEmpty()) {
+ return "Java/" + skVersion;
+ }
+ }
+ } catch (IOException e) {
+ //Ignore
+ LOGGER.trace("Failed to load Semantic Kernel version from properties file", e);
+ }
+ return version;
+ }
+
+ public static RequestOptions getRequestOptions() {
+ return new RequestOptions()
+ .setHeader(HttpHeaderName.fromString("Semantic-Kernel-Version"), version);
+ }
+}
diff --git a/java/aiservices/openai/src/main/java/com/microsoft/semantickernel/aiservices/openai/chatcompletion/OpenAIChatCompletion.java b/java/aiservices/openai/src/main/java/com/microsoft/semantickernel/aiservices/openai/chatcompletion/OpenAIChatCompletion.java
index 9d42a0212b..150e44084e 100644
--- a/java/aiservices/openai/src/main/java/com/microsoft/semantickernel/aiservices/openai/chatcompletion/OpenAIChatCompletion.java
+++ b/java/aiservices/openai/src/main/java/com/microsoft/semantickernel/aiservices/openai/chatcompletion/OpenAIChatCompletion.java
@@ -21,12 +21,14 @@ import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.microsoft.semantickernel.Kernel;
+import com.microsoft.semantickernel.aiservices.openai.OpenAIRequestSettings;
import com.microsoft.semantickernel.chatcompletion.AuthorRole;
import com.microsoft.semantickernel.chatcompletion.ChatCompletionService;
import com.microsoft.semantickernel.chatcompletion.ChatHistory;
import com.microsoft.semantickernel.chatcompletion.ChatMessageContent;
import com.microsoft.semantickernel.chatcompletion.StreamingChatMessageContent;
import com.microsoft.semantickernel.exceptions.AIException;
+import com.microsoft.semantickernel.exceptions.AIException.ErrorCodes;
import com.microsoft.semantickernel.exceptions.SKException;
import com.microsoft.semantickernel.hooks.KernelHooks;
import com.microsoft.semantickernel.hooks.PreChatCompletionEvent;
@@ -165,7 +167,15 @@ public class OpenAIChatCompletion implements ChatCompletionService {
.getOptions();
return client
- .getChatCompletions(getModelId(), options)
+ .getChatCompletionsWithResponse(getModelId(), options,
+ OpenAIRequestSettings.getRequestOptions())
+ .flatMap(completionsResult -> {
+ if (completionsResult.getStatusCode() >= 400) {
+ return Mono.error(new AIException(ErrorCodes.SERVICE_ERROR,
+ "Request failed: " + completionsResult.getStatusCode()));
+ }
+ return Mono.just(completionsResult.getValue());
+ })
.filter(choices -> choices.getChoices() != null && !choices.getChoices().isEmpty())
.map(this::accumulateResponses)
.map(responses ->
diff --git a/java/aiservices/openai/src/main/java/com/microsoft/semantickernel/aiservices/openai/textcompletion/OpenAITextGenerationService.java b/java/aiservices/openai/src/main/java/com/microsoft/semantickernel/aiservices/openai/textcompletion/OpenAITextGenerationService.java
index c0db75c824..96dedce0fb 100644
--- a/java/aiservices/openai/src/main/java/com/microsoft/semantickernel/aiservices/openai/textcompletion/OpenAITextGenerationService.java
+++ b/java/aiservices/openai/src/main/java/com/microsoft/semantickernel/aiservices/openai/textcompletion/OpenAITextGenerationService.java
@@ -4,7 +4,9 @@ import com.azure.ai.openai.OpenAIAsyncClient;
import com.azure.ai.openai.models.CompletionsOptions;
import com.azure.ai.openai.models.CompletionsUsage;
import com.microsoft.semantickernel.Kernel;
+import com.microsoft.semantickernel.aiservices.openai.OpenAIRequestSettings;
import com.microsoft.semantickernel.exceptions.AIException;
+import com.microsoft.semantickernel.exceptions.AIException.ErrorCodes;
import com.microsoft.semantickernel.orchestration.FunctionResultMetadata;
import com.microsoft.semantickernel.orchestration.PromptExecutionSettings;
import com.microsoft.semantickernel.orchestration.contextvariables.ContextVariable;
@@ -90,9 +92,16 @@ public class OpenAITextGenerationService implements TextGenerationService {
CompletionsOptions completionsOptions = getCompletionsOptions(text, requestSettings);
return client
- .getCompletions(getModelId(), completionsOptions)
+ .getCompletionsWithResponse(getModelId(), completionsOptions,
+ OpenAIRequestSettings.getRequestOptions())
+ .flatMap(completionsResult -> {
+ if (completionsResult.getStatusCode() >= 400) {
+ return Mono.error(new AIException(ErrorCodes.SERVICE_ERROR,
+ "Request failed: " + completionsResult.getStatusCode()));
+ }
+ return Mono.just(completionsResult.getValue());
+ })
.map(completions -> {
-
FunctionResultMetadata metadata = FunctionResultMetadata.build(
completions.getId(),
completions.getUsage(),
diff --git a/java/aiservices/openai/src/main/resources/com/microsoft/semantickernel/aiservices/openai/semantic-kernel-version.properties b/java/aiservices/openai/src/main/resources/com/microsoft/semantickernel/aiservices/openai/semantic-kernel-version.properties
new file mode 100644
index 0000000000..73220f4f85
--- /dev/null
+++ b/java/aiservices/openai/src/main/resources/com/microsoft/semantickernel/aiservices/openai/semantic-kernel-version.properties
@@ -0,0 +1 @@
+semantic-kernel.version=${project.version}
\ No newline at end of file
From 7d374d12a59567a814d16cd846b2bac87a8d2026 Mon Sep 17 00:00:00 2001
From: John Oliver <1615532+johnoliver@users.noreply.github.com>
Date: Tue, 13 Feb 2024 12:08:48 +0000
Subject: [PATCH 3/4] Java: Tidy poms (#4989)
### Motivation and Context
### Description
### Contribution Checklist
- [ ] The code builds clean without any errors or warnings
- [ ] The PR follows the [SK Contribution
Guidelines](https://github.com/microsoft/semantic-kernel/blob/main/CONTRIBUTING.md)
and the [pre-submission formatting
script](https://github.com/microsoft/semantic-kernel/blob/main/CONTRIBUTING.md#development-scripts)
raises no violations
- [ ] All unit tests pass, and I have added new tests where possible
- [ ] I didn't break anyone :smile:
---
java/aiservices/openai/pom.xml | 7 +-
java/api-test/integration-tests/pom.xml | 10 +--
java/api-test/pom.xml | 10 ++-
.../pom.xml | 12 ++--
.../semantickernel-plugin-core/pom.xml | 2 +-
java/pom.xml | 45 ++-----------
java/samples/pom.xml | 15 +++--
java/samples/sample-code/pom.xml | 8 +--
java/samples/sk-v1/01-SimpleChat/pom.xml | 4 +-
java/samples/sk-v1/02-PersonaChat/pom.xml | 4 +-
java/samples/sk-v1/03-SimpleRag/pom.xml | 4 +-
java/samples/sk-v1/04-DynamicRag/pom.xml | 2 +-
java/samples/sk-v1/05-MultiModal/pom.xml | 6 +-
java/samples/sk-v1/06-Assistants/pom.xml | 2 +-
java/samples/sk-v1/pom.xml | 15 +++--
java/semantickernel-api/pom.xml | 13 ++--
java/semantickernel-bom/pom.xml | 66 +++----------------
17 files changed, 76 insertions(+), 149 deletions(-)
diff --git a/java/aiservices/openai/pom.xml b/java/aiservices/openai/pom.xml
index 3aa692f4aa..0dd5a6b547 100644
--- a/java/aiservices/openai/pom.xml
+++ b/java/aiservices/openai/pom.xml
@@ -7,12 +7,12 @@
com.microsoft.semantic-kernel
semantickernel-parent
- 1.0.0-alpha.1-SNAPSHOT
+ 1.0.0-alpha.2-SNAPSHOT
../../pom.xml
- aiservices-openai
- OpenAI Services
+ semantickernel-aiservices-openai
+ Semantic Kernel OpenAI Services
OpenAI services for Semantic Kernel
@@ -39,7 +39,6 @@
javax.xml.stream
stax-api
- 1.0-2
provided
diff --git a/java/api-test/integration-tests/pom.xml b/java/api-test/integration-tests/pom.xml
index 443aaf6769..2de167c173 100644
--- a/java/api-test/integration-tests/pom.xml
+++ b/java/api-test/integration-tests/pom.xml
@@ -7,17 +7,18 @@
com.microsoft.semantic-kernel
api-test
- 1.0.0-alpha.1-SNAPSHOT
+ 1.0.0-alpha.2-SNAPSHOT
../pom.xml
+ Semantic Kernel Integration Tests
integration-tests
jar
com.microsoft.semantic-kernel
- sample-code
+ semantickernel-sample-code
${project.version}
test
@@ -56,11 +57,6 @@
semantickernel-api
test
-
- com.microsoft.semantic-kernel
- sample-code
- ${project.version}
-
org.xerial
diff --git a/java/api-test/pom.xml b/java/api-test/pom.xml
index d58fb677fd..e0ec35b229 100644
--- a/java/api-test/pom.xml
+++ b/java/api-test/pom.xml
@@ -7,10 +7,11 @@
com.microsoft.semantic-kernel
semantickernel-parent
- 1.0.0-alpha.1-SNAPSHOT
+ 1.0.0-alpha.2-SNAPSHOT
../pom.xml
+ Semantic Kernel Api Tests
api-test
pom
@@ -50,6 +51,13 @@
${maven.compiler.release}
+
+ org.apache.maven.plugins
+ maven-deploy-plugin
+
+ true
+
+
diff --git a/java/connectors/semantickernel-connectors-web-bing/pom.xml b/java/connectors/semantickernel-connectors-web-bing/pom.xml
index cd586071c2..4a9a76e4a9 100644
--- a/java/connectors/semantickernel-connectors-web-bing/pom.xml
+++ b/java/connectors/semantickernel-connectors-web-bing/pom.xml
@@ -1,12 +1,13 @@
-
+
4.0.0
com.microsoft.semantic-kernel
semantickernel-parent
- 1.0.0-alpha.1-SNAPSHOT
+ 1.0.0-alpha.2-SNAPSHOT
../../pom.xml
@@ -19,13 +20,8 @@
com.microsoft.semantic-kernel
semantickernel-api
- compile
- com.microsoft.semantic-kernel
- semantickernel-api
-
-
com.fasterxml.jackson.core
jackson-databind
compile
@@ -34,7 +30,7 @@
com.fasterxml.jackson.core
jackson-core
compile
-
+
diff --git a/java/plugins/semantickernel-plugin-core/pom.xml b/java/plugins/semantickernel-plugin-core/pom.xml
index d3ba36e213..2775027140 100644
--- a/java/plugins/semantickernel-plugin-core/pom.xml
+++ b/java/plugins/semantickernel-plugin-core/pom.xml
@@ -6,7 +6,7 @@
com.microsoft.semantic-kernel
semantickernel-parent
- 1.0.0-alpha.1-SNAPSHOT
+ 1.0.0-alpha.2-SNAPSHOT
../../pom.xml
diff --git a/java/pom.xml b/java/pom.xml
index 28c20ae658..8604e256ea 100644
--- a/java/pom.xml
+++ b/java/pom.xml
@@ -7,8 +7,9 @@
com.microsoft.semantic-kernel
semantickernel-parent
- 1.0.0-alpha.1-SNAPSHOT
+ 1.0.0-alpha.2-SNAPSHOT
pom
+
https://www.github.com/microsoft/semantic-kernel
Semantic Kernel Parent
Parent pom for the Semantic Kernel Project
@@ -65,25 +66,14 @@
+ semantickernel-bom
+
connectors/semantickernel-connectors-web-bing
-
-
-
-
-
-
-
-
aiservices/openai
-
-
-
-
plugins/semantickernel-plugin-core
- semantickernel-bom
semantickernel-api
@@ -403,17 +393,6 @@
-
-
-
@@ -619,9 +587,6 @@
17
17
-
bug-check
@@ -819,6 +784,6 @@
https://github.com/microsoft/semantic-kernel
scm:git:https://github.com/microsoft/semantic-kernel.git
scm:git:https://github.com/microsoft/semantic-kernel.git
- java-0.2.11-alpha
+ HEAD
diff --git a/java/samples/pom.xml b/java/samples/pom.xml
index ae72b8025c..7bc8da3587 100644
--- a/java/samples/pom.xml
+++ b/java/samples/pom.xml
@@ -5,19 +5,17 @@
com.microsoft.semantic-kernel
semantickernel-parent
- 1.0.0-alpha.1-SNAPSHOT
+ 1.0.0-alpha.2-SNAPSHOT
../pom.xml
- com.microsoft.semantic-kernel
- samples
- 1.0.0-alpha.1-SNAPSHOT
+ semantickernel-samples-parent
+ 1.0.0-alpha.2-SNAPSHOT
pom
Semantic Kernel Samples Parent
Parent pom for sample code for using the Semantic Kernel project
-
sk-v1
sample-code
@@ -104,6 +102,13 @@
true
+
+ org.apache.maven.plugins
+ maven-deploy-plugin
+
+ true
+
+
diff --git a/java/samples/sample-code/pom.xml b/java/samples/sample-code/pom.xml
index 6ccf417079..b8e182987b 100644
--- a/java/samples/sample-code/pom.xml
+++ b/java/samples/sample-code/pom.xml
@@ -4,12 +4,12 @@
4.0.0
com.microsoft.semantic-kernel
- samples
- 1.0.0-alpha.1-SNAPSHOT
+ semantickernel-samples-parent
+ 1.0.0-alpha.2-SNAPSHOT
../pom.xml
- sample-code
+ semantickernel-sample-code
Semantic Kernel Samples
Sample code for using the Semantic Kernel project
jar
@@ -71,7 +71,7 @@
com.microsoft.semantic-kernel
- aiservices-openai
+ semantickernel-aiservices-openai
diff --git a/java/samples/sk-v1/01-SimpleChat/pom.xml b/java/samples/sk-v1/01-SimpleChat/pom.xml
index 5ec59bb19f..ac11a5bd0b 100644
--- a/java/samples/sk-v1/01-SimpleChat/pom.xml
+++ b/java/samples/sk-v1/01-SimpleChat/pom.xml
@@ -6,8 +6,8 @@
com.microsoft.semantic-kernel
- sk-v1-samples
- 1.0.0-alpha.1-SNAPSHOT
+ semantickernel-v1-samples
+ 1.0.0-alpha.2-SNAPSHOT
../pom.xml
diff --git a/java/samples/sk-v1/02-PersonaChat/pom.xml b/java/samples/sk-v1/02-PersonaChat/pom.xml
index fa1ec8ff3b..d94076f072 100644
--- a/java/samples/sk-v1/02-PersonaChat/pom.xml
+++ b/java/samples/sk-v1/02-PersonaChat/pom.xml
@@ -7,8 +7,8 @@
com.microsoft.semantic-kernel
- sk-v1-samples
- 1.0.0-alpha.1-SNAPSHOT
+ semantickernel-v1-samples
+ 1.0.0-alpha.2-SNAPSHOT
../pom.xml
diff --git a/java/samples/sk-v1/03-SimpleRag/pom.xml b/java/samples/sk-v1/03-SimpleRag/pom.xml
index 1a47d2bd3c..0403c77869 100644
--- a/java/samples/sk-v1/03-SimpleRag/pom.xml
+++ b/java/samples/sk-v1/03-SimpleRag/pom.xml
@@ -7,8 +7,8 @@
com.microsoft.semantic-kernel
- sk-v1-samples
- 1.0.0-alpha.1-SNAPSHOT
+ semantickernel-v1-samples
+ 1.0.0-alpha.2-SNAPSHOT
../pom.xml
diff --git a/java/samples/sk-v1/04-DynamicRag/pom.xml b/java/samples/sk-v1/04-DynamicRag/pom.xml
index a6cc1e8fc1..433b40cc33 100644
--- a/java/samples/sk-v1/04-DynamicRag/pom.xml
+++ b/java/samples/sk-v1/04-DynamicRag/pom.xml
@@ -7,7 +7,7 @@
com.microsoft.semantic-kernel
- sk-v1-samples
+ semantickernel-v1-samples
1.0.0-alpha.1-SNAPSHOT
../pom.xml
diff --git a/java/samples/sk-v1/05-MultiModal/pom.xml b/java/samples/sk-v1/05-MultiModal/pom.xml
index 2b8ad559a2..afcd106a10 100644
--- a/java/samples/sk-v1/05-MultiModal/pom.xml
+++ b/java/samples/sk-v1/05-MultiModal/pom.xml
@@ -7,7 +7,7 @@
com.microsoft.semantic-kernel
- sk-v1-samples
+ semantickernel-v1-samples
1.0.0-alpha.1-SNAPSHOT
../pom.xml
@@ -18,7 +18,7 @@
com.microsoft.semantic-kernel
- aiservices-openai
+ semantickernel-aiservices-openai
com.microsoft.semantic-kernel
@@ -30,7 +30,7 @@
com.microsoft.semantic-kernel
- aiservices-openai
+ semantickernel-aiservices-openai
com.microsoft.semantic-kernel
diff --git a/java/samples/sk-v1/06-Assistants/pom.xml b/java/samples/sk-v1/06-Assistants/pom.xml
index 1fed7623bf..e80ebd518a 100644
--- a/java/samples/sk-v1/06-Assistants/pom.xml
+++ b/java/samples/sk-v1/06-Assistants/pom.xml
@@ -7,7 +7,7 @@
com.microsoft.semantic-kernel
- sk-v1-samples
+ semantickernel-v1-samples
1.0.0-alpha.1-SNAPSHOT
../pom.xml
diff --git a/java/samples/sk-v1/pom.xml b/java/samples/sk-v1/pom.xml
index 6ba4918d4d..3ee6f22211 100644
--- a/java/samples/sk-v1/pom.xml
+++ b/java/samples/sk-v1/pom.xml
@@ -3,9 +3,14 @@
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0
- com.microsoft.semantic-kernel
- sk-v1-samples
- 1.0.0-alpha.1-SNAPSHOT
+
+ com.microsoft.semantic-kernel
+ semantickernel-samples-parent
+ 1.0.0-alpha.2-SNAPSHOT
+ ../pom.xml
+
+
+ semantickernel-v1-samples
Semantic Kernel version 1 Samples
Sample code for using the Semantic Kernel version 1 API
@@ -47,7 +52,7 @@
com.microsoft.semantic-kernel
- aiservices-openai
+ semantickernel-aiservices-openai
com.microsoft.semantic-kernel
@@ -59,7 +64,7 @@
com.microsoft.semantic-kernel
- aiservices-openai
+ semantickernel-aiservices-openai
com.azure
diff --git a/java/semantickernel-api/pom.xml b/java/semantickernel-api/pom.xml
index 456c7305a9..53476d750d 100644
--- a/java/semantickernel-api/pom.xml
+++ b/java/semantickernel-api/pom.xml
@@ -1,12 +1,13 @@
-
+
4.0.0
com.microsoft.semantic-kernel
semantickernel-parent
- 1.0.0-alpha.1-SNAPSHOT
+ 1.0.0-alpha.2-SNAPSHOT
../pom.xml
@@ -50,6 +51,10 @@
jackson-dataformat-yaml
compile
+
+ com.github.spotbugs
+ spotbugs-annotations
+
org.mockito
@@ -66,9 +71,5 @@
junit-jupiter-api
test
-
- com.github.spotbugs
- spotbugs-annotations
-
\ No newline at end of file
diff --git a/java/semantickernel-bom/pom.xml b/java/semantickernel-bom/pom.xml
index 4961916361..20b0793855 100644
--- a/java/semantickernel-bom/pom.xml
+++ b/java/semantickernel-bom/pom.xml
@@ -1,11 +1,12 @@
-
+
4.0.0
com.microsoft.semantic-kernel
semantickernel-bom
- 1.0.0-alpha.1-SNAPSHOT
+ 1.0.0-alpha.2-SNAPSHOT
pom
Semantic Kernel Java BOM
@@ -48,19 +49,6 @@
semantickernel-api
${project.version}
-
-
com.microsoft.semantic-kernel
semantickernel-gpt3-tokenizer
@@ -76,28 +64,6 @@
semantickernel-connectors-web-bing
${project.version}
-
com.microsoft.semantic-kernel
aiservices-azureopenai
@@ -115,7 +81,7 @@
com.microsoft.semantic-kernel
- aiservices-openai
+ semantickernel-aiservices-openai
${project.version}
@@ -134,13 +100,6 @@
azure-identity
1.11.2
-
com.fasterxml.jackson.core
jackson-annotations
@@ -190,20 +149,13 @@
3.0.2
-
- org.xerial
- sqlite-jdbc
- 3.42.0.0
+ javax.xml.stream
+ stax-api
+ 1.0-2
+ provided
-
-
- org.postgresql
- postgresql
- 42.6.0
-
--->
-
From 6df0f5517c8aad681dd5e16b4c4bb5e5ba1147d0 Mon Sep 17 00:00:00 2001
From: John Oliver <1615532+johnoliver@users.noreply.github.com>
Date: Tue, 13 Feb 2024 21:21:48 +0000
Subject: [PATCH 4/4] Java: add a priority order to hook invocations. Remove
withInvocationContext (#5004)
### Motivation and Context
### Description
### Contribution Checklist
- [ ] The code builds clean without any errors or warnings
- [ ] The PR follows the [SK Contribution
Guidelines](https://github.com/microsoft/semantic-kernel/blob/main/CONTRIBUTING.md)
and the [pre-submission formatting
script](https://github.com/microsoft/semantic-kernel/blob/main/CONTRIBUTING.md#development-scripts)
raises no violations
- [ ] All unit tests pass, and I have added new tests where possible
- [ ] I didn't break anyone :smile:
---
.../semantickernel/hooks/KernelHook.java | 14 ++++++-
.../semantickernel/hooks/KernelHooks.java | 42 ++++++++++++-------
.../orchestration/FunctionInvocation.java | 13 ------
3 files changed, 39 insertions(+), 30 deletions(-)
diff --git a/java/semantickernel-api/src/main/java/com/microsoft/semantickernel/hooks/KernelHook.java b/java/semantickernel-api/src/main/java/com/microsoft/semantickernel/hooks/KernelHook.java
index 535727e391..be649fa47b 100644
--- a/java/semantickernel-api/src/main/java/com/microsoft/semantickernel/hooks/KernelHook.java
+++ b/java/semantickernel-api/src/main/java/com/microsoft/semantickernel/hooks/KernelHook.java
@@ -6,7 +6,19 @@ import java.util.List;
import java.util.function.Function;
import java.util.function.Predicate;
-public interface KernelHook extends Predicate, Function {
+public interface KernelHook extends Predicate,
+ Function {
+
+ /**
+ * The priority of the hook. The default priority is 50. The priority is used to determine the
+ * order in which hooks that accept the same event type are executed, lower priorities are executed first. No ordering is
+ * guaranteed for hooks with the same priority.
+ *
+ * @return the priority of the hook
+ */
+ default int getPriority() {
+ return 50;
+ }
interface FunctionInvokingHook extends KernelHook {
diff --git a/java/semantickernel-api/src/main/java/com/microsoft/semantickernel/hooks/KernelHooks.java b/java/semantickernel-api/src/main/java/com/microsoft/semantickernel/hooks/KernelHooks.java
index e7cd3f931e..f47bb7fbcd 100644
--- a/java/semantickernel-api/src/main/java/com/microsoft/semantickernel/hooks/KernelHooks.java
+++ b/java/semantickernel-api/src/main/java/com/microsoft/semantickernel/hooks/KernelHooks.java
@@ -1,18 +1,19 @@
package com.microsoft.semantickernel.hooks;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.UUID;
-import java.util.function.Function;
-
-import javax.annotation.Nullable;
-
import com.microsoft.semantickernel.hooks.KernelHook.FunctionInvokedHook;
import com.microsoft.semantickernel.hooks.KernelHook.FunctionInvokingHook;
import com.microsoft.semantickernel.hooks.KernelHook.PreChatCompletionHook;
import com.microsoft.semantickernel.hooks.KernelHook.PromptRenderedHook;
import com.microsoft.semantickernel.hooks.KernelHook.PromptRenderingHook;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.SortedSet;
+import java.util.TreeSet;
+import java.util.UUID;
+import java.util.function.Function;
+import javax.annotation.Nullable;
public class KernelHooks {
@@ -37,7 +38,7 @@ public class KernelHooks {
public UnmodifiableKernelHooks unmodifiableClone() {
return new UnmodifiableKernelHooks(this);
}
-
+
private Map> getHooks() {
return Collections.unmodifiableMap(hooks);
}
@@ -69,7 +70,11 @@ public class KernelHooks {
@SuppressWarnings("unchecked")
public T executeHooks(T event) {
- for (KernelHook> hook : hooks.values()) {
+ SortedSet> hooks = new TreeSet<>(Comparator.comparingInt(KernelHook::getPriority));
+
+ hooks.addAll(this.hooks.values());
+
+ for (KernelHook> hook : hooks) {
if (hook.test(event)) {
// unchecked cast
event = ((KernelHook) hook).apply(event);
@@ -110,33 +115,38 @@ public class KernelHooks {
}
public static class UnmodifiableKernelHooks extends KernelHooks {
-
+
private UnmodifiableKernelHooks(KernelHooks kernelHooks) {
super(kernelHooks);
}
@Override
- public String addFunctionInvokingHook(Function function) {
+ public String addFunctionInvokingHook(
+ Function function) {
throw new UnsupportedOperationException("unmodifiable instance of KernelHooks");
}
@Override
- public String addFunctionInvokedHook(Function, FunctionInvokedEvent>> function) {
+ public String addFunctionInvokedHook(
+ Function, FunctionInvokedEvent>> function) {
throw new UnsupportedOperationException("unmodifiable instance of KernelHooks");
}
@Override
- public String addPreChatCompletionHook(Function function) {
+ public String addPreChatCompletionHook(
+ Function function) {
throw new UnsupportedOperationException("unmodifiable instance of KernelHooks");
}
@Override
- public String addPromptRenderedHook(Function function) {
+ public String addPromptRenderedHook(
+ Function function) {
throw new UnsupportedOperationException("unmodifiable instance of KernelHooks");
}
@Override
- public String addPromptRenderingHook(Function function) {
+ public String addPromptRenderingHook(
+ Function function) {
throw new UnsupportedOperationException("unmodifiable instance of KernelHooks");
}
diff --git a/java/semantickernel-api/src/main/java/com/microsoft/semantickernel/orchestration/FunctionInvocation.java b/java/semantickernel-api/src/main/java/com/microsoft/semantickernel/orchestration/FunctionInvocation.java
index 811578e3fe..d52b50840f 100644
--- a/java/semantickernel-api/src/main/java/com/microsoft/semantickernel/orchestration/FunctionInvocation.java
+++ b/java/semantickernel-api/src/main/java/com/microsoft/semantickernel/orchestration/FunctionInvocation.java
@@ -129,19 +129,6 @@ public class FunctionInvocation extends Mono> {
return this;
}
- public FunctionInvocation withInvocationContext(
- @Nullable InvocationContext invocationContext) {
- if (invocationContext == null) {
- return this;
- }
- withTypes(invocationContext.getContextVariableTypes());
- withToolCallBehavior(invocationContext.getToolCallBehavior());
- withPromptExecutionSettings(invocationContext.getPromptExecutionSettings());
- addKernelHooks(invocationContext.getKernelHooks());
- return this;
- }
-
-
@Override
public void subscribe(CoreSubscriber super FunctionResult> coreSubscriber) {
performSubscribe(