From 9b4a57209c73fa2d1278f6f7af8e3e40abc40359 Mon Sep 17 00:00:00 2001 From: Rodrigo Lazo Paz Date: Tue, 24 Sep 2024 10:40:41 -0400 Subject: [PATCH 1/3] Add missing `FirstOrdinalSerializer` to enum It's only necessary on enums we receive from the backend, not from the ones we send. --- .../com/google/firebase/vertexai/common/server/Types.kt | 5 ++++- .../com/google/firebase/vertexai/common/shared/Types.kt | 5 ++++- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/firebase-vertexai/src/main/kotlin/com/google/firebase/vertexai/common/server/Types.kt b/firebase-vertexai/src/main/kotlin/com/google/firebase/vertexai/common/server/Types.kt index 16f96796bbf..cf5f98593e8 100644 --- a/firebase-vertexai/src/main/kotlin/com/google/firebase/vertexai/common/server/Types.kt +++ b/firebase-vertexai/src/main/kotlin/com/google/firebase/vertexai/common/server/Types.kt @@ -31,6 +31,9 @@ internal object BlockReasonSerializer : internal object HarmProbabilitySerializer : KSerializer by FirstOrdinalSerializer(HarmProbability::class) +internal object HarmSeveritySerializer : + KSerializer by FirstOrdinalSerializer(HarmSeverity::class) + internal object FinishReasonSerializer : KSerializer by FirstOrdinalSerializer(FinishReason::class) @@ -117,7 +120,7 @@ internal enum class HarmProbability { HIGH } -@Serializable +@Serializable(HarmSeveritySerializer::class) internal enum class HarmSeverity { UNKNOWN, @SerialName("HARM_SEVERITY_UNSPECIFIED") UNSPECIFIED, diff --git a/firebase-vertexai/src/main/kotlin/com/google/firebase/vertexai/common/shared/Types.kt b/firebase-vertexai/src/main/kotlin/com/google/firebase/vertexai/common/shared/Types.kt index ee630cb69ce..0c1b1176b73 100644 --- a/firebase-vertexai/src/main/kotlin/com/google/firebase/vertexai/common/shared/Types.kt +++ b/firebase-vertexai/src/main/kotlin/com/google/firebase/vertexai/common/shared/Types.kt @@ -32,6 +32,9 @@ import kotlinx.serialization.json.jsonObject internal object HarmCategorySerializer : KSerializer by FirstOrdinalSerializer(HarmCategory::class) +internal object OutcomeSerializer : + KSerializer by FirstOrdinalSerializer(Outcome::class) + @Serializable(HarmCategorySerializer::class) internal enum class HarmCategory { UNKNOWN, @@ -84,7 +87,7 @@ internal data class Blob(@SerialName("mime_type") val mimeType: String, val data @Serializable internal data class CodeExecutionResult(val outcome: Outcome, val output: String) -@Serializable +@Serializable(OutcomeSerializer::class) internal enum class Outcome { @SerialName("OUTCOME_UNSPECIFIED") UNSPECIFIED, OUTCOME_OK, From 4a99ec3d0a56933c183e69894055b59eff3d9430 Mon Sep 17 00:00:00 2001 From: Rodrigo Lazo Paz Date: Tue, 24 Sep 2024 10:45:38 -0400 Subject: [PATCH 2/3] Fix formatting --- .../kotlin/com/google/firebase/vertexai/common/shared/Types.kt | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/firebase-vertexai/src/main/kotlin/com/google/firebase/vertexai/common/shared/Types.kt b/firebase-vertexai/src/main/kotlin/com/google/firebase/vertexai/common/shared/Types.kt index 0c1b1176b73..39a77b6e357 100644 --- a/firebase-vertexai/src/main/kotlin/com/google/firebase/vertexai/common/shared/Types.kt +++ b/firebase-vertexai/src/main/kotlin/com/google/firebase/vertexai/common/shared/Types.kt @@ -32,8 +32,7 @@ import kotlinx.serialization.json.jsonObject internal object HarmCategorySerializer : KSerializer by FirstOrdinalSerializer(HarmCategory::class) -internal object OutcomeSerializer : - KSerializer by FirstOrdinalSerializer(Outcome::class) +internal object OutcomeSerializer : KSerializer by FirstOrdinalSerializer(Outcome::class) @Serializable(HarmCategorySerializer::class) internal enum class HarmCategory { From 93a038207556e164c558cd7596e8b92ff98cc7d2 Mon Sep 17 00:00:00 2001 From: Rodrigo Lazo Paz Date: Tue, 24 Sep 2024 11:42:49 -0400 Subject: [PATCH 3/3] Remove unused code --- .../firebase/vertexai/common/shared/Types.kt | 21 ---------------- .../vertexai/common/UnarySnapshotTests.kt | 24 ------------------- 2 files changed, 45 deletions(-) diff --git a/firebase-vertexai/src/main/kotlin/com/google/firebase/vertexai/common/shared/Types.kt b/firebase-vertexai/src/main/kotlin/com/google/firebase/vertexai/common/shared/Types.kt index 39a77b6e357..ffc077b5d50 100644 --- a/firebase-vertexai/src/main/kotlin/com/google/firebase/vertexai/common/shared/Types.kt +++ b/firebase-vertexai/src/main/kotlin/com/google/firebase/vertexai/common/shared/Types.kt @@ -32,8 +32,6 @@ import kotlinx.serialization.json.jsonObject internal object HarmCategorySerializer : KSerializer by FirstOrdinalSerializer(HarmCategory::class) -internal object OutcomeSerializer : KSerializer by FirstOrdinalSerializer(Outcome::class) - @Serializable(HarmCategorySerializer::class) internal enum class HarmCategory { UNKNOWN, @@ -60,11 +58,6 @@ internal data class Content(@EncodeDefault val role: String? = "user", val parts @Serializable internal data class FunctionResponsePart(val functionResponse: FunctionResponse) : Part -@Serializable internal data class ExecutableCodePart(val executableCode: ExecutableCode) : Part - -@Serializable -internal data class CodeExecutionResultPart(val codeExecutionResult: CodeExecutionResult) : Part - @Serializable internal data class FunctionResponse(val name: String, val response: JsonObject) @Serializable @@ -82,18 +75,6 @@ internal data class FileData( @Serializable internal data class Blob(@SerialName("mime_type") val mimeType: String, val data: Base64) -@Serializable internal data class ExecutableCode(val language: String, val code: String) - -@Serializable internal data class CodeExecutionResult(val outcome: Outcome, val output: String) - -@Serializable(OutcomeSerializer::class) -internal enum class Outcome { - @SerialName("OUTCOME_UNSPECIFIED") UNSPECIFIED, - OUTCOME_OK, - OUTCOME_FAILED, - OUTCOME_DEADLINE_EXCEEDED, -} - @Serializable internal data class SafetySetting( val category: HarmCategory, @@ -126,8 +107,6 @@ internal object PartSerializer : JsonContentPolymorphicSerializer(Part::cl "functionResponse" in jsonObject -> FunctionResponsePart.serializer() "inlineData" in jsonObject -> BlobPart.serializer() "fileData" in jsonObject -> FileDataPart.serializer() - "executableCode" in jsonObject -> ExecutableCodePart.serializer() - "codeExecutionResult" in jsonObject -> CodeExecutionResultPart.serializer() else -> throw SerializationException("Unknown Part type") } } diff --git a/firebase-vertexai/src/test/java/com/google/firebase/vertexai/common/UnarySnapshotTests.kt b/firebase-vertexai/src/test/java/com/google/firebase/vertexai/common/UnarySnapshotTests.kt index 77d41bba957..b08eb104248 100644 --- a/firebase-vertexai/src/test/java/com/google/firebase/vertexai/common/UnarySnapshotTests.kt +++ b/firebase-vertexai/src/test/java/com/google/firebase/vertexai/common/UnarySnapshotTests.kt @@ -20,13 +20,8 @@ import com.google.firebase.vertexai.common.server.BlockReason import com.google.firebase.vertexai.common.server.FinishReason import com.google.firebase.vertexai.common.server.HarmProbability import com.google.firebase.vertexai.common.server.HarmSeverity -import com.google.firebase.vertexai.common.shared.CodeExecutionResult -import com.google.firebase.vertexai.common.shared.CodeExecutionResultPart -import com.google.firebase.vertexai.common.shared.ExecutableCode -import com.google.firebase.vertexai.common.shared.ExecutableCodePart import com.google.firebase.vertexai.common.shared.FunctionCallPart import com.google.firebase.vertexai.common.shared.HarmCategory -import com.google.firebase.vertexai.common.shared.Outcome import com.google.firebase.vertexai.common.shared.TextPart import com.google.firebase.vertexai.common.util.goldenUnaryFile import com.google.firebase.vertexai.common.util.shouldNotBeNullOrEmpty @@ -352,23 +347,4 @@ internal class UnarySnapshotTests { callPart.functionCall.args shouldBe null } } - - @Test - fun `code execution parses correctly`() = - goldenUnaryFile("success-code-execution.json") { - withTimeout(testTimeout) { - val response = apiController.generateContent(textGenerateContentRequest("prompt")) - val content = response.candidates.shouldNotBeNullOrEmpty().first().content - content.shouldNotBeNull() - val executableCodePart = content.parts[0] - val codeExecutionResult = content.parts[1] - - executableCodePart.shouldBe( - ExecutableCodePart(ExecutableCode("PYTHON", "print(\"Hello World\")")) - ) - codeExecutionResult.shouldBe( - CodeExecutionResultPart(CodeExecutionResult(Outcome.OUTCOME_OK, "Hello World")) - ) - } - } }