Agent Development Kit for Android: cuándo usar ADK y cómo integrar agentes de IA en tu app
El Agent Development Kit for Android, o ADK, es un framework para construir agentes de IA dentro de una aplicación Android. No se limita a enviar un prompt y mostrar una respuesta: permite definir instrucciones, gestionar sesiones, coordinar varios agentes y conectar capacidades de la app como herramientas invocables por el modelo.
La biblioteca está diseñada para Kotlin y Java, incorpora dependencias específicas para Android y permite ejecutar modelos en el dispositivo mediante Gemini Nano y las APIs de ML Kit GenAI. También puede trabajar con modelos cloud o combinar ambos enfoques en una arquitectura híbrida. (Android Developers)
Qué es exactamente un agente con ADK
Un agente es una unidad de software que recibe una intención del usuario, interpreta el contexto, decide qué pasos necesita ejecutar y genera una respuesta. Para hacerlo, puede apoyarse en un modelo de lenguaje, herramientas de tu aplicación y otros agentes especializados.
Por ejemplo, una app de viajes podría tener:
- Un agente principal que entiende la petición del usuario.
- Un agente local que resume reservas ya almacenadas en el dispositivo.
- Un agente cloud que propone un itinerario.
- Herramientas para consultar vuelos, guardar favoritos o crear recordatorios.
ADK aporta la estructura para organizar esa colaboración. En lugar de repartir lógica de prompts, estados y llamadas a servicios por distintos ViewModel, puedes concentrar la responsabilidad en una capa de agentes.
Cuándo conviene integrarlo en una app Android
ADK resulta útil cuando la IA necesita razonar sobre una petición, consultar información contextual o ejecutar varias acciones coordinadas.
Algunos casos claros son:
| Caso de uso | Por qué ADK encaja |
|---|---|
| Asistente de productividad | Puede interpretar órdenes, consultar tareas y generar planes de acción. |
| Búsqueda semántica en contenido propio | Combina contexto de la app, herramientas de búsqueda y respuestas generadas. |
| Soporte al cliente dentro de la app | Mantiene una sesión conversacional y deriva consultas a herramientas o agentes especializados. |
| Apps con datos sensibles | Permite usar modelos en el dispositivo para procesar contenido sin enviarlo a un servidor. |
| Flujos complejos | Coordina pasos como clasificar, resumir, validar y presentar una respuesta final. |
No es la mejor opción para cada funcionalidad de IA. Si solo necesitas resumir un texto, corregir una frase o clasificar una imagen, una API específica de ML Kit puede ser más simple y predecible. ADK merece la pena cuando hay decisiones, contexto, herramientas o varios pasos.
Ejecución local, cloud o híbrida
La decisión más importante no es el prompt, sino dónde se ejecuta la inferencia.
Modelo en el dispositivo
Con Gemini Nano a través de ML Kit GenAI, la inferencia puede realizarse sin conexión y sin enviar el contenido a la nube. Esto reduce la latencia de red, mejora la privacidad y evita costes por petición, aunque el rendimiento depende del hardware y de la disponibilidad del modelo en cada dispositivo. (Android Developers)
Encaja especialmente bien en funcionalidades como:
- Resumen de notas privadas.
- Reescritura de mensajes.
- Asistentes que trabajan con contenido local.
- Funciones disponibles sin conexión.
Modelo en la nube
Un modelo cloud suele ofrecer mayor capacidad para tareas complejas, acceso a información remota y respuestas más ricas. A cambio, añade latencia, coste, conectividad y requisitos de seguridad.
Arquitectura híbrida
El enfoque híbrido combina ambas opciones. Un agente principal puede usar un modelo cloud para coordinar el flujo, mientras subagentes locales procesan información sensible, como notas, historial o documentos descargados.
Esta arquitectura permite equilibrar privacidad y capacidad. Por ejemplo, una app de salud podría resumir localmente síntomas registrados por el usuario y enviar al backend solo una representación mínima y consentida para obtener contenido educativo.
Configura ADK en el proyecto
Actualmente, ADK para Android requiere minSdk 24 o superior, compileSdk 34 o superior, Java 17 y KSP para procesar anotaciones como @Tool. La dependencia Android reemplaza a la variante JVM: no debes añadir ambas. (Android Developers)
plugins {
id("com.android.application")
kotlin("android")
id("com.google.devtools.ksp") version "2.1.20-2.0.1"
}
android {
compileSdk = 34
defaultConfig {
minSdk = 24
targetSdk = 34
}
}
dependencies {
implementation("com.google.adk:google-adk-kotlin-core-android:0.1.0")
ksp("com.google.adk:google-adk-kotlin-processor:0.1.0")
}
kotlin {
jvmToolchain(17)
}
Revisa siempre la documentación antes de copiar versiones: ADK para Android sigue evolucionando y sus artefactos pueden cambiar.
Crea un agente local sencillo
El siguiente ejemplo crea un agente que trabaja con un modelo local ya inicializado mediante ML Kit. En una app real, conviene exponerlo desde una capa de dominio o un repositorio, no crearlo directamente en un Composable.
import com.google.adk.kt.agents.Instruction
import com.google.adk.kt.agents.LlmAgent
import com.google.adk.kt.models.mlkit.GenaiPrompt
import com.google.adk.kt.runners.InMemoryRunner
import com.google.adk.kt.sessions.InMemorySessionService
import com.google.adk.kt.types.Content
import com.google.adk.kt.types.Part
import com.google.adk.kt.types.Role
import com.google.mlkit.genai.prompt.GenerativeModel
import kotlinx.coroutines.flow.Flow
class NotesAssistant(
generativeModel: GenerativeModel
) {
private val model = GenaiPrompt.create(
generativeModel = generativeModel,
name = "gemini-nano"
)
private val agent = LlmAgent(
name = "notes_assistant",
description = "Resume y organiza notas del usuario.",
model = model,
instruction = Instruction(
"Responde en español. Resume el contenido con claridad y " +
"no inventes información que no aparezca en la nota."
)
)
private val runner = InMemoryRunner(
agent = agent,
sessionService = InMemorySessionService()
)
fun ask(note: String): Flow<Any> {
return runner.runAsync(
userId = "current-user",
sessionId = "notes-session",
newMessage = Content(
role = Role.USER,
parts = listOf(
Part(text = "Resume esta nota:\n$note")
)
)
)
}
}
El InMemoryRunner ejecuta el agente y expone los eventos de respuesta como un flujo. En Android, recógelo desde un ViewModel con viewModelScope y publica el texto final o los fragmentos parciales en el estado de UI. La documentación oficial muestra este patrón basado en corrutinas y collect. (Android Developers)
Añade herramientas cuando el agente debe actuar
El valor diferencial de ADK aparece cuando el agente puede usar funciones de tu app. Una herramienta puede consultar una base de datos local, recuperar una reserva, crear una tarea o buscar un producto.
Define funciones pequeñas, deterministas y con permisos claros. Evita exponer operaciones destructivas sin confirmación explícita del usuario.
import com.google.adk.kt.annotations.Param
import com.google.adk.kt.annotations.Tool
class TaskTools(
private val repository: TasksRepository
) {
@Tool
suspend fun getPendingTasks(
@Param("Categoría opcional para filtrar tareas")
category: String?
): List<String> {
return repository.pendingTasks(category)
.map { task -> task.title }
}
}
Después puedes registrar las herramientas generadas en el agente mediante tools = TaskTools(repository).generatedTools(). Mantén estas operaciones dentro de tu capa de datos o dominio: el agente decide cuándo pedir una acción, pero tu aplicación conserva las reglas de negocio, autorización y validación.
Recomendaciones para producción
Empieza con un único agente y una única capacidad útil. Un flujo pequeño es más fácil de probar, medir y proteger que una red de subagentes creada demasiado pronto.
También conviene aplicar estas reglas:
- Conserva las decisiones críticas fuera del modelo.
- Pide confirmación antes de compras, borrados, envíos o cambios de cuenta.
- Registra métricas de latencia, errores, cancelaciones y coste por interacción.
- Diseña estados de carga y recuperación ante falta de red.
- Trata la salida del modelo como contenido no confiable hasta validarla.
- Prueba en dispositivos reales si dependes de inferencia local.
ADK no sustituye la arquitectura Android habitual. Sigue necesitando ViewModel, repositorios, control de permisos, pruebas y una UI clara. Su función es aportar una capa de orquestación para experiencias de IA que ya no caben en una sola llamada a un modelo.