From 90115ed58a280f385383ec852e5ed11b7c42a4cf Mon Sep 17 00:00:00 2001 From: Rodrigo Lazo Paz Date: Tue, 24 Sep 2024 02:21:50 -0400 Subject: [PATCH 1/3] Update endpoint --- .../com/google/firebase/vertexai/type/RequestOptions.kt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/firebase-vertexai/src/main/kotlin/com/google/firebase/vertexai/type/RequestOptions.kt b/firebase-vertexai/src/main/kotlin/com/google/firebase/vertexai/type/RequestOptions.kt index 0fedcdb5c4f..dbfbc5b9367 100644 --- a/firebase-vertexai/src/main/kotlin/com/google/firebase/vertexai/type/RequestOptions.kt +++ b/firebase-vertexai/src/main/kotlin/com/google/firebase/vertexai/type/RequestOptions.kt @@ -25,8 +25,8 @@ import kotlin.time.toDuration class RequestOptions internal constructor( internal val timeout: Duration, - internal val endpoint: String = "https://firebaseml.googleapis.com", - internal val apiVersion: String = "v2beta", + internal val endpoint: String = "https://firebasevertexai.googleapis.com", + internal val apiVersion: String = "v1beta", ) { /** From cb18a9a000995544277400c604ade5d29e26f78d Mon Sep 17 00:00:00 2001 From: Rodrigo Lazo Paz Date: Thu, 26 Sep 2024 14:44:42 -0400 Subject: [PATCH 2/3] Address test failure --- .../com/google/firebase/vertexai/common/APIControllerTests.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/firebase-vertexai/src/test/java/com/google/firebase/vertexai/common/APIControllerTests.kt b/firebase-vertexai/src/test/java/com/google/firebase/vertexai/common/APIControllerTests.kt index 582678cf306..8937b13569b 100644 --- a/firebase-vertexai/src/test/java/com/google/firebase/vertexai/common/APIControllerTests.kt +++ b/firebase-vertexai/src/test/java/com/google/firebase/vertexai/common/APIControllerTests.kt @@ -108,7 +108,7 @@ internal class RequestFormatTests { } } - mockEngine.requestHistory.first().url.host shouldBe "firebaseml.googleapis.com" + mockEngine.requestHistory.first().url.host shouldBe "firebasevertexai.googleapis.com" } @Test From 357592870390f1e22fb07818f4cb88767c6740ef Mon Sep 17 00:00:00 2001 From: Rodrigo Lazo Paz Date: Fri, 27 Sep 2024 14:50:39 -0400 Subject: [PATCH 3/3] Add support for more information within GRpcDetails That extra data enable us to be more precise when checking for services disabled. --- .../firebase/vertexai/common/APIController.kt | 28 +++++++++++++++++-- .../firebase/vertexai/common/server/Types.kt | 7 ++++- 2 files changed, 32 insertions(+), 3 deletions(-) diff --git a/firebase-vertexai/src/main/kotlin/com/google/firebase/vertexai/common/APIController.kt b/firebase-vertexai/src/main/kotlin/com/google/firebase/vertexai/common/APIController.kt index bee23d52613..7f145e10fd6 100644 --- a/firebase-vertexai/src/main/kotlin/com/google/firebase/vertexai/common/APIController.kt +++ b/firebase-vertexai/src/main/kotlin/com/google/firebase/vertexai/common/APIController.kt @@ -17,7 +17,11 @@ package com.google.firebase.vertexai.common import android.util.Log +import com.google.firebase.Firebase +import com.google.firebase.options import com.google.firebase.vertexai.common.server.FinishReason +import com.google.firebase.vertexai.common.server.GRpcError +import com.google.firebase.vertexai.common.server.GRpcErrorDetails import com.google.firebase.vertexai.common.util.decodeToFlow import com.google.firebase.vertexai.common.util.fullModelName import com.google.firebase.vertexai.type.RequestOptions @@ -239,12 +243,32 @@ private suspend fun validateResponse(response: HttpResponse) { if (message.contains("quota")) { throw QuotaExceededException(message) } - if (error.details?.any { "SERVICE_DISABLED" == it.reason } == true) { - throw ServiceDisabledException(message) + getServiceDisabledErrorDetailsOrNull(error)?.let { + val errorMessage = + if (it.metadata?.get("service") == "firebasevertexai.googleapis.com") { + """ + The Vertex AI for Firebase SDK requires the Firebase Vertex AI API + `firebasevertexai.googleapis.com` to be enabled for your project. Enable it by visiting + the Firebase Console at https://console.firebase.google.com/project/${Firebase.options.projectId}/genai/vertex then + retry. If you enabled this API recently, wait a few minutes for the action to propagate + to our systems and retry. + """ + .trimIndent() + } else { + error.message + } + + throw ServiceDisabledException(errorMessage) } throw ServerException(message) } +private fun getServiceDisabledErrorDetailsOrNull(error: GRpcError): GRpcErrorDetails? { + return error.details?.firstOrNull { + it.reason == "SERVICE_DISABLED" && it.domain == "googleapis.com" + } +} + private fun GenerateContentResponse.validate() = apply { if ((candidates?.isEmpty() != false) && promptFeedback == null) { throw SerializationException("Error deserializing response, found no valid fields") 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 742729ffa07..3749d534e47 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 @@ -163,4 +163,9 @@ internal data class GRpcError( val details: List? = null ) -@Serializable internal data class GRpcErrorDetails(val reason: String? = null) +@Serializable +internal data class GRpcErrorDetails( + val reason: String? = null, + val domain: String? = null, + val metadata: Map? = null +)