
Announcing ADK for Kotlin 1.0: Building Production-Ready AI Agents in Kotlin, Android, and Beyond
Google announces ADK (Agent Development Kit) for Kotlin 1.0, reaching feature parity with ADK Python/Java and adding Android-first extensions: on-device inference via LiteRT-LM and ML Kit, Firebase AI Logic for hybrid cloud, and persistence through Room and AppSearch. It uses Kotlin Symbol Processing (KSP) to generate type-safe function-calling schemas at compile time from @Tool/@Param annotated methods, and introduces a SkillToolset for progressive-disclosure SOPs (SKILL.md files) plus human-in-the-loop confirmation for sensitive tool calls like bank transfers.
What it claims
ADK for Kotlin 1.0 is GA, built on a Kotlin Multiplatform (KMP) core that is agnostic to model backends, session providers, and memory systems, with plug-and-play Android extensions layered on top. It targets both server-side JVM agents and Android apps, and claims full feature parity with ADK Python/Java "Core" plus Vertex AI service bindings (VertexAiSessionService, VertexAiRagMemoryService, VertexAiMemoryBankService). Examples use gemini-3.8-flash.
How it works
The two mechanisms the summary names are shown concretely here:
- KSP function calling: annotate methods with
@Tool/@Paramon a plain class; KSP generates an extensionYourService().generatedTools()at compile time — type-safe schemas,suspendsupport, zero runtime reflection. Tools can set@Tool(requireConfirmation = true). - Skills:
SkillToolset(NewFileSystemSource(...))exposeslist_skills,load_skill,load_skill_resource. ASKILL.mdcarries frontmatter (name,description,allowed-tools) and steps; bundled assets are fetched only on demand (progressive disclosure).
Human-in-the-loop is a two-turn pause/resume: turn 1 emits a synthetic function call named FunctionCall.REQUEST_CONFIRMATION_FUNCTION_CALL_NAME; the app reads its id, then turn 2 sends a FunctionResponse with mapOf(ToolConfirmation.CONFIRMED_KEY to true) to resume and execute the tool.
Agents run through InMemoryRunner.runAsync(...) returning a flow of Events. On Android the runner accepts pluggable services: RoomSessionService.fromContext (SQLite chat history across process death), AppSearchMemoryService.fromContext (on-device full-text indexed memory), FileArtifactService.fromExternalFilesDir.
How to use it
dependencies {
implementation("com.google.adk:google-adk-kotlin-core:1.0.0")
ksp("com.google.adk:google-adk-kotlin-processor:1.0.0")
// Optional Android extensions:
implementation("com.google.adk:google-adk-kotlin-mlkit-android:1.0.0-beta")
implementation("com.google.adk:google-adk-kotlin-litertlm:1.0.0")
implementation("com.google.adk:google-adk-kotlin-firebase-android:1.0.0")
}Firebase-backed agents use Firebase.create("gemini-3.8-flash", firebaseAi) as the model.
Limits
The page is an announcement, not an evaluation — no benchmarks, latency, or cost figures, and no licence stated. Note the version skew across artifacts: the ML Kit extension is 1.0.0-beta while core, LiteRT-LM, and Firebase are 1.0.0; the text also flags LiteRT-LM/ML Kit on-device inference as "(beta)". All tool outputs in the examples are hardcoded stubs, so the diagnostics/banking flows demonstrate the API shape only, not real backend integration.
Organisations named here
- Firebase
Technologies named here
- Kotlin
- Gemini 3.8 Flash
- ADK for Kotlin
- ADK Python
- ADK Java
- LiteRT-LM
- ML Kit
- Firebase AI Logic
- Room
- AppSearch
- Kotlin Multiplatform
- KSP
- VertexAiSessionService
- VertexAiRagMemoryService
- VertexAiMemoryBankService
- InMemoryRunner
- SkillToolset
- RoomSessionService
- AppSearchMemoryService
- FileArtifactService
- Kotlin Coroutines
- Gemini
- Firebase
Techniques named here
- Progressive disclosure
- Compile-time function calling via @Tool/@Param annotations
- Human-in-the-loop tool confirmation
- Multi-agent orchestration
Related in agents



