Postado por Thomas Ezan, Jolanda Verhoef e Caren Chang, Engenheiros de Relações com Desenvolvedores Sênior, Android Developer Relations
Bem-vindos à série de posts do blog "Construa aplicativos Android inteligentes" onde transformamos um aplicativo básico do Android em uma experiência pessoalizada, inteligente e agenciada. No nosso post anterior, exploramos como construir recursos inteligentes no dispositivo usando Gemini Nano através da API de Prompt do ML Kit.
Neste post, veremos como você pode aproveitar o Firebase AI Logic para criar recursos baseados em nuvem e híbridos:
- Basear respostas no contexto real do mundo
- Roteirizar solicitações dinamicamente entre a nuvem e o local usando inferência híbrida
- Traduzir conteúdo com sistemas de roteamento personalizados
Às vezes, um caso de uso requer modelos de IA com maior conhecimento do mundo, uma janela de contexto muito maior ou a capacidade de lidar com consultas complexas. Nesses cenários, podemos aproveitar os modelos em nuvem.
Ao mesmo tempo, você pode querer o melhor dos dois mundos: usar inferência híbrida para executar no dispositivo quando disponível para reduzir custos e recorrer à nuvem para garantir compatibilidade com todos os dispositivos.
Vamos ver como implementamos três recursos baseados em nuvem e híbridos no Jetpacker:
- um assistente de museu com web grounding
- redação de avaliações de restaurantes híbridas
- suporte ao chat de hotel com tradução ao vivo roteirizada personalmente.
Use LLM grounding para informações atualizadas Assistente de museu com LLM grounding
O Assistente do Museu é um chatbot interativo projetado para ajudar os usuários a planejar suas visitas aos museus. Ele fornece aos visitantes detalhes atualizados sobre exibições específicas, horários de funcionamento atuais, preços de ingressos e muito mais.
‘Como posso obter um desconto no ingresso para o Louvre?’
Quando construímos recursos de IA, fazer com que o modelo responda com informações frescas, precisas e específicas do mundo real é um desafio comum. Enquanto os modelos em nuvem possuem uma quantidade massiva de conhecimento sobre o mundo, eles podem não saber sobre exposições sazonais ou os horários de funcionamento atuais.
responda às perguntas corretamente e com precisão.
Para preencher essa lacuna, podemos usar técnicas de grounding para adicionar contexto extra ao contexto do modelo. O Firebase AI Logic SDK suporta três tipos de grounding:
- URL grounding: Baseando respostas no conteúdo de uma página web específica (por exemplo, preços atuais ou regras do museu).
- Google Search grounding: Permitindo que o modelo consulte o índice de pesquisa em tempo real do Google para detalhes atualizados.
- Maps grounding: Usando dados de localização do Google Maps.
No Jetpacker, construímos dinamicamente as ferramentas disponíveis com base em bandeiras de recurso habilitadas e inicializamos o modelo gerativo usando o Firebase AI SDK:
// implementation("com.google.firebase:firebase-ai-logic")
private var toolList = mutableListOf<Tool>()
init {
if (ENABLE_SEARCH_GROUNDING) {
toolList.add(Tool.googleSearch())
}
if (ENABLE_URL_GROUNDING) {
toolList.add(Tool.urlContext())
}
}
private val generativeModel = Firebase.ai(backend = GenerativeBackend.googleAI())
.generativeModel(
modelName = "gemini-3-flash",
systemInstruction = content {
text("Você é um assistente útil do museu respondendo perguntas sobre um museu. Use texto simples.")
},
tools = toolList
)
Quando o usuário consulta o assistente, se a base URL estiver habilitada, anexamos diretamente as URLs específicas do recurso do museu ao prompt:
val groundingText = if (FeatureFlags.ENABLE_URL_GROUNDING) {
"\n Se a mensagem acima for sobre as regras e termos para visitar o Louvre, se necessário responda com esses URLs ${urlList.joinToString()}"
} else {
""
}
val prompt = "$text $groundingText"
var response = chat.sendMessage(prompt)
Inferência híbrida: geração de revisões no dispositivo com link profundo do Maps
Nem todas as tarefas de IA exigem um modelo baseado em nuvem, e nem todos os dispositivos estão online. Para ajudar desenvolvedores a equilibrarem latência, custo e disponibilidade offline, recentemente introduzimos o API do Firebase para Inferência Híbrida.
No Jetpacker, a funcionalidade de revisão de restaurante permite que os usuários revisem tópicos selecionados e redija automaticamente uma revisão. Para habilitar isso para todos os usuários, priorizamos a execução local com Gemini Nano e recorremos a modelos em nuvem em dispositivos que não suportam o Gemini Nano.
A funcionalidade de revisão de restaurante usa inferência híbrida para redigir uma revisão baseada em tópicos
// implementation("com.google.firebase:firebase-ai-logic")
// implementation("com.google.firebase:firebase-ai-ondevice:16.0.0-beta03")
// Inicialize o modelo com a configuração de roteamento híbrido
val reviewModel = Firebase.ai.generativeModel(
modelName = "gemini-3.1-flash-lite",
onDeviceConfig = OnDeviceConfig(
inferenceMode = InferenceMode.PREFER_ON_DEVICE
)
)
A API de Inferência Híbrida suporta quatro modos distintos de roteamento:
- PREFER_ON_DEVICE: Prioriza a execução local e recorre à nuvem se o Gemini Nano não estiver disponível.
- PREFER_IN_CLOUD: Prioriza a execução em nuvem e recorre ao dispositivo se o dispositivo ficar offline.
- ONLY_ON_DEVICE: Restringe a execução estritamente ao dispositivo.
- ONLY_IN_CLOUD: Restringe a execução estritamente à nuvem.
Uma vez que a revisão é gerada, copiamos para o clipboard e usamos uma intent para abrir diretamente o Google Maps na página de revisão do restaurante, proporcionando uma experiência de usuário fluida:
Roteamento híbrido personalizado: suporte ao chat de hotel com simulações de personagens
O suporte ao chat de hotel foi criado para permitir que os usuários finalizem logística e verifiquem detalhes do hotel. Esta funcionalidade usa instruções do sistema para configurar uma recepcionista assistente localizada. Ao passar informações específicas — como o idioma preferido e as informações sobre o hotel — nas instruções, podemos configurar um personagem conversacional representando um determinado hotel.
private val generativeModel = Firebase.ai(backend = GenerativeBackend.googleAI())
.generativoModelo(
systemInstruction = conteúdo {
texto("""
Você é uma recepcionista útil no $hotelName, falando apenas em $language.
Responda educadamente em $language. O bar fecha às 22h e o café da manhã está disponível das 7h às 10h.
Há alguém na recepção 24 horas por dia. Você pode pegar suas malas do armário de bagagens
no final do lobby a qualquer hora.
""")
},
modelName = "gemini-3-flash-preview"
)
Como as respostas da recepcionista estão em idioma local do hotel (por exemplo, francês para o Hotel Le Meurice em Paris), precisamos traduzir as mensagens para o idioma preferido do usuário.
Mensagens de suporte ao chat de hotel são automaticamente traduzidas para o idioma preferido do usuário
Enquanto os modelos híbridos podem configurar preferências simples de roteamento, cenários complexos exigem lógica personalizada de roteamento. No Jetpacker, implementamos uma pilha personalizada de roteamento que leva em conta:
- Identificação de idioma: Usando a API ML Kit Language Identification, podemos detectar o idioma da mensagem recebida.
- Tradução no dispositivo (Gemini Nano): A API de Prompt do ML Kit nos permite traduzir pares comuns de idiomas diretamente no dispositivo, economizando largura de banda e custos na nuvem.
- Tradução em nuvem (Gemini 3 Flash): Para idiomas mais complexos, usamos o Gemini Flash 3 para obter uma tradução de melhor qualidade.
// implementation("com.google.android.gms:play-services-mlkit-language-id:17.0.0")
// ML Kit for Language Identification (powered by Google Play Services)
private val languageIdentifier = LanguageIdentification.getClient()
// Modelo de tradução no dispositivo (prefer Gemini Nano) para traduzir pares comuns de idiomas
private val hybridTranslationModel = Firebase.ai(backend = GenerativeBackend.googleAI())
.generativoModelo(
modelName = "gemini-3-flash",
onDeviceConfig = OnDeviceConfig(mode = InferenceMode.PREFER_ON_DEVICE)
)
// Modelo de tradução em nuvem para pares mais complexos de idiomas
private val cloudTranslationModel = Firebase.ai(backend = GenerativeBackend.googleAI())
.generativoModelo(
modelName = "gemini-3-flash"
)
Quando uma mensagem precisa ser traduzida, identificamos o idioma de origem e aplicamos nossa lógica personalizada de roteamento, executando a tradução ou no dispositivo ou na nuvem:
fun traduzirMensagem(mensagem: SupportChatMessage) { viewModelScope.launch { // 1. Detectar idioma usando ML Kit Language Identification val idiomaOrigem = try { Tasks.await(languageIdentifier.identifyLanguage(mensagem.text)) } catch (e: Exception) { "Indefinido" } // 2. Roteamento personalizado: verificamos a qualidade da tradução para inglês e coreano com Gemini Nano, e traduzimos as mensagens no dispositivo para esses dois idiomas val rotearParaNuvem = idiomaOrigem != "en" && idiomaOrigem != "ko" val prompt = "Traduza o seguinte texto para $idiomaSelecionado. Retorne apenas a frase traduzida: ${mensagem.text}." val (textoTraduzido, prefixoRoteamento) = if (rotearParaNuvem) { val resultado = cloudTranslationModel.generateContent(prompt) resultado.text to "[Nuvem]" } else { val resultado = hybridTranslationModel.generateContent(prompt) resultado.text to "[No Dispositivo]" } if (textoTraduzido != null) { _traducoes.update { atual -> atual + (mensagem.id to "$prefixoRoteamento: $textoTraduzido") } } } }
Neste exemplo, a lógica de roteamento personalizado leva em consideração apenas o idioma de origem e destino da tradução. No entanto, com base no caso de uso do seu aplicativo, você pode expandir a lógica de roteamento para incluir outros fatores como a versão do modelo no dispositivo, conectividade de rede, status da bateria etc.
Segurança das Pipelines de IA: Firebase App Check
No final, usar IA na nuvem abre possibilidades de abuso de chaves de API ou cobranças não autorizadas. Para proteger as chamadas à API, integramos Firebase App Check usando a Integridade do Play (produção) e o provedor local Debug (para desenvolvimento local ou emuladores).
No arquivo JetPackerApplication.kt, instalamos o provedor de debug ao iniciar e acionamos a autenticação anônima para estabelecer uma sessão segura do usuário:
// implementation("com.google.firebase:firebase-appcheck-playintegrity")
// implementation("com.google.firebase:firebase-appcheck-debug")
// implementation("com.google.firebase:firebase-auth")
override fun onCreate() { super.onCreate() Firebase.initialize(context = this) Firebase.appCheck.installAppCheckProviderFactory( DebugAppCheckProviderFactory.getInstance() ) Firebase.auth.signInAnonymously() }
Quando construindo localmente em um emulador, o App Check imprime um token de debug secreto no logcat:
Digite este segredo de debug na lista permitida no console do Firebase: a8c2dd4c-xxxx-xxxx-xxxx-ef6c114ba27e
Uma vez registrado no console do Firebase, as solicitações locais são totalmente verificadas e autenticadas pelo App Check, protegendo nosso back-end enquanto permitimos testar o aplicativo localmente.
Conclusão
Combinando a capacidade de modelos em nuvem (fundamentação, instruções do sistema) com as capacidades no dispositivo (roteamento híbrido, tradução, verificações de segurança do aplicativo), criamos um aplicativo de viagem que é inteligente, seguro e disponível offline.
Confira o código-fonte completo para Jetpacker no GitHub, e explore a documentação do Firebase para começar:
Documentação de Lógica IA do Firebase
API de Inferência Híbrida do Firebase
Saiba mais
Parte 1: Introdução do aplicativo e uma visão geral de alto nível.
Parte 2: Inteligência no dispositivo. Aprofundamento nos APIs GenAI do ML Kit e Gemini Nano para construir recursos de privacidade primeiro como resumo de itinerário, análise de recibos e processamento local de áudio.
Parte 3 (este post!): Inferência híbrida e em nuvem. Explore como usar o Firebase AI Logic para fundamentar as respostas de LLM em dados do mundo real como Google Maps e contexto da web.
Parte 4: Integração com o sistema de inteligência Android usando AppFunctions.
Parte 5 (em breve): Fluxos de trabalho agênticos dentro do aplicativo. Estenda o aplicativo com um assistente de reserva completo a partir da A2UI e ADK.
Interessado em mais sobre desenvolvimento Android? Siga os Desenvolvedores Android no YouTube ou LinkedIn!
Todos os trechos de código neste post seguem a seguinte declaração de direitos autorais:
Direitos Autorais 2026 Google LLC.
SPDX-License-Identifier: Apache-2.0