diff --git a/generativeai/src/main/java/com/google/ai/client/generativeai/internal/api/client/Types.kt b/generativeai/src/main/java/com/google/ai/client/generativeai/internal/api/client/Types.kt index 8f647bf1..abd0e545 100644 --- a/generativeai/src/main/java/com/google/ai/client/generativeai/internal/api/client/Types.kt +++ b/generativeai/src/main/java/com/google/ai/client/generativeai/internal/api/client/Types.kt @@ -26,7 +26,7 @@ internal data class GenerationConfig( @SerialName("top_k") val topK: Int?, @SerialName("candidate_count") val candidateCount: Int?, @SerialName("max_output_tokens") val maxOutputTokens: Int?, - @SerialName("stop_sequences") val stopSequences: List? + @SerialName("stop_sequences") val stopSequences: List?, ) @Serializable internal data class Tool(val functionDeclarations: List) @@ -35,20 +35,16 @@ internal data class GenerationConfig( internal data class FunctionDeclaration( val name: String, val description: String, - val parameters: FunctionParameters -) - -@Serializable -internal data class FunctionParameters( - val properties: Map, - val required: List, - val type: String, + val parameters: FunctionParameterProperties, ) @Serializable internal data class FunctionParameterProperties( val type: String, - val description: String, - val format: String?, - val enum: List? + val description: String? = null, + val format: String? = null, + val enum: List? = null, + val properties: Map? = null, + val required: List? = null, + val items: FunctionParameterProperties? = null ) diff --git a/generativeai/src/main/java/com/google/ai/client/generativeai/internal/util/conversions.kt b/generativeai/src/main/java/com/google/ai/client/generativeai/internal/util/conversions.kt index cfd5c533..33e5e5f4 100644 --- a/generativeai/src/main/java/com/google/ai/client/generativeai/internal/util/conversions.kt +++ b/generativeai/src/main/java/com/google/ai/client/generativeai/internal/util/conversions.kt @@ -123,15 +123,23 @@ internal fun FunctionDeclaration.toInternal() = com.google.ai.client.generativeai.internal.api.client.FunctionDeclaration( name, description, - com.google.ai.client.generativeai.internal.api.client.FunctionParameters( - getParameters().associate { it.name to it.toInternal() }, - getParameters().map { it.name }, - "OBJECT", + FunctionParameterProperties( + properties = getParameters().associate { it.name to it.toInternal() }, + required = getParameters().map { it.name }, + type = "OBJECT", ), ) -internal fun ParameterDeclaration.toInternal() = - FunctionParameterProperties(type.name, description, format, enum) +internal fun ParameterDeclaration.toInternal(): FunctionParameterProperties = + FunctionParameterProperties( + type.name, + description, + format, + enum, + properties?.mapValues { it.value.toInternal() }, + required, + items?.toInternal() + ) internal fun JSONObject.toInternal() = Json.decodeFromString(toString()) diff --git a/generativeai/src/main/java/com/google/ai/client/generativeai/type/FunctionDeclarations.kt b/generativeai/src/main/java/com/google/ai/client/generativeai/type/FunctionDeclarations.kt index 1aafb2cc..642596d2 100644 --- a/generativeai/src/main/java/com/google/ai/client/generativeai/type/FunctionDeclarations.kt +++ b/generativeai/src/main/java/com/google/ai/client/generativeai/type/FunctionDeclarations.kt @@ -169,12 +169,20 @@ abstract class FunctionDeclaration(val name: String, val description: String) { * int/float or keywords like "enum" for the string type * @property enum: contains the enum values for a string enum * @property type: contains the type info and parser + * @property properties: if type is OBJECT, then this contains the description of the fields of the + * object by name + * @property required: if type is OBJECT, then this contains the list of required keys + * @property items: if the type is ARRAY, then this contains a description of the objects in the + * array */ class ParameterDeclaration( val name: String, val description: String, val format: String? = null, val enum: List? = null, + val properties: Map>? = null, + val required: List? = null, + val items: ParameterDeclaration? = null, val type: FunctionType, ) { fun fromString(value: String?) = type.parse(value)