Last verified: 2026-09-05 — LiteRT-LM 0.16.1 (litertlm-android) on a Pixel 8a (Android 16) for Recipe 2, with a re-gate row on 0.17.0; the bundle list below carries the date it was read from the Hugging Face API.
Yes. LiteRT-LM runs any .litertlm bundle, and the litert-community organization on Hugging Face publishes ungated bundles for families other than Gemma: Qwen 2, 2.5, 3 and 3.5, SmolLM, OLMo, Phi, Ministral, LFM, Falcon-H1, granite, Nemotron and more, plus vision-language, speech-recognition and translation models. The list below is generated from the Hugging Face API and says for each one the base model, the license and the files. litert-community/Qwen2.5-1.5B-Instruct (Apache-2.0, converted from Qwen/Qwen2.5-1.5B-Instruct) is the one Recipe 2 uses to add an offline chat to an existing Android app, verified on a Pixel 8a. A fine-tune that is not on the list converts with hf-to-litertlm (that route, on iPhone, is the next page).
Before choosing this route, check three things: the bundle is ungated or you have accepted its license, the device has the memory for the file you pick (Recipe 2’s 1.6 GB q8 bundle held 1,975,121 kB of process memory on the Pixel 8a while loaded), and the app can ship or download a file of that size.
Read from the Hugging Face API on 2026-09-05: 93 repositories under litert-community carry a .litertlm file, and 79 of them are neither gated nor a Gemma model. They are listed below by the task on their card, with the base model and the license exactly as the card metadata gives them. The size column is the figure written in the repository name, not a count of the weights; repositories whose name carries none are left blank. Not listed: 7 ungated Gemma repositories and 7 gated ones (functiongemma-270m-ft-mobile-actions, functiongemma-270m-ft-tiny-garden, gemma-3-270m-it, Gemma3-1B-IT, Llama-3.2-1B, Llama-3.2-3B, MedGemma-1.5-4B-IT).
Text generation (chat and instruct models) (57)
| repository | base model | license | size in name | .litertlm files |
last updated |
|---|---|---|---|---|---|
| OLMo-2-1B-Instruct | allenai/OLMo-2-0425-1B-Instruct | apache-2.0 | 1B | OLMo-2-1B-Instruct_q4_block32_ekv4096.litertlm |
2026-09-05 |
| FastVLM-0.5B | apple/FastVLM-0.5B | apple-amlr | 0.5B | FastVLM-0.5B.litertlmFastVLM-0.5B.qualcomm.sm8750.litertlmFastVLM-0.5B.qualcomm.sm8850.litertlm |
2026-06-24 |
| DeepSeek-R1-Distill-Qwen-1.5B | deepseek-ai/DeepSeek-R1-Distill-Qwen-1.5B | mit | 1.5B | DeepSeek-R1-Distill-Qwen-1.5B_multi-prefill-seq_q8_ekv4096.litertlm |
2025-09-22 |
| DeepSeek-R1-Distill-Qwen-7B | deepseek-ai/DeepSeek-R1-Distill-Qwen-7B | mit | 7B | DeepSeek-R1-Distill-Qwen-7B_q4_block32_ekv4096.litertlm |
2026-09-04 |
| SmolLM2-135M-Instruct | HuggingFaceTB/SmolLM2-135M-Instruct | apache-2.0 | 135M | SmolLM2_135M_Instruct.litertlm |
2026-06-01 |
| SmolLM2-360M-Instruct | HuggingFaceTB/SmolLM2-360M-Instruct | apache-2.0 | 360M | SmolLM2_360M_instruct.litertlm |
2026-05-07 |
| SmolLM3-3B | HuggingFaceTB/SmolLM3-3B | apache-2.0 | 3B | SmolLM3-3B.litertlmSmolLM3-3B_q4_block32_ekv4096.litertlm |
2026-09-05 |
| granite-4.0-350m-litert-lm | ibm-granite/granite-4.0-350m | apache-2.0 | 350m | granite-4.0-350m_q8_ekv1280.litertlm |
2026-07-15 |
| granite-4.0-h-1b | ibm-granite/granite-4.0-h-1b | apache-2.0 | 1b | granite-4.0-h-1b_int8.litertlm |
2026-09-05 |
| granite-4.0-h-350m | ibm-granite/granite-4.0-h-350m | apache-2.0 | 350m | granite-4.0-h-350m_fp16.litertlmgranite-4.0-h-350m_int8.litertlmgranite-4.0-h-350m_int8_gpu.litertlm |
2026-09-05 |
| granite-4.1-3b | ibm-granite/granite-4.1-3b | apache-2.0 | 3b | granite-4.1-3b_int4.litertlmgranite-4.1-3b_int8.litertlm |
2026-09-04 |
| granite-4.2-3b | ibm-granite/granite-4.2-3b | apache-2.0 | 3b | granite-4.2-3b_int4.litertlmgranite-4.2-3b_int8.litertlm |
2026-09-04 |
| LFM2.5-1.2B-Instruct | LiquidAI/LFM2.5-1.2B-Instruct | other (lfm-open-license-v1.0) | 1.2B | LFM2.5-1.2B-Instruct_int4.litertlmLFM2.5-1.2B-Instruct_int4_gpu.litertlmLFM2.5-1.2B-Instruct_int8.litertlm |
2026-09-05 |
| LFM2.5-1.2B-JP | LiquidAI/LFM2.5-1.2B-JP | other (lfm-open-license-v1.0) | 1.2B | LFM2.5-1.2B-JP_int4.litertlmLFM2.5-1.2B-JP_int4_gpu.litertlmLFM2.5-1.2B-JP_int8.litertlmLFM2.5-1.2B-JP_int8_gpu.litertlm |
2026-09-05 |
| LFM2.5-1.2B-Thinking | LiquidAI/LFM2.5-1.2B-Thinking | other (lfm-open-license-v1.0) | 1.2B | LFM2.5-1.2B-Thinking_int4.litertlmLFM2.5-1.2B-Thinking_int4_gpu.litertlmLFM2.5-1.2B-Thinking_int8.litertlmLFM2.5-1.2B-Thinking_int8_gpu.litertlm |
2026-09-05 |
| LFM2.5-2.6B | LiquidAI/LFM2.5-2.6B | other (lfm-open-license-v1.0) | 2.6B | LFM2.5-2.6B_int4.litertlmLFM2.5-2.6B_int8.litertlm |
2026-09-04 |
| LFM2.5-230M | LiquidAI/LFM2.5-230M | other (lfm1.0) | 230M | LFM2.5-230M_int4.litertlmLFM2.5-230M_int8.litertlm |
2026-09-05 |
| Jan-nano | Menlo/Jan-nano | apache-2.0 | model.litertlmmodel_block32.litertlm |
2026-09-04 | |
| FastContext-1.0-4B-SFT | microsoft/FastContext-1.0-4B-SFT | mit | 4B | model.litertlmmodel_block128.litertlm |
2026-09-04 |
| Phi-4-mini-instruct | microsoft/Phi-4-mini-instruct | mit | Phi-4-mini-instruct_multi-prefill-seq_q8_ekv4096.litertlm |
2025-09-22 | |
| Phi-4-mini-reasoning | microsoft/Phi-4-mini-reasoning | mit | model.litertlm |
2026-09-05 | |
| Ministral-3-3B-Instruct-2512 | mistralai/Ministral-3-3B-Instruct-2512 | apache-2.0 | 3B | Ministral-3-3B-Instruct-2512_q4_block32_ekv4096.litertlm |
2026-09-04 |
| Ministral-3-3B-Reasoning-2512 | mistralai/Ministral-3-3B-Reasoning-2512 | apache-2.0 | 3B | model.litertlm |
2026-09-04 |
| Nanbeige4.1-3B | Nanbeige/Nanbeige4.1-3B | apache-2.0 | 3B | model.litertlm |
2026-09-05 |
| Nanbeige4.2-3B | Nanbeige/Nanbeige4.2-3B | apache-2.0 | 3B | model.litertlmmodel_fp32act.litertlm |
2026-09-04 |
| Nemotron-H-4B-Instruct-128K | nvidia/Nemotron-H-4B-Instruct-128K | other (nvidia-open-model-license) | 4B | Nemotron-H-4B-Instruct-128K_int8.litertlm |
2026-09-04 |
| Nemotron-3-Nano-4B | nvidia/NVIDIA-Nemotron-3-Nano-4B-BF16 | other (nvidia-nemotron-open-model-license) | 4B | Nemotron-3-Nano-4B_int8.litertlm |
2026-09-04 |
| MiniCPM5-1B | openbmb/MiniCPM5-1B | apache-2.0 | 1B | MiniCPM5-1B_dynamic_wi8_afp32.litertlmminicpm_wi4b32_wi8_afp32.litertlmminicpm_wi4b32_wi8_afp32_gpu_opt.litertlm |
2026-08-14 |
| Polaris-4B-Preview | POLARIS-Project/Polaris-4B-Preview | apache-2.0 | 4B | model.litertlm |
2026-09-04 |
| Qwen2-0.5B-Instruct | Qwen/Qwen2-0.5B-Instruct | apache-2.0 | 0.5B | Qwen2_0.5B_Instruct.litertlm |
2026-09-01 |
| Qwen2-1.5B-Instruct | Qwen/Qwen2-1.5B-Instruct | apache-2.0 | 1.5B | Qwen2_1.5B_Instruct.litertlm |
2026-06-26 |
| Qwen2.5-1.5B-Instruct | Qwen/Qwen2.5-1.5B-Instruct | apache-2.0 | 1.5B | Qwen2.5-1.5B-Instruct_multi-prefill-seq_f32_ekv4096.litertlmQwen2.5-1.5B-Instruct_multi-prefill-seq_q8_ekv4096.litertlm |
2025-11-25 |
| Qwen2.5-Coder-1.5B-Instruct | Qwen/Qwen2.5-Coder-1.5B-Instruct | apache-2.0 | 1.5B | Qwen2.5-Coder-1.5B-Instruct_int4.litertlm |
2026-09-05 |
| Qwen3-0.6B | Qwen/Qwen3-0.6B | apache-2.0 | 0.6B | Qwen3-0.6B.litertlmQwen3-0.6B.mediatek.mt6993.litertlmQwen3-0.6B_dynamic_wi4b32_afp32.litertlmqwen3_0_6b_mixed_int4.litertlm |
2026-08-05 |
| Qwen3-0.6B-int4 | Qwen/Qwen3-0.6B | apache-2.0 | 0.6B | qwen3_0.6b_nothink_q4_block32_ekv1280.litertlmqwen3_0.6b_q4_block32_ekv1280.litertlm |
2026-06-30 |
| Qwen3-1.7B | Qwen/Qwen3-1.7B | apache-2.0 | 1.7B | Qwen3-1.7B_dynamic_wi4b32_afp32.litertlmQwen3_1.7B.litertlm |
2026-08-31 |
| Qwen3-14B | Qwen/Qwen3-14B | apache-2.0 | 14B | qwen3_14b_channelwise_int8_float32kv.litertlmqwen3_14b_mixed_int4.litertlm |
2026-06-05 |
| Qwen3-4B | Qwen/Qwen3-4B | apache-2.0 | 4B | qwen3_4b_channelwise_int8_float32kv.litertlmqwen3_4b_mixed_int4.litertlm |
2026-06-05 |
| Qwen3-4B-Instruct-2507 | Qwen/Qwen3-4B-Instruct-2507 | apache-2.0 | 4B | qwen3_4b_instruct_2507_mixed_int4.litertlm |
2026-09-03 |
| Qwen3-4B-Thinking-2507 | Qwen/Qwen3-4B-Thinking-2507 | apache-2.0 | 4B | Qwen3_4b_thinking_dynamic_wi4b32_afp32.litertlmmodel.litertlm |
2026-09-04 |
| Qwen3-8B | Qwen/Qwen3-8B | apache-2.0 | 8B | qwen3_8b_channelwise_int8_float32kv.litertlmqwen3_8b_mixed_int4.litertlm |
2026-06-05 |
| Qwen3.5-0.8B | Qwen/Qwen3.5-0.8B | apache-2.0 | 0.8B | Qwen3.5-0.8B-VL_int8.litertlmQwen3.5-0.8B_int8.litertlm |
2026-09-05 |
| Qwen3.5-2B | Qwen/Qwen3.5-2B | apache-2.0 | 2B | Qwen3.5-2B-VL_int8.litertlmQwen3.5-2B_int8.litertlm |
2026-09-05 |
| Qwen3.5-4B | Qwen/Qwen3.5-4B | apache-2.0 | 4B | Qwen3.5-4B_int8.litertlmQwen3.5-4B_mixed_int4.litertlm |
2026-09-05 |
| Qwen2.5-Coder-3B-Instruct | Qwen2.5-Coder-3B-Instruct | apache-2.0 | 3B | Qwen2.5_Coder_3B_It.litertlm |
2026-09-01 |
| TinySwallow-1.5B-Instruct | SakanaAI/TinySwallow-1.5B-Instruct | apache-2.0 | 1.5B | TinySwallow-1.5B-Instruct.litertlm |
2026-06-01 |
| sarashina2.2-0.5b-instruct-v0.1 | sbintuitions/sarashina2.2-0.5b-instruct-v0.1 | mit | 0.5b | sarashina2.2-0.5b-instruct-v0.1_int4.litertlmsarashina2.2-0.5b-instruct-v0.1_int8.litertlm |
2026-09-05 |
| sarashina2.2-1b-instruct-v0.1 | sbintuitions/sarashina2.2-1b-instruct-v0.1 | mit | 1b | sarashina2.2-1b-instruct-v0.1_int4.litertlmsarashina2.2-1b-instruct-v0.1_int8.litertlm |
2026-09-05 |
| Falcon-H1-0.5B-Instruct | tiiuae/Falcon-H1-0.5B-Instruct | other (falcon-llm-license) | 0.5B | Falcon-H1-0.5B-Instruct_int8.litertlm |
2026-09-05 |
| Falcon-H1-1.5B-Deep-Instruct | tiiuae/Falcon-H1-1.5B-Deep-Instruct | other (falcon-llm-license) | 1.5B | Falcon-H1-1.5B-Deep-Instruct_int8.litertlm |
2026-09-05 |
| Falcon-H1-1.5B-Instruct | tiiuae/Falcon-H1-1.5B-Instruct | other (falcon-llm-license) | 1.5B | Falcon-H1-1.5B-Instruct_int8.litertlm |
2026-09-05 |
| Falcon-H1-3B-Instruct | tiiuae/Falcon-H1-3B-Instruct | other (falcon-llm-license) | 3B | Falcon-H1-3B-Instruct_int8.litertlm |
2026-09-04 |
| Falcon-H1-Tiny-R-0.6B | tiiuae/Falcon-H1-Tiny-R-0.6B | other (falcon-llm-license) | 0.6B | Falcon-H1-Tiny-R-0.6B_int8.litertlm |
2026-09-05 |
| VibeThinker-1.5B | WeiboAI/VibeThinker-1.5B | mit | 1.5B | VibeThinker-1.5B.litertlm |
2026-05-27 |
| VibeThinker-3B | WeiboAI/VibeThinker-3B | mit | 3B | model.litertlm |
2026-09-04 |
| Zamba2-1.2B-instruct | Zyphra/Zamba2-1.2B-instruct | apache-2.0 | 1.2B | Zamba2-1.2B-instruct_int8.litertlm |
2026-09-05 |
| Zamba2-2.7B-instruct | Zyphra/Zamba2-2.7B-instruct | apache-2.0 | 2.7B | Zamba2-2.7B-instruct_int8.litertlm |
2026-09-04 |
Image and text to text (vision-language models) (18)
| repository | base model | license | size in name | .litertlm files |
last updated |
|---|---|---|---|---|---|
| Ovis2.5-2B | AIDC-AI/Ovis2.5-2B | apache-2.0 | 2B | Ovis2.5-2B.litertlm |
2026-09-04 |
| North-Micro-Vision-Instruct | CohereLabs/North-Micro-Vision-Instruct | apache-2.0 | North-Micro-Vision-Instruct_int4.litertlmNorth-Micro-Vision-Instruct_wi8.litertlm |
2026-09-04 | |
| SmolVLM2-2.2B | HuggingFaceTB/SmolVLM2-2.2B-Instruct | apache-2.0 | 2.2B | SmolVLM2-2.2B.litertlm |
2026-09-04 |
| SmolVLM2-500M | HuggingFaceTB/SmolVLM2-500M-Video-Instruct | apache-2.0 | 500M | SmolVLM2-500M.litertlm |
2026-09-05 |
| granite-docling-258M | ibm-granite/granite-docling-258M | apache-2.0 | 258M | granite-docling-258M.litertlm |
2026-09-05 |
| LFM2.5-VL-1.6B | LiquidAI/LFM2.5-VL-1.6B | other (lfm-open-license-v1.0) | 1.6B | LFM2.5-VL-1.6B_int4.litertlmLFM2.5-VL-1.6B_int8.litertlm |
2026-09-05 |
| LFM2.5-VL-3B | LiquidAI/LFM2.5-VL-3B | other (lfm-open-license-v1.0) | 3B | LFM2.5-VL-3B_int4.litertlmLFM2.5-VL-3B_int8.litertlm |
2026-09-04 |
| LFM2.5-VL-450M | LiquidAI/LFM2.5-VL-450M | other (lfm-open-license-v1.0) | 450M | LFM2.5-VL-450M_int4.litertlmLFM2.5-VL-450M_int8.litertlm |
2026-09-05 |
| LLaVA-OneVision-0.5B | llava-hf/llava-onevision-qwen2-0.5b-ov-hf | apache-2.0 | 0.5B | LLaVA-OneVision-0.5B.litertlm |
2026-09-05 |
| Mage-VL | microsoft/Mage-VL | apache-2.0 | Mage-VL.litertlm |
2026-09-04 | |
| MiniCPM-V-4 | openbmb/MiniCPM-V-4 | apache-2.0 | MiniCPM-V-4-int8.litertlm |
2026-08-01 | |
| InternVL3-1B | OpenGVLab/InternVL3-1B | apache-2.0 | 1B | InternVL3-1B.litertlm |
2026-09-05 |
| InternVL3-2B | OpenGVLab/InternVL3-2B | apache-2.0 | 2B | InternVL3-2B.litertlm |
2026-09-05 |
| InternVL3_5-1B | OpenGVLab/InternVL3_5-1B | apache-2.0 | 1B | model.litertlm |
2026-09-05 |
| InternVL3_5-2B | OpenGVLab/InternVL3_5-2B | apache-2.0 | 2B | model.litertlm |
2026-09-04 |
| InternVL3_5-4B | OpenGVLab/InternVL3_5-4B | apache-2.0 | 4B | model.litertlm |
2026-09-04 |
| PaddleOCR-VL-1.6 | PaddlePaddle/PaddleOCR-VL-1.6 | apache-2.0 | PaddleOCR-VL-1.6.litertlm |
2026-09-05 | |
| Qwen2-VL-2B | Qwen/Qwen2-VL-2B-Instruct | apache-2.0 | 2B | Qwen2-VL-2B.litertlm |
2026-09-05 |
Speech recognition (2)
| repository | base model | license | size in name | .litertlm files |
last updated |
|---|---|---|---|---|---|
| VibeVoice-ASR-BitNet | microsoft/VibeVoice-ASR-BitNet | mit | VibeVoice-ASR-BitNet.litertlm |
2026-09-04 | |
| Qwen3-ASR-0.6B | Qwen/Qwen3-ASR-0.6B | apache-2.0 | 0.6B | qwen3_asr_0.6b_5s_i8.litertlm |
2026-09-03 |
Translation (1)
| repository | base model | license | size in name | .litertlm files |
last updated |
|---|---|---|---|---|---|
| Hy-MT2-1.8B | tencent/Hy-MT2-1.8B | apache-2.0 | 1.8B | Hy-MT2-1.8B_int8.litertlm |
2026-09-05 |
No pipeline tag on the card (1)
| repository | base model | license | size in name | .litertlm files | last updated |
|—|—|—|—|—|—|
| Shieldstral-1.0-3B | mistralai/Shieldstral-1.0-3B | apache-2.0 | 3B | Shieldstral-1.0-3B-vision_int4.litertlmShieldstral-1.0-3B-vision_int4_gpu.litertlmShieldstral-1.0-3B_int4.litertlmShieldstral-1.0-3B_int8.litertlm | 2026-09-04 |
| you have | route | why |
|---|---|---|
| a model on the list above, an Android app | LiteRT-LM Kotlin API, Recipe 2 below | the bundle carries the tokenizer and the chat template; the recipe adds two Gradle lines, two files, cancel and release |
| a model on the list above, an iOS or macOS app | LiteRT-LM through swift-litert-lm | same bundle file; the Swift path is on the next page |
| your own fine-tune of a listed family | hf-to-litertlm, then the recipe for your platform | one command from the Hugging Face repo to a .litertlm, with an 8-question gate |
| a gated model (Gemma, Llama 3.2, MedGemma) | LiteRT-LM after accepting the license on Hugging Face | the bundle download then needs a token; Recipe 2’s downloader sends none |
| a model the converter refuses (mixture-of-experts, repo-local code, pre-quantized weights) | another runtime, see “When not to use” | LiteRT-LM has no bundle for it and hf-to-litertlm refuses it at the entry gate |
Recipe 2 adds Qwen2.5-1.5B-Instruct as an offline chat to an app that already exists: android-llm-chat/INTEGRATION.md.
Add a chat that needs no network, using Qwen2.5-1.5B-Instruct, to an existing Android app. Model: litert-community/Qwen2.5-1.5B-Instruct Qwen2.5-1.5B-Instruct_multi-prefill-seq_q8_ekv4096.litertlm (1,597,931,520 bytes, apache-2.0, from Qwen/Qwen2.5-1.5B-Instruct). Runtime: LiteRT-LM 0.16.1 (com.google.ai.edge.litertlm:litertlm-android), cpu. Verified: Pixel 8a, Android 16, build CP1A.260505.005 (SDK 36), 2026-09-05: CPU: 10.48 tokens/s decode, 55.4 tokens/s prefill, 0.67 s to the first token; GPU: 13.8 tokens/s decode, 71.5 tokens/s prefill, 0.5 s to the first token. Status: verified. Guide: https://github.com/john-rocky/on-device-recipes/blob/main/android-llm-chat/INTEGRATION.md; machine-readable: https://raw.githubusercontent.com/john-rocky/on-device-recipes/main/android-llm-chat/recipe.json.
Add the two dependency lines (generated below, with the pins), copy ChatEngine.kt and ModelProvisioner.kt from the recipe, then:
val modelFile = ModelProvisioner.provision(context, MODEL_URL, MODEL_SHA256, MODEL_BYTES) { status -> }
val engine = ChatEngine(modelFile.absolutePath, cacheDir = context.cacheDir.path)
engine.initialize() // seconds; Dispatchers.IO inside
engine.send("Hello").collect { chunk -> transcript.append(chunk) }
engine.cancel() // Stop: ends the reply being generated; the next send() continues the chat
engine.close() // Release: frees the model; initialize() loads it again with the chat kept
The model file, the dependency pins, the manifest lines and the verify command, from recipe.json:
| | |
|—|—|
| model repository | litert-community/Qwen2.5-1.5B-Instruct |
| model file | Qwen2.5-1.5B-Instruct_multi-prefill-seq_q8_ekv4096.litertlm |
| download URL | https://huggingface.co/litert-community/Qwen2.5-1.5B-Instruct/resolve/main/Qwen2.5-1.5B-Instruct_multi-prefill-seq_q8_ekv4096.litertlm |
| sha256 | faa60663b333290c1496c499828b21d3e3254a788cacd8cce917ce0f761a2dc9 |
| size, bytes | 1,597,931,520 |
| license | apache-2.0 |
| base model | Qwen/Qwen2.5-1.5B-Instruct |
| variant | q8 weights, KV cache 4096 tokens (the f32 file in the same repo is 6.2 GB) |
| published by | litert-community (Google AI Edge); not gated |
| runtime | LiteRT-LM |
| runtime version | 0.16.1 |
| Maven artifact | com.google.ai.edge.litertlm:litertlm-android |
| accelerator | cpu |
| converter | none |
| conversion note | The bundle is published as-is by litert-community; this recipe converts nothing. A fine-tune of the same base converts with https://github.com/john-rocky/hf-to-litertlm. |
| minimum Android SDK | 24 |
| ABI | arm64-v8a |
| toolchain | AGP 9.3.1, Gradle 9.7.0, compileSdk 36, JDK 17 |
Dependency lines, exactly as they go into the build file:
implementation("com.google.ai.edge.litertlm:litertlm-android:0.16.1")
implementation("org.jetbrains.kotlinx:kotlinx-coroutines-android:1.11.0")
minSdk 24. pins org.jetbrains.kotlinx:kotlinx-coroutines-android 1.11.0, androidx.test:runner 1.7.0, androidx.test.ext:junit 1.3.0, junit:junit 4.13.2. Gradle: No org.jetbrains.kotlin.android plugin: AGP 9 has Kotlin built in and rejects the standalone plugin; testInstrumentationRunner = “androidx.test.runner.AndroidJUnitRunner”. manifest:
Model delivery: downloaded at first launch into filesDir/models/
Verify:
./gradlew :app:connectedDebugAndroidTest -Pandroid.injected.androidTest.leaveApksInstalledAfterRun=true # first run downloads the 1.6 GB model on the device (about 3 min on Wi-Fi); or, after one install, adb push <file> /sdcard/Android/data/io.github.johnrocky.llmchat/files/ first
| Expected, from the run recorded in recipe.json: BUILD SUCCESSFUL; run finished: 5 tests, 0 failed. logcat (tag recipe), Pixel 8a, CPU backend, LiteRT-LM 0.16.1, 2026-09-05: PROVISION via=pushed ms=9 bytes=1597931520 | RESULT check=turn load_ms=8794 chunks=7 chars=31 first_chunk_ms=909 prefill_tok_s=55.45 decode_tok_s=8.90 ttft_s=0.67 reply=”The capital of France is Paris.” second_turn_chars=31 | RESULT check=throughput prompt=”Explain in five sentences why the sky is blue.” runs=3 decode_tokens=113/113/122 decode_tok_s=10.48/10.54/10.26 decode_tok_s_median=10.48 prefill_tok_s=60.29/55.28/50.75 thermal_status=1->1 | RESULT check=cancel_collector chunks_before_cancel=10 cpu_ms_generating=2020/502ms cpu_ms_after_cancel=80/1507ms next_turn_first_chunk_ms=1578 turns=4 intro_reply=”Hello Alice! How can I help you today?” next_turn_reply=Alice | RESULT check=cancel_explicit chunks=6 flow_completed_ms=2219 cpu_ms_after_cancel=10/1506ms next_turn_first_chunk_ms=1099 turns=2 partial=”1, 2, “ next_turn_head=OK. | RESULT check=release load1_ms=1381 pss_loaded_kb=1975121 pss_released_kb=91633 load2_ms=1442 reply_chars_after_reload=31 turns_after_reload=4 | RESULT check=close_during_generation chunks_at_close=6 close_ms=535 cpu_ms_after_close=30/1509ms reload_ms=1154 next_turn_head=OK. Asserted: non-blank streamed replies; no chunk after the cancel and process CPU time under 400 ms over the next 1.5 s; the turn before the cancel is still known (‘Alice’); an explicit cancel() ends the flow at chunk 5-8 and the next prompt gets a fresh short answer; close() then initialize() answers again with the history kept; close() during a reply returns in under 10 s and the process is idle afterwards. Latency, tokens/s, memory and load times are logged conditions, not assertions. |
Test files: ChatIntegrationTest.kt
To try a bundle on a Mac or Linux box before touching the app: pip install litert-lm, then
litert-lm run --from-huggingface-repo litert-community/Qwen2.5-1.5B-Instruct Qwen2.5-1.5B-Instruct_multi-prefill-seq_q8_ekv4096.litertlm --prompt "In one sentence, what is the capital of France?".
Recipe 2’s instrumented test on a Pixel 8a (Tensor G3, Android 16), phone idle, 2026-09-05. Tokens/s are the runtime’s own numbers, median of three turns of the same prompt. The third row is a re-gate run on litertlm-android 0.17.0, which the recipe does not pin yet (its Kotlin 2.4 metadata is refused by the Kotlin built into AGP 9.3.1; the row was taken with the metadata check skipped).
| device | OS | backend | runtime | load ms | reload ms | decode tokens/s | decode tokens/s per run | decode tokens per run | prefill tokens/s | first token s | PSS loaded kB | PSS after release kB | CPU ms in the 1.5 s after a cancel | close() during a reply ms | thermal status | date | |—|—|—|—|—|—|—|—|—|—|—|—|—|—|—|—|—| | Pixel 8a | Android 16, build CP1A.260505.005 (SDK 36) | cpu | 0.16.1 | 8,794 | 1,442 | 10.48 | 10.48/10.54/10.26 | 113/113/122 | 55.4 | 0.67 | 1,975,121 | 91,633 | 80 | 535 | 1 -> 1 | 2026-09-05 | | Pixel 8a | Android 16, build CP1A.260505.005 (SDK 36) | gpu | 0.16.1 | 6,691 | 5,483 | 13.8 | 13.28/13.81/13.80 | 30/37/39 | 71.5 | 0.5 | 2,647,531 | 492,268 | 60 | 696 | 1 -> 1 | 2026-09-05 | | Pixel 8a | Android 16, build CP1A.260505.005 (SDK 36) | cpu | 0.17.0 (compiled with -Xskip-metadata-version-check, see regate) | 13,272 | 1,614 | 10.2 | 10.20/10.32/10.18 | 92/110/110 | 42.9 | 0.6 | 1,973,407 | 90,063 | 10 | 597 | 1 -> 1 | 2026-09-05 |
Conditions:
Full lines and conditions: INTEGRATION.md section 7. The same bundle through the litert-lm CLI on a Mac and a Galaxy S26, with a different harness: litertlm-qwen2.5-1.5b-mac-galaxy-s26.md.
Use LiteRT-LM when one bundle file has to run on Android and iOS from the same runtime, when you want the tokenizer and the chat template inside the model file, or when the model you need is already on the list above. Recipe 2 is the Android form; the Swift form is on the next page.
Not the better choice when:
auto_map), pre-quantized weights (GPTQ, AWQ, bitsandbytes) and gated repositories at its entry gate. For those, llama.cpp (GGUF) has the wider architecture coverage on Android and desktop, and MLX has it on Apple silicon..litertlm only; there is no converter from GGUF or MLX weights, so a model you have only in those formats stays on llama.cpp or MLX.Not verified here: any runtime other than LiteRT-LM on the Pixel 8a. This page quotes no speed for llama.cpp, MLX or ExecuTorch, because none was measured with this recipe’s harness.
Not verified as of 2026-09-05:
Re-gate notes:
.litertlm): https://github.com/john-rocky/hf-to-litertlmDoes the bundle need a Hugging Face token? Not for the ungated ones listed above. Recipe 2’s downloader sends no token; a gated bundle (Gemma, Llama 3.2, MedGemma) needs the license accepted on Hugging Face and a token in the download.
Is Gemma faster or better supported than the others? Not measured here. This page compares nothing across families; every number on it is Qwen2.5-1.5B-Instruct on one Pixel 8a.
Can I keep the chat after Stop? Yes. LiteRT-LM 0.16 does not reuse a session after cancelProcess(); Recipe 2’s ChatEngine keeps the history itself and rebuilds the runtime conversation on the next send(), at the cost of one prefill of the chat so far (1,578 ms to the first chunk of the next turn on the CPU backend in the recipe’s test).
Which litertlm-android version? 0.16.1, the version Recipe 2 pins and was verified with. 0.17.0 is on Google Maven since 2026-09-04 but ships Kotlin 2.4 metadata that the Kotlin built into AGP 9.3.1 refuses; the re-gate row above was taken with that check skipped.
Which files in a repository are for phones? Names with q8, q4, int8 or int4 are the quantized bundles; f32, fp16 and fp32act are the reference-precision ones (6.2 GB for Qwen2.5-1.5B f32); names with a SoC (sm8750, mt6989, Tensor_G5) are compiled for that NPU; _gpu and _web are backend-specific builds. Recipe 2 uses the q8_ekv4096 file (ekv4096 = 4096-token KV cache).
This page is the canonical text. Article copies (dev.to, Zenn, Medium) are snapshots that link back here and are not edited after publishing; corrections land here first. The bundle list is regenerated by tools/render.py --fetch; the date above it is the date it was read.