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 0ed048e8a..79c7d6179 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 @@ -13,6 +13,7 @@ import java.util.Collections; import java.util.HashMap; import java.util.List; +import java.util.Locale; import java.util.Map; import java.util.stream.Collectors; import javax.annotation.Nonnull; @@ -149,7 +150,13 @@ public Map getProperties() { private static String getSchemaForFunctionParameter(@Nullable InputVariable parameter) { List entries = new ArrayList<>(); - entries.add("\"type\":\"string\""); + String type = "string"; + + if (parameter != null && parameter.getType() != null) { + type = getJavaTypeToOpenAiFunctionType(parameter.getType()); + } + + entries.add("\"type\":\"" + type + "\""); // Add description if present if (parameter != null && parameter.getDescription() != null && !parameter.getDescription() @@ -179,4 +186,28 @@ private static String getSchemaForFunctionParameter(@Nullable InputVariable para return "{" + schema + "}"; } + + private static String getJavaTypeToOpenAiFunctionType(String javaType) { + switch (javaType.toLowerCase(Locale.ROOT)) { + case "boolean": + return "boolean"; + case "integer": + case "int": + case "long": + case "short": + case "byte": + return "integer"; + case "double": + case "float": + return "number"; + case "string": + return "string"; + case "array": + return "array"; + case "void": + return "null"; + default: + return "object"; + } + } } diff --git a/samples/semantickernel-concepts/semantickernel-syntax-examples/src/main/java/com/microsoft/semantickernel/samples/demos/lights/LightsPlugin.java b/samples/semantickernel-concepts/semantickernel-syntax-examples/src/main/java/com/microsoft/semantickernel/samples/demos/lights/LightsPlugin.java index 55d70b021..d2f4ed08e 100644 --- a/samples/semantickernel-concepts/semantickernel-syntax-examples/src/main/java/com/microsoft/semantickernel/samples/demos/lights/LightsPlugin.java +++ b/samples/semantickernel-concepts/semantickernel-syntax-examples/src/main/java/com/microsoft/semantickernel/samples/demos/lights/LightsPlugin.java @@ -26,8 +26,8 @@ public List getLights() { @DefineKernelFunction(name = "change_state", description = "Changes the state of the light") public LightModel changeState( - @KernelFunctionParameter(name = "id", description = "The ID of the light to change") int id, - @KernelFunctionParameter(name = "isOn", description = "The new state of the light") boolean isOn) { + @KernelFunctionParameter(name = "id", description = "The ID of the light to change", type = int.class) int id, + @KernelFunctionParameter(name = "isOn", description = "The new state of the light", type = boolean.class) boolean isOn) { System.out.println("Changing light " + id + " " + isOn); Optional light = lights.stream() .filter(l -> l.getId() == id) diff --git a/semantickernel-api/src/main/java/com/microsoft/semantickernel/semanticfunctions/KernelFunctionFromMethod.java b/semantickernel-api/src/main/java/com/microsoft/semantickernel/semanticfunctions/KernelFunctionFromMethod.java index 680d93c0b..2765e9589 100644 --- a/semantickernel-api/src/main/java/com/microsoft/semantickernel/semanticfunctions/KernelFunctionFromMethod.java +++ b/semantickernel-api/src/main/java/com/microsoft/semantickernel/semanticfunctions/KernelFunctionFromMethod.java @@ -476,7 +476,7 @@ private static Object toObjectType( ContextVariableTypeConverter c = sourceType.getConverter(); Object converted = c.toObject(invocationContext.getContextVariableTypes(), sourceValue, - targetArgType); + targetArgType, false); if (converted != null) { return converted; }