Skip to main content

@stewmore/expo-ai-android-aicore

Android Gemini Nano via ML Kit GenAI / AICore (on-device) provider for the Expo AI Runtime.

Install & use

import { ExpoAI } from '@stewmore/expo-ai-core';
import '@stewmore/expo-ai-android-aicore'; // registers the Android adapter (side-effect import)

const caps = await ExpoAI.getCapabilities();
if (caps.available && caps.provider === 'android-aicore-gemini-nano') {
const result = await ExpoAI.generate({ prompt: 'Write a haiku about Kotlin.' });
console.log(result.text); // privacy: on-device
}

If the model isn't downloaded yet, the availability reason is model_not_downloaded — trigger a download:

import { downloadGeminiNanoModel } from '@stewmore/expo-ai-android-aicore';
await downloadGeminiNanoModel();

Requirements

  • A device with AICore / Gemini Nano (e.g. recent Pixel and Galaxy flagships), Android API 26+.
  • A development build (custom native code — not Expo Go): npx expo prebuild && npx expo run:android.

AICore is system-managed and may still be initializing — the adapter surfaces model_initializing / aicore_unavailable (retryable) so the runtime can fall back per the app's policy.

What it maps

RuntimeML Kit GenAI
generatePrompt API GenerativeModel.generateContent
streamgenerateContentStream (Flow) → token deltas
capability detectioncheckStatus()FeatureStatus
model downloaddownload() (downloadGeminiNanoModel)
sessionsemulated (transcript replayed as prompt prefix — the Prompt API is stateless)
errorsGenAiException.errorCodeExpoAIError

Structured output and summarize/rewrite/proofread are provided by the core runtime over generate (JSON prompt + validate + repair).

note

The com.google.mlkit:genai-prompt API is beta; bump the dependency version and confirm symbol names against the installed SDK when building.