Split out InvocationContext

This commit is contained in:
John Oliver
2024-02-06 21:55:09 +00:00
parent 757474e252
commit 20c8fda6ef
3 changed files with 59 additions and 89 deletions
@@ -4,8 +4,8 @@ package com.microsoft.semantickernel.syntaxexamples;
import com.azure.ai.openai.OpenAIAsyncClient;
import com.azure.ai.openai.OpenAIClientBuilder;
import com.github.tomakehurst.wiremock.core.WireMockConfiguration;
import com.github.tomakehurst.wiremock.junit5.WireMockExtension;
import com.github.tomakehurst.wiremock.junit5.WireMockRuntimeInfo;
import com.github.tomakehurst.wiremock.junit5.WireMockTest;
import com.microsoft.semantickernel.Kernel;
import com.microsoft.semantickernel.orchestration.FunctionResult;
import com.microsoft.semantickernel.orchestration.KernelFunctionArguments;
@@ -18,32 +18,14 @@ import java.time.ZoneOffset;
import java.time.format.DateTimeFormatter;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.RegisterExtension;
/*
Run this test with the following JVM arguments:
-Djavax.net.ssl.trustStore=scripts/client.truststore
-Djavax.net.ssl.trustStorePassword=password
*/
@WireMockTest
public class Example05_InlineFunctionDefinitionTest {
@RegisterExtension
static WireMockExtension wm1 = WireMockExtension.newInstance()
.options(WireMockConfiguration.wireMockConfig()
.httpsPort(8443)
.trustStorePath("scripts/client.truststore")
.trustStorePassword("password")
.trustStoreType("jks")
.keystorePath("scripts/server.keystore")
.keystorePassword("password")
.keystoreType("jks"))
.build();
@Test
public void main() {
public void main(WireMockRuntimeInfo wmRuntimeInfo) {
final OpenAIAsyncClient client = new OpenAIClientBuilder()
.endpoint("https://localhost:8443")
.endpoint("http://localhost:" + wmRuntimeInfo.getHttpPort())
.buildAsyncClient();
TextGenerationService textGenerationService = TextGenerationService.builder()
@@ -1,10 +1,15 @@
package com.microsoft.semantickernel;
import com.microsoft.semantickernel.exceptions.SKException;
import com.microsoft.semantickernel.hooks.KernelHooks;
import com.microsoft.semantickernel.hooks.KernelHooks.UnmodifiableKernelHooks;
import com.microsoft.semantickernel.orchestration.FunctionResult;
import com.microsoft.semantickernel.orchestration.InvocationContext;
import com.microsoft.semantickernel.orchestration.KernelFunction;
import com.microsoft.semantickernel.orchestration.KernelFunctionArguments;
import com.microsoft.semantickernel.orchestration.PromptExecutionSettings;
import com.microsoft.semantickernel.orchestration.ToolCallBehavior;
import com.microsoft.semantickernel.orchestration.ToolCallBehavior.UnmodifiableToolCallBehavior;
import com.microsoft.semantickernel.orchestration.contextvariables.ContextVariable;
import com.microsoft.semantickernel.orchestration.contextvariables.ContextVariableType;
import java.util.function.BiConsumer;
@@ -26,7 +31,12 @@ public class FunctionInvocation<T> extends Mono<FunctionResult<T>> {
@Nullable
private ContextVariableType<T> resultType;
@Nullable
private InvocationContext context;
private UnmodifiableKernelHooks hooks;
@Nullable
private PromptExecutionSettings promptExecutionSettings;
@Nullable
private UnmodifiableToolCallBehavior toolCallBehavior;
public FunctionInvocation(
Kernel kernel,
@@ -62,20 +72,49 @@ public class FunctionInvocation<T> extends Mono<FunctionResult<T>> {
function,
resultType)
.withArguments(arguments)
.withContext(context);
.withResultType(resultType)
.withKernelHooks(hooks)
.withPromptExecutionSettings(promptExecutionSettings)
.withToolCallBehavior(toolCallBehavior);
}
public FunctionInvocation<T> withContext(
@Nullable
InvocationContext context) {
if (context == null) {
this.context = null;
} else {
this.context = new InvocationContext(context);
}
public FunctionInvocation<T> withKernelHooks(KernelHooks hooks) {
this.hooks = unmodifiableClone(hooks);
return this;
}
public FunctionInvocation<T> withPromptExecutionSettings(
PromptExecutionSettings promptExecutionSettings) {
this.promptExecutionSettings = promptExecutionSettings;
return this;
}
public FunctionInvocation<T> withToolCallBehavior(ToolCallBehavior toolCallBehavior) {
this.toolCallBehavior = unmodifiableClone(toolCallBehavior);
return this;
}
private static UnmodifiableToolCallBehavior unmodifiableClone(
ToolCallBehavior toolCallBehavior) {
if (toolCallBehavior instanceof UnmodifiableToolCallBehavior) {
return (UnmodifiableToolCallBehavior) toolCallBehavior;
} else if (toolCallBehavior != null) {
return toolCallBehavior.unmodifiableClone();
} else {
return null;
}
}
private static UnmodifiableKernelHooks unmodifiableClone(KernelHooks kernelHooks) {
if (kernelHooks instanceof UnmodifiableKernelHooks) {
return (UnmodifiableKernelHooks) kernelHooks;
} else if (kernelHooks != null) {
return kernelHooks.unmodifiableClone();
} else {
return null;
}
}
@Override
public void subscribe(CoreSubscriber<? super FunctionResult<T>> coreSubscriber) {
performSubscribe(
@@ -84,7 +123,11 @@ public class FunctionInvocation<T> extends Mono<FunctionResult<T>> {
function,
arguments,
resultType,
context);
new InvocationContext(
hooks,
promptExecutionSettings,
toolCallBehavior
));
}
// Extracted to static to ensure mutable state is not used
@@ -1,22 +1,8 @@
// Copyright (c) Microsoft. All rights reserved.
package com.microsoft.semantickernel;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.function.Function;
import java.util.stream.Collectors;
import javax.annotation.Nullable;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.microsoft.semantickernel.builders.Buildable;
import com.microsoft.semantickernel.builders.SemanticKernelBuilder;
import com.microsoft.semantickernel.exceptions.SKException;
import com.microsoft.semantickernel.hooks.KernelHooks;
import com.microsoft.semantickernel.orchestration.FunctionResult;
import com.microsoft.semantickernel.orchestration.InvocationContext;
@@ -29,7 +15,6 @@ import com.microsoft.semantickernel.semanticfunctions.PromptTemplate;
import com.microsoft.semantickernel.services.AIServiceSelection;
import com.microsoft.semantickernel.services.AIServiceSelector;
import com.microsoft.semantickernel.services.OrderedAIServiceSelector;
import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
import java.util.ArrayList;
import java.util.HashMap;
@@ -69,46 +54,6 @@ public class Kernel implements Buildable {
this.globalKernelHooks = new KernelHooks(globalKernelHooks);
}
/*
public <T> Mono<FunctionResult<T>> invokeAsync(
KernelFunction<T> function,
@Nullable KernelFunctionArguments arguments) {
return invokeAsync(function, arguments, null);
}
public <T> Mono<FunctionResult<T>> invokeAsync(
KernelFunction<T> function,
@Nullable KernelFunctionArguments arguments,
@Nullable ContextVariableType<T> variableType) {
return invokeAsync(function, arguments, variableType, null);
}
public <T> Mono<FunctionResult<T>> invokeAsync(
String pluginName,
String functionName,
@Nullable KernelFunctionArguments arguments) {
return invokeAsync(pluginName, functionName, arguments, null);
}
public <T> Mono<FunctionResult<T>> invokeAsync(
String pluginName,
String functionName,
@Nullable KernelFunctionArguments arguments,
@Nullable ContextVariableType<T> resultType) {
return invokeAsync(pluginName, functionName, arguments, resultType, null);
}
public <T> Mono<FunctionResult<T>> invokeAsync(
String pluginName,
String functionName,
@Nullable KernelFunctionArguments arguments,
@Nullable ContextVariableType<T> variableType,
@Nullable InvocationContext invocationContext) {
KernelFunction function = plugins.getFunction(pluginName, functionName);
return invokeAsync(function, arguments, variableType, invocationContext);
}
*/
public <T> FunctionInvocation<T> invokeAsync(
String pluginName,
String functionName) {