diff --git a/agents/semantickernel-agents-core/pom.xml b/agents/semantickernel-agents-core/pom.xml
index 1270d00d0..e237c85a8 100644
--- a/agents/semantickernel-agents-core/pom.xml
+++ b/agents/semantickernel-agents-core/pom.xml
@@ -4,7 +4,7 @@
com.microsoft.semantic-kernel
semantickernel-parent
- 1.4.4-RC3-SNAPSHOT
+ 1.4.5-SNAPSHOT
../../pom.xml
diff --git a/aiservices/google/pom.xml b/aiservices/google/pom.xml
index 145ee5494..abe67c86f 100644
--- a/aiservices/google/pom.xml
+++ b/aiservices/google/pom.xml
@@ -4,7 +4,7 @@
com.microsoft.semantic-kernel
semantickernel-parent
- 1.4.4-RC3-SNAPSHOT
+ 1.4.5-SNAPSHOT
../../pom.xml
@@ -17,7 +17,7 @@
com.google.cloud
libraries-bom
- 26.49.0
+ 26.80.0
pom
import
diff --git a/aiservices/huggingface/pom.xml b/aiservices/huggingface/pom.xml
index 152aba546..139c98a9d 100644
--- a/aiservices/huggingface/pom.xml
+++ b/aiservices/huggingface/pom.xml
@@ -6,7 +6,7 @@
com.microsoft.semantic-kernel
semantickernel-parent
- 1.4.4-RC3-SNAPSHOT
+ 1.4.5-SNAPSHOT
../../pom.xml
diff --git a/aiservices/huggingface/src/main/java/com/microsoft/semantickernel/aiservices/huggingface/services/HuggingFacePromptExecutionSettings.java b/aiservices/huggingface/src/main/java/com/microsoft/semantickernel/aiservices/huggingface/services/HuggingFacePromptExecutionSettings.java
index adcabe7c4..ac4f4c093 100644
--- a/aiservices/huggingface/src/main/java/com/microsoft/semantickernel/aiservices/huggingface/services/HuggingFacePromptExecutionSettings.java
+++ b/aiservices/huggingface/src/main/java/com/microsoft/semantickernel/aiservices/huggingface/services/HuggingFacePromptExecutionSettings.java
@@ -47,7 +47,8 @@ public HuggingFacePromptExecutionSettings(PromptExecutionSettings copy) {
copy.getUser(),
copy.getStopSequences(),
copy.getTokenSelectionBiases(),
- copy.getResponseFormat() == null ? null : copy.getResponseFormat());
+ copy.getResponseFormat() == null ? null : copy.getResponseFormat(),
+ copy.getMaxCompletionTokens() == null ? null : copy.getMaxCompletionTokens().toString());
this.topK = null;
this.repetitionPenalty = null;
this.maxTime = null;
@@ -101,10 +102,12 @@ public HuggingFacePromptExecutionSettings(
@Nullable Boolean details,
@Nullable Boolean logProbs,
@Nullable Integer topLogProbs,
- @Nullable Long seed) {
+ @Nullable Long seed,
+ @Nullable Boolean maxCompletionTokensEnable) {
super(
serviceId, modelId, temperature, topP, presencePenalty, frequencyPenalty, maxTokens,
- resultsPerPrompt, bestOf, user, stopSequences, tokenSelectionBiases, responseFormat);
+ resultsPerPrompt, bestOf, user, stopSequences, tokenSelectionBiases, responseFormat,
+ Boolean.toString(Boolean.TRUE.equals(maxCompletionTokensEnable)));
this.topK = topK;
this.repetitionPenalty = repetitionPenalty;
@@ -151,6 +154,7 @@ public static HuggingFacePromptExecutionSettings fromExecutionSettings(
null,
null,
null,
+ null,
null);
}
diff --git a/aiservices/openai/pom.xml b/aiservices/openai/pom.xml
index 992629a43..96e01cd19 100644
--- a/aiservices/openai/pom.xml
+++ b/aiservices/openai/pom.xml
@@ -6,7 +6,7 @@
com.microsoft.semantic-kernel
semantickernel-parent
- 1.4.4-RC3-SNAPSHOT
+ 1.4.5-SNAPSHOT
../../pom.xml
diff --git a/aiservices/openai/src/main/java/com/microsoft/semantickernel/aiservices/openai/chatcompletion/OpenAIChatCompletion.java b/aiservices/openai/src/main/java/com/microsoft/semantickernel/aiservices/openai/chatcompletion/OpenAIChatCompletion.java
index 8256bb002..8f0ebaf20 100644
--- a/aiservices/openai/src/main/java/com/microsoft/semantickernel/aiservices/openai/chatcompletion/OpenAIChatCompletion.java
+++ b/aiservices/openai/src/main/java/com/microsoft/semantickernel/aiservices/openai/chatcompletion/OpenAIChatCompletion.java
@@ -65,8 +65,8 @@
import com.microsoft.semantickernel.orchestration.ToolCallBehavior;
import com.microsoft.semantickernel.orchestration.responseformat.JsonResponseSchema;
import com.microsoft.semantickernel.orchestration.responseformat.JsonSchemaResponseFormat;
-import com.microsoft.semantickernel.semanticfunctions.KernelFunction;
import com.microsoft.semantickernel.semanticfunctions.KernelArguments;
+import com.microsoft.semantickernel.semanticfunctions.KernelFunction;
import com.microsoft.semantickernel.services.chatcompletion.AuthorRole;
import com.microsoft.semantickernel.services.chatcompletion.ChatCompletionService;
import com.microsoft.semantickernel.services.chatcompletion.ChatHistory;
@@ -149,7 +149,7 @@ public Mono>> getChatMessageContentsAsync(
if (invocationContext != null
&& invocationContext
- .returnMode() == InvocationReturnMode.LAST_MESSAGE_ONLY) {
+ .returnMode() == InvocationReturnMode.LAST_MESSAGE_ONLY) {
chatHistoryResult = new ChatHistory(
Collections.singletonList(
CollectionUtil.getLastOrNull(chatHistoryResult.getMessages())));
@@ -183,7 +183,7 @@ public Mono>> getChatMessageContentsAsync(
if (invocationContext != null
&& invocationContext
- .returnMode() == InvocationReturnMode.LAST_MESSAGE_ONLY) {
+ .returnMode() == InvocationReturnMode.LAST_MESSAGE_ONLY) {
result = new ChatHistory(
Collections.singletonList(
CollectionUtil.getLastOrNull(result.getMessages())));
@@ -443,31 +443,31 @@ private Mono internalChatMessageContentsAsync(
.getOptions();
return Mono.deferContextual(contextView -> {
- ChatCompletionSpan span = ChatCompletionSpan.startChatCompletionSpan(
- SemanticKernelTelemetry.getTelemetry(invocationContext),
- contextView,
- getModelId(),
- SemanticKernelTelemetry.OPEN_AI_PROVIDER,
- options.getMaxTokens(),
- options.getTemperature(),
- options.getTopP());
-
- return getClient()
- .getChatCompletionsWithResponse(getDeploymentName(), options,
- OpenAIRequestSettings.getRequestOptions())
- .contextWrite(span.getReactorContextModifier())
- .flatMap(completionsResult -> {
- if (completionsResult.getStatusCode() >= 400) {
- return Mono.error(new AIException(ErrorCodes.SERVICE_ERROR,
- "Request failed: " + completionsResult.getStatusCode()));
- }
+ ChatCompletionSpan span = ChatCompletionSpan.startChatCompletionSpan(
+ SemanticKernelTelemetry.getTelemetry(invocationContext),
+ contextView,
+ getModelId(),
+ SemanticKernelTelemetry.OPEN_AI_PROVIDER,
+ options.getMaxTokens(),
+ options.getTemperature(),
+ options.getTopP());
+
+ return getClient()
+ .getChatCompletionsWithResponse(getDeploymentName(), options,
+ OpenAIRequestSettings.getRequestOptions())
+ .contextWrite(span.getReactorContextModifier())
+ .flatMap(completionsResult -> {
+ if (completionsResult.getStatusCode() >= 400) {
+ return Mono.error(new AIException(ErrorCodes.SERVICE_ERROR,
+ "Request failed: " + completionsResult.getStatusCode()));
+ }
- return Mono.just(completionsResult.getValue());
- })
- .doOnError(span::endSpanWithError)
- .doOnSuccess(span::endSpanWithUsage)
- .doOnTerminate(span::close);
- })
+ return Mono.just(completionsResult.getValue());
+ })
+ .doOnError(span::endSpanWithError)
+ .doOnSuccess(span::endSpanWithUsage)
+ .doOnTerminate(span::close);
+ })
.flatMap(completions -> {
List responseMessages = completions
.getChoices()
@@ -920,7 +920,8 @@ private static ChatCompletionsOptions getCompletionsOptions(
}
Map logit = null;
- if (promptExecutionSettings.getTokenSelectionBiases() != null) {
+ if (promptExecutionSettings.getTokenSelectionBiases() != null
+ && !promptExecutionSettings.getTokenSelectionBiases().isEmpty()) {
logit = promptExecutionSettings
.getTokenSelectionBiases()
.entrySet()
@@ -937,12 +938,13 @@ private static ChatCompletionsOptions getCompletionsOptions(
.setFrequencyPenalty(promptExecutionSettings.getFrequencyPenalty())
.setPresencePenalty(promptExecutionSettings.getPresencePenalty())
.setMaxTokens(promptExecutionSettings.getMaxTokens())
+ .setMaxCompletionTokens(promptExecutionSettings.getMaxCompletionTokens())
.setN(promptExecutionSettings.getResultsPerPrompt())
// Azure OpenAI WithData API does not allow to send empty array of stop sequences
// Gives back "Validation error at #/stop/str: Input should be a valid string\nValidation error at #/stop/list[str]: List should have at least 1 item after validation, not 0"
.setStop(promptExecutionSettings.getStopSequences() == null
|| promptExecutionSettings.getStopSequences().isEmpty() ? null
- : promptExecutionSettings.getStopSequences())
+ : promptExecutionSettings.getStopSequences())
.setUser(promptExecutionSettings.getUser())
.setLogitBias(logit);
@@ -1147,7 +1149,7 @@ private static OpenAIToolCallConfig getToolCallBehaviorConfig(
toolChoice,
toolCallBehavior.isAutoInvokeAllowed()
&& requestIndex < Math.min(MAXIMUM_INFLIGHT_AUTO_INVOKES,
- toolCallBehavior.getMaximumAutoInvokeAttempts()),
+ toolCallBehavior.getMaximumAutoInvokeAttempts()),
null);
}
@@ -1262,11 +1264,11 @@ private static ChatRequestAssistantMessage formAssistantMessage(
String args = arguments != null && !arguments.isEmpty()
? arguments.entrySet().stream()
- .map(entry -> String.format("\"%s\": \"%s\"",
- StringEscapeUtils.escapeJson(entry.getKey()),
- StringEscapeUtils.escapeJson(
- entry.getValue().toPromptString())))
- .collect(Collectors.joining(",", "{", "}"))
+ .map(entry -> String.format("\"%s\": \"%s\"",
+ StringEscapeUtils.escapeJson(entry.getKey()),
+ StringEscapeUtils.escapeJson(
+ entry.getValue().toPromptString())))
+ .collect(Collectors.joining(",", "{", "}"))
: "{}";
String prefix = "";
diff --git a/aiservices/openai/src/main/java/com/microsoft/semantickernel/aiservices/openai/chatcompletion/OpenAIFunction.java b/aiservices/openai/src/main/java/com/microsoft/semantickernel/aiservices/openai/chatcompletion/OpenAIFunction.java
index cf126d095..4ef550c23 100644
--- a/aiservices/openai/src/main/java/com/microsoft/semantickernel/aiservices/openai/chatcompletion/OpenAIFunction.java
+++ b/aiservices/openai/src/main/java/com/microsoft/semantickernel/aiservices/openai/chatcompletion/OpenAIFunction.java
@@ -7,22 +7,20 @@
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
-import com.microsoft.semantickernel.exceptions.SKException;
import com.microsoft.semantickernel.orchestration.responseformat.ResponseSchemaGenerator;
+import com.microsoft.semantickernel.plugin.KernelPluginFactory;
import com.microsoft.semantickernel.semanticfunctions.InputVariable;
import com.microsoft.semantickernel.semanticfunctions.KernelFunctionMetadata;
-import org.apache.commons.lang3.StringUtils;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Locale;
import java.util.Map;
-import java.util.Objects;
-import java.util.concurrent.ConcurrentHashMap;
import java.util.stream.Collectors;
import javax.annotation.Nonnull;
import javax.annotation.Nullable;
+import org.apache.commons.lang3.StringUtils;
class OpenAIFunction {
@@ -229,14 +227,9 @@ private static String getJavaTypeToOpenAiFunctionType(String javaType) {
}
private static String getObjectSchema(String type, String description) {
- String schema = "{ \"type\" : \"object\" }";
- try {
- Class> clazz = Class.forName(type);
- schema = ResponseSchemaGenerator.jacksonGenerator().generateSchema(clazz);
+ Class> clazz = KernelPluginFactory.getTypeForName(type);
+ String schema = ResponseSchemaGenerator.jacksonGenerator().generateSchema(clazz);
- } catch (ClassNotFoundException | SKException ignored) {
-
- }
Map properties = BinaryData.fromString(schema).toObject(Map.class);
if (StringUtils.isNotBlank(description)) {
properties.put("description", description);
diff --git a/api-test/integration-tests/pom.xml b/api-test/integration-tests/pom.xml
index 862cc5184..c919de195 100644
--- a/api-test/integration-tests/pom.xml
+++ b/api-test/integration-tests/pom.xml
@@ -6,7 +6,7 @@
com.microsoft.semantic-kernel
api-test
- 1.4.4-RC3-SNAPSHOT
+ 1.4.5-SNAPSHOT
../pom.xml
@@ -90,18 +90,18 @@
com.mysql
mysql-connector-j
- 9.0.0
+ 9.6.0
test
org.postgresql
postgresql
- 42.7.3
+ 42.7.10
org.xerial
sqlite-jdbc
- 3.46.1.0
+ 3.53.0.0
@@ -122,7 +122,7 @@
com.redis
testcontainers-redis
- 2.2.2
+ 2.2.4
test
@@ -147,7 +147,12 @@
org.hsqldb
hsqldb
- 2.7.3
+ 2.7.4
+ test
+
+
+ com.microsoft.semantic-kernel
+ semantickernel-api-data
test
@@ -157,7 +162,7 @@
org.testcontainers
testcontainers-bom
- 1.18.3
+ 2.0.4
pom
import
diff --git a/api-test/integration-tests/src/test/java/com/microsoft/semantickernel/tests/ImportingMultiplePluginsTest.java b/api-test/integration-tests/src/test/java/com/microsoft/semantickernel/tests/ImportingMultiplePluginsTest.java
index a555937ed..e9e5c6d4a 100644
--- a/api-test/integration-tests/src/test/java/com/microsoft/semantickernel/tests/ImportingMultiplePluginsTest.java
+++ b/api-test/integration-tests/src/test/java/com/microsoft/semantickernel/tests/ImportingMultiplePluginsTest.java
@@ -4,7 +4,6 @@
import com.microsoft.semantickernel.Kernel;
import com.microsoft.semantickernel.plugin.KernelPlugin;
import com.microsoft.semantickernel.plugin.KernelPluginFactory;
-import org.junit.Ignore;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Disabled;
import org.junit.jupiter.api.Test;
diff --git a/api-test/integration-tests/src/test/java/com/microsoft/semantickernel/tests/data/redis/Hotel.java b/api-test/integration-tests/src/test/java/com/microsoft/semantickernel/tests/data/redis/Hotel.java
index 416e06b66..46083425a 100644
--- a/api-test/integration-tests/src/test/java/com/microsoft/semantickernel/tests/data/redis/Hotel.java
+++ b/api-test/integration-tests/src/test/java/com/microsoft/semantickernel/tests/data/redis/Hotel.java
@@ -18,11 +18,11 @@ public class Hotel {
@VectorStoreRecordData(isFilterable = true)
private final String name;
- @VectorStoreRecordData
+ @VectorStoreRecordData(isFilterable = true)
private final int code;
@JsonProperty("summary")
- @VectorStoreRecordData()
+ @VectorStoreRecordData(isFilterable = true)
private final String description;
@JsonProperty("summaryEmbedding1")
diff --git a/api-test/integration-tests/src/test/java/com/microsoft/semantickernel/tests/data/redis/RedisHashSetVectorStoreRecordCollectionTest.java b/api-test/integration-tests/src/test/java/com/microsoft/semantickernel/tests/data/redis/RedisHashSetVectorStoreRecordCollectionTest.java
index c5b6a186f..6bfebb8d7 100644
--- a/api-test/integration-tests/src/test/java/com/microsoft/semantickernel/tests/data/redis/RedisHashSetVectorStoreRecordCollectionTest.java
+++ b/api-test/integration-tests/src/test/java/com/microsoft/semantickernel/tests/data/redis/RedisHashSetVectorStoreRecordCollectionTest.java
@@ -53,56 +53,56 @@ public enum RecordCollectionOptions {
@BeforeAll
static void setup() {
optionsMap.put(RecordCollectionOptions.DEFAULT, RedisHashSetVectorStoreRecordCollectionOptions.builder()
- .withRecordClass(Hotel.class)
- .build());
+ .withRecordClass(Hotel.class)
+ .build());
List fields = new ArrayList<>();
fields.add(VectorStoreRecordKeyField.builder()
- .withName("id")
- .withFieldType(String.class)
- .build());
+ .withName("id")
+ .withFieldType(String.class)
+ .build());
fields.add(VectorStoreRecordDataField.builder()
- .withName("name")
- .withFieldType(String.class)
- .build());
+ .withName("name")
+ .withFieldType(String.class)
+ .build());
fields.add(VectorStoreRecordDataField.builder()
- .withName("code")
- .withFieldType(Integer.class)
- .build());
+ .withName("code")
+ .withFieldType(Integer.class)
+ .build());
fields.add(VectorStoreRecordDataField.builder()
- .withName("description")
- .withStorageName("summary")
- .withFieldType(String.class)
- .build());
+ .withName("description")
+ .withStorageName("summary")
+ .withFieldType(String.class)
+ .build());
fields.add(VectorStoreRecordVectorField.builder()
- .withName("euclidean")
- .withStorageName("summaryEmbedding1")
- .withFieldType(List.class)
- .withDimensions(8)
- .build());
+ .withName("euclidean")
+ .withStorageName("summaryEmbedding1")
+ .withFieldType(List.class)
+ .withDimensions(8)
+ .build());
fields.add(VectorStoreRecordVectorField.builder()
- .withName("cosineDistance")
- .withStorageName("summaryEmbedding2")
- .withFieldType(List.class)
- .withDimensions(8)
- .build());
+ .withName("cosineDistance")
+ .withStorageName("summaryEmbedding2")
+ .withFieldType(List.class)
+ .withDimensions(8)
+ .build());
fields.add(VectorStoreRecordVectorField.builder()
- .withName("dotProduct")
- .withStorageName("summaryEmbedding3")
- .withFieldType(List.class)
- .withDimensions(8)
- .build());
+ .withName("dotProduct")
+ .withStorageName("summaryEmbedding3")
+ .withFieldType(List.class)
+ .withDimensions(8)
+ .build());
fields.add(VectorStoreRecordDataField.builder()
- .withName("rating")
- .withFieldType(Double.class)
- .isFilterable(true)
- .build());
+ .withName("rating")
+ .withFieldType(Double.class)
+ .isFilterable(true)
+ .build());
VectorStoreRecordDefinition recordDefinition = VectorStoreRecordDefinition.fromFields(fields);
optionsMap.put(RecordCollectionOptions.WITH_CUSTOM_DEFINITION, RedisHashSetVectorStoreRecordCollectionOptions.builder()
- .withRecordClass(Hotel.class)
- .withRecordDefinition(recordDefinition)
- .build());
+ .withRecordClass(Hotel.class)
+ .withRecordDefinition(recordDefinition)
+ .build());
// Search configuration
List hotels = getHotels();
@@ -127,20 +127,20 @@ static void setup() {
private static RedisHashSetVectorStoreRecordCollection createCollection(@Nonnull RedisHashSetVectorStoreRecordCollectionOptions options, @Nonnull String collectionName) {
return new RedisHashSetVectorStoreRecordCollection<>(new JedisPooled(redisContainer.getRedisURI()), collectionName, RedisHashSetVectorStoreRecordCollectionOptions.builder()
- .withRecordClass(options.getRecordClass())
- .withVectorStoreRecordMapper(options.getVectorStoreRecordMapper())
- .withRecordDefinition(options.getRecordDefinition())
- .withPrefixCollectionName(options.isPrefixCollectionName())
- .build());
+ .withRecordClass(options.getRecordClass())
+ .withVectorStoreRecordMapper(options.getVectorStoreRecordMapper())
+ .withRecordDefinition(options.getRecordDefinition())
+ .withPrefixCollectionName(options.isPrefixCollectionName())
+ .build());
}
private static List getHotels() {
return Arrays.asList(
- new Hotel("id_1", "Hotel 1", 1, "Hotel 1 description", Arrays.asList(0.5f, 3.2f, 7.1f, -4.0f, 2.8f, 10.0f, -1.3f, 5.5f),null, null, 4.0),
- new Hotel("id_2", "Hotel 2", 2, "Hotel 2 description", Arrays.asList(-2.0f, 8.1f, 0.9f, 5.4f, -3.3f, 2.2f, 9.9f, -4.5f),null, null, 4.0),
- new Hotel("id_3", "Hotel 3", 3, "Hotel 3 description", Arrays.asList(4.5f, -6.2f, 3.1f, 7.7f, -0.8f, 1.1f, -2.2f, 8.3f),null, null, 5.0),
- new Hotel("id_4", "Hotel 4", 4, "Hotel 4 description", Arrays.asList(7.0f, 1.2f, -5.3f, 2.5f, 6.6f, -7.8f, 3.9f, -0.1f),null, null, 4.0),
- new Hotel("id_5", "Hotel 5", 5, "Hotel 5 description", Arrays.asList(-3.5f, 4.4f, -1.2f, 9.9f, 5.7f, -6.1f, 7.8f, -2.0f),null, null, 4.0)
+ new Hotel("id_1", "Hotel 1", 1, "Hotel 1 description", Arrays.asList(0.5f, 3.2f, 7.1f, -4.0f, 2.8f, 10.0f, -1.3f, 5.5f),null, null, 4.0),
+ new Hotel("id_2", "Hotel 2", 2, "Hotel 2 description", Arrays.asList(-2.0f, 8.1f, 0.9f, 5.4f, -3.3f, 2.2f, 9.9f, -4.5f),null, null, 4.0),
+ new Hotel("id_3", "Hotel 3", 3, "Hotel 3 description", Arrays.asList(4.5f, -6.2f, 3.1f, 7.7f, -0.8f, 1.1f, -2.2f, 8.3f),null, null, 5.0),
+ new Hotel("id_4", "Hotel 4", 4, "Hotel 4 description", Arrays.asList(7.0f, 1.2f, -5.3f, 2.5f, 6.6f, -7.8f, 3.9f, -0.1f),null, null, 4.0),
+ new Hotel("id_5", "Hotel 5", 5, "Hotel 5 description", Arrays.asList(-3.5f, 4.4f, -1.2f, 9.9f, 5.7f, -6.1f, 7.8f, -2.0f),null, null, 4.0)
);
}
@@ -362,12 +362,12 @@ public void getBatchAsyncWithNoVectors(RecordCollectionOptions options) {
private static Stream provideSearchParameters() {
return Stream.of(
- Arguments.of(RecordCollectionOptions.DEFAULT, "euclidean"),
- Arguments.of(RecordCollectionOptions.DEFAULT, "cosineDistance"),
- Arguments.of(RecordCollectionOptions.DEFAULT, "dotProduct"),
- Arguments.of(RecordCollectionOptions.WITH_CUSTOM_DEFINITION, "euclidean"),
- Arguments.of(RecordCollectionOptions.WITH_CUSTOM_DEFINITION, "cosineDistance"),
- Arguments.of(RecordCollectionOptions.WITH_CUSTOM_DEFINITION, "dotProduct")
+ Arguments.of(RecordCollectionOptions.DEFAULT, "euclidean"),
+ Arguments.of(RecordCollectionOptions.DEFAULT, "cosineDistance"),
+ Arguments.of(RecordCollectionOptions.DEFAULT, "dotProduct"),
+ Arguments.of(RecordCollectionOptions.WITH_CUSTOM_DEFINITION, "euclidean"),
+ Arguments.of(RecordCollectionOptions.WITH_CUSTOM_DEFINITION, "cosineDistance"),
+ Arguments.of(RecordCollectionOptions.WITH_CUSTOM_DEFINITION, "dotProduct")
);
}
@@ -383,8 +383,8 @@ public void search(RecordCollectionOptions options, String embeddingName) {
recordCollection.upsertBatchAsync(hotels, null).block();
VectorSearchOptions searchOptions = VectorSearchOptions.builder()
- .withVectorFieldName(embeddingName)
- .build();
+ .withVectorFieldName(embeddingName)
+ .build();
// Embeddings similar to the third hotel
List> results = recordCollection.searchAsync(SEARCH_EMBEDDINGS, searchOptions).block().getResults();
@@ -407,9 +407,9 @@ public void searchWithVectors(RecordCollectionOptions options, String embeddingN
recordCollection.upsertBatchAsync(hotels, null).block();
VectorSearchOptions searchOptions = VectorSearchOptions.builder()
- .withVectorFieldName(embeddingName)
- .withIncludeVectors(true)
- .build();
+ .withVectorFieldName(embeddingName)
+ .withIncludeVectors(true)
+ .build();
// Embeddings similar to the third hotel
List> results = recordCollection.searchAsync(SEARCH_EMBEDDINGS, searchOptions).block().getResults();
@@ -430,10 +430,10 @@ public void searchWithOffSet(RecordCollectionOptions options, String embeddingNa
recordCollection.upsertBatchAsync(hotels, null).block();
VectorSearchOptions searchOptions = VectorSearchOptions.builder()
- .withVectorFieldName(embeddingName)
- .withSkip(1)
- .withTop(4)
- .build();
+ .withVectorFieldName(embeddingName)
+ .withSkip(1)
+ .withTop(4)
+ .build();
// Embeddings similar to the third hotel
List> results = recordCollection.searchAsync(SEARCH_EMBEDDINGS, searchOptions).block().getResults();
@@ -453,16 +453,16 @@ public void searchWithFilterEqualToFilter(RecordCollectionOptions recordCollecti
recordCollection.upsertBatchAsync(hotels, null).block();
VectorSearchOptions options = VectorSearchOptions.builder()
- .withVectorFieldName(embeddingName)
- .withTop(3)
- .withVectorSearchFilter(
- VectorSearchFilter.builder()
- .equalTo("rating", 4.0).build())
- .build();
+ .withVectorFieldName(embeddingName)
+ .withTop(3)
+ .withVectorSearchFilter(
+ VectorSearchFilter.builder()
+ .equalTo("rating", 4.0).build())
+ .build();
// Embeddings similar to the third hotel, but as the filter is set to 4.0, the third hotel should not be returned
List> results = recordCollection.searchAsync(SEARCH_EMBEDDINGS,
- options).block().getResults();
+ options).block().getResults();
assertNotNull(results);
assertEquals(3, results.size());
// The first hotel should be the most similar
diff --git a/api-test/integration-tests/src/test/java/com/microsoft/semantickernel/tests/data/redis/RedisJsonVectorStoreRecordCollectionTest.java b/api-test/integration-tests/src/test/java/com/microsoft/semantickernel/tests/data/redis/RedisJsonVectorStoreRecordCollectionTest.java
index 1b4c30e82..1190e4377 100644
--- a/api-test/integration-tests/src/test/java/com/microsoft/semantickernel/tests/data/redis/RedisJsonVectorStoreRecordCollectionTest.java
+++ b/api-test/integration-tests/src/test/java/com/microsoft/semantickernel/tests/data/redis/RedisJsonVectorStoreRecordCollectionTest.java
@@ -53,56 +53,56 @@ public enum RecordCollectionOptions {
@BeforeAll
static void setup() {
optionsMap.put(RecordCollectionOptions.DEFAULT, RedisJsonVectorStoreRecordCollectionOptions.builder()
- .withRecordClass(Hotel.class)
- .build());
+ .withRecordClass(Hotel.class)
+ .build());
List fields = new ArrayList<>();
fields.add(VectorStoreRecordKeyField.builder()
- .withName("id")
- .withFieldType(String.class)
- .build());
+ .withName("id")
+ .withFieldType(String.class)
+ .build());
fields.add(VectorStoreRecordDataField.builder()
- .withName("name")
- .withFieldType(String.class)
- .build());
+ .withName("name")
+ .withFieldType(String.class)
+ .build());
fields.add(VectorStoreRecordDataField.builder()
- .withName("code")
- .withFieldType(Integer.class)
- .build());
+ .withName("code")
+ .withFieldType(Integer.class)
+ .build());
fields.add(VectorStoreRecordDataField.builder()
- .withName("description")
- .withStorageName("summary")
- .withFieldType(String.class)
- .build());
+ .withName("description")
+ .withStorageName("summary")
+ .withFieldType(String.class)
+ .build());
fields.add(VectorStoreRecordVectorField.builder()
- .withName("euclidean")
- .withStorageName("summaryEmbedding1")
- .withFieldType(List.class)
- .withDimensions(8)
- .build());
+ .withName("euclidean")
+ .withStorageName("summaryEmbedding1")
+ .withFieldType(List.class)
+ .withDimensions(8)
+ .build());
fields.add(VectorStoreRecordVectorField.builder()
- .withName("cosineDistance")
- .withStorageName("summaryEmbedding2")
- .withFieldType(List.class)
- .withDimensions(8)
- .build());
+ .withName("cosineDistance")
+ .withStorageName("summaryEmbedding2")
+ .withFieldType(List.class)
+ .withDimensions(8)
+ .build());
fields.add(VectorStoreRecordVectorField.builder()
- .withName("dotProduct")
- .withStorageName("summaryEmbedding3")
- .withFieldType(List.class)
- .withDimensions(8)
- .build());
+ .withName("dotProduct")
+ .withStorageName("summaryEmbedding3")
+ .withFieldType(List.class)
+ .withDimensions(8)
+ .build());
fields.add(VectorStoreRecordDataField.builder()
- .withName("rating")
- .withFieldType(Double.class)
- .isFilterable(true)
- .build());
+ .withName("rating")
+ .withFieldType(Double.class)
+ .isFilterable(true)
+ .build());
VectorStoreRecordDefinition recordDefinition = VectorStoreRecordDefinition.fromFields(fields);
optionsMap.put(RecordCollectionOptions.WITH_CUSTOM_DEFINITION, RedisJsonVectorStoreRecordCollectionOptions.builder()
- .withRecordClass(Hotel.class)
- .withRecordDefinition(recordDefinition)
- .build());
+ .withRecordClass(Hotel.class)
+ .withRecordDefinition(recordDefinition)
+ .build());
// Search configuration
List hotels = getHotels();
@@ -127,20 +127,20 @@ static void setup() {
private static RedisJsonVectorStoreRecordCollection createCollection(@Nonnull RedisJsonVectorStoreRecordCollectionOptions options, @Nonnull String collectionName) {
return new RedisJsonVectorStoreRecordCollection<>(new JedisPooled(redisContainer.getRedisURI()), collectionName, RedisJsonVectorStoreRecordCollectionOptions.builder()
- .withRecordClass(options.getRecordClass())
- .withVectorStoreRecordMapper(options.getVectorStoreRecordMapper())
- .withRecordDefinition(options.getRecordDefinition())
- .withPrefixCollectionName(options.isPrefixCollectionName())
- .build());
+ .withRecordClass(options.getRecordClass())
+ .withVectorStoreRecordMapper(options.getVectorStoreRecordMapper())
+ .withRecordDefinition(options.getRecordDefinition())
+ .withPrefixCollectionName(options.isPrefixCollectionName())
+ .build());
}
private static List getHotels() {
return Arrays.asList(
- new Hotel("id_1", "Hotel 1", 1, "Hotel 1 description", Arrays.asList(0.5f, 3.2f, 7.1f, -4.0f, 2.8f, 10.0f, -1.3f, 5.5f),null, null, 4.0),
- new Hotel("id_2", "Hotel 2", 2, "Hotel 2 description", Arrays.asList(-2.0f, 8.1f, 0.9f, 5.4f, -3.3f, 2.2f, 9.9f, -4.5f),null, null, 4.0),
- new Hotel("id_3", "Hotel 3", 3, "Hotel 3 description", Arrays.asList(4.5f, -6.2f, 3.1f, 7.7f, -0.8f, 1.1f, -2.2f, 8.3f),null, null, 5.0),
- new Hotel("id_4", "Hotel 4", 4, "Hotel 4 description", Arrays.asList(7.0f, 1.2f, -5.3f, 2.5f, 6.6f, -7.8f, 3.9f, -0.1f),null, null, 4.0),
- new Hotel("id_5", "Hotel 5", 5, "Hotel 5 description", Arrays.asList(-3.5f, 4.4f, -1.2f, 9.9f, 5.7f, -6.1f, 7.8f, -2.0f),null, null, 4.0)
+ new Hotel("id_1", "Hotel 1", 1, "Hotel 1 description", Arrays.asList(0.5f, 3.2f, 7.1f, -4.0f, 2.8f, 10.0f, -1.3f, 5.5f),null, null, 4.0),
+ new Hotel("id_2", "Hotel 2", 2, "Hotel 2 description", Arrays.asList(-2.0f, 8.1f, 0.9f, 5.4f, -3.3f, 2.2f, 9.9f, -4.5f),null, null, 4.0),
+ new Hotel("id_3", "Hotel 3", 3, "Hotel 3 description", Arrays.asList(4.5f, -6.2f, 3.1f, 7.7f, -0.8f, 1.1f, -2.2f, 8.3f),null, null, 5.0),
+ new Hotel("id_4", "Hotel 4", 4, "Hotel 4 description", Arrays.asList(7.0f, 1.2f, -5.3f, 2.5f, 6.6f, -7.8f, 3.9f, -0.1f),null, null, 4.0),
+ new Hotel("id_5", "Hotel 5", 5, "Hotel 5 description", Arrays.asList(-3.5f, 4.4f, -1.2f, 9.9f, 5.7f, -6.1f, 7.8f, -2.0f),null, null, 4.0)
);
}
@@ -362,12 +362,12 @@ public void getBatchAsyncWithNoVectors(RecordCollectionOptions options) {
private static Stream provideSearchParameters() {
return Stream.of(
- Arguments.of(RecordCollectionOptions.DEFAULT, "euclidean"),
- Arguments.of(RecordCollectionOptions.DEFAULT, "cosineDistance"),
- Arguments.of(RecordCollectionOptions.DEFAULT, "dotProduct"),
- Arguments.of(RecordCollectionOptions.WITH_CUSTOM_DEFINITION, "euclidean"),
- Arguments.of(RecordCollectionOptions.WITH_CUSTOM_DEFINITION, "cosineDistance"),
- Arguments.of(RecordCollectionOptions.WITH_CUSTOM_DEFINITION, "dotProduct")
+ Arguments.of(RecordCollectionOptions.DEFAULT, "euclidean"),
+ Arguments.of(RecordCollectionOptions.DEFAULT, "cosineDistance"),
+ Arguments.of(RecordCollectionOptions.DEFAULT, "dotProduct"),
+ Arguments.of(RecordCollectionOptions.WITH_CUSTOM_DEFINITION, "euclidean"),
+ Arguments.of(RecordCollectionOptions.WITH_CUSTOM_DEFINITION, "cosineDistance"),
+ Arguments.of(RecordCollectionOptions.WITH_CUSTOM_DEFINITION, "dotProduct")
);
}
@@ -383,8 +383,8 @@ public void search(RecordCollectionOptions options, String embeddingName) {
recordCollection.upsertBatchAsync(hotels, null).block();
VectorSearchOptions searchOptions = VectorSearchOptions.builder()
- .withVectorFieldName(embeddingName)
- .build();
+ .withVectorFieldName(embeddingName)
+ .build();
// Embeddings similar to the third hotel
List> results = recordCollection.searchAsync(SEARCH_EMBEDDINGS, searchOptions).block().getResults();
@@ -407,9 +407,9 @@ public void searchWithVectors(RecordCollectionOptions options, String embeddingN
recordCollection.upsertBatchAsync(hotels, null).block();
VectorSearchOptions searchOptions = VectorSearchOptions.builder()
- .withVectorFieldName(embeddingName)
- .withIncludeVectors(true)
- .build();
+ .withVectorFieldName(embeddingName)
+ .withIncludeVectors(true)
+ .build();
// Embeddings similar to the third hotel
List> results = recordCollection.searchAsync(SEARCH_EMBEDDINGS, searchOptions).block().getResults();
@@ -430,10 +430,10 @@ public void searchWithOffSet(RecordCollectionOptions options, String embeddingNa
recordCollection.upsertBatchAsync(hotels, null).block();
VectorSearchOptions searchOptions = VectorSearchOptions.builder()
- .withVectorFieldName(embeddingName)
- .withSkip(1)
- .withTop(4)
- .build();
+ .withVectorFieldName(embeddingName)
+ .withSkip(1)
+ .withTop(4)
+ .build();
// Embeddings similar to the third hotel
List> results = recordCollection.searchAsync(SEARCH_EMBEDDINGS, searchOptions).block().getResults();
diff --git a/api-test/pom.xml b/api-test/pom.xml
index 587dfe5b1..6b6e2ff60 100644
--- a/api-test/pom.xml
+++ b/api-test/pom.xml
@@ -6,7 +6,7 @@
com.microsoft.semantic-kernel
semantickernel-parent
- 1.4.4-RC3-SNAPSHOT
+ 1.4.5-SNAPSHOT
../pom.xml
diff --git a/data/semantickernel-data-azureaisearch/pom.xml b/data/semantickernel-data-azureaisearch/pom.xml
index e9db7daae..b7b30067d 100644
--- a/data/semantickernel-data-azureaisearch/pom.xml
+++ b/data/semantickernel-data-azureaisearch/pom.xml
@@ -1,10 +1,11 @@
-
+
4.0.0
com.microsoft.semantic-kernel
semantickernel-parent
- 1.4.4-RC3-SNAPSHOT
+ 1.4.5-SNAPSHOT
../../pom.xml
@@ -40,6 +41,23 @@
+
+
+
+ org.junit.jupiter
+ junit-jupiter
+ test
+
+
+ org.mockito
+ mockito-core
+ test
+
+
+ com.microsoft.semantic-kernel
+ semantickernel-api-builders
+ test
+
\ No newline at end of file
diff --git a/data/semantickernel-data-azureaisearch/src/main/java/com/microsoft/semantickernel/data/azureaisearch/AzureAISearchVectorStoreCollectionSearchMapping.java b/data/semantickernel-data-azureaisearch/src/main/java/com/microsoft/semantickernel/data/azureaisearch/AzureAISearchVectorStoreCollectionSearchMapping.java
index c31af301d..5d61f9817 100644
--- a/data/semantickernel-data-azureaisearch/src/main/java/com/microsoft/semantickernel/data/azureaisearch/AzureAISearchVectorStoreCollectionSearchMapping.java
+++ b/data/semantickernel-data-azureaisearch/src/main/java/com/microsoft/semantickernel/data/azureaisearch/AzureAISearchVectorStoreCollectionSearchMapping.java
@@ -57,11 +57,11 @@ public String getFilter(VectorSearchFilter vectorSearchFilter,
@Override
public String getEqualToFilter(EqualToFilterClause filterClause) {
- String fieldName = filterClause.getFieldName();
+ String fieldName = validateFieldName(filterClause.getFieldName());
Object value = filterClause.getValue();
if (value instanceof String) {
- return String.format("%s eq '%s'", fieldName, value);
+ return String.format("%s eq '%s'", fieldName, escapeSingleQuotes((String) value));
} else if (value instanceof Boolean) {
return String.format("%s eq %s", fieldName,
value.toString().toLowerCase());
@@ -86,7 +86,18 @@ public String getEqualToFilter(EqualToFilterClause filterClause) {
@Override
public String getAnyTagEqualToFilter(AnyTagEqualToFilterClause filterClause) {
- return String.format("%s/any(t: t eq '%s')", filterClause.getFieldName(),
- filterClause.getValue());
+ return String.format("%s/any(t: t eq '%s')", validateFieldName(filterClause.getFieldName()),
+ escapeSingleQuotes(filterClause.getValue().toString()));
+ }
+
+ private String validateFieldName(String fieldName) {
+ if (fieldName.matches("[a-zA-Z_][a-zA-Z0-9_]*")) {
+ return fieldName;
+ }
+ throw new SKException("Invalid field name: " + fieldName);
+ }
+
+ private String escapeSingleQuotes(String value) {
+ return value.replaceAll("'", "''");
}
}
diff --git a/data/semantickernel-data-hsqldb/pom.xml b/data/semantickernel-data-hsqldb/pom.xml
index 1cd331795..5296d116c 100644
--- a/data/semantickernel-data-hsqldb/pom.xml
+++ b/data/semantickernel-data-hsqldb/pom.xml
@@ -4,7 +4,7 @@
com.microsoft.semantic-kernel
semantickernel-parent
- 1.4.4-RC3-SNAPSHOT
+ 1.4.5-SNAPSHOT
../../pom.xml
diff --git a/data/semantickernel-data-hsqldb/src/main/java/com/microsoft/semantickernel/data/jdbc/hsqldb/HSQLDBVectorStoreQueryProvider.java b/data/semantickernel-data-hsqldb/src/main/java/com/microsoft/semantickernel/data/jdbc/hsqldb/HSQLDBVectorStoreQueryProvider.java
index 484313168..e105a20db 100644
--- a/data/semantickernel-data-hsqldb/src/main/java/com/microsoft/semantickernel/data/jdbc/hsqldb/HSQLDBVectorStoreQueryProvider.java
+++ b/data/semantickernel-data-hsqldb/src/main/java/com/microsoft/semantickernel/data/jdbc/hsqldb/HSQLDBVectorStoreQueryProvider.java
@@ -12,7 +12,6 @@
import com.microsoft.semantickernel.data.vectorstorage.options.UpsertRecordOptions;
import com.microsoft.semantickernel.exceptions.SKException;
import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
-
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
@@ -32,7 +31,6 @@ public class HSQLDBVectorStoreQueryProvider extends JDBCVectorStoreQueryProvider
private final ObjectMapper objectMapper;
- @SuppressFBWarnings("EI_EXPOSE_REP2")
private HSQLDBVectorStoreQueryProvider(
DataSource dataSource,
String collectionsTable,
diff --git a/data/semantickernel-data-jdbc/pom.xml b/data/semantickernel-data-jdbc/pom.xml
index 077d4da6c..68452053c 100644
--- a/data/semantickernel-data-jdbc/pom.xml
+++ b/data/semantickernel-data-jdbc/pom.xml
@@ -4,7 +4,7 @@
com.microsoft.semantic-kernel
semantickernel-parent
- 1.4.4-RC3-SNAPSHOT
+ 1.4.5-SNAPSHOT
../../pom.xml
@@ -66,17 +66,17 @@
org.postgresql
postgresql
- 42.7.7
+ 42.7.10
org.xerial
sqlite-jdbc
- 3.47.0.0
+ 3.53.0.0
com.oracle.database.jdbc
ojdbc11
- 23.7.0.25.01
+ 23.26.1.0.0
\ No newline at end of file
diff --git a/data/semantickernel-data-jdbc/src/main/java/com/microsoft/semantickernel/data/jdbc/JDBCVectorStoreQueryProvider.java b/data/semantickernel-data-jdbc/src/main/java/com/microsoft/semantickernel/data/jdbc/JDBCVectorStoreQueryProvider.java
index 2fcc2d5b7..3441ccfed 100644
--- a/data/semantickernel-data-jdbc/src/main/java/com/microsoft/semantickernel/data/jdbc/JDBCVectorStoreQueryProvider.java
+++ b/data/semantickernel-data-jdbc/src/main/java/com/microsoft/semantickernel/data/jdbc/JDBCVectorStoreQueryProvider.java
@@ -29,8 +29,6 @@
import java.util.HashMap;
import java.util.List;
import java.util.Map;
-import java.util.concurrent.locks.Lock;
-import java.util.concurrent.locks.ReentrantLock;
import java.util.stream.Collectors;
import java.util.stream.Stream;
import javax.annotation.Nonnull;
@@ -59,7 +57,6 @@ public class JDBCVectorStoreQueryProvider
private final Object dbCreationLock = new Object();
- @SuppressFBWarnings("EI_EXPOSE_REP2") // DataSource is not exposed
protected JDBCVectorStoreQueryProvider(
@Nonnull DataSource dataSource,
@Nonnull String collectionsTable,
@@ -102,8 +99,9 @@ protected JDBCVectorStoreQueryProvider(
* @param supportedDataTypes the supported data types
* @param supportedVectorTypes the supported vector types
*/
+ @SuppressFBWarnings("EI_EXPOSE_REP2")
public JDBCVectorStoreQueryProvider(
- @SuppressFBWarnings("EI_EXPOSE_REP2") @Nonnull DataSource dataSource,
+ @Nonnull DataSource dataSource,
@Nonnull String collectionsTable,
@Nonnull String prefixForCollectionTables,
@Nonnull Map, String> supportedKeyTypes,
diff --git a/data/semantickernel-data-jdbc/src/main/java/com/microsoft/semantickernel/data/jdbc/JDBCVectorStoreRecordCollection.java b/data/semantickernel-data-jdbc/src/main/java/com/microsoft/semantickernel/data/jdbc/JDBCVectorStoreRecordCollection.java
index 1d6b3e09b..fc421c2b0 100644
--- a/data/semantickernel-data-jdbc/src/main/java/com/microsoft/semantickernel/data/jdbc/JDBCVectorStoreRecordCollection.java
+++ b/data/semantickernel-data-jdbc/src/main/java/com/microsoft/semantickernel/data/jdbc/JDBCVectorStoreRecordCollection.java
@@ -46,7 +46,6 @@ public class JDBCVectorStoreRecordCollection
* @param collectionName the name of the collection
* @param options the options
*/
- @SuppressFBWarnings("EI_EXPOSE_REP2") // DataSource is not exposed
public JDBCVectorStoreRecordCollection(
@Nonnull DataSource dataSource,
@Nonnull String collectionName,
diff --git a/data/semantickernel-data-mysql/pom.xml b/data/semantickernel-data-mysql/pom.xml
index 3d6d40e6b..7826fd50c 100644
--- a/data/semantickernel-data-mysql/pom.xml
+++ b/data/semantickernel-data-mysql/pom.xml
@@ -4,7 +4,7 @@
com.microsoft.semantic-kernel
semantickernel-parent
- 1.4.4-RC3-SNAPSHOT
+ 1.4.5-SNAPSHOT
../../pom.xml
diff --git a/data/semantickernel-data-mysql/src/main/java/com/microsoft/semantickernel/data/jdbc/mysql/MySQLVectorStoreQueryProvider.java b/data/semantickernel-data-mysql/src/main/java/com/microsoft/semantickernel/data/jdbc/mysql/MySQLVectorStoreQueryProvider.java
index feb6dc4f3..1ff0f7068 100644
--- a/data/semantickernel-data-mysql/src/main/java/com/microsoft/semantickernel/data/jdbc/mysql/MySQLVectorStoreQueryProvider.java
+++ b/data/semantickernel-data-mysql/src/main/java/com/microsoft/semantickernel/data/jdbc/mysql/MySQLVectorStoreQueryProvider.java
@@ -13,14 +13,13 @@
import com.microsoft.semantickernel.data.vectorstorage.options.UpsertRecordOptions;
import com.microsoft.semantickernel.exceptions.SKException;
import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
-
-import javax.annotation.Nonnull;
-import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.List;
import java.util.stream.Collectors;
+import javax.annotation.Nonnull;
+import javax.sql.DataSource;
/**
* The MySQL vector store query provider.
@@ -32,7 +31,6 @@ public class MySQLVectorStoreQueryProvider extends
private final ObjectMapper objectMapper;
- @SuppressFBWarnings("EI_EXPOSE_REP2")
private MySQLVectorStoreQueryProvider(
@Nonnull DataSource dataSource,
@Nonnull String collectionsTable,
diff --git a/data/semantickernel-data-oracle/pom.xml b/data/semantickernel-data-oracle/pom.xml
index e2c934439..f8376c9c0 100644
--- a/data/semantickernel-data-oracle/pom.xml
+++ b/data/semantickernel-data-oracle/pom.xml
@@ -4,7 +4,7 @@
com.microsoft.semantic-kernel
semantickernel-parent
- 1.4.4-RC3-SNAPSHOT
+ 1.4.5-SNAPSHOT
../../pom.xml
@@ -61,12 +61,12 @@
com.oracle.database.jdbc
ojdbc11
- 23.7.0.25.01
+ 23.26.1.0.0
com.oracle.database.jdbc
ojdbc-provider-jackson-oson
- 1.0.4
+ 1.0.6
org.junit.jupiter
diff --git a/data/semantickernel-data-oracle/src/test/java/com/microsoft/semantickernel/data/jdbc/oracle/Hotel.java b/data/semantickernel-data-oracle/src/test/java/com/microsoft/semantickernel/data/jdbc/oracle/Hotel.java
index 0f93ff7f5..ef6ac824f 100644
--- a/data/semantickernel-data-oracle/src/test/java/com/microsoft/semantickernel/data/jdbc/oracle/Hotel.java
+++ b/data/semantickernel-data-oracle/src/test/java/com/microsoft/semantickernel/data/jdbc/oracle/Hotel.java
@@ -8,12 +8,8 @@
import com.microsoft.semantickernel.data.vectorstorage.annotations.VectorStoreRecordVector;
import com.microsoft.semantickernel.data.vectorstorage.definition.DistanceFunction;
import com.microsoft.semantickernel.data.vectorstorage.definition.IndexKind;
-
import java.util.List;
-import static com.fasterxml.jackson.annotation.JsonCreator.Mode.DELEGATING;
-import static com.fasterxml.jackson.annotation.JsonCreator.Mode.PROPERTIES;
-
public class Hotel {
@VectorStoreRecordKey
private final String id;
@@ -52,13 +48,8 @@ public class Hotel {
@VectorStoreRecordData
private double rating;
- @JsonCreator(mode = DELEGATING)
- public Hotel() {
- this(null, null, 0, 0d, null, null, null, null, null, null, 0.0);
- }
-
- @JsonCreator(mode = PROPERTIES)
- protected Hotel(
+ @JsonCreator
+ public Hotel(
@JsonProperty("id") String id,
@JsonProperty("name") String name,
@JsonProperty("code") int code,
diff --git a/data/semantickernel-data-postgres/pom.xml b/data/semantickernel-data-postgres/pom.xml
index 8f22241dc..5ed076d3a 100644
--- a/data/semantickernel-data-postgres/pom.xml
+++ b/data/semantickernel-data-postgres/pom.xml
@@ -4,7 +4,7 @@
com.microsoft.semantic-kernel
semantickernel-parent
- 1.4.4-RC3-SNAPSHOT
+ 1.4.5-SNAPSHOT
../../pom.xml
@@ -51,7 +51,7 @@
org.postgresql
postgresql
- 42.7.7
+ 42.7.10
\ No newline at end of file
diff --git a/data/semantickernel-data-postgres/src/main/java/com/microsoft/semantickernel/data/jdbc/postgres/PostgreSQLVectorStoreQueryProvider.java b/data/semantickernel-data-postgres/src/main/java/com/microsoft/semantickernel/data/jdbc/postgres/PostgreSQLVectorStoreQueryProvider.java
index 1f3273eb3..e65bb9eb1 100644
--- a/data/semantickernel-data-postgres/src/main/java/com/microsoft/semantickernel/data/jdbc/postgres/PostgreSQLVectorStoreQueryProvider.java
+++ b/data/semantickernel-data-postgres/src/main/java/com/microsoft/semantickernel/data/jdbc/postgres/PostgreSQLVectorStoreQueryProvider.java
@@ -4,10 +4,10 @@
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
-import com.microsoft.semantickernel.data.jdbc.JDBCVectorStoreQueryProvider;
-import com.microsoft.semantickernel.data.jdbc.SQLVectorStoreQueryProvider;
import com.microsoft.semantickernel.data.filter.AnyTagEqualToFilterClause;
import com.microsoft.semantickernel.data.filter.EqualToFilterClause;
+import com.microsoft.semantickernel.data.jdbc.JDBCVectorStoreQueryProvider;
+import com.microsoft.semantickernel.data.jdbc.SQLVectorStoreQueryProvider;
import com.microsoft.semantickernel.data.vectorsearch.VectorSearchFilter;
import com.microsoft.semantickernel.data.vectorsearch.VectorSearchResult;
import com.microsoft.semantickernel.data.vectorsearch.VectorSearchResults;
@@ -22,9 +22,6 @@
import com.microsoft.semantickernel.data.vectorstorage.options.VectorSearchOptions;
import com.microsoft.semantickernel.exceptions.SKException;
import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
-
-import javax.annotation.Nonnull;
-import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
@@ -38,6 +35,8 @@
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
+import javax.annotation.Nonnull;
+import javax.sql.DataSource;
/**
* The MySQL vector store query provider.
@@ -50,7 +49,6 @@ public class PostgreSQLVectorStoreQueryProvider extends
private final String prefixForCollectionTables;
private final ObjectMapper objectMapper;
- @SuppressFBWarnings("EI_EXPOSE_REP2")
private PostgreSQLVectorStoreQueryProvider(
@Nonnull DataSource dataSource,
@Nonnull String collectionsTable,
diff --git a/data/semantickernel-data-redis/pom.xml b/data/semantickernel-data-redis/pom.xml
index de2f60ee5..8dffac895 100644
--- a/data/semantickernel-data-redis/pom.xml
+++ b/data/semantickernel-data-redis/pom.xml
@@ -4,7 +4,7 @@
com.microsoft.semantic-kernel
semantickernel-parent
- 1.4.4-RC3-SNAPSHOT
+ 1.4.5-SNAPSHOT
../../pom.xml
@@ -70,6 +70,13 @@
redis.clients
jedis
+
+
+
+ org.junit.jupiter
+ junit-jupiter
+ test
+
\ No newline at end of file
diff --git a/data/semantickernel-data-redis/src/main/java/com/microsoft/semantickernel/data/redis/RedisVectorStoreCollectionSearchMapping.java b/data/semantickernel-data-redis/src/main/java/com/microsoft/semantickernel/data/redis/RedisVectorStoreCollectionSearchMapping.java
index f029f6787..7f7d31bcf 100644
--- a/data/semantickernel-data-redis/src/main/java/com/microsoft/semantickernel/data/redis/RedisVectorStoreCollectionSearchMapping.java
+++ b/data/semantickernel-data-redis/src/main/java/com/microsoft/semantickernel/data/redis/RedisVectorStoreCollectionSearchMapping.java
@@ -154,12 +154,12 @@ public String getFilter(VectorSearchFilter filter,
*/
@Override
public String getEqualToFilter(EqualToFilterClause filterClause) {
- String fieldName = filterClause.getFieldName();
+ String fieldName = validateFieldName(filterClause.getFieldName());
Object value = filterClause.getValue();
String formattedValue;
if (value instanceof String) {
- formattedValue = String.format("\"%s\"", value);
+ formattedValue = String.format("\"%s\"", escapeRedisString((String) value));
} else if (value instanceof Number) {
formattedValue = String.format("[%s %s]", value, value);
} else {
@@ -178,6 +178,19 @@ public String getEqualToFilter(EqualToFilterClause filterClause) {
*/
@Override
public String getAnyTagEqualToFilter(AnyTagEqualToFilterClause filterClause) {
- return String.format("@%s:\"%s\"", filterClause.getFieldName(), filterClause.getValue());
+ return String.format("@%s:\"%s\"",
+ validateFieldName(filterClause.getFieldName()),
+ escapeRedisString(filterClause.getValue().toString()));
+ }
+
+ private String validateFieldName(String fieldName) {
+ if (fieldName.matches("[a-zA-Z_][a-zA-Z0-9_]*")) {
+ return fieldName;
+ }
+ throw new SKException("Invalid field name: " + fieldName);
+ }
+
+ private String escapeRedisString(String searchString) {
+ return searchString.replaceAll("([,.<>{}\\[\\]\"':;!@#$%^&*()\\-+=~|\\\\/?\\s])", "\\\\$1");
}
}
diff --git a/data/semantickernel-data-sqlite/pom.xml b/data/semantickernel-data-sqlite/pom.xml
index fc4d80186..79a8b15a7 100644
--- a/data/semantickernel-data-sqlite/pom.xml
+++ b/data/semantickernel-data-sqlite/pom.xml
@@ -4,7 +4,7 @@
com.microsoft.semantic-kernel
semantickernel-parent
- 1.4.4-RC3-SNAPSHOT
+ 1.4.5-SNAPSHOT
../../pom.xml
@@ -52,7 +52,7 @@
org.xerial
sqlite-jdbc
- 3.47.0.0
+ 3.53.0.0
\ No newline at end of file
diff --git a/data/semantickernel-data-sqlite/src/main/java/com/microsoft/semantickernel/data/jdbc/sqlite/SQLiteVectorStoreQueryProvider.java b/data/semantickernel-data-sqlite/src/main/java/com/microsoft/semantickernel/data/jdbc/sqlite/SQLiteVectorStoreQueryProvider.java
index 57de12257..2d88702ee 100644
--- a/data/semantickernel-data-sqlite/src/main/java/com/microsoft/semantickernel/data/jdbc/sqlite/SQLiteVectorStoreQueryProvider.java
+++ b/data/semantickernel-data-sqlite/src/main/java/com/microsoft/semantickernel/data/jdbc/sqlite/SQLiteVectorStoreQueryProvider.java
@@ -13,13 +13,12 @@
import com.microsoft.semantickernel.data.vectorstorage.options.UpsertRecordOptions;
import com.microsoft.semantickernel.exceptions.SKException;
import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
-
-import javax.annotation.Nonnull;
-import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.List;
+import javax.annotation.Nonnull;
+import javax.sql.DataSource;
/**
* A query provider for a vector store in SQLite.
@@ -30,7 +29,6 @@ public class SQLiteVectorStoreQueryProvider extends
private final DataSource dataSource;
private final ObjectMapper objectMapper;
- @SuppressFBWarnings("EI_EXPOSE_REP2")
private SQLiteVectorStoreQueryProvider(
@Nonnull DataSource dataSource,
@Nonnull String collectionsTable,
diff --git a/pom.xml b/pom.xml
index 9a52016ca..cb089c6c9 100644
--- a/pom.xml
+++ b/pom.xml
@@ -6,7 +6,7 @@
com.microsoft.semantic-kernel
semantickernel-parent
- 1.4.4-RC3-SNAPSHOT
+ 1.4.5-SNAPSHOT
pom
https://www.github.com/microsoft/semantic-kernel
@@ -15,7 +15,7 @@
1.0.0-beta.16
- 10.18.2
+ 13.4.2
0.10.21
false
2.19.1
@@ -42,8 +42,7 @@
3.10.1
3.5.0
2.4.0
-
- 3.27.0
+ 3.28.0
3.8.0
0.16.1
3.1.1
@@ -59,12 +58,11 @@
2.17.1
5.14.2
0.9.1
-
- 7.22.0
+ 7.23.0
UTF-8
microsoft/semantic-kernel
git@github.com:${project.github.repository}.git
- 4.8.6
+ 4.9.8
@@ -203,13 +201,32 @@
org.wiremock
wiremock
- 3.9.2
+ 3.13.2
test
org.mockito
mockito-junit-jupiter
- 5.14.2
+ 5.23.0
+ test
+
+
+
+ org.testcontainers
+ junit-jupiter
+ 1.21.4
+ test
+
+
+ org.testcontainers
+ postgresql
+ 1.21.4
+ test
+
+
+ org.testcontainers
+ mysql
+ 1.21.4
test
diff --git a/samples/pom.xml b/samples/pom.xml
index d2bea638a..5dac1dfb8 100644
--- a/samples/pom.xml
+++ b/samples/pom.xml
@@ -4,7 +4,7 @@
com.microsoft.semantic-kernel
semantickernel-parent
- 1.4.4-RC3-SNAPSHOT
+ 1.4.5-SNAPSHOT
../pom.xml
diff --git a/samples/semantickernel-concepts/pom.xml b/samples/semantickernel-concepts/pom.xml
index 0b51d1255..bd7e73580 100644
--- a/samples/semantickernel-concepts/pom.xml
+++ b/samples/semantickernel-concepts/pom.xml
@@ -4,7 +4,7 @@
com.microsoft.semantic-kernel
semantickernel-samples-parent
- 1.4.4-RC3-SNAPSHOT
+ 1.4.5-SNAPSHOT
../pom.xml
diff --git a/samples/semantickernel-concepts/semantickernel-syntax-examples/pom.xml b/samples/semantickernel-concepts/semantickernel-syntax-examples/pom.xml
index bd5b298ce..55b6a06ee 100644
--- a/samples/semantickernel-concepts/semantickernel-syntax-examples/pom.xml
+++ b/samples/semantickernel-concepts/semantickernel-syntax-examples/pom.xml
@@ -4,7 +4,7 @@
com.microsoft.semantic-kernel
semantickernel-concepts
- 1.4.4-RC3-SNAPSHOT
+ 1.4.5-SNAPSHOT
../pom.xml
@@ -29,7 +29,7 @@
io.opentelemetry.instrumentation
opentelemetry-reactor-3.1
- 2.9.0-alpha
+ 2.26.1-alpha
com.microsoft.semantic-kernel
@@ -140,20 +140,20 @@
org.apache.pdfbox
pdfbox
- 3.0.3
+ 3.0.7
com.google.cloud
google-cloud-vertexai
- 1.6.0
+ 1.52.0
compile
com.mysql
mysql-connector-j
- 9.0.0
+ 9.6.0
com.github.victools
diff --git a/samples/semantickernel-concepts/semantickernel-syntax-examples/src/main/java/com/microsoft/semantickernel/samples/syntaxexamples/Example62_CustomAIServiceSelector.java b/samples/semantickernel-concepts/semantickernel-syntax-examples/src/main/java/com/microsoft/semantickernel/samples/syntaxexamples/Example62_CustomAIServiceSelector.java
index 5e01d13a2..c3ebd6a0f 100644
--- a/samples/semantickernel-concepts/semantickernel-syntax-examples/src/main/java/com/microsoft/semantickernel/samples/syntaxexamples/Example62_CustomAIServiceSelector.java
+++ b/samples/semantickernel-concepts/semantickernel-syntax-examples/src/main/java/com/microsoft/semantickernel/samples/syntaxexamples/Example62_CustomAIServiceSelector.java
@@ -50,7 +50,7 @@ public static void main(String[] args) {
var openAIChatCompletion = OpenAIChatCompletion.builder()
.withOpenAIAsyncClient(client)
.withServiceId("AzureOpenAIChat")
- .withModelId("gpt-35-turbo-2")
+ .withModelId("gpt-35-turbo")
.build();
var textGenerationService = TextGenerationService.builder()
diff --git a/samples/semantickernel-concepts/semantickernel-syntax-examples/src/main/java/com/microsoft/semantickernel/samples/syntaxexamples/chatcompletion/responseschema/Example_ChatWithResponseFormat.java b/samples/semantickernel-concepts/semantickernel-syntax-examples/src/main/java/com/microsoft/semantickernel/samples/syntaxexamples/chatcompletion/responseschema/Example_ChatWithResponseFormat.java
index 5d0aad36e..8a5d02334 100644
--- a/samples/semantickernel-concepts/semantickernel-syntax-examples/src/main/java/com/microsoft/semantickernel/samples/syntaxexamples/chatcompletion/responseschema/Example_ChatWithResponseFormat.java
+++ b/samples/semantickernel-concepts/semantickernel-syntax-examples/src/main/java/com/microsoft/semantickernel/samples/syntaxexamples/chatcompletion/responseschema/Example_ChatWithResponseFormat.java
@@ -55,6 +55,7 @@ public static void main(String[] args) throws InterruptedException, JsonProcessi
.setResponseFormat(Pet.class)
.setName("Pet")
.build())
+ .withMaxCompletionTokensEnable(true)
.build();
FunctionResult response = kernel
diff --git a/samples/semantickernel-concepts/semantickernel-syntax-examples/src/main/java/com/microsoft/semantickernel/samples/syntaxexamples/chatcompletion/responseschema/Example_ChatWithResponseFormatToolCall.java b/samples/semantickernel-concepts/semantickernel-syntax-examples/src/main/java/com/microsoft/semantickernel/samples/syntaxexamples/chatcompletion/responseschema/Example_ChatWithResponseFormatToolCall.java
index cd227ebd5..a3126eff5 100644
--- a/samples/semantickernel-concepts/semantickernel-syntax-examples/src/main/java/com/microsoft/semantickernel/samples/syntaxexamples/chatcompletion/responseschema/Example_ChatWithResponseFormatToolCall.java
+++ b/samples/semantickernel-concepts/semantickernel-syntax-examples/src/main/java/com/microsoft/semantickernel/samples/syntaxexamples/chatcompletion/responseschema/Example_ChatWithResponseFormatToolCall.java
@@ -58,6 +58,7 @@ public static void main(String[] args) throws InterruptedException, JsonProcessi
PromptExecutionSettings promptExecutionSettings = PromptExecutionSettings.builder()
.withJsonSchemaResponseFormat(Pet.class)
+ .withMaxCompletionTokensEnable(true)
.build();
FunctionResult response = kernel.invokePromptAsync("Get pet with id 1234")
diff --git a/samples/semantickernel-concepts/semantickernel-syntax-examples/src/main/java/com/microsoft/semantickernel/samples/syntaxexamples/functions/Example59_OpenAIFunctionCalling.java b/samples/semantickernel-concepts/semantickernel-syntax-examples/src/main/java/com/microsoft/semantickernel/samples/syntaxexamples/functions/Example59_OpenAIFunctionCalling.java
index e921bb784..d021caf88 100644
--- a/samples/semantickernel-concepts/semantickernel-syntax-examples/src/main/java/com/microsoft/semantickernel/samples/syntaxexamples/functions/Example59_OpenAIFunctionCalling.java
+++ b/samples/semantickernel-concepts/semantickernel-syntax-examples/src/main/java/com/microsoft/semantickernel/samples/syntaxexamples/functions/Example59_OpenAIFunctionCalling.java
@@ -39,7 +39,7 @@ public class Example59_OpenAIFunctionCalling {
// Only required if AZURE_CLIENT_KEY is set
private static final String CLIENT_ENDPOINT = System.getenv("CLIENT_ENDPOINT");
private static final String MODEL_ID = System.getenv()
- .getOrDefault("MODEL_ID", "gpt-4o");
+ .getOrDefault("MODEL_ID", "gpt-35-turbo");
// Define functions that can be called by the model
public static class HelperFunctions {
diff --git a/samples/semantickernel-demos/booking-agent-m365/pom.xml b/samples/semantickernel-demos/booking-agent-m365/pom.xml
index 60bc7ffbc..08b39c255 100644
--- a/samples/semantickernel-demos/booking-agent-m365/pom.xml
+++ b/samples/semantickernel-demos/booking-agent-m365/pom.xml
@@ -4,7 +4,7 @@
com.microsoft.semantic-kernel
semantickernel-demos
- 1.4.4-RC3-SNAPSHOT
+ 1.4.5-SNAPSHOT
../pom.xml
@@ -43,7 +43,7 @@
com.microsoft.graph
microsoft-graph
- 6.13.0
+ 6.62.0
diff --git a/samples/semantickernel-demos/pom.xml b/samples/semantickernel-demos/pom.xml
index c19477a7c..a37b5822a 100644
--- a/samples/semantickernel-demos/pom.xml
+++ b/samples/semantickernel-demos/pom.xml
@@ -4,7 +4,7 @@
com.microsoft.semantic-kernel
semantickernel-samples-parent
- 1.4.4-RC3-SNAPSHOT
+ 1.4.5-SNAPSHOT
../pom.xml
diff --git a/samples/semantickernel-demos/semantickernel-spring-starter/pom.xml b/samples/semantickernel-demos/semantickernel-spring-starter/pom.xml
index 8db11dcd1..b8656b4f6 100644
--- a/samples/semantickernel-demos/semantickernel-spring-starter/pom.xml
+++ b/samples/semantickernel-demos/semantickernel-spring-starter/pom.xml
@@ -4,7 +4,7 @@
com.microsoft.semantic-kernel
semantickernel-demos
- 1.4.4-RC3-SNAPSHOT
+ 1.4.5-SNAPSHOT
../pom.xml
@@ -31,40 +31,40 @@
org.springframework.boot
spring-boot-test
- 3.3.2
+ 4.1.0-M4
test
org.assertj
assertj-core
- 3.27.7
+ 4.0.0-M1
test
org.springframework.boot
spring-boot-autoconfigure
- 3.3.2
+ 4.1.0-M4
org.springframework.boot
spring-boot
- 3.3.11
+ 4.1.0-M4
org.springframework
spring-test
- 6.1.10
+ 7.0.6
test
com.azure
azure-identity
- 1.12.2
+ 1.18.2
org.junit.jupiter
junit-jupiter-api
- 5.10.3
+ 6.1.0-M1
test
diff --git a/samples/semantickernel-demos/sk-presidio-sample/pom.xml b/samples/semantickernel-demos/sk-presidio-sample/pom.xml
index 079b5af0f..974f4b5b3 100644
--- a/samples/semantickernel-demos/sk-presidio-sample/pom.xml
+++ b/samples/semantickernel-demos/sk-presidio-sample/pom.xml
@@ -4,7 +4,7 @@
com.microsoft.semantic-kernel
semantickernel-demos
- 1.4.4-RC3-SNAPSHOT
+ 1.4.5-SNAPSHOT
../pom.xml
diff --git a/samples/semantickernel-learn-resources/pom.xml b/samples/semantickernel-learn-resources/pom.xml
index 8d5130b22..f7ffcb6ac 100644
--- a/samples/semantickernel-learn-resources/pom.xml
+++ b/samples/semantickernel-learn-resources/pom.xml
@@ -4,7 +4,7 @@
com.microsoft.semantic-kernel
semantickernel-samples-parent
- 1.4.4-RC3-SNAPSHOT
+ 1.4.5-SNAPSHOT
../pom.xml
@@ -89,7 +89,7 @@
com.mysql
mysql-connector-j
- 9.0.0
+ 9.6.0
compile
diff --git a/samples/semantickernel-sample-plugins/pom.xml b/samples/semantickernel-sample-plugins/pom.xml
index 0abacea7f..893e5a0d4 100644
--- a/samples/semantickernel-sample-plugins/pom.xml
+++ b/samples/semantickernel-sample-plugins/pom.xml
@@ -4,7 +4,7 @@
com.microsoft.semantic-kernel
semantickernel-samples-parent
- 1.4.4-RC3-SNAPSHOT
+ 1.4.5-SNAPSHOT
../pom.xml
diff --git a/samples/semantickernel-sample-plugins/semantickernel-openapi-plugin/pom.xml b/samples/semantickernel-sample-plugins/semantickernel-openapi-plugin/pom.xml
index f0b576424..8785c2387 100644
--- a/samples/semantickernel-sample-plugins/semantickernel-openapi-plugin/pom.xml
+++ b/samples/semantickernel-sample-plugins/semantickernel-openapi-plugin/pom.xml
@@ -4,7 +4,7 @@
com.microsoft.semantic-kernel
semantickernel-sample-plugins
- 1.4.4-RC3-SNAPSHOT
+ 1.4.5-SNAPSHOT
../pom.xml
@@ -62,7 +62,7 @@
io.swagger.parser.v3
swagger-parser
- 2.1.22
+ 2.1.40
com.microsoft.semantic-kernel
diff --git a/samples/semantickernel-sample-plugins/semantickernel-presidio-plugin/pom.xml b/samples/semantickernel-sample-plugins/semantickernel-presidio-plugin/pom.xml
index 10326e6ea..30e912bb1 100644
--- a/samples/semantickernel-sample-plugins/semantickernel-presidio-plugin/pom.xml
+++ b/samples/semantickernel-sample-plugins/semantickernel-presidio-plugin/pom.xml
@@ -4,7 +4,7 @@
com.microsoft.semantic-kernel
semantickernel-sample-plugins
- 1.4.4-RC3-SNAPSHOT
+ 1.4.5-SNAPSHOT
../pom.xml
diff --git a/samples/semantickernel-sample-plugins/semantickernel-text-splitter-plugin/pom.xml b/samples/semantickernel-sample-plugins/semantickernel-text-splitter-plugin/pom.xml
index 1bf80430f..32eab45e6 100644
--- a/samples/semantickernel-sample-plugins/semantickernel-text-splitter-plugin/pom.xml
+++ b/samples/semantickernel-sample-plugins/semantickernel-text-splitter-plugin/pom.xml
@@ -4,7 +4,7 @@
com.microsoft.semantic-kernel
semantickernel-sample-plugins
- 1.4.4-RC3-SNAPSHOT
+ 1.4.5-SNAPSHOT
../pom.xml
diff --git a/semantickernel-api-ai-services/pom.xml b/semantickernel-api-ai-services/pom.xml
index 6187b56b4..3f3d7f611 100644
--- a/semantickernel-api-ai-services/pom.xml
+++ b/semantickernel-api-ai-services/pom.xml
@@ -4,7 +4,7 @@
com.microsoft.semantic-kernel
semantickernel-parent
- 1.4.4-RC3-SNAPSHOT
+ 1.4.5-SNAPSHOT
../pom.xml
diff --git a/semantickernel-api-builders/pom.xml b/semantickernel-api-builders/pom.xml
index be51b46f7..41bcd8d16 100644
--- a/semantickernel-api-builders/pom.xml
+++ b/semantickernel-api-builders/pom.xml
@@ -4,7 +4,7 @@
com.microsoft.semantic-kernel
semantickernel-parent
- 1.4.4-RC3-SNAPSHOT
+ 1.4.5-SNAPSHOT
com.microsoft.semantic-kernel
diff --git a/semantickernel-api-data/pom.xml b/semantickernel-api-data/pom.xml
index 13bd19931..972317a14 100644
--- a/semantickernel-api-data/pom.xml
+++ b/semantickernel-api-data/pom.xml
@@ -4,7 +4,7 @@
com.microsoft.semantic-kernel
semantickernel-parent
- 1.4.4-RC3-SNAPSHOT
+ 1.4.5-SNAPSHOT
../pom.xml
diff --git a/semantickernel-api-exceptions/pom.xml b/semantickernel-api-exceptions/pom.xml
index b07b001c0..a64467eca 100644
--- a/semantickernel-api-exceptions/pom.xml
+++ b/semantickernel-api-exceptions/pom.xml
@@ -4,7 +4,7 @@
com.microsoft.semantic-kernel
semantickernel-parent
- 1.4.4-RC3-SNAPSHOT
+ 1.4.5-SNAPSHOT
../pom.xml
diff --git a/semantickernel-api-localization/pom.xml b/semantickernel-api-localization/pom.xml
index f1c3c2467..3ea4a60bd 100644
--- a/semantickernel-api-localization/pom.xml
+++ b/semantickernel-api-localization/pom.xml
@@ -4,7 +4,7 @@
com.microsoft.semantic-kernel
semantickernel-parent
- 1.4.4-RC3-SNAPSHOT
+ 1.4.5-SNAPSHOT
../pom.xml
diff --git a/semantickernel-api-textembedding-services/pom.xml b/semantickernel-api-textembedding-services/pom.xml
index eb8391355..5b2e5181f 100644
--- a/semantickernel-api-textembedding-services/pom.xml
+++ b/semantickernel-api-textembedding-services/pom.xml
@@ -4,7 +4,7 @@
com.microsoft.semantic-kernel
semantickernel-parent
- 1.4.4-RC3-SNAPSHOT
+ 1.4.5-SNAPSHOT
../pom.xml
diff --git a/semantickernel-api/pom.xml b/semantickernel-api/pom.xml
index ace57557c..ad0290493 100644
--- a/semantickernel-api/pom.xml
+++ b/semantickernel-api/pom.xml
@@ -6,7 +6,7 @@
com.microsoft.semantic-kernel
semantickernel-parent
- 1.4.4-RC3-SNAPSHOT
+ 1.4.5-SNAPSHOT
../pom.xml
@@ -42,7 +42,7 @@
io.opentelemetry.instrumentation
opentelemetry-reactor-3.1
- 2.9.0-alpha
+ 2.26.1-alpha
com.azure
diff --git a/semantickernel-api/src/main/java/com/microsoft/semantickernel/contextvariables/ContextVariableTypeConverter.java b/semantickernel-api/src/main/java/com/microsoft/semantickernel/contextvariables/ContextVariableTypeConverter.java
index 22d53ec06..3082ecf8a 100644
--- a/semantickernel-api/src/main/java/com/microsoft/semantickernel/contextvariables/ContextVariableTypeConverter.java
+++ b/semantickernel-api/src/main/java/com/microsoft/semantickernel/contextvariables/ContextVariableTypeConverter.java
@@ -3,7 +3,6 @@
import com.microsoft.semantickernel.exceptions.SKException;
import com.microsoft.semantickernel.localization.SemanticKernelResources;
-import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
@@ -341,7 +340,6 @@ public static class Builder {
*
* @param clazz the class of the type
*/
- @SuppressFBWarnings("CT_CONSTRUCTOR_THROW")
public Builder(Class clazz) {
this.clazz = clazz;
fromObject = x -> ContextVariableTypes.convert(x, clazz);
diff --git a/semantickernel-api/src/main/java/com/microsoft/semantickernel/contextvariables/converters/CollectionVariableContextVariableTypeConverter.java b/semantickernel-api/src/main/java/com/microsoft/semantickernel/contextvariables/converters/CollectionVariableContextVariableTypeConverter.java
index d7bf72e00..5b2661971 100644
--- a/semantickernel-api/src/main/java/com/microsoft/semantickernel/contextvariables/converters/CollectionVariableContextVariableTypeConverter.java
+++ b/semantickernel-api/src/main/java/com/microsoft/semantickernel/contextvariables/converters/CollectionVariableContextVariableTypeConverter.java
@@ -7,7 +7,6 @@
import com.microsoft.semantickernel.contextvariables.ContextVariableType;
import com.microsoft.semantickernel.contextvariables.ContextVariableTypeConverter;
import com.microsoft.semantickernel.contextvariables.ContextVariableTypes;
-import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
import java.util.Collection;
import java.util.stream.Collectors;
@@ -24,7 +23,6 @@ public class CollectionVariableContextVariableTypeConverter extends
* Creates a new instance of the {@link CollectionVariableContextVariableTypeConverter} class.
* @param delimiter The delimiter to use joining elements of the collection.
*/
- @SuppressFBWarnings("CT_CONSTRUCTOR_THROW")
public CollectionVariableContextVariableTypeConverter(String delimiter) {
super(
Collection.class,
@@ -38,7 +36,6 @@ public CollectionVariableContextVariableTypeConverter(String delimiter) {
/**
* Creates a new instance of the {@link CollectionVariableContextVariableTypeConverter} class.
*/
- @SuppressFBWarnings("CT_CONSTRUCTOR_THROW")
public CollectionVariableContextVariableTypeConverter() {
this(",");
}
diff --git a/semantickernel-api/src/main/java/com/microsoft/semantickernel/hooks/FunctionInvokedEvent.java b/semantickernel-api/src/main/java/com/microsoft/semantickernel/hooks/FunctionInvokedEvent.java
index 7a39cdfe8..715e71185 100644
--- a/semantickernel-api/src/main/java/com/microsoft/semantickernel/hooks/FunctionInvokedEvent.java
+++ b/semantickernel-api/src/main/java/com/microsoft/semantickernel/hooks/FunctionInvokedEvent.java
@@ -2,8 +2,8 @@
package com.microsoft.semantickernel.hooks;
import com.microsoft.semantickernel.orchestration.FunctionResult;
-import com.microsoft.semantickernel.semanticfunctions.KernelFunction;
import com.microsoft.semantickernel.semanticfunctions.KernelArguments;
+import com.microsoft.semantickernel.semanticfunctions.KernelFunction;
import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
import javax.annotation.Nullable;
@@ -60,7 +60,6 @@ public KernelArguments getArguments() {
*
* @return the result
*/
- @SuppressFBWarnings("EI_EXPOSE_REP")
public FunctionResult getResult() {
return result;
}
diff --git a/semantickernel-api/src/main/java/com/microsoft/semantickernel/hooks/KernelHook.java b/semantickernel-api/src/main/java/com/microsoft/semantickernel/hooks/KernelHook.java
index e4d3f5300..586c93c5d 100644
--- a/semantickernel-api/src/main/java/com/microsoft/semantickernel/hooks/KernelHook.java
+++ b/semantickernel-api/src/main/java/com/microsoft/semantickernel/hooks/KernelHook.java
@@ -104,6 +104,7 @@ static ChatCompletionsOptions cloneOptionsWithMessages(
.setFrequencyPenalty(options.getFrequencyPenalty())
.setLogitBias(options.getLogitBias())
.setMaxTokens(options.getMaxTokens())
+ .setMaxCompletionTokens(options.getMaxCompletionTokens())
.setModel(options.getModel())
.setStop(options.getStop())
.setTemperature(options.getTemperature())
diff --git a/semantickernel-api/src/main/java/com/microsoft/semantickernel/hooks/PreToolCallEvent.java b/semantickernel-api/src/main/java/com/microsoft/semantickernel/hooks/PreToolCallEvent.java
index 42430f085..e5850228c 100644
--- a/semantickernel-api/src/main/java/com/microsoft/semantickernel/hooks/PreToolCallEvent.java
+++ b/semantickernel-api/src/main/java/com/microsoft/semantickernel/hooks/PreToolCallEvent.java
@@ -2,8 +2,8 @@
package com.microsoft.semantickernel.hooks;
import com.microsoft.semantickernel.contextvariables.ContextVariableTypes;
-import com.microsoft.semantickernel.semanticfunctions.KernelFunction;
import com.microsoft.semantickernel.semanticfunctions.KernelArguments;
+import com.microsoft.semantickernel.semanticfunctions.KernelFunction;
import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
import javax.annotation.Nullable;
@@ -52,7 +52,6 @@ public KernelArguments getArguments() {
* Get the tool call function.
* @return The tool call function.
*/
- @SuppressFBWarnings("EI_EXPOSE_REP2")
public KernelFunction> getFunction() {
return function;
}
diff --git a/semantickernel-api/src/main/java/com/microsoft/semantickernel/hooks/PromptRenderedEvent.java b/semantickernel-api/src/main/java/com/microsoft/semantickernel/hooks/PromptRenderedEvent.java
index 348d3bf12..fbd8cb801 100644
--- a/semantickernel-api/src/main/java/com/microsoft/semantickernel/hooks/PromptRenderedEvent.java
+++ b/semantickernel-api/src/main/java/com/microsoft/semantickernel/hooks/PromptRenderedEvent.java
@@ -55,7 +55,6 @@ public KernelArguments getArguments() {
*
* @return the prompt
*/
- @SuppressFBWarnings("EI_EXPOSE_REP")
public String getPrompt() {
return prompt;
}
diff --git a/semantickernel-api/src/main/java/com/microsoft/semantickernel/implementation/chatcompletion/ChatXMLPromptParser.java b/semantickernel-api/src/main/java/com/microsoft/semantickernel/implementation/chatcompletion/ChatXMLPromptParser.java
index 8cc1cc972..975f5e533 100644
--- a/semantickernel-api/src/main/java/com/microsoft/semantickernel/implementation/chatcompletion/ChatXMLPromptParser.java
+++ b/semantickernel-api/src/main/java/com/microsoft/semantickernel/implementation/chatcompletion/ChatXMLPromptParser.java
@@ -18,6 +18,7 @@
import java.util.Locale;
import java.util.Map;
import javax.annotation.Nullable;
+import javax.xml.XMLConstants;
import javax.xml.namespace.QName;
import javax.xml.stream.XMLEventReader;
import javax.xml.stream.XMLInputFactory;
@@ -32,6 +33,29 @@ public class ChatXMLPromptParser {
private static final Logger LOGGER = LoggerFactory.getLogger(ChatXMLPromptParser.class);
+ private static XMLInputFactory createXMLInputFactory() {
+ XMLInputFactory factory = XMLInputFactory.newInstance();
+
+ trySetProperty(factory, XMLConstants.FEATURE_SECURE_PROCESSING, true);
+ trySetProperty(factory, XMLConstants.ACCESS_EXTERNAL_DTD, "");
+ trySetProperty(factory, XMLConstants.ACCESS_EXTERNAL_SCHEMA, "");
+
+ factory.setProperty(XMLInputFactory.IS_SUPPORTING_EXTERNAL_ENTITIES, false);
+ factory.setProperty(XMLInputFactory.SUPPORT_DTD, false);
+ factory.setProperty(XMLInputFactory.IS_REPLACING_ENTITY_REFERENCES, false);
+
+ return factory;
+ }
+
+ private static void trySetProperty(XMLInputFactory factory, String property, Object value) {
+ try {
+ factory.setProperty(property, value);
+ } catch (IllegalArgumentException e) {
+ // Property not supported by this XMLInputFactory implementation
+ LOGGER.trace("XMLInputFactory property '{}' not supported", property);
+ }
+ }
+
public static ChatPromptParseVisitor parse(
String rawPrompt,
ChatPromptParseVisitor chatPromptParseVisitor) {
@@ -64,7 +88,7 @@ private static ChatPromptParseVisitor getChatRequestMessages(String promp
// In this way, we can avoid parsing the whole prompt twice and easily extend the parsing logic.
try (InputStream is = new ByteArrayInputStream(prompt.getBytes(StandardCharsets.UTF_8))) {
- XMLInputFactory factory = XMLInputFactory.newInstance();
+ XMLInputFactory factory = createXMLInputFactory();
XMLEventReader reader = factory.createXMLEventReader(is);
while (reader.hasNext()) {
XMLEvent event = reader.nextEvent();
@@ -109,7 +133,7 @@ private static ChatPromptParseVisitor getFunctionDefinitions(String promp
//
try (InputStream is = new ByteArrayInputStream(prompt.getBytes(StandardCharsets.UTF_8))) {
- XMLInputFactory factory = XMLInputFactory.newInstance();
+ XMLInputFactory factory = createXMLInputFactory();
XMLEventReader reader = factory.createXMLEventReader(is);
FunctionDefinition functionDefinition = null;
Map parameters = new HashMap<>();
diff --git a/semantickernel-api/src/main/java/com/microsoft/semantickernel/orchestration/FunctionInvocation.java b/semantickernel-api/src/main/java/com/microsoft/semantickernel/orchestration/FunctionInvocation.java
index 9b8a518c3..8641f201c 100644
--- a/semantickernel-api/src/main/java/com/microsoft/semantickernel/orchestration/FunctionInvocation.java
+++ b/semantickernel-api/src/main/java/com/microsoft/semantickernel/orchestration/FunctionInvocation.java
@@ -14,9 +14,8 @@
import com.microsoft.semantickernel.hooks.KernelHooks.UnmodifiableKernelHooks;
import com.microsoft.semantickernel.implementation.telemetry.SemanticKernelTelemetry;
import com.microsoft.semantickernel.localization.SemanticKernelResources;
-import com.microsoft.semantickernel.semanticfunctions.KernelFunction;
import com.microsoft.semantickernel.semanticfunctions.KernelArguments;
-import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
+import com.microsoft.semantickernel.semanticfunctions.KernelFunction;
import java.util.NoSuchElementException;
import java.util.function.BiConsumer;
import javax.annotation.Nullable;
@@ -63,7 +62,6 @@ public class FunctionInvocation extends Mono> {
* @param kernel The kernel to invoke the function on.
* @param function The function to invoke.
*/
- @SuppressFBWarnings("EI_EXPOSE_REP2")
public FunctionInvocation(
Kernel kernel,
KernelFunction function) {
@@ -80,7 +78,6 @@ public FunctionInvocation(
* @param function The function to invoke.
* @param resultType The type of the result of the function invocation.
*/
- @SuppressFBWarnings("EI_EXPOSE_REP2")
public FunctionInvocation(
Kernel kernel,
KernelFunction> function,
diff --git a/semantickernel-api/src/main/java/com/microsoft/semantickernel/orchestration/PromptExecutionSettings.java b/semantickernel-api/src/main/java/com/microsoft/semantickernel/orchestration/PromptExecutionSettings.java
index 19dfbd0dd..bfa2bb667 100644
--- a/semantickernel-api/src/main/java/com/microsoft/semantickernel/orchestration/PromptExecutionSettings.java
+++ b/semantickernel-api/src/main/java/com/microsoft/semantickernel/orchestration/PromptExecutionSettings.java
@@ -82,6 +82,7 @@ public class PromptExecutionSettings {
private static final String PRESENCE_PENALTY = "presence_penalty";
private static final String FREQUENCY_PENALTY = "frequency_penalty";
private static final String MAX_TOKENS = "max_tokens";
+ private static final String MAX_COMPLETION_TOKENS = "max_completion_tokens";
private static final String BEST_OF = "best_of";
private static final String USER = "user";
private static final String STOP_SEQUENCES = "stop_sequences";
@@ -89,13 +90,19 @@ public class PromptExecutionSettings {
private static final String TOKEN_SELECTION_BIASES = "token_selection_biases";
private static final String RESPONSE_FORMAT = "response_format";
+ private static final String MAX_COMPLETION_TOKENS_ENABLE = "MAX_COMPLETION_TOKENS_ENABLE";
+ private static final String DEFAULT_MAX_COMPLETION_TOKENS_ENABLE = System.getenv(
+ MAX_COMPLETION_TOKENS_ENABLE);
+
private final String serviceId;
private final String modelId;
private final double temperature;
private final double topP;
private final double presencePenalty;
private final double frequencyPenalty;
- private final int maxTokens;
+ private final boolean maxCompletionTokensEnable;
+ private final Integer maxCompletionTokens;
+ private final Integer maxTokens;
private final int bestOf;
private final int resultsPerPrompt;
private final String user;
@@ -135,14 +142,24 @@ public PromptExecutionSettings(
@JsonProperty(USER) String user,
@Nullable @JsonProperty(STOP_SEQUENCES) List stopSequences,
@Nullable @JsonProperty(TOKEN_SELECTION_BIASES) Map tokenSelectionBiases,
- @Nullable @JsonProperty(RESPONSE_FORMAT) ResponseFormat responseFormat) {
+ @Nullable @JsonProperty(RESPONSE_FORMAT) ResponseFormat responseFormat,
+ @JsonProperty(value = MAX_COMPLETION_TOKENS_ENABLE, defaultValue = "false") String maxCompletionTokensEnable) {
this.serviceId = serviceId != null ? serviceId : DEFAULT_SERVICE_ID;
this.modelId = modelId != null ? modelId : "";
this.temperature = clamp(temperature, 0d, 2d, DEFAULT_TEMPERATURE);
this.topP = clamp(topP, 0d, 1d, DEFAULT_TOP_P);
this.presencePenalty = clamp(presencePenalty, -2d, 2d, DEFAULT_PRESENCE_PENALTY);
this.frequencyPenalty = clamp(frequencyPenalty, -2d, 2d, DEFAULT_FREQUENCY_PENALTY);
- this.maxTokens = clamp(maxTokens, 1, Integer.MAX_VALUE, DEFAULT_MAX_TOKENS);
+
+ this.maxCompletionTokensEnable = isMaxCompletionTokensEnable(maxCompletionTokensEnable);
+
+ if (this.maxCompletionTokensEnable) {
+ this.maxCompletionTokens = clamp(maxTokens, 1, Integer.MAX_VALUE, DEFAULT_MAX_TOKENS);
+ this.maxTokens = null;
+ } else {
+ this.maxTokens = clamp(maxTokens, 1, Integer.MAX_VALUE, DEFAULT_MAX_TOKENS);
+ this.maxCompletionTokens = null;
+ }
this.resultsPerPrompt = clamp(resultsPerPrompt, 1, Integer.MAX_VALUE,
DEFAULT_RESULTS_PER_PROMPT);
this.bestOf = clamp(bestOf, 1, Integer.MAX_VALUE, DEFAULT_BEST_OF);
@@ -161,6 +178,22 @@ public PromptExecutionSettings(
}
}
+ private boolean isMaxCompletionTokensEnable(String maxCompletionTokensEnable) {
+ final boolean maxCompletionTokensEnabled;
+ if (maxCompletionTokensEnable != null && !maxCompletionTokensEnable.isEmpty()) {
+ maxCompletionTokensEnabled = Boolean.parseBoolean(maxCompletionTokensEnable);
+ } else {
+ if (DEFAULT_MAX_COMPLETION_TOKENS_ENABLE != null
+ && DEFAULT_MAX_COMPLETION_TOKENS_ENABLE.isEmpty()) {
+ maxCompletionTokensEnabled = Boolean.parseBoolean(
+ DEFAULT_MAX_COMPLETION_TOKENS_ENABLE);
+ } else {
+ maxCompletionTokensEnabled = false;
+ }
+ }
+ return maxCompletionTokensEnabled;
+ }
+
/**
* Create a new builder for PromptExecutionSettings.
*
@@ -257,7 +290,7 @@ public double getFrequencyPenalty() {
* @return The maximum number of tokens to generate in the output.
*/
@JsonProperty(MAX_TOKENS)
- public int getMaxTokens() {
+ public Integer getMaxTokens() {
return maxTokens;
}
@@ -351,7 +384,10 @@ public boolean equals(Object obj) {
if (Double.compare(frequencyPenalty, other.frequencyPenalty) != 0) {
return false;
}
- if (maxTokens != other.maxTokens) {
+ if (!Objects.equals(maxTokens, other.maxTokens)) {
+ return false;
+ }
+ if (!Objects.equals(maxCompletionTokens, other.maxCompletionTokens)) {
return false;
}
if (bestOf != other.bestOf) {
@@ -383,6 +419,12 @@ public ResponseFormat getResponseFormat() {
return responseFormat;
}
+
+ @JsonProperty(MAX_COMPLETION_TOKENS)
+ public Integer getMaxCompletionTokens() {
+ return maxCompletionTokens;
+ }
+
/**
* Builder for PromptExecutionSettings.
*/
@@ -480,6 +522,18 @@ public Builder withMaxTokens(int maxTokens) {
return this;
}
+ /**
+ * Enables the use of max_completion_tokens config parameter rather than the older
+ * max_completion
+ *
+ * @param enable Whether to enable
+ * @return This builder
+ */
+ public Builder withMaxCompletionTokensEnable(boolean enable) {
+ settings.put(MAX_COMPLETION_TOKENS_ENABLE, Boolean.toString(enable));
+ return this;
+ }
+
/**
* Set the number of results to generate for each prompt. The value is clamped to the range
* [1, Integer.MAX_VALUE], and the default is 1.
@@ -620,7 +674,9 @@ public PromptExecutionSettings build() {
(List) settings.getOrDefault(STOP_SEQUENCES, Collections.emptyList()),
(Map) settings.getOrDefault(TOKEN_SELECTION_BIASES,
Collections.emptyMap()),
- (ResponseFormat) settings.getOrDefault(RESPONSE_FORMAT, new TextResponseFormat()));
+ (ResponseFormat) settings.getOrDefault(RESPONSE_FORMAT, new TextResponseFormat()),
+ (String) settings.getOrDefault(MAX_COMPLETION_TOKENS_ENABLE,
+ DEFAULT_MAX_COMPLETION_TOKENS_ENABLE));
}
}
}
diff --git a/semantickernel-api/src/main/java/com/microsoft/semantickernel/plugin/KernelPluginFactory.java b/semantickernel-api/src/main/java/com/microsoft/semantickernel/plugin/KernelPluginFactory.java
index afa31cb00..e0bc517b5 100644
--- a/semantickernel-api/src/main/java/com/microsoft/semantickernel/plugin/KernelPluginFactory.java
+++ b/semantickernel-api/src/main/java/com/microsoft/semantickernel/plugin/KernelPluginFactory.java
@@ -27,10 +27,14 @@
import java.nio.file.Path;
import java.util.ArrayList;
import java.util.Arrays;
+import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
+import java.util.Locale;
import java.util.Map;
+import java.util.Set;
+import java.util.function.Predicate;
import java.util.stream.Collectors;
import javax.annotation.Nullable;
import org.reactivestreams.Publisher;
@@ -67,6 +71,12 @@ public class KernelPluginFactory {
COMMON_CLASS_NAMES.put("map", HashMap.class);
COMMON_CLASS_NAMES.put("set", HashSet.class);
+ COMMON_CLASS_NAMES.put(Integer.class.getName(), int.class);
+ COMMON_CLASS_NAMES.put(String.class.getName(), String.class);
+ COMMON_CLASS_NAMES.put(List.class.getName(), ArrayList.class);
+ COMMON_CLASS_NAMES.put(Map.class.getName(), HashMap.class);
+ COMMON_CLASS_NAMES.put(Set.class.getName(), HashSet.class);
+
BOXED_FROM_PRIMITIVE.put(void.class, Void.class);
BOXED_FROM_PRIMITIVE.put(int.class, Integer.class);
BOXED_FROM_PRIMITIVE.put(double.class, Double.class);
@@ -240,21 +250,16 @@ public static Class> getTypeForName(String className) {
return clazz;
}
+ if (!checkClassName(className)) {
+ throw new SKException("Requested type is not allowed: " + className);
+ }
+
try {
clazz = Thread.currentThread().getContextClassLoader().loadClass(className);
} catch (ClassNotFoundException e) {
// ignore
}
- if (clazz == null) {
- try {
- // Seems that in tests specifically we need to use the class loader of the class itself
- clazz = KernelPluginFactory.class.getClassLoader().loadClass(className);
- } catch (ClassNotFoundException e) {
- // ignore
- }
- }
-
if (clazz == null) {
throw new SKException("Requested type could not be found: " + className
+ ". This needs to be a fully qualified class name, e.g. 'java.lang.String'.");
@@ -262,6 +267,10 @@ public static Class> getTypeForName(String className) {
return clazz;
}
+ public static boolean checkClassName(String className) {
+ return ClassFilter.CLASS_CHECKER.test(className);
+ }
+
/**
* Creates a plugin from the provided name and function collection.
*
@@ -429,6 +438,7 @@ private static KernelFunction getKernelFunction(
/**
* Imports a plugin from a resource directory on the filesystem.
+ *
* @param parentDirectory The parent directory containing the plugin directories.
* @param pluginDirectoryName The name of the plugin directory.
* @param functionName The name of the function to import.
@@ -552,4 +562,107 @@ private static PromptTemplateConfig getPromptTemplateConfig(
return null;
}
}
+
+ // Filters allowed classes that can be used as types in plugins
+ public static class ClassFilter {
+
+ // Selects which filter type to use, allow list or ban list
+ public static final String CLASS_BLOCK_TYPE_PROPERTY_NAME = "semantic-kernel.class-block-type";
+ public static final String CLASS_BLOCK_LIST_PROPERTY_NAME = "semantic-kernel.class-block-list";
+ public static final String CLASS_ALLOW_LIST_PROPERTY_NAME = "semantic-kernel.class-allow-list";
+
+ // allow nothing by default (other than java primitives and collections)
+ private static final List CLASS_ALLOW_LIST;
+ private static final List CLASS_ALLOW_LIST_DEFAULT = Collections.emptyList();
+
+ // block Java classes by default (other than java primitives and collections)
+ private static final List CLASS_BLOCK_LIST;
+ private static final List CLASS_BLOCK_LIST_DEFAULT = Arrays.asList(
+ "java\\..*",
+ "com\\.sun\\..*",
+ "javax\\..*",
+ "jdk\\..*",
+ "org\\.xml\\..*",
+ "org\\.w3c\\..*"
+ );
+
+ static Predicate CLASS_CHECKER;
+
+ private enum BlockType {
+ BLOCK,
+ ALLOW
+ }
+
+ static {
+ // Default to blocking type
+ String classFilterType = System.getProperty(CLASS_BLOCK_TYPE_PROPERTY_NAME,
+ BlockType.BLOCK.name());
+ CLASS_BLOCK_LIST = getList(CLASS_BLOCK_LIST_PROPERTY_NAME, CLASS_BLOCK_LIST_DEFAULT);
+ CLASS_ALLOW_LIST = getList(CLASS_ALLOW_LIST_PROPERTY_NAME, CLASS_ALLOW_LIST_DEFAULT);
+
+ BlockType type;
+
+ try {
+ type = BlockType.valueOf(classFilterType.toUpperCase(Locale.ROOT));
+ } catch (IllegalArgumentException e) {
+ type = BlockType.BLOCK;
+ }
+
+ switch (type) {
+ case ALLOW:
+ CLASS_CHECKER = ClassFilter::evaluateAllow;
+ break;
+ case BLOCK:
+ default:
+ CLASS_CHECKER = ClassFilter::evaluateBlock;
+ break;
+ }
+ }
+
+ private static List getList(String propertyName, List defaultList) {
+ String blockList = System.getProperty(propertyName);
+
+ if (blockList != null) {
+ return Arrays.asList(blockList.split(","));
+ } else {
+ return defaultList;
+ }
+ }
+
+ // Block classes/packages classes (other than common Java primitives and collections)
+ private static boolean evaluateBlock(String className) {
+ if (className == null || className.isEmpty()) {
+ return false;
+ }
+
+ for (String ban : CLASS_BLOCK_LIST) {
+ if (className.matches(ban)) {
+ LOGGER.warn(
+ "Skipping class not allowed by class block list {}, if you wish to unblock this class update the property: {}",
+ className, CLASS_BLOCK_LIST_PROPERTY_NAME);
+ return false;
+ }
+ }
+
+ return true;
+ }
+
+ // Only allow explicitly allowed classes/packages (other than common Java primitives and collections)
+ private static boolean evaluateAllow(String className) {
+ if (className == null || className.isEmpty()) {
+ return false;
+ }
+
+ for (String allow : CLASS_ALLOW_LIST) {
+ if (className.matches(allow)) {
+ return true;
+ }
+ }
+
+ LOGGER.warn(
+ "Skipping class not allowed by class allow list {}, if you wish to allow this class update the property: {}",
+ className, CLASS_ALLOW_LIST_DEFAULT);
+ return false;
+ }
+ }
}
diff --git a/semantickernel-api/src/main/java/com/microsoft/semantickernel/templateengine/handlebars/HandlebarsPromptTemplate.java b/semantickernel-api/src/main/java/com/microsoft/semantickernel/templateengine/handlebars/HandlebarsPromptTemplate.java
index 460e48159..bd8df1383 100644
--- a/semantickernel-api/src/main/java/com/microsoft/semantickernel/templateengine/handlebars/HandlebarsPromptTemplate.java
+++ b/semantickernel-api/src/main/java/com/microsoft/semantickernel/templateengine/handlebars/HandlebarsPromptTemplate.java
@@ -18,13 +18,12 @@
import com.microsoft.semantickernel.orchestration.InvocationContext;
import com.microsoft.semantickernel.orchestration.ToolCallBehavior;
import com.microsoft.semantickernel.plugin.KernelPlugin;
-import com.microsoft.semantickernel.semanticfunctions.KernelFunction;
import com.microsoft.semantickernel.semanticfunctions.KernelArguments;
+import com.microsoft.semantickernel.semanticfunctions.KernelFunction;
import com.microsoft.semantickernel.semanticfunctions.PromptTemplate;
import com.microsoft.semantickernel.semanticfunctions.PromptTemplateConfig;
import com.microsoft.semantickernel.semanticfunctions.PromptTemplateOption;
import com.microsoft.semantickernel.services.chatcompletion.ChatMessageContent;
-import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
@@ -192,7 +191,6 @@ private class HandleBarsPromptTemplateHandler {
private final String template;
private final Handlebars handlebars;
- @SuppressFBWarnings("CT_CONSTRUCTOR_THROW") // Think this is a false positive
public HandleBarsPromptTemplateHandler(
Kernel kernel,
String template,
diff --git a/semantickernel-bom/pom.xml b/semantickernel-bom/pom.xml
index 303e08b72..9b4361751 100644
--- a/semantickernel-bom/pom.xml
+++ b/semantickernel-bom/pom.xml
@@ -5,7 +5,7 @@
com.microsoft.semantic-kernel
semantickernel-bom
- 1.4.4-RC3-SNAPSHOT
+ 1.4.5-SNAPSHOT
pom
Semantic Kernel Java BOM
@@ -13,7 +13,7 @@
https://www.github.com/microsoft/semantic-kernel
- 2.18.6
+ 2.21.2
@@ -52,7 +52,7 @@
io.opentelemetry
opentelemetry-bom
- 1.43.0
+ 1.61.0
pom
import
@@ -150,17 +150,17 @@
com.azure
azure-identity
- 1.14.0
+ 1.18.2
com.azure
azure-core
- 1.53.0
+ 1.57.1
com.azure
azure-search-documents
- 11.8.0-beta.1
+ 11.8.1
com.azure
@@ -171,13 +171,13 @@
redis.clients
jedis
- 5.2.0
+ 7.4.1
com.fasterxml.jackson.core
jackson-annotations
- ${com.fasterxml.jackson.core.version}
+ 2.21
com.fasterxml.jackson.core
@@ -197,7 +197,7 @@
${com.fasterxml.jackson.core.version}
runtime
-
+
com.github.jknack
handlebars
@@ -211,7 +211,7 @@
org.slf4j
slf4j-api
- 2.0.16
+ 2.0.17
com.google.code.findbugs
@@ -230,36 +230,36 @@
com.github.spotbugs
spotbugs-annotations
- 4.8.6
+ 4.9.8
org.apache.commons
commons-text
- 1.14.0
+ 1.15.0
com.google.cloud
google-cloud-vertexai
- 1.12.0
+ 1.52.0
com.github.victools
jsonschema-generator
- 4.36.0
+ 4.38.0
true
com.github.victools
jsonschema-module-jackson
- 4.36.0
+ 4.38.0
true
io.projectreactor
reactor-core
- 3.7.8
+ 3.8.5
diff --git a/semantickernel-experimental/pom.xml b/semantickernel-experimental/pom.xml
index 5cdbd5349..61e60f645 100644
--- a/semantickernel-experimental/pom.xml
+++ b/semantickernel-experimental/pom.xml
@@ -4,7 +4,7 @@
com.microsoft.semantic-kernel
semantickernel-parent
- 1.4.4-RC3-SNAPSHOT
+ 1.4.5-SNAPSHOT
semantickernel-experimental
@@ -115,12 +115,12 @@
org.postgresql
postgresql
- 42.7.7
+ 42.7.10
org.xerial
sqlite-jdbc
- 3.47.0.0
+ 3.53.0.0