From 701cf7134a6da3666edc4ad852e17b6df6c8785b Mon Sep 17 00:00:00 2001 From: Rosario Fernandes Date: Thu, 30 Jul 2026 14:30:06 +0100 Subject: [PATCH 1/5] use Gemini 3.5 Flash Lite and Gemini 3.6 Flash --- ai-sample-catalog/samples/gemini-chatbot/README.md | 2 +- .../ai/samples/geminichatbot/GeminiChatbotViewModel.kt | 2 +- ai-sample-catalog/samples/gemini-hybrid/README.md | 2 +- .../ai/samples/geminihybrid/GeminiHybridViewModel.kt | 6 +++--- ai-sample-catalog/samples/gemini-multimodal/README.md | 2 +- .../ai/samples/geminimultimodal/data/GeminiDataSource.kt | 2 +- .../samples/gemini-video-metadata-creation/README.md | 2 +- .../geminivideometadatacreation/GenerateAccountTags.kt | 4 ++-- .../samples/geminivideometadatacreation/GenerateChapters.kt | 4 ++-- .../geminivideometadatacreation/GenerateDescription.kt | 2 +- .../samples/geminivideometadatacreation/GenerateHashtags.kt | 4 ++-- .../ai/samples/geminivideometadatacreation/GenerateLinks.kt | 4 ++-- .../geminivideometadatacreation/GenerateThumbnails.kt | 4 ++-- .../samples/gemini-video-summarization/README.md | 2 +- .../viewmodel/VideoSummarizationViewModel.kt | 2 +- 15 files changed, 22 insertions(+), 22 deletions(-) diff --git a/ai-sample-catalog/samples/gemini-chatbot/README.md b/ai-sample-catalog/samples/gemini-chatbot/README.md index caf00047..53dd5804 100644 --- a/ai-sample-catalog/samples/gemini-chatbot/README.md +++ b/ai-sample-catalog/samples/gemini-chatbot/README.md @@ -18,7 +18,7 @@ Here is the key snippet of code that calls the generative model: ```kotlin private val generativeModel by lazy { - Firebase.ai(backend = GenerativeBackend.googleAI()).generativeModel("gemini-2.5-flash") + Firebase.ai(backend = GenerativeBackend.googleAI()).generativeModel("gemini-3.6-flash") } private val chat = generativeModel.startChat() diff --git a/ai-sample-catalog/samples/gemini-chatbot/src/main/java/com/android/ai/samples/geminichatbot/GeminiChatbotViewModel.kt b/ai-sample-catalog/samples/gemini-chatbot/src/main/java/com/android/ai/samples/geminichatbot/GeminiChatbotViewModel.kt index 4f422422..9afebba7 100644 --- a/ai-sample-catalog/samples/gemini-chatbot/src/main/java/com/android/ai/samples/geminichatbot/GeminiChatbotViewModel.kt +++ b/ai-sample-catalog/samples/gemini-chatbot/src/main/java/com/android/ai/samples/geminichatbot/GeminiChatbotViewModel.kt @@ -50,7 +50,7 @@ class GeminiChatbotViewModel @Inject constructor() : ViewModel() { private val generativeModel by lazy { Firebase.ai(backend = GenerativeBackend.googleAI()).generativeModel( - "gemini-2.5-flash", + "gemini-3.6-flash", generationConfig = generationConfig { temperature = 0.9f topK = 32 diff --git a/ai-sample-catalog/samples/gemini-hybrid/README.md b/ai-sample-catalog/samples/gemini-hybrid/README.md index 650cc640..d6b82dde 100644 --- a/ai-sample-catalog/samples/gemini-hybrid/README.md +++ b/ai-sample-catalog/samples/gemini-hybrid/README.md @@ -18,7 +18,7 @@ Here is how the model is instantiated to leverage hybrid inference: ```kotlin val model = Firebase.ai(backend = GenerativeBackend.googleAI()) .generativeModel( - "gemini-2.5-flash-lite", + "gemini-3.5-flash-lite", onDeviceConfig = OnDeviceConfig(mode = InferenceMode.PREFER_ON_DEVICE) ) diff --git a/ai-sample-catalog/samples/gemini-hybrid/src/main/java/com/android/ai/samples/geminihybrid/GeminiHybridViewModel.kt b/ai-sample-catalog/samples/gemini-hybrid/src/main/java/com/android/ai/samples/geminihybrid/GeminiHybridViewModel.kt index 0498a669..529c5afe 100644 --- a/ai-sample-catalog/samples/gemini-hybrid/src/main/java/com/android/ai/samples/geminihybrid/GeminiHybridViewModel.kt +++ b/ai-sample-catalog/samples/gemini-hybrid/src/main/java/com/android/ai/samples/geminihybrid/GeminiHybridViewModel.kt @@ -79,7 +79,7 @@ class GeminiHybridViewModel @Inject constructor() : ViewModel() { try { val model = Firebase.ai(backend = GenerativeBackend.googleAI()) .generativeModel( - "gemini-2.5-flash-lite", + "gemini-3.5-flash-lite", onDeviceConfig = OnDeviceConfig( mode = InferenceMode.ONLY_ON_DEVICE, modelOption = OnDeviceModelOption.PREVIEW, @@ -162,7 +162,7 @@ class GeminiHybridViewModel @Inject constructor() : ViewModel() { val model = Firebase.ai(backend = GenerativeBackend.googleAI()) .generativeModel( - "gemini-2.5-flash-lite", + "gemini-3.5-flash-lite", onDeviceConfig = OnDeviceConfig( mode = _uiState.value.selectedMode, modelOption = _uiState.value.selectedModelOption, @@ -235,7 +235,7 @@ class GeminiHybridViewModel @Inject constructor() : ViewModel() { val model = Firebase.ai(backend = GenerativeBackend.googleAI()) .generativeModel( - "gemini-2.5-flash-lite", + "gemini-3.5-flash-lite", onDeviceConfig = OnDeviceConfig( mode = _uiState.value.selectedMode, modelOption = _uiState.value.selectedModelOption, diff --git a/ai-sample-catalog/samples/gemini-multimodal/README.md b/ai-sample-catalog/samples/gemini-multimodal/README.md index 58ca3459..aa09c365 100644 --- a/ai-sample-catalog/samples/gemini-multimodal/README.md +++ b/ai-sample-catalog/samples/gemini-multimodal/README.md @@ -19,7 +19,7 @@ Here is the key snippet of code that initializes the generative model: ```kotlin private val generativeModel by lazy { Firebase.ai(backend = GenerativeBackend.googleAI()).generativeModel( - "gemini-2.5-flash", + "gemini-3.6-flash", generationConfig = generationConfig { temperature = 0.9f topK = 32 diff --git a/ai-sample-catalog/samples/gemini-multimodal/src/main/java/com/android/ai/samples/geminimultimodal/data/GeminiDataSource.kt b/ai-sample-catalog/samples/gemini-multimodal/src/main/java/com/android/ai/samples/geminimultimodal/data/GeminiDataSource.kt index bb25e443..49acd22d 100644 --- a/ai-sample-catalog/samples/gemini-multimodal/src/main/java/com/android/ai/samples/geminimultimodal/data/GeminiDataSource.kt +++ b/ai-sample-catalog/samples/gemini-multimodal/src/main/java/com/android/ai/samples/geminimultimodal/data/GeminiDataSource.kt @@ -31,7 +31,7 @@ import javax.inject.Singleton class GeminiDataSource @Inject constructor() { private val generativeModel by lazy { Firebase.ai(backend = GenerativeBackend.googleAI()).generativeModel( - "gemini-2.5-flash", + "gemini-3.6-flash", generationConfig = generationConfig { temperature = 0.9f topK = 32 diff --git a/ai-sample-catalog/samples/gemini-video-metadata-creation/README.md b/ai-sample-catalog/samples/gemini-video-metadata-creation/README.md index 2fd9c2ba..279a03fa 100644 --- a/ai-sample-catalog/samples/gemini-video-metadata-creation/README.md +++ b/ai-sample-catalog/samples/gemini-video-metadata-creation/README.md @@ -19,7 +19,7 @@ Here is a key snippet of code that generates a video description: ```kotlin suspend fun generateDescription(videoUri: Uri): @Composable () -> Unit { val response = Firebase.ai(backend = GenerativeBackend.vertexAI()) - .generativeModel(modelName = "gemini-2.5-flash") + .generativeModel(modelName = "gemini-3.6-flash") .generateContent( content { fileData(videoUri.toString(), "video/mp4") diff --git a/ai-sample-catalog/samples/gemini-video-metadata-creation/src/main/java/com/android/ai/samples/geminivideometadatacreation/GenerateAccountTags.kt b/ai-sample-catalog/samples/gemini-video-metadata-creation/src/main/java/com/android/ai/samples/geminivideometadatacreation/GenerateAccountTags.kt index 70f20267..6037f0c3 100644 --- a/ai-sample-catalog/samples/gemini-video-metadata-creation/src/main/java/com/android/ai/samples/geminivideometadatacreation/GenerateAccountTags.kt +++ b/ai-sample-catalog/samples/gemini-video-metadata-creation/src/main/java/com/android/ai/samples/geminivideometadatacreation/GenerateAccountTags.kt @@ -57,7 +57,7 @@ private val accountTagsSchema = Schema.array( * for generating account tags. * * This model is specifically set up with: - * - `modelName = "gemini-2.5-flash"`: Specifies the underlying Gemini model to use. + * - `modelName = "gemini-3.6-flash"`: Specifies the underlying Gemini model to use. * - `responseMimeType = "application/json"`: Indicates that the model is expected to * return its response in JSON format. * - `responseSchema = accountTagsSchema`: Defines the expected structure of the JSON @@ -69,7 +69,7 @@ private val accountTagsSchema = Schema.array( */ private val accountTagsModel = Firebase.ai(backend = GenerativeBackend.vertexAI()) .generativeModel( - modelName = "gemini-2.5-flash", + modelName = "gemini-3.6-flash", // Tell Firebase AI the exact format of the response. generationConfig { responseMimeType = "application/json" diff --git a/ai-sample-catalog/samples/gemini-video-metadata-creation/src/main/java/com/android/ai/samples/geminivideometadatacreation/GenerateChapters.kt b/ai-sample-catalog/samples/gemini-video-metadata-creation/src/main/java/com/android/ai/samples/geminivideometadatacreation/GenerateChapters.kt index a7d1075c..60fe041c 100644 --- a/ai-sample-catalog/samples/gemini-video-metadata-creation/src/main/java/com/android/ai/samples/geminivideometadatacreation/GenerateChapters.kt +++ b/ai-sample-catalog/samples/gemini-video-metadata-creation/src/main/java/com/android/ai/samples/geminivideometadatacreation/GenerateChapters.kt @@ -56,13 +56,13 @@ private val chaptersSchema = Schema.array( /** * The configured generative model for creating video chapters. * - * This model is initialized with the "gemini-2.5-flash" model name and + * This model is initialized with the "gemini-3.6-flash" model name and * configured to expect a JSON response. The `responseSchema` ensures that * the output conforms to the `Chapters` data structure. */ private val chaptersModel = Firebase.ai(backend = GenerativeBackend.vertexAI()) .generativeModel( - modelName = "gemini-2.5-flash", + modelName = "gemini-3.6-flash", // Tell Firebase AI the exact format of the response. generationConfig { responseMimeType = "application/json" diff --git a/ai-sample-catalog/samples/gemini-video-metadata-creation/src/main/java/com/android/ai/samples/geminivideometadatacreation/GenerateDescription.kt b/ai-sample-catalog/samples/gemini-video-metadata-creation/src/main/java/com/android/ai/samples/geminivideometadatacreation/GenerateDescription.kt index 8d3d1b37..00defc52 100644 --- a/ai-sample-catalog/samples/gemini-video-metadata-creation/src/main/java/com/android/ai/samples/geminivideometadatacreation/GenerateDescription.kt +++ b/ai-sample-catalog/samples/gemini-video-metadata-creation/src/main/java/com/android/ai/samples/geminivideometadatacreation/GenerateDescription.kt @@ -42,7 +42,7 @@ import com.google.firebase.ai.type.content */ suspend fun generateDescription(videoUri: Uri): @Composable () -> Unit { val response = Firebase.ai(backend = GenerativeBackend.vertexAI()) - .generativeModel(modelName = "gemini-2.5-flash") + .generativeModel(modelName = "gemini-3.6-flash") .generateContent( content { fileData(videoUri.toString(), "video/mp4") diff --git a/ai-sample-catalog/samples/gemini-video-metadata-creation/src/main/java/com/android/ai/samples/geminivideometadatacreation/GenerateHashtags.kt b/ai-sample-catalog/samples/gemini-video-metadata-creation/src/main/java/com/android/ai/samples/geminivideometadatacreation/GenerateHashtags.kt index b2de146e..adf976c5 100644 --- a/ai-sample-catalog/samples/gemini-video-metadata-creation/src/main/java/com/android/ai/samples/geminivideometadatacreation/GenerateHashtags.kt +++ b/ai-sample-catalog/samples/gemini-video-metadata-creation/src/main/java/com/android/ai/samples/geminivideometadatacreation/GenerateHashtags.kt @@ -40,14 +40,14 @@ private val hashtagSchema = Schema.array(items = Schema.string("Hashtag")) /** * A generative model instance configured to generate hashtags for video content. * - * This model uses the "gemini-2.5-flash" model from Vertex AI and is specifically configured + * This model uses the "gemini-3.6-flash" model from Vertex AI and is specifically configured * to return a JSON array of strings, where each string represents a hashtag. * The `responseMimeType` is set to "application/json" and the `responseSchema` defines * the expected output format as an array of strings with the item name "Hashtag". */ private val hashtagsModel = Firebase.ai(backend = GenerativeBackend.vertexAI()) .generativeModel( - modelName = "gemini-2.5-flash", + modelName = "gemini-3.6-flash", // Tell Firebase AI the exact format of the response. generationConfig { responseMimeType = "application/json" diff --git a/ai-sample-catalog/samples/gemini-video-metadata-creation/src/main/java/com/android/ai/samples/geminivideometadatacreation/GenerateLinks.kt b/ai-sample-catalog/samples/gemini-video-metadata-creation/src/main/java/com/android/ai/samples/geminivideometadatacreation/GenerateLinks.kt index 72843ce8..c0f5e8c2 100644 --- a/ai-sample-catalog/samples/gemini-video-metadata-creation/src/main/java/com/android/ai/samples/geminivideometadatacreation/GenerateLinks.kt +++ b/ai-sample-catalog/samples/gemini-video-metadata-creation/src/main/java/com/android/ai/samples/geminivideometadatacreation/GenerateLinks.kt @@ -39,13 +39,13 @@ private val linksSchema = Schema.array(items = Schema.string("Link")) * The configured generative model for extracting links. * * This model is specifically configured to: - * - Use the "gemini-2.5-flash" model. + * - Use the "gemini-3.6-flash" model. * - Expect a response in "application/json" format. * - Adhere to the `linksSchema`, which defines the expected JSON structure as an array of strings (links). */ private val linksModel = Firebase.ai(backend = GenerativeBackend.vertexAI()) .generativeModel( - modelName = "gemini-2.5-flash", + modelName = "gemini-3.6-flash", // Tell Firebase AI the exact format of the response. generationConfig { responseMimeType = "application/json" diff --git a/ai-sample-catalog/samples/gemini-video-metadata-creation/src/main/java/com/android/ai/samples/geminivideometadatacreation/GenerateThumbnails.kt b/ai-sample-catalog/samples/gemini-video-metadata-creation/src/main/java/com/android/ai/samples/geminivideometadatacreation/GenerateThumbnails.kt index be2b7d55..8e0b3b4b 100644 --- a/ai-sample-catalog/samples/gemini-video-metadata-creation/src/main/java/com/android/ai/samples/geminivideometadatacreation/GenerateThumbnails.kt +++ b/ai-sample-catalog/samples/gemini-video-metadata-creation/src/main/java/com/android/ai/samples/geminivideometadatacreation/GenerateThumbnails.kt @@ -39,13 +39,13 @@ private val thumbnailsSchema = Schema.array(items = Schema.long("thumbnail times /** * Initializes the generative model for thumbnail generation. - * This model uses the "gemini-2.5-flash" model via the Vertex AI backend. + * This model uses the "gemini-3.6-flash" model via the Vertex AI backend. * It's configured to expect a JSON response with a specific schema (`thumbnailsSchema`) * defining an array of long integers representing thumbnail timestamps. */ private val thumbnailsModel = Firebase.ai(backend = GenerativeBackend.vertexAI()) .generativeModel( - modelName = "gemini-2.5-flash", + modelName = "gemini-3.6-flash", // Tell Firebase AI the exact format of the response. generationConfig { responseMimeType = "application/json" diff --git a/ai-sample-catalog/samples/gemini-video-summarization/README.md b/ai-sample-catalog/samples/gemini-video-summarization/README.md index 23c54b57..2f74011f 100644 --- a/ai-sample-catalog/samples/gemini-video-summarization/README.md +++ b/ai-sample-catalog/samples/gemini-video-summarization/README.md @@ -19,7 +19,7 @@ Here is the key snippet of code that calls the generative model: ```kotlin val generativeModel = Firebase.ai(backend = GenerativeBackend.vertexAI()) - .generativeModel("gemini-2.5-flash") + .generativeModel("gemini-3.6-flash") val requestContent = content { fileData(videoSource.toString(), "video/mp4") diff --git a/ai-sample-catalog/samples/gemini-video-summarization/src/main/java/com/android/ai/samples/geminivideosummary/viewmodel/VideoSummarizationViewModel.kt b/ai-sample-catalog/samples/gemini-video-summarization/src/main/java/com/android/ai/samples/geminivideosummary/viewmodel/VideoSummarizationViewModel.kt index 5faf39b5..71e9450e 100644 --- a/ai-sample-catalog/samples/gemini-video-summarization/src/main/java/com/android/ai/samples/geminivideosummary/viewmodel/VideoSummarizationViewModel.kt +++ b/ai-sample-catalog/samples/gemini-video-summarization/src/main/java/com/android/ai/samples/geminivideosummary/viewmodel/VideoSummarizationViewModel.kt @@ -75,7 +75,7 @@ class VideoSummarizationViewModel @Inject constructor() : ViewModel() { try { val generativeModel = Firebase.ai(backend = GenerativeBackend.vertexAI()) - .generativeModel("gemini-2.5-flash") + .generativeModel("gemini-3.6-flash") val requestContent = content { fileData(videoSource.toString(), "video/mp4") From 9046369b5442b52ca26773479199da7b1de223fb Mon Sep 17 00:00:00 2001 From: Rosario Fernandes Date: Thu, 30 Jul 2026 16:15:28 +0100 Subject: [PATCH 2/5] use stable versions of Nano Banana --- ai-sample-catalog/samples/gemini-image-chat/README.md | 2 +- .../ai/samples/geminiimagechat/GeminiImageChatViewModel.kt | 2 +- ai-sample-catalog/samples/magic-selfie/README.md | 2 +- .../ai/samples/magicselfie/data/MagicSelfieRepository.kt | 2 +- .../android/ai/samples/nanobanana/data/NanobananaDataSource.kt | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/ai-sample-catalog/samples/gemini-image-chat/README.md b/ai-sample-catalog/samples/gemini-image-chat/README.md index 0c919dd2..7c3b0ac4 100644 --- a/ai-sample-catalog/samples/gemini-image-chat/README.md +++ b/ai-sample-catalog/samples/gemini-image-chat/README.md @@ -17,7 +17,7 @@ The application uses the Firebase AI SDK (see [How to run](../../#how-to-run)) f Here is how the model is instantiated: ```kotlin Firebase.ai(backend = GenerativeBackend.googleAI()).generativeModel( - "gemini-3-pro-image-preview", + "gemini-3-pro-image", generationConfig = generationConfig { temperature = 0.9f topK = 32 diff --git a/ai-sample-catalog/samples/gemini-image-chat/src/main/java/com/android/ai/samples/geminiimagechat/GeminiImageChatViewModel.kt b/ai-sample-catalog/samples/gemini-image-chat/src/main/java/com/android/ai/samples/geminiimagechat/GeminiImageChatViewModel.kt index 3afec297..d6ea58e5 100644 --- a/ai-sample-catalog/samples/gemini-image-chat/src/main/java/com/android/ai/samples/geminiimagechat/GeminiImageChatViewModel.kt +++ b/ai-sample-catalog/samples/gemini-image-chat/src/main/java/com/android/ai/samples/geminiimagechat/GeminiImageChatViewModel.kt @@ -53,7 +53,7 @@ class GeminiImageChatViewModel @Inject constructor() : ViewModel() { private val generativeModel by lazy { Firebase.ai(backend = GenerativeBackend.googleAI()).generativeModel( - "gemini-3-pro-image-preview", + "gemini-3-pro-image", generationConfig = generationConfig { temperature = 0.9f topK = 32 diff --git a/ai-sample-catalog/samples/magic-selfie/README.md b/ai-sample-catalog/samples/magic-selfie/README.md index a25a5790..a122803a 100644 --- a/ai-sample-catalog/samples/magic-selfie/README.md +++ b/ai-sample-catalog/samples/magic-selfie/README.md @@ -4,7 +4,7 @@ This sample is part of the [AI Sample Catalog](../../). To build and run this sa ## Description -This sample demonstrates how to create a "magic selfie" by replacing the background of a user's photo with a generated image. It uses the Nano Banana 2 (`gemini-3.1-flash-image-preview`) model to perform semantic image editing, transforming the background based on a text prompt while preserving the subject. +This sample demonstrates how to create a "magic selfie" by replacing the background of a user's photo with a generated image. It uses the Nano Banana 2 (`gemini-3.1-flash-image`) model to perform semantic image editing, transforming the background based on a text prompt while preserving the subject.
Magic Selfie in action diff --git a/ai-sample-catalog/samples/magic-selfie/src/main/java/com/android/ai/samples/magicselfie/data/MagicSelfieRepository.kt b/ai-sample-catalog/samples/magic-selfie/src/main/java/com/android/ai/samples/magicselfie/data/MagicSelfieRepository.kt index 842edbd9..db4383d3 100644 --- a/ai-sample-catalog/samples/magic-selfie/src/main/java/com/android/ai/samples/magicselfie/data/MagicSelfieRepository.kt +++ b/ai-sample-catalog/samples/magic-selfie/src/main/java/com/android/ai/samples/magicselfie/data/MagicSelfieRepository.kt @@ -30,7 +30,7 @@ import javax.inject.Singleton class MagicSelfieRepository @Inject constructor() { private val generativeModel by lazy { 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) }, diff --git a/ai-sample-catalog/samples/nanobanana/src/main/java/com/android/ai/samples/nanobanana/data/NanobananaDataSource.kt b/ai-sample-catalog/samples/nanobanana/src/main/java/com/android/ai/samples/nanobanana/data/NanobananaDataSource.kt index 5a0fda69..9202f9d1 100644 --- a/ai-sample-catalog/samples/nanobanana/src/main/java/com/android/ai/samples/nanobanana/data/NanobananaDataSource.kt +++ b/ai-sample-catalog/samples/nanobanana/src/main/java/com/android/ai/samples/nanobanana/data/NanobananaDataSource.kt @@ -29,7 +29,7 @@ import javax.inject.Singleton class NanobananaDataSource @Inject constructor() { private val generativeModel by lazy { Firebase.ai(backend = GenerativeBackend.googleAI()).generativeModel( - modelName = "gemini-3.1-flash-image-preview", + modelName = "gemini-3.1-flash-image", generationConfig = generationConfig { responseModalities = listOf(ResponseModality.IMAGE) }, From 9533791f0f9ecc55908e2a55cce537209dea4093 Mon Sep 17 00:00:00 2001 From: Rosario Fernandes Date: Thu, 30 Jul 2026 16:19:47 +0100 Subject: [PATCH 3/5] jetpacker: use the latest Gemini models --- ai-sample-catalog/gradle.properties | 4 +++- jetpacker/README.md | 4 ++-- .../feature/detail/hotel_chat/HotelSupportChatViewModel.kt | 6 +++--- .../feature/detail/museum_assistant/ChatViewModel.kt | 2 +- .../feature/detail/review/ReviewScreenViewModel.kt | 2 +- 5 files changed, 10 insertions(+), 8 deletions(-) diff --git a/ai-sample-catalog/gradle.properties b/ai-sample-catalog/gradle.properties index e067f62c..2477f86c 100644 --- a/ai-sample-catalog/gradle.properties +++ b/ai-sample-catalog/gradle.properties @@ -23,4 +23,6 @@ kotlin.code.style=official # Enables namespacing of each library's R class so that its R class includes only the # resources declared in the library itself and none from the library's dependencies, # thereby reducing the size of the R class for that library -android.nonTransitiveRClass=true \ No newline at end of file +android.nonTransitiveRClass=true +# Enabled parallel sync for Gradle 9.4+ +org.gradle.tooling.parallel=true diff --git a/jetpacker/README.md b/jetpacker/README.md index 802591b8..9d0e4ea0 100644 --- a/jetpacker/README.md +++ b/jetpacker/README.md @@ -101,8 +101,8 @@ JetPacker integrates local on-device AI capabilities using ML Kit. These feature ## Cloud-Hybrid & Online AI Features JetPacker also integrates online hybrid features using Firebase AI Logic (Gemini API) and ML Kit: -- **ENABLE_MUSEUM_ASSISTANT**: Museum Assistant chatbot with URL, Maps, and Search grounding (uses Gemini 2.5 flash-lite). -- **ENABLE_REVIEW_GENERATION**: Topic-selected review generator (uses Gemini 2.5 flash-lite on-device with cloud fallback). +- **ENABLE_MUSEUM_ASSISTANT**: Museum Assistant chatbot with URL, Maps, and Search grounding (uses Gemini 3.6 flash-lite). +- **ENABLE_REVIEW_GENERATION**: Topic-selected review generator (uses Gemini 3.5 flash-lite on-device with cloud fallback). - **Hotel Support Chat**: Receives hotel receptionist assistance with real-time ML Kit + Gemini translation. ## AppFunctions Integration diff --git a/jetpacker/android/feature/detail/hotel_chat/src/main/kotlin/com/example/jetpacker/feature/detail/hotel_chat/HotelSupportChatViewModel.kt b/jetpacker/android/feature/detail/hotel_chat/src/main/kotlin/com/example/jetpacker/feature/detail/hotel_chat/HotelSupportChatViewModel.kt index 44740714..749427f2 100644 --- a/jetpacker/android/feature/detail/hotel_chat/src/main/kotlin/com/example/jetpacker/feature/detail/hotel_chat/HotelSupportChatViewModel.kt +++ b/jetpacker/android/feature/detail/hotel_chat/src/main/kotlin/com/example/jetpacker/feature/detail/hotel_chat/HotelSupportChatViewModel.kt @@ -65,7 +65,7 @@ class HotelSupportChatViewModel(val hotelName: String = "Hotel", val language: S private val hybridTranslationModel = Firebase.ai(backend = GenerativeBackend.googleAI()) .generativeModel( - modelName = "gemini-3-flash-preview", + modelName = "gemini-3.6-flash", onDeviceConfig = OnDeviceConfig(mode = InferenceMode.PREFER_ON_DEVICE), ) @@ -74,7 +74,7 @@ class HotelSupportChatViewModel(val hotelName: String = "Hotel", val language: S private val cloudTranslationModel = Firebase.ai(backend = GenerativeBackend.googleAI()) .generativeModel( - modelName = "gemini-3-flash-preview", // Represents cloud TranslateGemma + modelName = "gemini-3.6-flash", // Represents cloud TranslateGemma ) // Firebase AI for chat @@ -87,7 +87,7 @@ class HotelSupportChatViewModel(val hotelName: String = "Hotel", val language: S "You are a helpful hotel receptionist at $hotelName only speaking $language. Answer politely in $language. The bar closes at 10pm and breakfast is from 7am to 10am. There's someone at the desk 24/7. You can retrieve your luggage from the storage room at the back of the lobby at any time." ) }, - modelName = "gemini-3-flash-preview", + modelName = "gemini-3.6-flash", ) private val chat = generativeModel.startChat() diff --git a/jetpacker/android/feature/detail/museum_assistant/src/main/kotlin/com/example/jetpacker/feature/detail/museum_assistant/ChatViewModel.kt b/jetpacker/android/feature/detail/museum_assistant/src/main/kotlin/com/example/jetpacker/feature/detail/museum_assistant/ChatViewModel.kt index ef187f3a..fce2f67a 100644 --- a/jetpacker/android/feature/detail/museum_assistant/src/main/kotlin/com/example/jetpacker/feature/detail/museum_assistant/ChatViewModel.kt +++ b/jetpacker/android/feature/detail/museum_assistant/src/main/kotlin/com/example/jetpacker/feature/detail/museum_assistant/ChatViewModel.kt @@ -73,7 +73,7 @@ constructor(savedStateHandle: SavedStateHandle, private val eventDao: EventDao) "You are a helpful museum assistant, answering questions about a museum. Never use markdown, use plain text." ) }, - modelName = "gemini-3.1-flash-lite", + modelName = "gemini-3.5-flash-lite", tools = toolList, ) diff --git a/jetpacker/android/feature/detail/review/src/main/kotlin/com/example/jetpacker/feature/detail/review/ReviewScreenViewModel.kt b/jetpacker/android/feature/detail/review/src/main/kotlin/com/example/jetpacker/feature/detail/review/ReviewScreenViewModel.kt index 47f4578d..f6086564 100644 --- a/jetpacker/android/feature/detail/review/src/main/kotlin/com/example/jetpacker/feature/detail/review/ReviewScreenViewModel.kt +++ b/jetpacker/android/feature/detail/review/src/main/kotlin/com/example/jetpacker/feature/detail/review/ReviewScreenViewModel.kt @@ -72,7 +72,7 @@ class ReviewScreenViewModel @Inject constructor(savedStateHandle: SavedStateHand private val generativeModel = Firebase.ai(backend = GenerativeBackend.googleAI()) .generativeModel( - modelName = "gemini-2.5-flash-lite", + modelName = "gemini-3.5-flash-lite", onDeviceConfig = OnDeviceConfig(mode = InferenceMode.PREFER_ON_DEVICE), ) From cbb4bfda388eb49b2ac3c208ce15f361521d69ce Mon Sep 17 00:00:00 2001 From: Rosario Fernandes Date: Thu, 30 Jul 2026 16:21:27 +0100 Subject: [PATCH 4/5] revert gradle.properties changes --- ai-sample-catalog/gradle.properties | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/ai-sample-catalog/gradle.properties b/ai-sample-catalog/gradle.properties index 2477f86c..e067f62c 100644 --- a/ai-sample-catalog/gradle.properties +++ b/ai-sample-catalog/gradle.properties @@ -23,6 +23,4 @@ kotlin.code.style=official # Enables namespacing of each library's R class so that its R class includes only the # resources declared in the library itself and none from the library's dependencies, # thereby reducing the size of the R class for that library -android.nonTransitiveRClass=true -# Enabled parallel sync for Gradle 9.4+ -org.gradle.tooling.parallel=true +android.nonTransitiveRClass=true \ No newline at end of file From 8e8a483a76b30941a27a0825f4b54d2868be29d2 Mon Sep 17 00:00:00 2001 From: Rosario Fernandes Date: Thu, 30 Jul 2026 16:23:39 +0100 Subject: [PATCH 5/5] typo in jetpacker README --- jetpacker/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/jetpacker/README.md b/jetpacker/README.md index 9d0e4ea0..21fc2773 100644 --- a/jetpacker/README.md +++ b/jetpacker/README.md @@ -101,7 +101,7 @@ JetPacker integrates local on-device AI capabilities using ML Kit. These feature ## Cloud-Hybrid & Online AI Features JetPacker also integrates online hybrid features using Firebase AI Logic (Gemini API) and ML Kit: -- **ENABLE_MUSEUM_ASSISTANT**: Museum Assistant chatbot with URL, Maps, and Search grounding (uses Gemini 3.6 flash-lite). +- **ENABLE_MUSEUM_ASSISTANT**: Museum Assistant chatbot with URL, Maps, and Search grounding (uses Gemini 3.5 flash-lite). - **ENABLE_REVIEW_GENERATION**: Topic-selected review generator (uses Gemini 3.5 flash-lite on-device with cloud fallback). - **Hotel Support Chat**: Receives hotel receptionist assistance with real-time ML Kit + Gemini translation.