From f5457a5aa5e51abbca03548cb63f1d34e2966e08 Mon Sep 17 00:00:00 2001 From: Vinny DaSilva Date: Wed, 17 Sep 2025 22:16:48 -0400 Subject: [PATCH 1/3] Updating to use the free googleAI backend on a newer model. Also a few debugging statements. --- .../samples/geminilivetodo/ui/TodoScreenViewModel.kt | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/ai-catalog/samples/gemini-live-todo/src/main/java/com/android/ai/samples/geminilivetodo/ui/TodoScreenViewModel.kt b/ai-catalog/samples/gemini-live-todo/src/main/java/com/android/ai/samples/geminilivetodo/ui/TodoScreenViewModel.kt index 1e0e83bd..07bdee82 100644 --- a/ai-catalog/samples/gemini-live-todo/src/main/java/com/android/ai/samples/geminilivetodo/ui/TodoScreenViewModel.kt +++ b/ai-catalog/samples/gemini-live-todo/src/main/java/com/android/ai/samples/geminilivetodo/ui/TodoScreenViewModel.kt @@ -94,10 +94,15 @@ class TodoScreenViewModel @Inject constructor(private val todoRepository: TodoRe Manifest.permission.RECORD_AUDIO, ) == PackageManager.PERMISSION_GRANTED ) { + Log.d(TAG, "Start audio conversation") + it.startAudioConversation(::handleFunctionCall) liveSessionState.value = LiveSessionState.Running } } else { + + Log.d(TAG, "Stop audio conversation") + it.stopAudioConversation() liveSessionState.value = LiveSessionState.Ready } @@ -158,8 +163,8 @@ class TodoScreenViewModel @Inject constructor(private val todoRepository: TodoRe emptyMap(), ) - val generativeModel = Firebase.ai(backend = GenerativeBackend.vertexAI()).liveModel( - "gemini-2.0-flash-live-preview-04-09", + val generativeModel = Firebase.ai(backend = GenerativeBackend.googleAI()).liveModel( + "gemini-live-2.5-flash-preview", generationConfig = liveGenerationConfig, systemInstruction = systemInstruction, tools = listOf( @@ -181,6 +186,8 @@ class TodoScreenViewModel @Inject constructor(private val todoRepository: TodoRe } private fun handleFunctionCall(functionCall: FunctionCallPart): FunctionResponsePart { + Log.d(TAG, "handleFunctionCall ${functionCall.name}") + return when (functionCall.name) { "getTodoList" -> { val todoList = todoRepository.getTodoList().reversed() From 773c7b40a06a02fab5bbdc8780fd2ff436e22778 Mon Sep 17 00:00:00 2001 From: Vinny DaSilva Date: Wed, 17 Sep 2025 22:19:46 -0400 Subject: [PATCH 2/3] Adding the functionCall.id into the FunctionResponsePart which resolves issues with Gemini not responding --- .../samples/geminilivetodo/ui/TodoScreenViewModel.kt | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/ai-catalog/samples/gemini-live-todo/src/main/java/com/android/ai/samples/geminilivetodo/ui/TodoScreenViewModel.kt b/ai-catalog/samples/gemini-live-todo/src/main/java/com/android/ai/samples/geminilivetodo/ui/TodoScreenViewModel.kt index 07bdee82..4663e571 100644 --- a/ai-catalog/samples/gemini-live-todo/src/main/java/com/android/ai/samples/geminilivetodo/ui/TodoScreenViewModel.kt +++ b/ai-catalog/samples/gemini-live-todo/src/main/java/com/android/ai/samples/geminilivetodo/ui/TodoScreenViewModel.kt @@ -174,6 +174,8 @@ class TodoScreenViewModel @Inject constructor(private val todoRepository: TodoRe ), ) + + try { session = generativeModel.connect() } catch (e: Exception) { @@ -197,7 +199,7 @@ class TodoScreenViewModel @Inject constructor(private val todoRepository: TodoRe "message" to JsonPrimitive("List of tasks in the todo list: $todoList"), ), ) - FunctionResponsePart(functionCall.name, response) + FunctionResponsePart(functionCall.name, response, functionCall.id) } "addTodo" -> { val taskDescription = functionCall.args["taskDescription"]!!.jsonPrimitive.content @@ -208,7 +210,7 @@ class TodoScreenViewModel @Inject constructor(private val todoRepository: TodoRe "message" to JsonPrimitive("Task $taskDescription added to the todo list"), ), ) - FunctionResponsePart(functionCall.name, response) + FunctionResponsePart(functionCall.name, response, functionCall.id) } "removeTodo" -> { val taskId = functionCall.args["todoId"]!!.jsonPrimitive.long @@ -219,7 +221,7 @@ class TodoScreenViewModel @Inject constructor(private val todoRepository: TodoRe "message" to JsonPrimitive("Task was removed from the todo list"), ), ) - FunctionResponsePart(functionCall.name, response) + FunctionResponsePart(functionCall.name, response, functionCall.id) } "toggleTodoStatus" -> { val taskId = functionCall.args["todoId"]!!.jsonPrimitive.long @@ -230,13 +232,13 @@ class TodoScreenViewModel @Inject constructor(private val todoRepository: TodoRe "message" to JsonPrimitive("Task was toggled in the todo list"), ), ) - FunctionResponsePart(functionCall.name, response) + FunctionResponsePart(functionCall.name, response, functionCall.id) } else -> { val response = JsonObject( mapOf("error" to JsonPrimitive("Unknown function: ${functionCall.name}")), ) - FunctionResponsePart(functionCall.name, response) + FunctionResponsePart(functionCall.name, response, functionCall.id) } } } From 4b79ddcdc40e300408c6d73f4cdd91547e3c70b8 Mon Sep 17 00:00:00 2001 From: vad710 <1664748+vad710@users.noreply.github.com> Date: Thu, 18 Sep 2025 02:33:57 +0000 Subject: [PATCH 3/3] =?UTF-8?q?=F0=9F=A4=96=20Apply=20Spotless=20formattin?= =?UTF-8?q?g?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../android/ai/samples/geminilivetodo/ui/TodoScreenViewModel.kt | 2 -- 1 file changed, 2 deletions(-) diff --git a/ai-catalog/samples/gemini-live-todo/src/main/java/com/android/ai/samples/geminilivetodo/ui/TodoScreenViewModel.kt b/ai-catalog/samples/gemini-live-todo/src/main/java/com/android/ai/samples/geminilivetodo/ui/TodoScreenViewModel.kt index 4663e571..8e05681d 100644 --- a/ai-catalog/samples/gemini-live-todo/src/main/java/com/android/ai/samples/geminilivetodo/ui/TodoScreenViewModel.kt +++ b/ai-catalog/samples/gemini-live-todo/src/main/java/com/android/ai/samples/geminilivetodo/ui/TodoScreenViewModel.kt @@ -174,8 +174,6 @@ class TodoScreenViewModel @Inject constructor(private val todoRepository: TodoRe ), ) - - try { session = generativeModel.connect() } catch (e: Exception) {