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 5b58db1a..8f647bf1 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 @@ -18,7 +18,6 @@ package com.google.ai.client.generativeai.internal.api.client import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable -import kotlinx.serialization.json.JsonObject @Serializable internal data class GenerationConfig( @@ -41,7 +40,15 @@ internal data class FunctionDeclaration( @Serializable internal data class FunctionParameters( - val properties: JsonObject, + val properties: Map, val required: List, val type: String, ) + +@Serializable +internal data class FunctionParameterProperties( + val type: String, + val description: String, + val format: String?, + val enum: List? +) 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 1a775a8f..cfd5c533 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 @@ -21,6 +21,7 @@ import android.graphics.BitmapFactory import android.util.Base64 import com.google.ai.client.generativeai.internal.api.CountTokensResponse import com.google.ai.client.generativeai.internal.api.GenerateContentResponse +import com.google.ai.client.generativeai.internal.api.client.FunctionParameterProperties import com.google.ai.client.generativeai.internal.api.client.GenerationConfig import com.google.ai.client.generativeai.internal.api.server.BlockReason import com.google.ai.client.generativeai.internal.api.server.Candidate @@ -46,16 +47,14 @@ import com.google.ai.client.generativeai.type.CitationMetadata import com.google.ai.client.generativeai.type.FunctionDeclaration import com.google.ai.client.generativeai.type.GenerativeBeta import com.google.ai.client.generativeai.type.ImagePart +import com.google.ai.client.generativeai.type.ParameterDeclaration import com.google.ai.client.generativeai.type.SerializationException import com.google.ai.client.generativeai.type.Tool import com.google.ai.client.generativeai.type.content import java.io.ByteArrayOutputStream import kotlinx.serialization.decodeFromString import kotlinx.serialization.json.Json -import kotlinx.serialization.json.JsonArray import kotlinx.serialization.json.JsonObject -import kotlinx.serialization.json.JsonPrimitive -import kotlinx.serialization.json.buildJsonObject import org.json.JSONObject private const val BASE_64_FLAGS = Base64.NO_WRAP @@ -120,33 +119,19 @@ internal fun Tool.toInternal() = ) @GenerativeBeta -internal fun FunctionDeclaration.toInternal(): - com.google.ai.client.generativeai.internal.api.client.FunctionDeclaration { - val convertedParams = buildJsonObject { - getParameters().forEach { pramDeclaration -> - put( - pramDeclaration.name, - buildJsonObject { - put("type", JsonPrimitive(pramDeclaration.type.name)) - put("description", JsonPrimitive(pramDeclaration.description)) - pramDeclaration.format?.let { format -> put("format", JsonPrimitive(format)) } - pramDeclaration.enum?.let { enum -> - put("enum", JsonArray(enum.map { JsonPrimitive(it) })) - } - }, - ) - } - } - return com.google.ai.client.generativeai.internal.api.client.FunctionDeclaration( +internal fun FunctionDeclaration.toInternal() = + com.google.ai.client.generativeai.internal.api.client.FunctionDeclaration( name, description, com.google.ai.client.generativeai.internal.api.client.FunctionParameters( - convertedParams, + getParameters().associate { it.name to it.toInternal() }, getParameters().map { it.name }, "OBJECT", ), ) -} + +internal fun ParameterDeclaration.toInternal() = + FunctionParameterProperties(type.name, description, format, enum) 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 262e0759..1aafb2cc 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 @@ -181,22 +181,46 @@ class ParameterDeclaration( companion object { fun int(name: String, description: String) = - ParameterDeclaration(name, description, null, null, FunctionType.INTEGER) + ParameterDeclaration( + name = name, + description = description, + type = FunctionType.INTEGER, + ) fun str(name: String, description: String) = - ParameterDeclaration(name, description, null, null, FunctionType.STRING) + ParameterDeclaration( + name = name, + description = description, + type = FunctionType.STRING, + ) fun bool(name: String, description: String) = - ParameterDeclaration(name, description, null, null, FunctionType.BOOLEAN) + ParameterDeclaration( + name = name, + description = description, + type = FunctionType.BOOLEAN, + ) fun num(name: String, description: String) = - ParameterDeclaration(name, description, null, null, FunctionType.NUMBER) + ParameterDeclaration( + name = name, + description = description, + type = FunctionType.NUMBER, + ) fun obj(name: String, description: String) = - ParameterDeclaration(name, description, null, null, FunctionType.OBJECT) + ParameterDeclaration( + name = name, + description = description, + type = FunctionType.OBJECT, + ) fun arr(name: String, description: String) = - ParameterDeclaration>(name, description, null, null, FunctionType.ARRAY) + ParameterDeclaration>( + name = name, + description = description, + type = FunctionType.ARRAY, + ) fun enum(name: String, description: String, values: List) = ParameterDeclaration(name, description, "enum", values, FunctionType.STRING)