diff --git a/ai-catalog/gradle/libs.versions.toml b/ai-catalog/gradle/libs.versions.toml index 2acb257f..116a4aac 100644 --- a/ai-catalog/gradle/libs.versions.toml +++ b/ai-catalog/gradle/libs.versions.toml @@ -1,7 +1,7 @@ [versions] agp = "8.8.2" coilCompose = "3.1.0" -firebaseBom = "33.14.0" +firebaseBom = "34.1.0" lifecycleRuntimeCompose = "2.9.1" mlkitGenAi = "1.0.0-beta1" kotlin = "2.1.0" @@ -29,7 +29,6 @@ uiToolingPreviewAndroid = "1.8.1" spotless = "7.0.4" uiToolingPreview = "1.8.3" uiTooling = "1.8.3" -firebaseAi = "16.2.0" lifecycleViewmodelAndroid = "2.8.7" material3 = "1.3.2" @@ -75,7 +74,6 @@ androidx-media3-transformer = { module = "androidx.media3:media3-transformer", v androidx-ui-tooling-preview-android = { group = "androidx.compose.ui", name = "ui-tooling-preview-android", version.ref = "uiToolingPreviewAndroid" } ui-tooling-preview = { group = "androidx.compose.ui", name = "ui-tooling-preview", version.ref = "uiToolingPreview" } ui-tooling = { group = "androidx.compose.ui", name = "ui-tooling", version.ref = "uiTooling" } -google-firebase-ai = { group = "com.google.firebase", name = "firebase-ai", version.ref = "firebaseAi" } androidx-lifecycle-viewmodel-android = { group = "androidx.lifecycle", name = "lifecycle-viewmodel-android", version.ref = "lifecycleViewmodelAndroid" } material3 = { group = "androidx.compose.material3", name = "material3", version.ref = "material3" } diff --git a/ai-catalog/samples/gemini-chatbot/src/main/java/com/android/ai/samples/geminichatbot/ChatMessage.kt b/ai-catalog/samples/gemini-chatbot/src/main/java/com/android/ai/samples/geminichatbot/ChatMessage.kt index dc27f84a..6f252510 100644 --- a/ai-catalog/samples/gemini-chatbot/src/main/java/com/android/ai/samples/geminichatbot/ChatMessage.kt +++ b/ai-catalog/samples/gemini-chatbot/src/main/java/com/android/ai/samples/geminichatbot/ChatMessage.kt @@ -22,4 +22,5 @@ data class ChatMessage( val timestamp: Long, val isIncoming: Boolean = false, val senderIconUrl: Uri? = null, + val groundingMetadata: String? = null ) diff --git a/ai-catalog/samples/gemini-chatbot/src/main/java/com/android/ai/samples/geminichatbot/GeminiChatbotScreen.kt b/ai-catalog/samples/gemini-chatbot/src/main/java/com/android/ai/samples/geminichatbot/GeminiChatbotScreen.kt index baea8168..4a0fc3ec 100644 --- a/ai-catalog/samples/gemini-chatbot/src/main/java/com/android/ai/samples/geminichatbot/GeminiChatbotScreen.kt +++ b/ai-catalog/samples/gemini-chatbot/src/main/java/com/android/ai/samples/geminichatbot/GeminiChatbotScreen.kt @@ -167,10 +167,19 @@ fun MessageBubble(message: ChatMessage, modifier: Modifier = Modifier) { }, shape = MaterialTheme.shapes.large, ) { - Text( - modifier = Modifier.padding(16.dp), - text = message.text, - ) + Column { + Text( + modifier = Modifier.padding(16.dp), + text = message.text, + ) + if (message.groundingMetadata != null) { + Text( + modifier = Modifier.padding(16.dp), + fontSize = 10.sp, + text = "(sources: ${message.groundingMetadata})", + ) + } + } } } } diff --git a/ai-catalog/samples/gemini-chatbot/src/main/java/com/android/ai/samples/geminichatbot/GeminiChatbotViewModel.kt b/ai-catalog/samples/gemini-chatbot/src/main/java/com/android/ai/samples/geminichatbot/GeminiChatbotViewModel.kt index 3d27b510..51c6b2a8 100644 --- a/ai-catalog/samples/gemini-chatbot/src/main/java/com/android/ai/samples/geminichatbot/GeminiChatbotViewModel.kt +++ b/ai-catalog/samples/gemini-chatbot/src/main/java/com/android/ai/samples/geminichatbot/GeminiChatbotViewModel.kt @@ -23,6 +23,7 @@ import com.google.firebase.ai.type.GenerativeBackend import com.google.firebase.ai.type.HarmBlockThreshold import com.google.firebase.ai.type.HarmCategory import com.google.firebase.ai.type.SafetySetting +import com.google.firebase.ai.type.Tool import com.google.firebase.ai.type.content import com.google.firebase.ai.type.generationConfig import javax.inject.Inject @@ -65,6 +66,7 @@ class GeminiChatbotViewModel @Inject constructor() : ViewModel() { systemInstruction = content { text("""You are a friendly assistant. Keep your response short.""") }, + tools = listOf(Tool.googleSearch()) ) } @@ -86,10 +88,12 @@ class GeminiChatbotViewModel @Inject constructor() : ViewModel() { val response = chat.sendMessage(message) val newMessage = response.text?.let { + val groundingMetadata = response.candidates.firstOrNull()?.groundingMetadata ChatMessage( text = it.trim(), timestamp = System.currentTimeMillis(), isIncoming = true, + groundingMetadata = groundingMetadata?.groundingChunks?.map { it.web?.title }?.joinToString() ) } ?: error("Model returned an empty response") // This error will be caught by the try/catch diff --git a/ai-catalog/samples/gemini-live-todo/build.gradle.kts b/ai-catalog/samples/gemini-live-todo/build.gradle.kts index 8f8b6542..423a532d 100644 --- a/ai-catalog/samples/gemini-live-todo/build.gradle.kts +++ b/ai-catalog/samples/gemini-live-todo/build.gradle.kts @@ -56,7 +56,7 @@ dependencies { implementation(platform(libs.androidx.compose.bom)) implementation(libs.androidx.material.icons.extended) implementation(platform(libs.firebase.bom)) - implementation(libs.google.firebase.ai) + implementation(libs.firebase.ai) implementation(libs.androidx.lifecycle.viewmodel.android) implementation(libs.material3) implementation(libs.hilt.android)