diff --git a/common/src/main/kotlin/com/google/ai/client/generativeai/common/Request.kt b/common/src/main/kotlin/com/google/ai/client/generativeai/common/Request.kt index 89afce30..4e484266 100644 --- a/common/src/main/kotlin/com/google/ai/client/generativeai/common/Request.kt +++ b/common/src/main/kotlin/com/google/ai/client/generativeai/common/Request.kt @@ -17,6 +17,7 @@ package com.google.ai.client.generativeai.common import com.google.ai.client.generativeai.common.client.GenerationConfig +import com.google.ai.client.generativeai.common.client.Tool import com.google.ai.client.generativeai.common.shared.Content import com.google.ai.client.generativeai.common.shared.SafetySetting import kotlinx.serialization.SerialName @@ -30,6 +31,7 @@ data class GenerateContentRequest( val contents: List, @SerialName("safety_settings") val safetySettings: List? = null, @SerialName("generation_config") val generationConfig: GenerationConfig? = null, + val tools: List? = null, ) : Request @Serializable diff --git a/common/src/main/kotlin/com/google/ai/client/generativeai/common/RequestOptions.kt b/common/src/main/kotlin/com/google/ai/client/generativeai/common/RequestOptions.kt index 4decb5c1..e9ab3a9f 100644 --- a/common/src/main/kotlin/com/google/ai/client/generativeai/common/RequestOptions.kt +++ b/common/src/main/kotlin/com/google/ai/client/generativeai/common/RequestOptions.kt @@ -31,16 +31,16 @@ import kotlin.time.toDuration class RequestOptions( val timeout: Duration, val apiVersion: String = "v1", - val endpoint: String = "https://generativelanguage.googleapis.com" + val endpoint: String = "https://generativelanguage.googleapis.com", ) { @JvmOverloads constructor( timeout: Long? = HttpTimeout.INFINITE_TIMEOUT_MS, apiVersion: String = "v1", - endpoint: String = "https://generativelanguage.googleapis.com" + endpoint: String = "https://generativelanguage.googleapis.com", ) : this( (timeout ?: HttpTimeout.INFINITE_TIMEOUT_MS).toDuration(DurationUnit.MILLISECONDS), apiVersion, - endpoint + endpoint, ) } diff --git a/common/src/main/kotlin/com/google/ai/client/generativeai/common/client/Types.kt b/common/src/main/kotlin/com/google/ai/client/generativeai/common/client/Types.kt index bacbb1f1..00d44cc9 100644 --- a/common/src/main/kotlin/com/google/ai/client/generativeai/common/client/Types.kt +++ b/common/src/main/kotlin/com/google/ai/client/generativeai/common/client/Types.kt @@ -26,5 +26,25 @@ 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 data class Tool(val functionDeclarations: List) + +@Serializable +data class FunctionDeclaration( + val name: String, + val description: String, + val parameters: Schema, +) + +@Serializable +data class Schema( + val type: String, + val description: String? = null, + val format: String? = null, + val enum: List? = null, + val properties: Map? = null, + val required: List? = null, + val items: Schema? = null, ) diff --git a/common/src/main/kotlin/com/google/ai/client/generativeai/common/shared/Types.kt b/common/src/main/kotlin/com/google/ai/client/generativeai/common/shared/Types.kt index b14b8985..d10bdf36 100644 --- a/common/src/main/kotlin/com/google/ai/client/generativeai/common/shared/Types.kt +++ b/common/src/main/kotlin/com/google/ai/client/generativeai/common/shared/Types.kt @@ -26,6 +26,7 @@ import kotlinx.serialization.Serializable import kotlinx.serialization.SerializationException import kotlinx.serialization.json.JsonContentPolymorphicSerializer import kotlinx.serialization.json.JsonElement +import kotlinx.serialization.json.JsonObject import kotlinx.serialization.json.jsonObject object HarmCategorySerializer : @@ -52,6 +53,14 @@ data class Content(@EncodeDefault val role: String? = "user", val parts: List) + @Serializable data class FileDataPart(@SerialName("file_data") val fileData: FileData) : Part @Serializable @@ -83,6 +92,8 @@ object PartSerializer : JsonContentPolymorphicSerializer(Part::class) { val jsonObject = element.jsonObject return when { "text" in jsonObject -> TextPart.serializer() + "functionCall" in jsonObject -> FunctionCallPart.serializer() + "functionResponse" in jsonObject -> FunctionResponsePart.serializer() "inline_data" in jsonObject -> BlobPart.serializer() "file_data" in jsonObject -> FileDataPart.serializer() else -> throw SerializationException("Unknown Part type")