ml-kit-genai-prompt-api — Claude Code skill for on-device Prompt API
An Android skill that walks your codebase through ML Kit GenAI Prompt API: on-device Gemini Nano calls, typed output and prefix caching.
npx skills add android/skills --skill ml-kit-genai-prompt-api -a claude-codeWhat ml-kit-genai-prompt-api does
The skill reads an Android codebase and lays out the steps for wiring in the ML Kit GenAI Prompt API, which sends natural language requests to Gemini Nano on the device. It covers four areas: prompt optimization, prefix caching, model lifecycle and structured output.
Setup comes first. minSdk has to be 26 or higher, and the app-level build.gradle needs the com.google.mlkit:genai-prompt dependency at version 1.0.0-beta4 or above. If com.google.mlkit:genai-schema-compiler is already in the project and KSP sits below 2.3.6, the plugin gets bumped too — otherwise the schema build breaks.
For structured output the skill checks isStructuredOutputFeatureAvailable() on the device, then refactors functions to return a @Generable typed object instead of a JSON string. Prompts over 200 words get the prefix caching API. Instances of ML Kit are released with close() when an Activity, Fragment or ViewModel is destroyed, and the model must report FeatureStatus as AVAILABLE before the first inference.
What it helps with
- add ML Kit GenAI Prompt API to an Android app
- replace string parsing with a
@Generabletyped return value - turn on prefix caching for prompts longer than 200 words
- confirm the model is downloaded and
FeatureStatusisAVAILABLEbefore inference - release ML Kit instances when an Activity or ViewModel is destroyed
Example prompts for the agent
- Wire up the ML Kit GenAI Prompt API in this project and check that minSdk is at least 26
- Refactor parseEmail to return a
@Generableobject instead of a string - This prompt is over 200 words — add prefix caching and verify the model's FeatureStatus
How to install ml-kit-genai-prompt-api
1Skills CLI (Vercel)
npx skills add android/skills --skill ml-kit-genai-prompt-api -a claude-code2Manually: put the files in place
~/.claude/skills/ml-kit-genai-prompt-api/SKILL.mdCopy the whole skill folder; for one project use .claude/skills/ml-kit-genai-prompt-api/
1Skills CLI (Vercel)
npx skills add android/skills --skill ml-kit-genai-prompt-api -a codex2Manually: put the files in place
.agents/skills/ml-kit-genai-prompt-api/SKILL.mdFor all projects use ~/.agents/skills/
1Skills CLI (Vercel)
npx skills add android/skills --skill ml-kit-genai-prompt-api -a cursor2Manually: put the files in place
.cursor/skills/ml-kit-genai-prompt-api/SKILL.mdCursor also reads .agents/skills/ and .claude/skills/
1GitHub CLI
gh skill install android/skills ml-kit-genai-prompt-api2Manually: put the files in place
.github/skills/ml-kit-genai-prompt-api/SKILL.md1Skills CLI (Vercel)
npx skills add android/skills --skill ml-kit-genai-prompt-api -a gemini-cli2Platform CLI
gemini skills install https://github.com/android/skills --path device-ai/ml-kit-genai-prompt-apiManually: put the files in place
.devin/skills/ml-kit-genai-prompt-api/SKILL.mdThe legacy .windsurf/skills/ path still works
Skills CLI (Vercel)
npx skills add android/skills --skill ml-kit-genai-prompt-api -a opencodeClaude.ai
Zip the folder and upload it in Settings → Capabilities → Skills
Step by step, with commands for each platform: How to install skills in Claude Code: five ways
Questions about ml-kit-genai-prompt-api
How do I install ml-kit-genai-prompt-api in Claude?
Run npx skills add android/skills --skill ml-kit-genai-prompt-api -a claude-code. The skill lands in ~/.claude/skills/ml-kit-genai-prompt-api/SKILL.md.
What does ml-kit-genai-prompt-api do?
It analyzes Android code and guides you through the ML Kit GenAI Prompt API: prompt optimization, prefix caching, structured output and releasing model resources.
What has to be in place before using the skill?
Android API level 26 or higher, the com.google.mlkit:genai-prompt dependency at 1.0.0-beta4 or above in the app-level build.gradle, and KSP 2.3.6 if com.google.mlkit:genai-schema-compiler is used.
Source text
SKILL.md · Apache-2.0
---
name: ml-kit-genai-prompt-api
description: Analyzes Android codebases to implement ML Kit GenAI Prompt API. Use
this skill to send natural language requests on-device to Gemini Nano, use structured
output with Prompt API, implement prefix caching, optimize the current prompt, or
apply best practices."
license: Complete terms in LICENSE.txt
metadata:
author: Google LLC
last-updated: '2026-09-03'
keywords:
- ML Kit
- Prompt API
- Structured Output
- Prefix Caching
- Gemini Nano
---
This skill provides step-by-step guidance for integrating and optimizing the ML
Kit GenAI Prompt API in Android apps.
## Prerequisites
- Android API level must be 26 or higher. If `minSdk` is below 26, update it to 26.
- Add the ML Kit GenAI Prompt API dependency (`com.google.mlkit:genai-prompt`) to the app-level `build.gradle` file, with version at least `1.0.0-beta4`.
- If `com.google.mlkit:genai-schema-compiler` dependency is used and KSP plugin version is below 2.3.6, update it to 2.3.6.
## Detailed steps
### 1. Prompt optimization
To optimize prompts for use with the ML Kit Prompt API, follow the
[prompt optimization guide](https://developer.android.com/agents/skills/device-ai/prompt-api/references/prompt-optimization).
### 2. Prefix caching optimization
If the prompt is more than 200 words, implement the [prefix caching API](https://developer.android.com/agents/skills/device-ai/prompt-api/references/prefix-caching).
### 3. Lifecycle and best practices
- The model must be fully downloaded and available before calling the first inference. Follow the guide on [implementing a generative model](https://developer.android.com/agents/skills/device-ai/prompt-api/references/get-started) to check that the `FeatureStatus` of a model is `AVAILABLE` before making an inference.
- Release ML Kit instances by calling `close()` when an `Activity`,
`Fragment`, or `ViewModel` is destroyed. Example:
```kotlin
// Instantiating model in activity, fragment, or ViewModel
val generativeModel = Generation.getClient()
// When activity, fragment, or ViewModel is destroyed
generativeModel.close()
```
<br />
### 4. Structured output
When implementing or refactoring a prompt to use structured output, follow
these rules:
1. **Check for API availability:** Verify Structured Output feature is available on the device with `isStructuredOutputFeatureAvailable()` before using it. Refer to the [Structured Output API guide](https://developer.android.com/agents/skills/device-ai/prompt-api/references/structured-output) for full instructions.
2. **Return type:** Return the `@Generable` typed object from the function
signature instead of a `String` or JSON string.
For example:
fun parseEmail(email: String): String {
...
}
should be refactored to:
fun parseEmail(email: String): ParsedEmail? {
...
}
3. **Example:**
This is the example code before refactoring:
```kotlin
suspend fun parseEmail(email: String): String {
val parseEmailPrompt = "Parse this email and return the sender, title, and short summary of the email less than 10 words: "
val parsedEmail = generativeModel.generateContent(parseEmailPrompt + email)
return parsedEmail.candidates[0].text
}
```
<br />
This is the example code after using Structured Output API:
```kotlin
@Generable
data class ParsedEmail(
@Guide(description = "Sender of the email")
var sender: String = "",
@Guide(description = "Title of the email")
var title: String = "",
@Guide(description = "Summary of the email less than 10 words")
var summary: String = ""
)
suspend fun parseEmail(email: String): ParsedEmail? {
val parseEmailPrompt =
"Parse this email: $email"
val baseRequest = GenerateContentRequest.Builder(TextPart(parseEmailPrompt)).build()
val typedRequest = generateTypedContentRequest(baseRequest, ParsedEmail::class)
val typedResponse = generativeModel.generateContent(typedRequest)
return typedResponse.candidates[0].response
}
```
<br />
© Google LLC · Apache-2.0 · android/skills