From 1a6aad79a34cf87a25dc3a33a9f2c8a80036a9e2 Mon Sep 17 00:00:00 2001 From: Rosario Fernandes Date: Thu, 28 May 2026 16:25:26 +0100 Subject: [PATCH 1/2] refactor(ai-logic): use nano banana GA models --- firebase-ai/README.md | 10 +++++----- .../ai/feature/text/NanoBanana2ViewModel.kt | 15 +++++++++++++-- .../ai/feature/text/NanoBananaProViewModel.kt | 8 +++++++- .../ai/ui/navigation/FirebaseAISamples.kt | 7 +++---- 4 files changed, 28 insertions(+), 12 deletions(-) diff --git a/firebase-ai/README.md b/firebase-ai/README.md index eac81ef60..113d339ee 100644 --- a/firebase-ai/README.md +++ b/firebase-ai/README.md @@ -30,13 +30,13 @@ You can find the implementation for each feature by clicking on the links below: ### Gemini 3 - [Translate text](app/src/main/java/com/google/firebase/quickstart/ai/feature/text/TranslationViewModel.kt): Use Gemini 3.1 Flash-Lite to translate text - [SVG Generator](app/src/main/java/com/google/firebase/quickstart/ai/feature/text/SvgViewModel.kt): Use Gemini 3.5 Flash to create SVG illustrations -- [Gemini 3.1 Flash Image (Nano Banana 2)](app/src/main/java/com/google/firebase/quickstart/ai/feature/text/NanoBanana2ViewModel.kt): Generate and/or edit images using Nano Banana 2 preview -- [Gemini 3 Pro Image (Nano Banana Pro)](app/src/main/java/com/google/firebase/quickstart/ai/feature/text/NanoBananaProViewModel.kt): Generate and/or edit images using Nano Banana Pro preview +- [Gemini 3.1 Flash Image (Nano Banana 2)](app/src/main/java/com/google/firebase/quickstart/ai/feature/text/NanoBanana2ViewModel.kt): Generate and/or edit images using Nano Banana 2 +- [Gemini 3 Pro Image (Nano Banana Pro)](app/src/main/java/com/google/firebase/quickstart/ai/feature/text/NanoBananaProViewModel.kt): Generate and/or edit images using Nano Banana Pro ### Nano Banana -- [Gemini 3.1 Flash Image (Nano Banana 2)](app/src/main/java/com/google/firebase/quickstart/ai/feature/text/NanoBanana2ViewModel.kt): Generate and/or edit images using Nano Banana 2 preview -- [Gemini 3 Pro Image (Nano Banana Pro)](app/src/main/java/com/google/firebase/quickstart/ai/feature/text/NanoBananaProViewModel.kt): Generate and/or edit images using Nano Banana Pro preview -- [Gemini 2.5 Flash Image (Nano Banana)](app/src/main/java/com/google/firebase/quickstart/ai/feature/text/NanoBananaViewModel.kt): Generate and/or edit images using Nano Banana (GA) +- [Gemini 3.1 Flash Image (Nano Banana 2)](app/src/main/java/com/google/firebase/quickstart/ai/feature/text/NanoBanana2ViewModel.kt): Generate and/or edit images using Nano Banana 2 +- [Gemini 3 Pro Image (Nano Banana Pro)](app/src/main/java/com/google/firebase/quickstart/ai/feature/text/NanoBananaProViewModel.kt): Generate and/or edit images using Nano Banana Pro +- [Gemini 2.5 Flash Image (Nano Banana)](app/src/main/java/com/google/firebase/quickstart/ai/feature/text/NanoBananaViewModel.kt): Generate and/or edit images using Nano Banana ### Multimodal understanding - [Audio Summarization](app/src/main/java/com/google/firebase/quickstart/ai/feature/text/AudioSummarizationViewModel.kt): Use Gemini 3.1 Flash Lite to summarize an audio file diff --git a/firebase-ai/app/src/main/java/com/google/firebase/quickstart/ai/feature/text/NanoBanana2ViewModel.kt b/firebase-ai/app/src/main/java/com/google/firebase/quickstart/ai/feature/text/NanoBanana2ViewModel.kt index a768a5ea6..467ac37de 100644 --- a/firebase-ai/app/src/main/java/com/google/firebase/quickstart/ai/feature/text/NanoBanana2ViewModel.kt +++ b/firebase-ai/app/src/main/java/com/google/firebase/quickstart/ai/feature/text/NanoBanana2ViewModel.kt @@ -5,16 +5,23 @@ import kotlinx.serialization.Serializable import com.google.firebase.Firebase import com.google.firebase.ai.Chat import com.google.firebase.ai.ai +import com.google.firebase.ai.type.AspectRatio import com.google.firebase.ai.type.Content import com.google.firebase.ai.type.GenerativeBackend import com.google.firebase.ai.type.ResponseModality import com.google.firebase.ai.type.generationConfig +import com.google.firebase.ai.type.imageConfig import com.google.firebase.quickstart.ai.ui.UiChatMessage +import java.text.SimpleDateFormat +import java.util.Date +import java.util.Locale @Serializable object NanoBanana2Route class NanoBanana2ViewModel : ChatViewModel() { + private val currentMonthAndYear = SimpleDateFormat("MMM yyyy", Locale.US) + .format(Date()) override val initialPrompt: String = """ A photo of a glossy magazine cover, the minimal blue cover @@ -22,7 +29,7 @@ class NanoBanana2ViewModel : ChatViewModel() { font and fills the view. No other text. In front of the text there is a portrait of a person in a sleek and minimal dress. She is playfully holding the number 2, which is the focal point. - Put the issue number and "Feb 2026" date in the corner along with + Put the issue number and "$currentMonthAndYear" date in the corner along with a barcode. The magazine is on a shelf against an orange plastered wall, within a designer store. """.trimIndent() @@ -33,9 +40,13 @@ class NanoBanana2ViewModel : ChatViewModel() { val generativeModel = Firebase.ai( backend = GenerativeBackend.googleAI() ).generativeModel( - modelName = "gemini-3.1-flash-image-preview", + modelName = "gemini-3.1-flash-image", generationConfig = generationConfig { responseModalities = listOf(ResponseModality.TEXT, ResponseModality.IMAGE) + // Optionally specify additional configuration + imageConfig = imageConfig { + aspectRatio = AspectRatio.PORTRAIT_3x4 + } } ) chat = generativeModel.startChat() diff --git a/firebase-ai/app/src/main/java/com/google/firebase/quickstart/ai/feature/text/NanoBananaProViewModel.kt b/firebase-ai/app/src/main/java/com/google/firebase/quickstart/ai/feature/text/NanoBananaProViewModel.kt index 3fbe9aad6..e980bd3af 100644 --- a/firebase-ai/app/src/main/java/com/google/firebase/quickstart/ai/feature/text/NanoBananaProViewModel.kt +++ b/firebase-ai/app/src/main/java/com/google/firebase/quickstart/ai/feature/text/NanoBananaProViewModel.kt @@ -5,10 +5,12 @@ import kotlinx.serialization.Serializable import com.google.firebase.Firebase import com.google.firebase.ai.Chat import com.google.firebase.ai.ai +import com.google.firebase.ai.type.AspectRatio import com.google.firebase.ai.type.Content import com.google.firebase.ai.type.GenerativeBackend import com.google.firebase.ai.type.ResponseModality import com.google.firebase.ai.type.generationConfig +import com.google.firebase.ai.type.imageConfig import com.google.firebase.quickstart.ai.ui.UiChatMessage @Serializable @@ -36,9 +38,13 @@ class NanoBananaProViewModel : ChatViewModel() { val generativeModel = Firebase.ai( backend = GenerativeBackend.googleAI() ).generativeModel( - modelName = "gemini-3-pro-image-preview", + modelName = "gemini-3-pro-image", generationConfig = generationConfig { responseModalities = listOf(ResponseModality.TEXT, ResponseModality.IMAGE) + // Optionally specify additional configuration + imageConfig = imageConfig { + aspectRatio = AspectRatio.SQUARE_1x1 + } } ) chat = generativeModel.startChat() diff --git a/firebase-ai/app/src/main/java/com/google/firebase/quickstart/ai/ui/navigation/FirebaseAISamples.kt b/firebase-ai/app/src/main/java/com/google/firebase/quickstart/ai/ui/navigation/FirebaseAISamples.kt index 9213e8fc2..2104bc730 100644 --- a/firebase-ai/app/src/main/java/com/google/firebase/quickstart/ai/ui/navigation/FirebaseAISamples.kt +++ b/firebase-ai/app/src/main/java/com/google/firebase/quickstart/ai/ui/navigation/FirebaseAISamples.kt @@ -88,7 +88,7 @@ val FIREBASE_AI_SAMPLES = listOf( ), Sample( title = "Gemini 3.1 Flash Image (Nano Banana 2)", - description = "Generate and/or edit images using Nano Banana 2 preview", + description = "Generate and/or edit images using Nano Banana 2", route = NanoBanana2Route, screenType = ScreenType.CHAT, viewModelClass = NanoBanana2ViewModel::class, @@ -96,7 +96,7 @@ val FIREBASE_AI_SAMPLES = listOf( ), Sample( title = "Gemini 3 Pro Image (Nano Banana Pro)", - description = "Generate and/or edit images using Nano Banana Pro preview", + description = "Generate and/or edit images using Nano Banana Pro", route = NanoBananaProRoute, screenType = ScreenType.CHAT, viewModelClass = NanoBananaProViewModel::class, @@ -104,7 +104,7 @@ val FIREBASE_AI_SAMPLES = listOf( ), Sample( title = "Gemini 2.5 Flash Image (Nano Banana)", - description = "Generate and/or edit images using Nano Banana (GA)", + description = "Generate and/or edit images using Nano Banana", route = NanoBananaRoute, screenType = ScreenType.CHAT, viewModelClass = NanoBananaViewModel::class, @@ -187,6 +187,5 @@ val FIREBASE_AI_SAMPLES = listOf( screenType = ScreenType.HYBRID, viewModelClass = HybridInferenceViewModel::class, categories = listOf(Category.HYBRID) - ) ) From 453c30f6efe31f10df5a745f80a914233015f401 Mon Sep 17 00:00:00 2001 From: Rosario Fernandes Date: Thu, 28 May 2026 17:25:08 +0100 Subject: [PATCH 2/2] lazy initialPrompt --- .../quickstart/ai/feature/text/NanoBanana2ViewModel.kt | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/firebase-ai/app/src/main/java/com/google/firebase/quickstart/ai/feature/text/NanoBanana2ViewModel.kt b/firebase-ai/app/src/main/java/com/google/firebase/quickstart/ai/feature/text/NanoBanana2ViewModel.kt index 467ac37de..bf04895bc 100644 --- a/firebase-ai/app/src/main/java/com/google/firebase/quickstart/ai/feature/text/NanoBanana2ViewModel.kt +++ b/firebase-ai/app/src/main/java/com/google/firebase/quickstart/ai/feature/text/NanoBanana2ViewModel.kt @@ -20,10 +20,9 @@ import java.util.Locale object NanoBanana2Route class NanoBanana2ViewModel : ChatViewModel() { - private val currentMonthAndYear = SimpleDateFormat("MMM yyyy", Locale.US) - .format(Date()) - - override val initialPrompt: String = """ + override val initialPrompt: String by lazy { + val currentMonthAndYear = SimpleDateFormat("MMM yyyy", Locale.US).format(Date()) + """ A photo of a glossy magazine cover, the minimal blue cover has the large bold words Nano Banana. The text is in a serif font and fills the view. No other text. In front of the text @@ -33,6 +32,7 @@ class NanoBanana2ViewModel : ChatViewModel() { a barcode. The magazine is on a shelf against an orange plastered wall, within a designer store. """.trimIndent() + } private val chat: Chat