onDeviceLlmModule

actual fun onDeviceLlmModule(): Module(source)

Android on-device LLM tier, detection-ordered (ai-engineering.md §7): ML Kit Gemini Nano (AICore devices) → MediaPipe Gemma (broad coverage, downloaded on demand) → (falls through to the heuristic tier upstream). ModelManager is bound for the settings screen. Gemini Nano participates only when the consumer installs :ai-mlkit and mlKitLlmModule().

expect fun onDeviceLlmModule(): Module(source)

Per-platform Koin bindings for the on-device LLM tier. commonMain's aiModule includes this; the actual decides which OnDeviceLlm gets bound (ML Kit / Foundation Models / unavailable).

actual fun onDeviceLlmModule(): Module(source)

iOS on-device LLM tier, detection-ordered: Apple Foundation Models → MediaPipe Gemma → (falls through to the heuristic tier upstream).

Foundation Models is real once a consumer registers a Swift bridge into FoundationModelsBridge (see ai/ios-bridge/README.md) — until then FoundationModelsOnDeviceLlm degrades to unavailable, same as before a bridge existed. MediaPipe has no bridge yet (still an unconditional stub), so it's next in the chain for when one lands — no chain edits needed then. Either way, an iOS build with no bridge registered falls through to the heuristic tier, same as before this seam existed. ModelManager is NoModelManager on iOS (the OS/pod own model provisioning, not the app).

actual fun onDeviceLlmModule(): Module(source)

Desktop/JVM has no on-device model — the heuristic tier always answers.

actual fun onDeviceLlmModule(): Module(source)

Web/wasmJs has no on-device model — same floor as OnDeviceLlm.jvm.kt. A caller wanting a real answer in the browser wires its own CloudOnDeviceLlm (an :llm-chat com.siddharth.kmp.llmchat.AiProvider chain reaches every cloud vendor's HTTP API fine from wasmJs) instead of this module shipping one itself — this module owns no API keys.