diff --git a/firebase-ai/app/src/main/java/com/google/firebase/quickstart/ai/feature/text/NanoBananaLiteViewModel.kt b/firebase-ai/app/src/main/java/com/google/firebase/quickstart/ai/feature/text/NanoBananaLiteViewModel.kt new file mode 100644 index 0000000000..83f89d5219 --- /dev/null +++ b/firebase-ai/app/src/main/java/com/google/firebase/quickstart/ai/feature/text/NanoBananaLiteViewModel.kt @@ -0,0 +1,50 @@ +package com.google.firebase.quickstart.ai.feature.text + +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.Content +import com.google.firebase.ai.type.GenerativeBackend +import com.google.firebase.ai.type.ImageSize +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 +object NanoBananaLiteRoute + +class NanoBananaLiteViewModel : ChatViewModel() { + + override val initialPrompt: String = """ + A kawaii-style sticker of a happy red panda wearing a tiny bamboo hat. + It's munching on a green bamboo leaf. The design features bold, + clean outlines, simple cel-shading, and a vibrant color palette. + The background must be white. + """.trimIndent() + + private val chat: Chat + + init { + val generativeModel = Firebase.ai( + backend = GenerativeBackend.googleAI() + ).generativeModel( + modelName = "gemini-3.1-flash-lite-image", // aka Nano Banana Lite + generationConfig = generationConfig { + responseModalities = listOf(ResponseModality.TEXT, ResponseModality.IMAGE) + imageConfig = imageConfig { + // Nano Banana Lite currently only supports 1K output + imageSize = ImageSize.SIZE_1K + } + } + ) + chat = generativeModel.startChat() + } + + override suspend fun performSendMessage(prompt: Content, currentMessages: List) { + val response = chat.sendMessage(prompt) + validateAndDisplayResponse(response, currentMessages) + } +} 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 2104bc730c..069936b0d1 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 @@ -20,6 +20,8 @@ import com.google.firebase.quickstart.ai.feature.text.ImageBlogCreatorRoute import com.google.firebase.quickstart.ai.feature.text.ImageBlogCreatorViewModel import com.google.firebase.quickstart.ai.feature.text.NanoBanana2Route import com.google.firebase.quickstart.ai.feature.text.NanoBanana2ViewModel +import com.google.firebase.quickstart.ai.feature.text.NanoBananaLiteRoute +import com.google.firebase.quickstart.ai.feature.text.NanoBananaLiteViewModel import com.google.firebase.quickstart.ai.feature.text.NanoBananaProRoute import com.google.firebase.quickstart.ai.feature.text.NanoBananaProViewModel import com.google.firebase.quickstart.ai.feature.text.NanoBananaRoute @@ -86,6 +88,14 @@ val FIREBASE_AI_SAMPLES = listOf( viewModelClass = ImageBlogCreatorViewModel::class, categories = listOf(Category.MULTIMODAL_UNDERSTANDING) ), + Sample( + title = "Gemini 3.1 Flash Image Lite (Nano Banana Lite)", + description = "Generate and/or edit images using Nano Banana Lite", + route = NanoBananaLiteRoute, + screenType = ScreenType.CHAT, + viewModelClass = NanoBananaLiteViewModel::class, + categories = listOf(Category.NANO_BANANA, Category.GEMINI3) + ), Sample( title = "Gemini 3.1 Flash Image (Nano Banana 2)", description = "Generate and/or edit images using Nano Banana 2",