From 186edad11d71eeef2dbf25f2081b492f90e92d02 Mon Sep 17 00:00:00 2001 From: Andrew Heard Date: Mon, 20 Jan 2025 16:54:04 -0500 Subject: [PATCH 1/9] [Vertex AI] Add `apiVersion` parameter to `RequestOptions` --- .../firebase/vertexai/type/ApiVersion.kt | 28 ++++++++++++ .../firebase/vertexai/type/RequestOptions.kt | 14 ++++-- .../vertexai/GenerativeModelTesting.kt | 2 +- .../vertexai/common/APIControllerTests.kt | 44 ++++++++++++++++++- 4 files changed, 81 insertions(+), 7 deletions(-) create mode 100644 firebase-vertexai/src/main/kotlin/com/google/firebase/vertexai/type/ApiVersion.kt diff --git a/firebase-vertexai/src/main/kotlin/com/google/firebase/vertexai/type/ApiVersion.kt b/firebase-vertexai/src/main/kotlin/com/google/firebase/vertexai/type/ApiVersion.kt new file mode 100644 index 00000000000..c8b11fd4451 --- /dev/null +++ b/firebase-vertexai/src/main/kotlin/com/google/firebase/vertexai/type/ApiVersion.kt @@ -0,0 +1,28 @@ +/* + * Copyright 2025 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.firebase.vertexai.type + +/** Versions of the Vertex AI in Firebase server API. */ +public class ApiVersion private constructor(internal val value: String) { + public companion object { + /** The stable channel for version 1 of the API. */ + @JvmField public val V1: ApiVersion = ApiVersion("v1") + + /** The beta channel for version 1 of the API. */ + @JvmField public val V1BETA: ApiVersion = ApiVersion("v1beta") + } +} 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 9aa648b6d07..02f9b569357 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 @@ -26,17 +26,23 @@ public class RequestOptions internal constructor( internal val timeout: Duration, internal val endpoint: String = "https://firebasevertexai.googleapis.com", - internal val apiVersion: String = "v1beta", + internal val apiVersion: String, ) { /** * Constructor for RequestOptions. * * @param timeoutInMillis the maximum amount of time, in milliseconds, for a request to take, from - * the first request to first response. + * the first request to first response. + * @param apiVersion the version of the Vertex AI in Firebase API; defaults to [ApiVersion.V1BETA] + * if not specified. */ @JvmOverloads public constructor( - timeoutInMillis: Long = 180.seconds.inWholeMilliseconds - ) : this(timeout = timeoutInMillis.toDuration(DurationUnit.MILLISECONDS)) + timeoutInMillis: Long = 180.seconds.inWholeMilliseconds, + apiVersion: ApiVersion = ApiVersion.V1BETA, + ) : this( + timeout = timeoutInMillis.toDuration(DurationUnit.MILLISECONDS), + apiVersion = apiVersion.value, + ) } diff --git a/firebase-vertexai/src/test/java/com/google/firebase/vertexai/GenerativeModelTesting.kt b/firebase-vertexai/src/test/java/com/google/firebase/vertexai/GenerativeModelTesting.kt index 8b668371a31..f20ab347c3a 100644 --- a/firebase-vertexai/src/test/java/com/google/firebase/vertexai/GenerativeModelTesting.kt +++ b/firebase-vertexai/src/test/java/com/google/firebase/vertexai/GenerativeModelTesting.kt @@ -60,7 +60,7 @@ internal class GenerativeModelTesting { APIController( "super_cool_test_key", "gemini-1.5-flash", - RequestOptions(timeout = 5.seconds, endpoint = "https://my.custom.endpoint"), + RequestOptions(5.seconds.inWholeMilliseconds), mockEngine, TEST_CLIENT_ID, null, 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 8937b13569b..49169ff6425 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 @@ -26,11 +26,14 @@ import com.google.firebase.vertexai.common.util.commonTest import com.google.firebase.vertexai.common.util.createResponses import com.google.firebase.vertexai.common.util.doBlocking import com.google.firebase.vertexai.common.util.prepareStreamingResponse +import com.google.firebase.vertexai.type.ApiVersion import com.google.firebase.vertexai.type.RequestOptions import io.kotest.assertions.json.shouldContainJsonKey import io.kotest.assertions.throwables.shouldThrow import io.kotest.matchers.shouldBe +import io.kotest.matchers.shouldNotBe import io.kotest.matchers.string.shouldContain +import io.kotest.matchers.string.shouldStartWith import io.ktor.client.engine.mock.MockEngine import io.ktor.client.engine.mock.respond import io.ktor.content.TextContent @@ -74,7 +77,7 @@ internal class APIControllerTests { @Test fun `(generateContent) respects a custom timeout`() = - commonTest(requestOptions = RequestOptions(2.seconds)) { + commonTest(requestOptions = RequestOptions(2.seconds.inWholeMilliseconds)) { shouldThrow { withTimeout(testTimeout) { apiController.generateContent(textGenerateContentRequest("test")) @@ -122,7 +125,11 @@ internal class RequestFormatTests { APIController( "super_cool_test_key", "gemini-pro-1.5", - RequestOptions(timeout = 5.seconds, endpoint = "https://my.custom.endpoint"), + RequestOptions( + timeout = 5.seconds, + endpoint = "https://my.custom.endpoint", + apiVersion = "v1beta" + ), mockEngine, TEST_CLIENT_ID, null, @@ -138,6 +145,39 @@ internal class RequestFormatTests { mockEngine.requestHistory.first().url.host shouldBe "my.custom.endpoint" } + @Test + fun `using custom API version`() = doBlocking { + val channel = ByteChannel(autoFlush = true) + val mockEngine = MockEngine { + respond(channel, HttpStatusCode.OK, headersOf(HttpHeaders.ContentType, "application/json")) + } + prepareStreamingResponse(createResponses("Random")).forEach { channel.writeFully(it) } + val controller = + APIController( + "super_cool_test_key", + "gemini-pro-1.5", + RequestOptions( + timeoutInMillis = 5.seconds.inWholeMilliseconds, + apiVersion = ApiVersion.V1 + ), + mockEngine, + TEST_CLIENT_ID, + null, + ) + + withTimeout(5.seconds) { + controller.generateContentStream(textGenerateContentRequest("cats")).collect { + it.candidates?.isEmpty() shouldBe false + channel.close() + } + } + + mockEngine.requestHistory.first().url.encodedPath shouldStartWith "/${ApiVersion.V1.value}" + // TODO: Update test to set ApiVersion.V1BETA when ApiVersion.V1 becomes the default and delete + // the following check. + RequestOptions().apiVersion shouldNotBe ApiVersion.V1.value + } + @Test fun `client id header is set correctly in the request`() = doBlocking { val response = JSON.encodeToString(CountTokensResponse(totalTokens = 10)) From eb0e119f781a2af8f8ff863cd65d9004f55e1a74 Mon Sep 17 00:00:00 2001 From: Andrew Heard Date: Mon, 20 Jan 2025 17:26:35 -0500 Subject: [PATCH 2/9] Reformat with `spotless` --- .../com/google/firebase/vertexai/type/RequestOptions.kt | 4 ++-- .../google/firebase/vertexai/common/APIControllerTests.kt | 5 +---- 2 files changed, 3 insertions(+), 6 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 02f9b569357..9ecdbcfca21 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 @@ -33,9 +33,9 @@ internal constructor( * Constructor for RequestOptions. * * @param timeoutInMillis the maximum amount of time, in milliseconds, for a request to take, from - * the first request to first response. + * the first request to first response. * @param apiVersion the version of the Vertex AI in Firebase API; defaults to [ApiVersion.V1BETA] - * if not specified. + * if not specified. */ @JvmOverloads public constructor( 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 49169ff6425..ffc3e352d3d 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 @@ -156,10 +156,7 @@ internal class RequestFormatTests { APIController( "super_cool_test_key", "gemini-pro-1.5", - RequestOptions( - timeoutInMillis = 5.seconds.inWholeMilliseconds, - apiVersion = ApiVersion.V1 - ), + RequestOptions(timeoutInMillis = 5.seconds.inWholeMilliseconds, apiVersion = ApiVersion.V1), mockEngine, TEST_CLIENT_ID, null, From aa8aefcc3c0968ca4d18161895338767bef82995 Mon Sep 17 00:00:00 2001 From: Andrew Heard Date: Mon, 20 Jan 2025 17:27:19 -0500 Subject: [PATCH 3/9] Update mock responses to `v5.x` --- firebase-vertexai/update_responses.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/firebase-vertexai/update_responses.sh b/firebase-vertexai/update_responses.sh index b13b94c8229..cb01e1a2c40 100755 --- a/firebase-vertexai/update_responses.sh +++ b/firebase-vertexai/update_responses.sh @@ -17,7 +17,7 @@ # This script replaces mock response files for Vertex AI unit tests with a fresh # clone of the shared repository of Vertex AI test data. -RESPONSES_VERSION='v3.*' # The major version of mock responses to use +RESPONSES_VERSION='v5.*' # The major version of mock responses to use REPO_NAME="vertexai-sdk-test-data" REPO_LINK="https://github.com/FirebaseExtended/$REPO_NAME.git" From f2a78f33370a0b28d0339435cd7038da14f422d8 Mon Sep 17 00:00:00 2001 From: Andrew Heard Date: Wed, 22 Jan 2025 16:25:26 -0500 Subject: [PATCH 4/9] Add `constructor(apiVersion: ApiVersion)` --- .../firebase/vertexai/type/RequestOptions.kt | 25 ++++++++++++++++--- 1 file changed, 22 insertions(+), 3 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 9ecdbcfca21..4fcade8570b 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 @@ -26,7 +26,7 @@ public class RequestOptions internal constructor( internal val timeout: Duration, internal val endpoint: String = "https://firebasevertexai.googleapis.com", - internal val apiVersion: String, + internal val apiVersion: String = DEFAULT_API_VERSION.value, ) { /** @@ -39,10 +39,29 @@ internal constructor( */ @JvmOverloads public constructor( - timeoutInMillis: Long = 180.seconds.inWholeMilliseconds, - apiVersion: ApiVersion = ApiVersion.V1BETA, + timeoutInMillis: Long = DEFAULT_TIMEOUT_IN_MILLIS.seconds.inWholeMilliseconds, + apiVersion: ApiVersion = DEFAULT_API_VERSION, ) : this( timeout = timeoutInMillis.toDuration(DurationUnit.MILLISECONDS), apiVersion = apiVersion.value, ) + + /** + * Constructor for RequestOptions. + * + * @param apiVersion the version of the Vertex AI in Firebase API; defaults to [ApiVersion.V1BETA] + * if not specified. + */ + public constructor( + apiVersion: ApiVersion + ) : this( + timeoutInMillis = DEFAULT_TIMEOUT_IN_MILLIS, + apiVersion = apiVersion, + ) + + private companion object { + private const val DEFAULT_TIMEOUT_IN_MILLIS: Long = 180_000L + + private val DEFAULT_API_VERSION: ApiVersion = ApiVersion.V1BETA + } } From 18ebbd4e956177b629ccb9fd4bf622a05eb3c946 Mon Sep 17 00:00:00 2001 From: Andrew Heard Date: Wed, 22 Jan 2025 17:10:09 -0500 Subject: [PATCH 5/9] Fix `timeoutInMillis` value --- .../kotlin/com/google/firebase/vertexai/type/RequestOptions.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 4fcade8570b..ebea4d5e3f6 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 @@ -39,7 +39,7 @@ internal constructor( */ @JvmOverloads public constructor( - timeoutInMillis: Long = DEFAULT_TIMEOUT_IN_MILLIS.seconds.inWholeMilliseconds, + timeoutInMillis: Long = DEFAULT_TIMEOUT_IN_MILLIS, apiVersion: ApiVersion = DEFAULT_API_VERSION, ) : this( timeout = timeoutInMillis.toDuration(DurationUnit.MILLISECONDS), From 8d596c6d782dc3430f828101fae11c70e2f378ee Mon Sep 17 00:00:00 2001 From: Andrew Heard Date: Wed, 22 Jan 2025 17:14:41 -0500 Subject: [PATCH 6/9] Add `RequestOptionsTests` --- .../firebase/vertexai/type/RequestOptions.kt | 9 +- .../vertexai/type/RequestOptionsTests.kt | 86 +++++++++++++++++++ 2 files changed, 91 insertions(+), 4 deletions(-) create mode 100644 firebase-vertexai/src/test/java/com/google/firebase/vertexai/type/RequestOptionsTests.kt 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 ebea4d5e3f6..9052a726052 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,7 +25,7 @@ import kotlin.time.toDuration public class RequestOptions internal constructor( internal val timeout: Duration, - internal val endpoint: String = "https://firebasevertexai.googleapis.com", + internal val endpoint: String = DEFAULT_ENDPOINT, internal val apiVersion: String = DEFAULT_API_VERSION.value, ) { @@ -59,9 +59,10 @@ internal constructor( apiVersion = apiVersion, ) - private companion object { - private const val DEFAULT_TIMEOUT_IN_MILLIS: Long = 180_000L + internal companion object { + internal const val DEFAULT_TIMEOUT_IN_MILLIS: Long = 180_000L + internal const val DEFAULT_ENDPOINT: String = "https://firebasevertexai.googleapis.com" - private val DEFAULT_API_VERSION: ApiVersion = ApiVersion.V1BETA + internal val DEFAULT_API_VERSION: ApiVersion = ApiVersion.V1BETA } } diff --git a/firebase-vertexai/src/test/java/com/google/firebase/vertexai/type/RequestOptionsTests.kt b/firebase-vertexai/src/test/java/com/google/firebase/vertexai/type/RequestOptionsTests.kt new file mode 100644 index 00000000000..6480703b150 --- /dev/null +++ b/firebase-vertexai/src/test/java/com/google/firebase/vertexai/type/RequestOptionsTests.kt @@ -0,0 +1,86 @@ +/* + * Copyright 2025 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.firebase.vertexai.type + +import com.google.firebase.vertexai.type.RequestOptions.Companion.DEFAULT_API_VERSION +import com.google.firebase.vertexai.type.RequestOptions.Companion.DEFAULT_ENDPOINT +import com.google.firebase.vertexai.type.RequestOptions.Companion.DEFAULT_TIMEOUT_IN_MILLIS +import io.kotest.matchers.equals.shouldBeEqual +import kotlin.time.DurationUnit +import kotlin.time.toDuration +import org.junit.Test + +internal class RequestOptionsTests { + private val defaultTimeout = DEFAULT_TIMEOUT_IN_MILLIS.toDuration(DurationUnit.MILLISECONDS) + + @Test + fun `init default values`() { + val requestOptions = RequestOptions() + + requestOptions.timeout shouldBeEqual defaultTimeout + requestOptions.endpoint shouldBeEqual DEFAULT_ENDPOINT + requestOptions.apiVersion shouldBeEqual DEFAULT_API_VERSION.value + } + + @Test + fun `init custom timeout`() { + val expectedTimeoutInMillis = 60_000L + + val requestOptions = RequestOptions(timeoutInMillis = expectedTimeoutInMillis) + + requestOptions.timeout shouldBeEqual + expectedTimeoutInMillis.toDuration(DurationUnit.MILLISECONDS) + requestOptions.endpoint shouldBeEqual DEFAULT_ENDPOINT + requestOptions.apiVersion shouldBeEqual DEFAULT_API_VERSION.value + } + + @Test + fun `init API version v1`() { + val expectedApiVersion = ApiVersion.V1 + + val requestOptions = RequestOptions(apiVersion = expectedApiVersion) + + requestOptions.timeout shouldBeEqual defaultTimeout + requestOptions.endpoint shouldBeEqual DEFAULT_ENDPOINT + requestOptions.apiVersion shouldBeEqual expectedApiVersion.value + } + + @Test + fun `init API version v1beta`() { + val expectedApiVersion = ApiVersion.V1BETA + + val requestOptions = RequestOptions(apiVersion = expectedApiVersion) + + requestOptions.timeout shouldBeEqual defaultTimeout + requestOptions.endpoint shouldBeEqual DEFAULT_ENDPOINT + requestOptions.apiVersion shouldBeEqual expectedApiVersion.value + } + + @Test + fun `init all public options`() { + val expectedTimeoutInMillis = 30_000L + val expectedApiVersion = ApiVersion.V1BETA + + val requestOptions = + RequestOptions(timeoutInMillis = expectedTimeoutInMillis, apiVersion = expectedApiVersion) + + requestOptions.timeout shouldBeEqual + expectedTimeoutInMillis.toDuration(DurationUnit.MILLISECONDS) + requestOptions.endpoint shouldBeEqual DEFAULT_ENDPOINT + requestOptions.apiVersion shouldBeEqual expectedApiVersion.value + } +} From df662e97d418c653f83c43aa3a341f6f76c8fb52 Mon Sep 17 00:00:00 2001 From: Andrew Heard Date: Wed, 22 Jan 2025 17:15:28 -0500 Subject: [PATCH 7/9] Add `JavaPublicApiTests` with Java code samples for `RequestOptions` --- .../vertexai/api/java/JavaPublicApiTests.java | 15 +++++++++++++++ 1 file changed, 15 insertions(+) create mode 100644 firebase-vertexai/src/test/java/com/google/firebase/vertexai/api/java/JavaPublicApiTests.java diff --git a/firebase-vertexai/src/test/java/com/google/firebase/vertexai/api/java/JavaPublicApiTests.java b/firebase-vertexai/src/test/java/com/google/firebase/vertexai/api/java/JavaPublicApiTests.java new file mode 100644 index 00000000000..eb008478a0b --- /dev/null +++ b/firebase-vertexai/src/test/java/com/google/firebase/vertexai/api/java/JavaPublicApiTests.java @@ -0,0 +1,15 @@ +package com.google.firebase.vertexai.api.java; + +import com.google.firebase.vertexai.type.ApiVersion; +import com.google.firebase.vertexai.type.RequestOptions; + +/** Build tests for the Vertex AI in Firebase Java public API surface. */ +final class JavaPublicApiTests { + /** {@link RequestOptions} API */ + void requestOptionsCodeSamples() { + new RequestOptions(); + new RequestOptions(30_000L); + new RequestOptions(ApiVersion.V1); + new RequestOptions(60_000L, ApiVersion.V1BETA); + } +} From 253b3a71f5bf8d87d7db0c6ba8f30d4d248411ed Mon Sep 17 00:00:00 2001 From: Andrew Heard Date: Wed, 22 Jan 2025 17:17:13 -0500 Subject: [PATCH 8/9] Add copyright header to `JavaPublicApiTests.java` --- .../vertexai/api/java/JavaPublicApiTests.java | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/firebase-vertexai/src/test/java/com/google/firebase/vertexai/api/java/JavaPublicApiTests.java b/firebase-vertexai/src/test/java/com/google/firebase/vertexai/api/java/JavaPublicApiTests.java index eb008478a0b..cf271c42905 100644 --- a/firebase-vertexai/src/test/java/com/google/firebase/vertexai/api/java/JavaPublicApiTests.java +++ b/firebase-vertexai/src/test/java/com/google/firebase/vertexai/api/java/JavaPublicApiTests.java @@ -1,3 +1,19 @@ +/* + * Copyright 2025 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + package com.google.firebase.vertexai.api.java; import com.google.firebase.vertexai.type.ApiVersion; From 98b5c023223611aedfabbcd427a8b610118d1fa3 Mon Sep 17 00:00:00 2001 From: Andrew Heard Date: Wed, 22 Jan 2025 17:29:17 -0500 Subject: [PATCH 9/9] Fix formatting --- .../kotlin/com/google/firebase/vertexai/type/RequestOptions.kt | 1 - 1 file changed, 1 deletion(-) 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 9052a726052..e2d2ff36b36 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 @@ -17,7 +17,6 @@ package com.google.firebase.vertexai.type import kotlin.time.Duration -import kotlin.time.Duration.Companion.seconds import kotlin.time.DurationUnit import kotlin.time.toDuration