diff --git a/java/connectors/semantickernel-connectors-ai-openai/src/main/java/com/microsoft/semantickernel/connectors/ai/openai/chatcompletion/OpenAIChatCompletion.java b/java/connectors/semantickernel-connectors-ai-openai/src/main/java/com/microsoft/semantickernel/connectors/ai/openai/chatcompletion/OpenAIChatCompletion.java index acf12d9f48..511acad2dd 100644 --- a/java/connectors/semantickernel-connectors-ai-openai/src/main/java/com/microsoft/semantickernel/connectors/ai/openai/chatcompletion/OpenAIChatCompletion.java +++ b/java/connectors/semantickernel-connectors-ai-openai/src/main/java/com/microsoft/semantickernel/connectors/ai/openai/chatcompletion/OpenAIChatCompletion.java @@ -30,8 +30,12 @@ import reactor.core.publisher.Mono; /** OpenAI chat completion client. */ public class OpenAIChatCompletion extends ClientBase implements ChatCompletion { - public OpenAIChatCompletion(OpenAIAsyncClient client, String modelId) { + private CompletionType defaultCompletionType; + + public OpenAIChatCompletion( + OpenAIAsyncClient client, String modelId, CompletionType defaultCompletionType) { super(client, modelId); + this.defaultCompletionType = defaultCompletionType; } @Override @@ -50,7 +54,7 @@ public class OpenAIChatCompletion extends ClientBase implements ChatCompletion { @@ -59,12 +63,18 @@ public class OpenAIChatCompletion extends ClientBase implements ChatCompletion generateMessageStream(CompletionsOptions completionsOptions) { @@ -115,17 +115,22 @@ public class OpenAITextCompletion extends ClientBase implements TextCompletion { throw new AIException(AIException.ErrorCodes.INVALID_REQUEST, "Max tokens must be >0"); } - return new CompletionsOptions(Collections.singletonList(text)) - .setMaxTokens(requestSettings.getMaxTokens()) - .setTemperature(requestSettings.getTemperature()) - .setTopP(requestSettings.getTopP()) - .setFrequencyPenalty(requestSettings.getFrequencyPenalty()) - .setPresencePenalty(requestSettings.getPresencePenalty()) - .setModel(getModelId()) - .setUser(requestSettings.getUser()) - .setBestOf(requestSettings.getBestOf()) - .setLogitBias(new HashMap<>()) - .setStop(requestSettings.getStopSequences()); + CompletionsOptions options = + new CompletionsOptions(Collections.singletonList(text)) + .setMaxTokens(requestSettings.getMaxTokens()) + .setTemperature(requestSettings.getTemperature()) + .setTopP(requestSettings.getTopP()) + .setFrequencyPenalty(requestSettings.getFrequencyPenalty()) + .setPresencePenalty(requestSettings.getPresencePenalty()) + .setModel(getModelId()) + .setUser(requestSettings.getUser()) + .setBestOf(requestSettings.getBestOf()) + .setLogitBias(new HashMap<>()); + + if (requestSettings instanceof ChatRequestSettings) { + options = options.setStop(requestSettings.getStopSequences()); + } + return options; } public static final class Builder implements TextCompletion.Builder { diff --git a/java/extensions/semantickernel-planners/src/main/java/com/microsoft/semantickernel/planner/stepwiseplanner/DefaultStepwisePlanner.java b/java/extensions/semantickernel-planners/src/main/java/com/microsoft/semantickernel/planner/stepwiseplanner/DefaultStepwisePlanner.java index 6d6d6e8179..ec7cfd0c57 100644 --- a/java/extensions/semantickernel-planners/src/main/java/com/microsoft/semantickernel/planner/stepwiseplanner/DefaultStepwisePlanner.java +++ b/java/extensions/semantickernel-planners/src/main/java/com/microsoft/semantickernel/planner/stepwiseplanner/DefaultStepwisePlanner.java @@ -17,6 +17,7 @@ import com.microsoft.semantickernel.semanticfunctions.PromptTemplateConfig; import com.microsoft.semantickernel.semanticfunctions.SemanticFunctionConfig; import com.microsoft.semantickernel.skilldefinition.FunctionView; import com.microsoft.semantickernel.skilldefinition.ReadOnlyFunctionCollection; +import com.microsoft.semantickernel.skilldefinition.ReadOnlySkillCollection; import com.microsoft.semantickernel.skilldefinition.annotations.DefineSKFunction; import com.microsoft.semantickernel.skilldefinition.annotations.SKFunctionParameters; import com.microsoft.semantickernel.textcompletion.CompletionRequestSettings; @@ -529,7 +530,17 @@ public class DefaultStepwisePlanner implements StepwisePlanner { List> availableFunctions = this.getAvailableFunctions(); Optional> targetFunction = availableFunctions.stream() - .filter(f -> f.toFullyQualifiedName().equals(actionName)) + .filter( + f -> { + return f.toFullyQualifiedName().equals(actionName) + || f.toFullyQualifiedName() + .equals( + ReadOnlySkillCollection.GlobalSkill + + "." + + actionName) + || f.toFullyQualifiedName() + .equals("GLOBAL_FUNCTIONS." + actionName); + }) .findFirst(); if (!targetFunction.isPresent()) { diff --git a/java/pom.xml b/java/pom.xml index 7c4b88b591..4edd314cc3 100644 --- a/java/pom.xml +++ b/java/pom.xml @@ -67,6 +67,8 @@ connectors/semantickernel-connectors-ai-openai connectors/semantickernel-connectors-memory-sqlite connectors/semantickernel-connectors-memory-azurecognitivesearch + connectors/semantickernel-connectors-memory-jdbc + connectors/semantickernel-connectors-memory-postgresql extensions/semantickernel-planners extensions/semantickernel-gpt3-tokenizer @@ -76,8 +78,6 @@ semantickernel-bom semantickernel-api semantickernel-core - connectors/semantickernel-connectors-memory-jdbc - connectors/semantickernel-connectors-memory-postgresql diff --git a/java/semantickernel-core/src/main/java/com/microsoft/semantickernel/orchestration/NativeSKFunction.java b/java/semantickernel-core/src/main/java/com/microsoft/semantickernel/orchestration/NativeSKFunction.java index fa04600ccf..5c4193766e 100644 --- a/java/semantickernel-core/src/main/java/com/microsoft/semantickernel/orchestration/NativeSKFunction.java +++ b/java/semantickernel-core/src/main/java/com/microsoft/semantickernel/orchestration/NativeSKFunction.java @@ -300,10 +300,18 @@ public class NativeSKFunction extends AbstractSkFunction { } else { return method.invoke(instance, args.toArray()); } - } catch (IllegalAccessException - | InvocationTargetException e) { + } catch (InvocationTargetException e) { throw new AIException( - ErrorCodes.INVALID_REQUEST, e.getMessage()); + ErrorCodes.INVALID_REQUEST, + "Function threw an exception: " + + method.getName(), + e.getCause()); + } catch (IllegalAccessException e) { + throw new AIException( + ErrorCodes.INVALID_REQUEST, + "Unable to access function " + + method.getName(), + e); } }) .subscribeOn(Schedulers.boundedElastic()));