From c8635473e26ae8d859b9073537a5b68302ef122c Mon Sep 17 00:00:00 2001 From: Rodrigo Lazo Paz Date: Thu, 16 Apr 2026 10:17:17 -0400 Subject: [PATCH 1/8] [AI] Add configurable model generation for AI On-Device Introduced `GenerationConfig`, `ModelConfig`, `ModelReleaseStage`, and `ModelPreference` to `firebase-ai-ondevice-interop` to allow for configurable model selection. Updated the internal `genaiPrompt` dependency to `1.0.0-beta2` to support the new configuration options. Deprecated the parameter-less `FirebaseAIOnDeviceGenerativeModelFactory.newGenerativeModel()` method in favor of a new overload that accepts a `GenerationConfig`. --- ai-logic/firebase-ai-ondevice-interop/api.txt | 23 ++++++ ...irebaseAIOnDeviceGenerativeModelFactory.kt | 14 ++++ .../ai/ondevice/interop/GenerationConfig.kt | 73 +++++++++++++++++++ .../firebase-ai-ondevice.gradle.kts | 2 +- .../google/firebase/ai/ondevice/Converters.kt | 34 +++++++++ .../ondevice/FirebaseAIOnDeviceComponent.kt | 15 +++- .../ai/ondevice/GenerativeModelImpl.kt | 3 +- gradle/libs.versions.toml | 2 +- 8 files changed, 161 insertions(+), 5 deletions(-) create mode 100644 ai-logic/firebase-ai-ondevice-interop/src/main/kotlin/com/google/firebase/ai/ondevice/interop/GenerationConfig.kt diff --git a/ai-logic/firebase-ai-ondevice-interop/api.txt b/ai-logic/firebase-ai-ondevice-interop/api.txt index c27deeb6795..e4d830ef4bc 100644 --- a/ai-logic/firebase-ai-ondevice-interop/api.txt +++ b/ai-logic/firebase-ai-ondevice-interop/api.txt @@ -37,6 +37,29 @@ package com.google.firebase.ai.ondevice.interop { public interface FirebaseAIOnDeviceGenerativeModelFactory { method public com.google.firebase.ai.ondevice.interop.GenerativeModel newGenerativeModel(); + method public com.google.firebase.ai.ondevice.interop.GenerativeModel newGenerativeModel(com.google.firebase.ai.ondevice.interop.ModelConfig modelConfig); + } + + public final class ModelConfig { + ctor public ModelConfig(com.google.firebase.ai.ondevice.interop.ModelReleaseStage releaseStage = com.google.firebase.ai.ondevice.interop.ModelReleaseStage.STABLE, com.google.firebase.ai.ondevice.interop.ModelPreference preference = com.google.firebase.ai.ondevice.interop.ModelPreference.FULL); + method public com.google.firebase.ai.ondevice.interop.ModelPreference getPreference(); + method public com.google.firebase.ai.ondevice.interop.ModelReleaseStage getReleaseStage(); + property public final com.google.firebase.ai.ondevice.interop.ModelPreference preference; + property public final com.google.firebase.ai.ondevice.interop.ModelReleaseStage releaseStage; + } + + public enum ModelPreference { + method public static com.google.firebase.ai.ondevice.interop.ModelPreference valueOf(String name) throws java.lang.IllegalArgumentException; + method public static com.google.firebase.ai.ondevice.interop.ModelPreference[] values(); + enum_constant public static final com.google.firebase.ai.ondevice.interop.ModelPreference FAST; + enum_constant public static final com.google.firebase.ai.ondevice.interop.ModelPreference FULL; + } + + public enum ModelReleaseStage { + method public static com.google.firebase.ai.ondevice.interop.ModelReleaseStage valueOf(String name) throws java.lang.IllegalArgumentException; + method public static com.google.firebase.ai.ondevice.interop.ModelReleaseStage[] values(); + enum_constant public static final com.google.firebase.ai.ondevice.interop.ModelReleaseStage PREVIEW; + enum_constant public static final com.google.firebase.ai.ondevice.interop.ModelReleaseStage STABLE; } public final class FirebaseAIOnDeviceInvalidRequestException extends com.google.firebase.ai.ondevice.interop.FirebaseAIOnDeviceException { diff --git a/ai-logic/firebase-ai-ondevice-interop/src/main/kotlin/com/google/firebase/ai/ondevice/interop/FirebaseAIOnDeviceGenerativeModelFactory.kt b/ai-logic/firebase-ai-ondevice-interop/src/main/kotlin/com/google/firebase/ai/ondevice/interop/FirebaseAIOnDeviceGenerativeModelFactory.kt index aa2361371d7..024d2a437c7 100644 --- a/ai-logic/firebase-ai-ondevice-interop/src/main/kotlin/com/google/firebase/ai/ondevice/interop/FirebaseAIOnDeviceGenerativeModelFactory.kt +++ b/ai-logic/firebase-ai-ondevice-interop/src/main/kotlin/com/google/firebase/ai/ondevice/interop/FirebaseAIOnDeviceGenerativeModelFactory.kt @@ -28,5 +28,19 @@ public interface FirebaseAIOnDeviceGenerativeModelFactory { * * @return A new [GenerativeModel] instance ready for use. */ + @Deprecated( + message = "Use newGenerativeModel(GenerationConfig) instead", + replaceWith = ReplaceWith("newGenerativeModel(GenerationConfig)") + ) public fun newGenerativeModel(): GenerativeModel + + /** + * Creates and returns a new instance of [GenerativeModel] optionally configured with + * [ModelConfig]. + * + * @param generationConfig The configuration for the model, `null` if the default configuration + * should be used. + * @return A new [GenerativeModel] instance ready for use. + */ + public fun newGenerativeModel(generationConfig: GenerationConfig?): GenerativeModel } diff --git a/ai-logic/firebase-ai-ondevice-interop/src/main/kotlin/com/google/firebase/ai/ondevice/interop/GenerationConfig.kt b/ai-logic/firebase-ai-ondevice-interop/src/main/kotlin/com/google/firebase/ai/ondevice/interop/GenerationConfig.kt new file mode 100644 index 00000000000..ed30ef2a977 --- /dev/null +++ b/ai-logic/firebase-ai-ondevice-interop/src/main/kotlin/com/google/firebase/ai/ondevice/interop/GenerationConfig.kt @@ -0,0 +1,73 @@ +/* + * Copyright 2026 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.ai.ondevice.interop + +public class GenerationConfig(public val modelConfig: ModelConfig? = null) { + override fun toString(): String = "GenerationConfig(modelConfig=$modelConfig)" + + override fun equals(other: Any?): Boolean = + other is GenerationConfig && modelConfig == other.modelConfig + + override fun hashCode(): Int = modelConfig?.hashCode() ?: 0 +} + +/** + * Configuration parameters for model selection. + * + * @property releaseStage The release stage of the model to use. + * @property preference The performance preference for the model. + */ +public class ModelConfig( + public val releaseStage: ModelReleaseStage = ModelReleaseStage.STABLE, + public val preference: ModelPreference = ModelPreference.FULL, +) { + override fun equals(other: Any?): Boolean = + other is ModelConfig && releaseStage == other.releaseStage && preference == other.preference + + override fun hashCode(): Int { + var result = releaseStage.hashCode() + result = 31 * result + preference.hashCode() + return result + } + + override fun toString(): String { + return "ModelConfig(releaseStage=$releaseStage, preference=$preference)" + } +} +/** Defines the release stage of the model. */ +public enum class ModelReleaseStage { + /** + * Selects the latest model version that is fully tested and on consumer devices. This is the + * default setting. + */ + STABLE, + + /** + * Selects the latest model version in the preview stage. This stage lets you test beta features + * or newer model architectures before they are widely deployed. + */ + PREVIEW, +} + +/** Defines the performance preference for the model. */ +public enum class ModelPreference { + /** Recommended when model accuracy and full capabilities are prioritized over speed. */ + FULL, + + /** Recommended for latency-sensitive apps that require minimal response times. */ + FAST, +} diff --git a/ai-logic/firebase-ai-ondevice/firebase-ai-ondevice.gradle.kts b/ai-logic/firebase-ai-ondevice/firebase-ai-ondevice.gradle.kts index ae21bd4f955..9cb9a75df6d 100644 --- a/ai-logic/firebase-ai-ondevice/firebase-ai-ondevice.gradle.kts +++ b/ai-logic/firebase-ai-ondevice/firebase-ai-ondevice.gradle.kts @@ -68,7 +68,7 @@ kotlin { dependencies { implementation(libs.genai.prompt) - implementation("com.google.firebase:firebase-ai-ondevice-interop:16.0.0-beta01") + implementation(project(":ai-logic:firebase-ai-ondevice-interop")) implementation(libs.firebase.common) implementation(libs.firebase.components) diff --git a/ai-logic/firebase-ai-ondevice/src/main/kotlin/com/google/firebase/ai/ondevice/Converters.kt b/ai-logic/firebase-ai-ondevice/src/main/kotlin/com/google/firebase/ai/ondevice/Converters.kt index ef615423857..e757189bd97 100644 --- a/ai-logic/firebase-ai-ondevice/src/main/kotlin/com/google/firebase/ai/ondevice/Converters.kt +++ b/ai-logic/firebase-ai-ondevice/src/main/kotlin/com/google/firebase/ai/ondevice/Converters.kt @@ -22,9 +22,15 @@ import com.google.firebase.ai.ondevice.interop.CountTokensResponse import com.google.firebase.ai.ondevice.interop.FinishReason import com.google.firebase.ai.ondevice.interop.FirebaseAIOnDeviceInvalidRequestException import com.google.firebase.ai.ondevice.interop.GenerateContentResponse +import com.google.firebase.ai.ondevice.interop.GenerationConfig +import com.google.firebase.ai.ondevice.interop.ModelConfig import com.google.mlkit.genai.prompt.GenerateContentRequest import com.google.mlkit.genai.prompt.ImagePart +import com.google.mlkit.genai.prompt.ModelPreference +import com.google.mlkit.genai.prompt.ModelReleaseStage import com.google.mlkit.genai.prompt.TextPart +import com.google.mlkit.genai.prompt.generationConfig +import com.google.mlkit.genai.prompt.modelConfig import kotlin.math.min // ==================================== @@ -75,6 +81,34 @@ internal fun com.google.firebase.ai.ondevice.interop.GenerateContentRequest.toMl internal fun com.google.mlkit.genai.prompt.GenerateContentResponse.toInterop(): GenerateContentResponse = GenerateContentResponse(candidates.map { it.toInterop() }) +// ================================================ +// `GenerationConfig` converter extension functions +// ================================================ +internal fun GenerationConfig.toMlKit(): com.google.mlkit.genai.prompt.GenerationConfig = + generationConfig { + modelConfig = this@toMlKit.modelConfig.toMlKit() + } + +// =========================================== +// `ModelConfig` converter extension functions +// =========================================== +internal fun ModelConfig.toMlKit(): com.google.mlkit.genai.prompt.ModelConfig = modelConfig { + releaseStage = this@toMlKit.releaseStage.toMlKit() + preference = this@toMlKit.preference.toMlKit() +} + +private fun com.google.firebase.ai.ondevice.interop.ModelReleaseStage.toMlKit(): Int = + when (this) { + com.google.firebase.ai.ondevice.interop.ModelReleaseStage.PREVIEW -> ModelReleaseStage.PREVIEW + com.google.firebase.ai.ondevice.interop.ModelReleaseStage.STABLE -> ModelReleaseStage.STABLE + } + +private fun com.google.firebase.ai.ondevice.interop.ModelPreference.toMlKit(): Int = + when (this) { + com.google.firebase.ai.ondevice.interop.ModelPreference.FULL -> ModelPreference.FULL + com.google.firebase.ai.ondevice.interop.ModelPreference.FAST -> ModelPreference.FAST + } + private fun generateContentRequest( text: com.google.firebase.ai.ondevice.interop.TextPart, image: com.google.firebase.ai.ondevice.interop.ImagePart? = null, diff --git a/ai-logic/firebase-ai-ondevice/src/main/kotlin/com/google/firebase/ai/ondevice/FirebaseAIOnDeviceComponent.kt b/ai-logic/firebase-ai-ondevice/src/main/kotlin/com/google/firebase/ai/ondevice/FirebaseAIOnDeviceComponent.kt index ab44fc1dc7c..810d1e7fa5b 100644 --- a/ai-logic/firebase-ai-ondevice/src/main/kotlin/com/google/firebase/ai/ondevice/FirebaseAIOnDeviceComponent.kt +++ b/ai-logic/firebase-ai-ondevice/src/main/kotlin/com/google/firebase/ai/ondevice/FirebaseAIOnDeviceComponent.kt @@ -17,7 +17,9 @@ package com.google.firebase.ai.ondevice import com.google.firebase.ai.ondevice.interop.FirebaseAIOnDeviceGenerativeModelFactory +import com.google.firebase.ai.ondevice.interop.GenerationConfig import com.google.firebase.ai.ondevice.interop.GenerativeModel +import com.google.mlkit.genai.prompt.Generation /** * Factory class for Firebase AI OnDevice. @@ -26,5 +28,16 @@ import com.google.firebase.ai.ondevice.interop.GenerativeModel */ internal class FirebaseAIOnDeviceComponent : FirebaseAIOnDeviceGenerativeModelFactory { - override fun newGenerativeModel(): GenerativeModel = GenerativeModelImpl() + @Deprecated( + "Use newGenerativeModel(ModelConfig) instead", + replaceWith = ReplaceWith("newGenerativeModel(ModelConfig)") + ) + override fun newGenerativeModel(): GenerativeModel = newGenerativeModel(null) + + override fun newGenerativeModel(generationConfig: GenerationConfig?): GenerativeModel = + if (generationConfig == null) { + GenerativeModelImpl(Generation.getClient()) + } else { + GenerativeModelImpl(Generation.getClient(generationConfig.toMlKit())) + } } diff --git a/ai-logic/firebase-ai-ondevice/src/main/kotlin/com/google/firebase/ai/ondevice/GenerativeModelImpl.kt b/ai-logic/firebase-ai-ondevice/src/main/kotlin/com/google/firebase/ai/ondevice/GenerativeModelImpl.kt index c2254b283a4..77a5354d667 100644 --- a/ai-logic/firebase-ai-ondevice/src/main/kotlin/com/google/firebase/ai/ondevice/GenerativeModelImpl.kt +++ b/ai-logic/firebase-ai-ondevice/src/main/kotlin/com/google/firebase/ai/ondevice/GenerativeModelImpl.kt @@ -27,14 +27,13 @@ import com.google.firebase.ai.ondevice.interop.GenerativeModel import com.google.mlkit.genai.common.FeatureStatus import com.google.mlkit.genai.common.GenAiException import com.google.mlkit.genai.common.GenAiException.ErrorCode -import com.google.mlkit.genai.prompt.Generation import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.catch import kotlinx.coroutines.flow.map /** Implementation of [GenerativeModel] backed by MLKit's genai prompt SDK. */ internal class GenerativeModelImpl( - internal val mlkitModel: com.google.mlkit.genai.prompt.GenerativeModel = Generation.getClient() + internal val mlkitModel: com.google.mlkit.genai.prompt.GenerativeModel ) : GenerativeModel { /** diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index bf8ffbcf871..74a86cfa29c 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -28,7 +28,7 @@ firebaseAnnotations = "17.0.0" firebaseCommon = "22.0.1" firebaseComponents = "19.0.0" firebaseCrashlyticsGradle = "3.0.4" -genaiPrompt = "1.0.0-alpha1" +genaiPrompt = "1.0.0-beta2" glide = "5.0.5" googleApiClient = "2.8.1" googleServices = "4.3.15" From b507cc1a8b1b97182e687e3da99f7e27d1eb697d Mon Sep 17 00:00:00 2001 From: Rodrigo Lazo Paz Date: Thu, 16 Apr 2026 12:21:00 -0400 Subject: [PATCH 2/8] Fix compile issue --- .../main/kotlin/com/google/firebase/ai/ondevice/Converters.kt | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/ai-logic/firebase-ai-ondevice/src/main/kotlin/com/google/firebase/ai/ondevice/Converters.kt b/ai-logic/firebase-ai-ondevice/src/main/kotlin/com/google/firebase/ai/ondevice/Converters.kt index e757189bd97..595959eb60d 100644 --- a/ai-logic/firebase-ai-ondevice/src/main/kotlin/com/google/firebase/ai/ondevice/Converters.kt +++ b/ai-logic/firebase-ai-ondevice/src/main/kotlin/com/google/firebase/ai/ondevice/Converters.kt @@ -86,7 +86,9 @@ internal fun com.google.mlkit.genai.prompt.GenerateContentResponse.toInterop(): // ================================================ internal fun GenerationConfig.toMlKit(): com.google.mlkit.genai.prompt.GenerationConfig = generationConfig { - modelConfig = this@toMlKit.modelConfig.toMlKit() + this@toMlKit.modelConfig?.let { + modelConfig = it.toMlKit() + } } // =========================================== From 61c8e209d2048b1d53f8302f942847f20210a681 Mon Sep 17 00:00:00 2001 From: Rodrigo Lazo Paz Date: Thu, 16 Apr 2026 12:25:48 -0400 Subject: [PATCH 3/8] Update api.txt --- ai-logic/firebase-ai-ondevice-interop/api.txt | 50 ++++++++++--------- 1 file changed, 26 insertions(+), 24 deletions(-) diff --git a/ai-logic/firebase-ai-ondevice-interop/api.txt b/ai-logic/firebase-ai-ondevice-interop/api.txt index e4d830ef4bc..b160b11527c 100644 --- a/ai-logic/firebase-ai-ondevice-interop/api.txt +++ b/ai-logic/firebase-ai-ondevice-interop/api.txt @@ -36,30 +36,8 @@ package com.google.firebase.ai.ondevice.interop { } public interface FirebaseAIOnDeviceGenerativeModelFactory { - method public com.google.firebase.ai.ondevice.interop.GenerativeModel newGenerativeModel(); - method public com.google.firebase.ai.ondevice.interop.GenerativeModel newGenerativeModel(com.google.firebase.ai.ondevice.interop.ModelConfig modelConfig); - } - - public final class ModelConfig { - ctor public ModelConfig(com.google.firebase.ai.ondevice.interop.ModelReleaseStage releaseStage = com.google.firebase.ai.ondevice.interop.ModelReleaseStage.STABLE, com.google.firebase.ai.ondevice.interop.ModelPreference preference = com.google.firebase.ai.ondevice.interop.ModelPreference.FULL); - method public com.google.firebase.ai.ondevice.interop.ModelPreference getPreference(); - method public com.google.firebase.ai.ondevice.interop.ModelReleaseStage getReleaseStage(); - property public final com.google.firebase.ai.ondevice.interop.ModelPreference preference; - property public final com.google.firebase.ai.ondevice.interop.ModelReleaseStage releaseStage; - } - - public enum ModelPreference { - method public static com.google.firebase.ai.ondevice.interop.ModelPreference valueOf(String name) throws java.lang.IllegalArgumentException; - method public static com.google.firebase.ai.ondevice.interop.ModelPreference[] values(); - enum_constant public static final com.google.firebase.ai.ondevice.interop.ModelPreference FAST; - enum_constant public static final com.google.firebase.ai.ondevice.interop.ModelPreference FULL; - } - - public enum ModelReleaseStage { - method public static com.google.firebase.ai.ondevice.interop.ModelReleaseStage valueOf(String name) throws java.lang.IllegalArgumentException; - method public static com.google.firebase.ai.ondevice.interop.ModelReleaseStage[] values(); - enum_constant public static final com.google.firebase.ai.ondevice.interop.ModelReleaseStage PREVIEW; - enum_constant public static final com.google.firebase.ai.ondevice.interop.ModelReleaseStage STABLE; + method @Deprecated public com.google.firebase.ai.ondevice.interop.GenerativeModel newGenerativeModel(); + method public com.google.firebase.ai.ondevice.interop.GenerativeModel newGenerativeModel(com.google.firebase.ai.ondevice.interop.GenerationConfig? generationConfig); } public final class FirebaseAIOnDeviceInvalidRequestException extends com.google.firebase.ai.ondevice.interop.FirebaseAIOnDeviceException { @@ -98,6 +76,12 @@ package com.google.firebase.ai.ondevice.interop { property public final java.util.List candidates; } + public final class GenerationConfig { + ctor public GenerationConfig(com.google.firebase.ai.ondevice.interop.ModelConfig? modelConfig = null); + method public com.google.firebase.ai.ondevice.interop.ModelConfig? getModelConfig(); + property public final com.google.firebase.ai.ondevice.interop.ModelConfig? modelConfig; + } + public interface GenerativeModel { method public suspend Object? countTokens(com.google.firebase.ai.ondevice.interop.GenerateContentRequest request, kotlin.coroutines.Continuation); method public suspend Object? generateContent(com.google.firebase.ai.ondevice.interop.GenerateContentRequest request, kotlin.coroutines.Continuation); @@ -114,6 +98,24 @@ package com.google.firebase.ai.ondevice.interop { property public final android.graphics.Bitmap bitmap; } + public final class ModelConfig { + ctor public ModelConfig(com.google.firebase.ai.ondevice.interop.ModelReleaseStage releaseStage = com.google.firebase.ai.ondevice.interop.ModelReleaseStage.STABLE, com.google.firebase.ai.ondevice.interop.ModelPreference preference = com.google.firebase.ai.ondevice.interop.ModelPreference.FULL); + method public com.google.firebase.ai.ondevice.interop.ModelPreference getPreference(); + method public com.google.firebase.ai.ondevice.interop.ModelReleaseStage getReleaseStage(); + property public final com.google.firebase.ai.ondevice.interop.ModelPreference preference; + property public final com.google.firebase.ai.ondevice.interop.ModelReleaseStage releaseStage; + } + + public enum ModelPreference { + enum_constant public static final com.google.firebase.ai.ondevice.interop.ModelPreference FAST; + enum_constant public static final com.google.firebase.ai.ondevice.interop.ModelPreference FULL; + } + + public enum ModelReleaseStage { + enum_constant public static final com.google.firebase.ai.ondevice.interop.ModelReleaseStage PREVIEW; + enum_constant public static final com.google.firebase.ai.ondevice.interop.ModelReleaseStage STABLE; + } + public interface Part { } From 388058bf260f2e3ca0d715453fbf28e7443e0b74 Mon Sep 17 00:00:00 2001 From: Rodrigo Lazo Paz Date: Thu, 16 Apr 2026 12:27:57 -0400 Subject: [PATCH 4/8] Update deprecation message --- .../firebase/ai/ondevice/FirebaseAIOnDeviceComponent.kt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ai-logic/firebase-ai-ondevice/src/main/kotlin/com/google/firebase/ai/ondevice/FirebaseAIOnDeviceComponent.kt b/ai-logic/firebase-ai-ondevice/src/main/kotlin/com/google/firebase/ai/ondevice/FirebaseAIOnDeviceComponent.kt index 810d1e7fa5b..3275391ec10 100644 --- a/ai-logic/firebase-ai-ondevice/src/main/kotlin/com/google/firebase/ai/ondevice/FirebaseAIOnDeviceComponent.kt +++ b/ai-logic/firebase-ai-ondevice/src/main/kotlin/com/google/firebase/ai/ondevice/FirebaseAIOnDeviceComponent.kt @@ -29,8 +29,8 @@ import com.google.mlkit.genai.prompt.Generation internal class FirebaseAIOnDeviceComponent : FirebaseAIOnDeviceGenerativeModelFactory { @Deprecated( - "Use newGenerativeModel(ModelConfig) instead", - replaceWith = ReplaceWith("newGenerativeModel(ModelConfig)") + "Use newGenerativeModel(GenerationConfig) instead", + replaceWith = ReplaceWith("newGenerativeModel(GenerationConfig)") ) override fun newGenerativeModel(): GenerativeModel = newGenerativeModel(null) From 23a8abba21b9671ac09f61f6dba880145d5f7aa8 Mon Sep 17 00:00:00 2001 From: Rodrigo Lazo Date: Thu, 16 Apr 2026 23:51:31 -0400 Subject: [PATCH 5/8] Update ai-logic/firebase-ai-ondevice-interop/src/main/kotlin/com/google/firebase/ai/ondevice/interop/FirebaseAIOnDeviceGenerativeModelFactory.kt Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> --- .../interop/FirebaseAIOnDeviceGenerativeModelFactory.kt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ai-logic/firebase-ai-ondevice-interop/src/main/kotlin/com/google/firebase/ai/ondevice/interop/FirebaseAIOnDeviceGenerativeModelFactory.kt b/ai-logic/firebase-ai-ondevice-interop/src/main/kotlin/com/google/firebase/ai/ondevice/interop/FirebaseAIOnDeviceGenerativeModelFactory.kt index 024d2a437c7..670203af712 100644 --- a/ai-logic/firebase-ai-ondevice-interop/src/main/kotlin/com/google/firebase/ai/ondevice/interop/FirebaseAIOnDeviceGenerativeModelFactory.kt +++ b/ai-logic/firebase-ai-ondevice-interop/src/main/kotlin/com/google/firebase/ai/ondevice/interop/FirebaseAIOnDeviceGenerativeModelFactory.kt @@ -29,8 +29,8 @@ public interface FirebaseAIOnDeviceGenerativeModelFactory { * @return A new [GenerativeModel] instance ready for use. */ @Deprecated( - message = "Use newGenerativeModel(GenerationConfig) instead", - replaceWith = ReplaceWith("newGenerativeModel(GenerationConfig)") + message = "Use newGenerativeModel(GenerationConfig?) instead", + replaceWith = ReplaceWith("newGenerativeModel(null)") ) public fun newGenerativeModel(): GenerativeModel From ac6bb98041028673704b4038188dd4baeca6162f Mon Sep 17 00:00:00 2001 From: Rodrigo Lazo Date: Thu, 16 Apr 2026 23:51:48 -0400 Subject: [PATCH 6/8] Update ai-logic/firebase-ai-ondevice/src/main/kotlin/com/google/firebase/ai/ondevice/FirebaseAIOnDeviceComponent.kt Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> --- .../firebase/ai/ondevice/FirebaseAIOnDeviceComponent.kt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ai-logic/firebase-ai-ondevice/src/main/kotlin/com/google/firebase/ai/ondevice/FirebaseAIOnDeviceComponent.kt b/ai-logic/firebase-ai-ondevice/src/main/kotlin/com/google/firebase/ai/ondevice/FirebaseAIOnDeviceComponent.kt index 3275391ec10..9a98e5cab35 100644 --- a/ai-logic/firebase-ai-ondevice/src/main/kotlin/com/google/firebase/ai/ondevice/FirebaseAIOnDeviceComponent.kt +++ b/ai-logic/firebase-ai-ondevice/src/main/kotlin/com/google/firebase/ai/ondevice/FirebaseAIOnDeviceComponent.kt @@ -29,8 +29,8 @@ import com.google.mlkit.genai.prompt.Generation internal class FirebaseAIOnDeviceComponent : FirebaseAIOnDeviceGenerativeModelFactory { @Deprecated( - "Use newGenerativeModel(GenerationConfig) instead", - replaceWith = ReplaceWith("newGenerativeModel(GenerationConfig)") + "Use newGenerativeModel(GenerationConfig?) instead", + replaceWith = ReplaceWith("newGenerativeModel(null)") ) override fun newGenerativeModel(): GenerativeModel = newGenerativeModel(null) From d906a02f70be035556d4bd1f04652149e2897059 Mon Sep 17 00:00:00 2001 From: Rodrigo Lazo Date: Thu, 16 Apr 2026 23:52:10 -0400 Subject: [PATCH 7/8] Update ai-logic/firebase-ai-ondevice-interop/src/main/kotlin/com/google/firebase/ai/ondevice/interop/FirebaseAIOnDeviceGenerativeModelFactory.kt Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> --- .../interop/FirebaseAIOnDeviceGenerativeModelFactory.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ai-logic/firebase-ai-ondevice-interop/src/main/kotlin/com/google/firebase/ai/ondevice/interop/FirebaseAIOnDeviceGenerativeModelFactory.kt b/ai-logic/firebase-ai-ondevice-interop/src/main/kotlin/com/google/firebase/ai/ondevice/interop/FirebaseAIOnDeviceGenerativeModelFactory.kt index 670203af712..8cc45e80e6f 100644 --- a/ai-logic/firebase-ai-ondevice-interop/src/main/kotlin/com/google/firebase/ai/ondevice/interop/FirebaseAIOnDeviceGenerativeModelFactory.kt +++ b/ai-logic/firebase-ai-ondevice-interop/src/main/kotlin/com/google/firebase/ai/ondevice/interop/FirebaseAIOnDeviceGenerativeModelFactory.kt @@ -36,7 +36,7 @@ public interface FirebaseAIOnDeviceGenerativeModelFactory { /** * Creates and returns a new instance of [GenerativeModel] optionally configured with - * [ModelConfig]. + * [GenerationConfig]. * * @param generationConfig The configuration for the model, `null` if the default configuration * should be used. From d415b857f040dff3619910b079586577dc55a11c Mon Sep 17 00:00:00 2001 From: Rodrigo Lazo Paz Date: Fri, 17 Apr 2026 00:08:53 -0400 Subject: [PATCH 8/8] Add changelog entries --- ai-logic/firebase-ai-ondevice-interop/CHANGELOG.md | 3 ++- ai-logic/firebase-ai-ondevice/CHANGELOG.md | 2 ++ .../main/kotlin/com/google/firebase/ai/ondevice/Converters.kt | 4 +--- 3 files changed, 5 insertions(+), 4 deletions(-) diff --git a/ai-logic/firebase-ai-ondevice-interop/CHANGELOG.md b/ai-logic/firebase-ai-ondevice-interop/CHANGELOG.md index 7f045d58617..4134d65099b 100644 --- a/ai-logic/firebase-ai-ondevice-interop/CHANGELOG.md +++ b/ai-logic/firebase-ai-ondevice-interop/CHANGELOG.md @@ -1,6 +1,7 @@ # Unreleased +- [feature] Added support for model selection, required for nano-v4. (#8043) + # 16.0.0-beta01 - [feature] Initial release. - diff --git a/ai-logic/firebase-ai-ondevice/CHANGELOG.md b/ai-logic/firebase-ai-ondevice/CHANGELOG.md index 7f045d58617..0a19d412041 100644 --- a/ai-logic/firebase-ai-ondevice/CHANGELOG.md +++ b/ai-logic/firebase-ai-ondevice/CHANGELOG.md @@ -1,5 +1,7 @@ # Unreleased +- [feature] Added support for model selection, required for nano-v4. (#8043) + # 16.0.0-beta01 - [feature] Initial release. diff --git a/ai-logic/firebase-ai-ondevice/src/main/kotlin/com/google/firebase/ai/ondevice/Converters.kt b/ai-logic/firebase-ai-ondevice/src/main/kotlin/com/google/firebase/ai/ondevice/Converters.kt index 595959eb60d..85e1ae61794 100644 --- a/ai-logic/firebase-ai-ondevice/src/main/kotlin/com/google/firebase/ai/ondevice/Converters.kt +++ b/ai-logic/firebase-ai-ondevice/src/main/kotlin/com/google/firebase/ai/ondevice/Converters.kt @@ -86,9 +86,7 @@ internal fun com.google.mlkit.genai.prompt.GenerateContentResponse.toInterop(): // ================================================ internal fun GenerationConfig.toMlKit(): com.google.mlkit.genai.prompt.GenerationConfig = generationConfig { - this@toMlKit.modelConfig?.let { - modelConfig = it.toMlKit() - } + this@toMlKit.modelConfig?.let { modelConfig = it.toMlKit() } } // ===========================================