Te damos la bienvenida nuevamente a la serie de entradas de blog "Compila apps inteligentes para Android", en la que tomamos una app básica para Android y la transformamos en una experiencia personalizada, inteligente y de agente. En nuestra publicación anterior, exploramos cómo compilar funciones inteligentes integradas en el dispositivo con Gemini Nano a través de la API de Prompt del Kit de AA.
En esta publicación, veremos cómo puedes aprovechar Firebase AI Logic para compilar funciones de IA híbridas y alojadas en la nube:
- Fundamentar respuestas en el contexto del mundo real
- Enrutar solicitudes de forma dinámica entre la ejecución local y en la nube con la inferencia híbrida
- Traducir contenido con sistemas de enrutamiento personalizados
A veces, un caso de uso requiere modelos de IA con mayor conocimiento del mundo, una ventana de contexto mucho más grande o la capacidad de controlar consultas complejas. En esos casos, podemos aprovechar los modelos de la nube.
Otras veces, quieres lo mejor de ambos mundos: usar la inferencia híbrida para ejecutar integrado en el dispositivo cuando esté disponible para reducir los costos y recurrir a la nube para garantizar la compatibilidad con todos los dispositivos.
Veamos cómo implementamos tres funciones híbridas y en la nube en Jetpacker:
- un asistente de museo con fundamentación web
- redacción de opiniones de restaurantes híbridas
- chat de asistencia para hoteles con traducción en vivo enrutada de forma personalizada
Usa la fundamentación de LLM para obtener información actualizadaChatbot de asistente de museo con fundamentación de LLM
El asistente de museo es un chatbot interactivo diseñado para ayudar a los usuarios a planificar sus visitas al museo. Proporciona a los visitantes detalles actualizados sobre exposiciones específicas, horarios de apertura actuales, precios de entradas y mucho más.
Cuando se compilan funciones de IA, obtener que el modelo responda con información del mundo real actualizada, precisa y específica es un desafío común. Si bien los modelos de la nube poseen grandes cantidades de conocimiento del mundo, es posible que no conozcan las exposiciones de temporada ni el horario de atención del día actual.
Para cerrar esta brecha, podemos usar técnicas de fundamentación para agregar contexto adicional a la ventana de contexto del modelo. El SDK de Firebase AI Logic admite tres tipos de fundamentación:
- Fundamentación de URL: Fundamentar respuestas con contenido de una página web específica (p.ej., precios de entradas actuales o reglas del museo).
- Fundamentación de la Búsqueda de Google: Permitir que el modelo consulte el índice de la Búsqueda de Google en tiempo real para obtener detalles actualizados.
- Fundamentación de Maps: Usar datos de ubicación de Google Maps
En Jetpacker, construimos de forma dinámica las herramientas disponibles en función de las marcas de funciones habilitadas y, luego, inicializamos el modelo generativo con el SDK de Firebase AI:
// 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("You are a helpful museum assistant answering questions about a museum. Use plain text.") }, tools = toolList )
Cuando el usuario consulta al asistente, si la fundamentación de URL está habilitada, agregamos las URLs de recursos específicos del museo directamente en la instrucción:
val groundingText = if (FeatureFlags.ENABLE_URL_GROUNDING) { "\n If the following message above is about the rules and terms to visit Le Louvre, " + "if needed answer this urls ${urlList.joinToString()}" } else { "" } val prompt = "$text $groundingText" var response = chat.sendMessage(prompt)
Inferencia híbrida: Generación de opiniones integrada en el dispositivo con vínculo directo de Maps
No todas las tareas de IA requieren un modelo basado en la nube, y no todos los dispositivos están en línea. Para ayudar a los desarrolladores a equilibrar la latencia, el costo y la disponibilidad sin conexión, recientemente presentamos la API de Firebase para la inferencia híbrida.
En Jetpacker, la función de opinión de restaurantes permite a los usuarios revisar temas seleccionados y redactar automáticamente una opinión. Para habilitar esta función para todos los usuarios, priorizamos la ejecución local con Gemini Nano y recurrimos a los modelos de la nube en los dispositivos que no admiten Gemini Nano.
// implementation("com.google.firebase:firebase-ai-logic") // implementation("com.google.firebase:firebase-ai-ondevice:16.0.0-beta03") // Initialize the model with hybrid routing configuration val reviewModel = Firebase.ai.generativeModel( modelName = "gemini-3.1-flash-lite", onDeviceConfig = OnDeviceConfig( inferenceMode = InferenceMode.PREFER_ON_DEVICE ) )
La API de inferencia híbrida admite cuatro modos de enrutamiento distintos:
- PREFER_ON_DEVICE: Prioriza la ejecución local y recurre a la nube si Gemini Nano no está disponible.
- PREFER_IN_CLOUD: Prioriza la ejecución en la nube y recurre a la ejecución integrado en el dispositivo si este se desconecta.
- ONLY_ON_DEVICE: Restringe la ejecución estrictamente al dispositivo.
- ONLY_IN_CLOUD: Restringe la ejecución estrictamente a la nube.
Una vez que se genera la opinión, la copiamos al portapapeles y usamos un intent para abrir Google Maps directamente en la página de opiniones del restaurante, lo que proporciona una experiencia del usuario fluida:
private fun copyAndOpenMapsReview(context: Context, reviewText: String, placeId: String) { val clipboard = context.getSystemService(Context.CLIPBOARD_SERVICE) as ClipboardManager val clip = ClipData.newPlainText("User Review", reviewText) clipboard.setPrimaryClip(clip) val uri = Uri.parse("https://search.google.com/local/writereview/mobile?placeid=$placeId") val intent = Intent(Intent.ACTION_VIEW, uri).apply { setPackage("com.google.android.apps.maps") } context.startActivity(intent) }
Enrutamiento híbrido personalizado: Traducción del chat de asistencia para hoteles con personajes simulados
Se creó el chat de asistencia para hoteles para permitir que los usuarios finalicen la logística y consulten los detalles del hotel. Esta función usa instrucciones del sistema para configurar un asistente de recepción localizado. Si pasamos información específica, como el idioma preferido y la información del hotel, en las instrucciones, podemos configurar un personaje conversacional que represente un hotel específico.
private val generativeModel = Firebase.ai(backend = GenerativeBackend.googleAI()) .generativeModel( systemInstruction = content { text(""" 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" )
Dado que las respuestas de recepción están en el idioma local del hotel (por ejemplo, francés para el Hotel Le Meurice en París), debemos traducir los mensajes al idioma preferido del usuario.
Si bien los modelos híbridos pueden configurar preferencias de enrutamiento simples, las situaciones complejas requieren una lógica de enrutamiento personalizada. En Jetpacker, implementamos una pila de enrutamiento personalizada que tiene en cuenta lo siguiente:
- Identificación de idiomas: Con la API de Language Identification de ML Kit integrada en el dispositivo, podemos detectar el idioma del mensaje entrante.
- Traducción integrada en el dispositivo (Gemini Nano): La API de Prompt del Kit de AA nos permite traducir pares de idiomas comunes directamente en el dispositivo, lo que ahorra ancho de banda y costo de la nube.
- Traducción en la nube (Gemini 3 Flash): Para idiomas más complejos, usamos Gemini Flash 3 para obtener una traducción de mayor calidad.
// 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() // On-device translator model (prefer Gemini Nano) for translating common language pairs private val hybridTranslationModel = Firebase.ai(backend = GenerativeBackend.googleAI()) .generativeModel( modelName = "gemini-3-flash", onDeviceConfig = OnDeviceConfig(mode = InferenceMode.PREFER_ON_DEVICE) ) // Cloud translator model for more complex language pairs private val cloudTranslationModel = Firebase.ai(backend = GenerativeBackend.googleAI()) .generativeModel( modelName = "gemini-3-flash" )
Cuando se debe traducir un mensaje, identificamos el idioma de origen y aplicamos nuestra lógica de enrutamiento personalizada, ejecutando la traducción integrado en el dispositivo o en la nube:
fun translateMessage(message: SupportChatMessage) { viewModelScope.launch { // 1. Detect language using ML Kit Language Identification val sourceLang = try { Tasks.await(languageIdentifier.identifyLanguage(message.text)) } catch (e: Exception) { "Undefined" } // 2. Custom routing: we've verified the translation quality for English and Korean with Gemini Nano, and will translate message on-device for those two languages val routeToCloud = sourceLang != "en" && sourceLang != "kr" val prompt = "Translate the following text to $selectedLanguage. Just return the translated sentence: ${message.text}." val (translatedText, routePrefix) = if (routeToCloud) { val result = cloudTranslationModel.generateContent(prompt) result.text to "[Cloud]" } else { val result = hybridTranslationModel.generateContent(prompt) result.text to "[On-Device]" } if (translatedText != null) { _translations.update { current -> current + (message.id to "$routePrefix: $translatedText") } } } }
En este ejemplo, la lógica de enrutamiento personalizada solo tiene en cuenta el idioma de origen y de destino de la traducción. Sin embargo, según el caso de uso de tu app, puedes expandir la lógica de enrutamiento para incluir otros factores, como la versión del modelo integrado en el dispositivo, la conectividad de red, el estado de la batería y mucho más.
Protección de los pipelines de IA: Verificación de aplicaciones de Firebase
Por último, el uso de la IA en la nube abre posibilidades de abuso de claves de API o facturación no autorizada. Para proteger las llamadas a la API, integramos la Verificación de aplicaciones de Firebase con Play Integrity (producción) y el proveedor de depuración local (para el desarrollo local o los emuladores).
En el archivo JetPackerApplication.kt, instalamos el proveedor de depuración al inicio y activamos la autenticación anónima para establecer una sesión de usuario segura:
// 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() }
Cuando se compila de forma local en un emulador, la Verificación de aplicaciones imprime un secreto de token local en logcat:
Enter this debug secret into the allow list in the Firebase Console: a8c2dd4c-xxxx-xxxx-xxxx-ef6c114ba27e
Una vez registrados en Firebase console, la Verificación de aplicaciones verifica y autentica por completo las solicitudes locales, lo que protege nuestro backend y nos permite probar la app de forma local.
Conclusión
Al combinar las capacidades del modelo de la nube (fundamentación, instrucciones del sistema) con las capacidades integradas en el dispositivo (enrutamiento híbrido, traducción, verificaciones de seguridad de la app), creamos una app de viajes inteligente, segura y disponible sin conexión.
Consulta el código fuente completo de Jetpacker en GitHub y explora la documentación de Firebase para comenzar:
Documentación de Firebase AI Logic
API de inferencia híbrida de Firebase
Más información
Consulta las otras partes de esta serie de entradas de blog:
Parte 1: Introducción de la app y descripción general de alto nivel.
Parte 2: Inteligencia en el dispositivo (análisis detallado de las APIs de IA generativa del Kit de AA y Gemini Nano para compilar funciones que prioricen la privacidad, como el resumen de itinerarios, el análisis de recibos y el procesamiento de audio local)
Parte 3 (esta publicación): Razonamiento híbrido y en la nube (explora cómo usar Firebase AI Logic para fundamentar las respuestas de LLM en datos del mundo real, como Google Maps y el contexto web)
Parte 4: Integración del sistema (integración con el sistema de inteligencia de Android mediante AppFunctions)
Parte 5 (próximamente): Flujos de trabajo de agente en la app (extiende la app con un asistente de reservaciones de extremo a extremo potenciado por A2UI y ADK)
¿Te interesa obtener más información sobre el desarrollo para Android? Sigue a Android Developers en YouTube o LinkedIn.
Todos los fragmentos de código de esta entrada de blog siguen el siguiente aviso sobre derechos de autor:
Copyright 2026 Google LLC. SPDX-License-Identifier: Apache-2.0
-
Cómo hacerTe damos la bienvenida nuevamente a la serie de entradas de blog "Compila apps inteligentes para Android", en la que tomamos una app básica para Android y la transformamos en una experiencia personalizada, inteligente y de agente. En nuestra publicación anterior, presentamos Jetpacker, la app de demostración que usaremos en esta serie.
Caren Chang • Lectura de 6 min -
Cómo hacerJetpacker es una app de demostración técnica que nuestro equipo creó desde cero para el Google I/O de este año (compilada con Antigravity). En esencia, Jetpacker ayuda a los usuarios a planificar, explorar y disfrutar de su próxima gran aventura.
Jolanda Verhoef • Lectura de 4 min -
Cómo hacerTe damos la bienvenida nuevamente a la serie de entradas de blog "Compila apps inteligentes para Android", en la que tomamos una app básica para Android y la transformamos en una experiencia personalizada, inteligente y de agente. En nuestra publicación anterior, exploramos cómo aprovechar Firebase AI Logic para compilar funciones de IA híbridas y alojadas en la nube.
Ben Weiss • Lectura de 6 min
Recibe la información más reciente sobre el desarrollo de Android en tu bandeja de entrada todas las semanas.