Repository navigation
Releases: DenisovAV/flutter_edge_ai
Release list
Native dylibs native-v0.18.0-d
native-v0.18.0-c with libLiteRtLm.so rebuilt in the two Linux archives (x86_64, arm64); every other library in them and the other five archives are byte-identical to native-v0.18.0-c.
Linux: native tool calls no longer abort (#551). The three Gemma data processors in LiteRT-LM reinterpret_cast the object returned by the prebuilt libGemmaModelConstraintProvider.so to their own Constraint. On Linux that provider is built with Google's libc++ (std::__u, trivial_abi unique_ptr, a size-based vector) and the runtime with clang + libstdc++, so the first constrained token of every tool call aborted the process — FunctionGemma and Gemma 4 alike, on x86_64 and arm64 (google-ai-edge/LiteRT-LM#3821). This build wraps the provider object instead: each method is called with the provider's own convention and each mask is copied into a runtime-side BitmapLogitMask (patch_c_api.sh §12, gemma_constraint_abi_bridge.h). The layout constants are measured on the provider these archives ship (x86_64 dded89d4…, arm64 016f5d61…, unchanged since native-v0.17.1-a); a provider with another layout returns an error naming the bridge instead of crashing. Exports, NEEDED and the glibc floor (2.34) are unchanged apart from the bridge's own classes.
Verified with litertlm_native_tools_test on the libraries in these archives: Linux x86_64 (GCE, CPU) 6/6 — FunctionGemma ×2, Mobile Actions, Tiny Garden, Gemma 4 ×2 — and Linux arm64 (GitHub ubuntu-22.04-arm) 4/4 with the public models (FunctionGemma ×2, Gemma 4 ×2); each case asserts the model's text after the tool result. On native-v0.18.0-c the same suite dies on its first tool call on both architectures. litertlm_ffi_test "CPU text" passes on both.
checksums_litertlm.txt lists the SHA-256 of every archive; flutter_edge_ai_litertlm's build hook verifies the same values.
Native dylibs native-v0.18.0-c
native-v0.18.0-b with two files added to the Linux arm64 archive; the other six archives are the native-v0.18.0-b assets unchanged, and every library already in the Linux arm64 archive is byte-identical.
Linux arm64: Qualcomm NPU. The archive now carries libLiteRtDispatch_Qualcomm.so, built from the same LiteRT pin as the Android dispatch (26895c9f) against the QAIRT 2.50.0 headers (clang 17, glibc 2.34), and libcdsprpc.so, a shim with no code whose only content is a NEEDED libcdsprpc.so.1: Qualcomm's HTP Stubs name the bare libcdsprpc.so, which Qualcomm's Linux images and Ubuntu's qcom-fastrpc1 install only as libcdsprpc.so.1. The QNN runtime itself is not in the archive — Qualcomm's licence allows redistribution only inside an application — so flutter_edge_ai_litertlm's build hook reads it out of Qualcomm's public QAIRT 2.50 SDK zip, and only for apps that set qualcomm_npu: true.
Verified on an Arduino VENTUNO Q (QCS8275, Hexagon V75) with flutter_edge_ai_litertlm 1.11.0: Gemma 4 E2B (gemma-4-E2B-it_qualcomm_qcs8275.litertlm) generates text and answers about an image and an audio clip on the NPU, with HTP performance mode Burst(2), at 31.5 tokens/s decode.
checksums_litertlm.txt lists the SHA-256 of every archive; flutter_edge_ai_litertlm's build hook verifies the same values.
Native dylibs native-v0.18.0-b
native-v0.18.0-a with libLiteRtLm.dylib rebuilt in the three Apple archives (macOS arm64, iOS arm64, iOS simulator arm64); the other four archives are the native-v0.18.0-a assets unchanged.
iOS/macOS: in an app that also embeds flutter_litert (3.4 or later), LiteRT-LM's GPU registry first tried the generic libLiteRtGpuAccelerator.dylib; that dlopen failed, and the fallback dlsym(RTLD_DEFAULT, "LiteRtRegisterGpuAccelerator") bound flutter_litert's accelerator (another LiteRT version), which crashed in LiteRtCreateCompiledModel. This build tries only its own LiteRtLmMetalAccelerator.framework, by its @executable_path path, and never falls back to the default lookup on Apple (patch_c_api.sh §10b, patches/litert_gpu_registry_apple.patch). Verified on an iPhone 17 Pro and an M4 Pro Mac in an app with flutter_litert 3.9.3: its detector and Gemma 4 E2B both on the GPU. Only libLiteRtLm.dylib changes: same exported symbols, dependencies and deployment targets as native-v0.18.0-a, every other library byte-identical.
checksums_litertlm.txt lists the SHA-256 of every archive; flutter_edge_ai_litertlm's build hook verifies the same values.
Native dylibs native-v0.18.0-a
native-v0.18.0 with the two Linux libLiteRtLm.so rebuilt; the other five archives are the native-v0.18.0 assets unchanged.
Linux: LiteRT-LM v0.18.0 sets the Qualcomm NPU options (HTP burst mode) only on Android, so on a Linux Qualcomm board the NPU ran HTP in its default mode and the dispatch logged "Null Qualcomm options". This build applies them on Linux too (patch_c_api.sh §11, patches/npu_qualcomm_options_linux.patch); Google Tensor options stay Android-only. Only libLiteRtLm.so changes in the Linux archives: same exported symbols, NEEDED entries and GLIBC versions as native-v0.18.0, every other library byte-identical.
checksums_litertlm.txt lists the SHA-256 of every archive; flutter_edge_ai_litertlm's build hook verifies the same values.
Native dylibs native-v0.18.0
Native LiteRT-LM bundles for flutter_edge_ai_litertlm 1.10.0.
Runtime: LiteRT-LM v0.18.0 (b2f686e2), LiteRT 26895c9f; Qualcomm dispatch built against QAIRT 2.50.0; Intel NPU stack on OpenVINO 2026.3.1.
Android
- The Qualcomm QNN runtime is no longer in this archive. Qualcomm licenses it for redistribution inside an application only, so an app opts in with
hooks: user_defines: flutter_edge_ai_litertlm: qualcomm_npu: trueand the build hook fetchescom.qualcomm.qti:qnn-runtime:2.50.0from Maven Central. LiteRT'slibLiteRtDispatch_Qualcomm.sostays. libLiteRtGpuAccelerator.so,libLiteRtWebGpuAccelerator.soandlibLiteRtTopKWebGpuSampler.soare gone: they needlibwebgpu_dawn.so, which was never in the Android bundle, so they could not load. Android GPU is OpenCL.
iOS / macOS
- The Metal accelerator ships as
libLiteRtLmMetalAccelerator.dylib(frameworkLiteRtLmMetalAccelerator), so it no longer replaces theLiteRtMetalAccelerator.frameworkthatflutter_litertembeds.
Verified: macOS arm64, iOS simulator, Linux x86_64 (T4), Windows x86_64 (T4), Android on Pixel 8a / Galaxy S24 / Galaxy A34 (FTL), and Qualcomm NPU on Snapdragon 8 Elite Gen 5 (SM8850) via Qualcomm Device Cloud.
checksums_litertlm.txt lists the SHA-256 of every archive; flutter_edge_ai_litertlm's build hook verifies the same values.
Release v2.0.0
What's Changed
- flutter_gemma becomes Flutter Edge AI: every package renamed to flutter_edge_ai* by @DenisovAV in #564
- fix(agent): include bundled skill definitions in published package by @seydoudemon in #578
- fix(agent): ship and fail loudly on bundled skills, check published files in CI; release 0.2.7 by @DenisovAV in #579
- flutter_edge_ai 2.0: RAG moves to flutter_edge_ai_rag, legacy APIs and aliases removed, docs pass by @DenisovAV in #580
New Contributors
- @seydoudemon made their first contribution in #578
Full Changelog: v1.11.4...v2.0.0
Release v1.11.4
What's Changed
- The codelabs carry the litert_embeddings.js that flutter_gemma_litertlm 1.8.4 ships by @DenisovAV in #562
- A PR that rebuilds the LiteRT web bundle warns which codelab copies will need syncing by @DenisovAV in #563
- refactor(builtin_ai): rebuild on flutter_local_ai, drop the native layer by @kekko7072 in #521
- Release builtin_ai 0.3.0 and core 1.11.1: the docs, the site and the skill describe the flutter_local_ai adapter by @DenisovAV in #565
- Web pins move to @litert-lm/core 0.17.1, tasks-genai 0.10.29, ORT-web 1.30.0, Transformers.js 4.3.0; ONNX web generation works again by @DenisovAV in #566
- feat(diagnostics): anonymous footprint and available memory, read from the OS (#517) by @samarthsinh2660 in #541
- flutter_gemma_diagnostics gets its skill, its site page and its place in the docs; core 1.11.3 ships the skill by @DenisovAV in #567
- fix(web): preserve plain-string SDK response content by @Oxygenesis in #554
- test(benchmark): record anonymous memory next to the timings (#517) by @samarthsinh2660 in #569
New Contributors
- @kekko7072 made their first contribution in #521
- @Oxygenesis made their first contribution in #554
Full Changelog: v1.11.0...v1.11.4
Release v1.11.0
What's Changed
- LiteRT-LM v0.17.0 (native-v0.17.0): litertlm 1.7.0, speech 0.5.1 by @DenisovAV in #522
- fix(codelabs): make the web path work, and correct the texts by @DenisovAV in #523
- FunctionGemma answers its tool results, and native-v0.17.0-a stops tool calls crashing by @DenisovAV in #496
- Stop shipping the example's sqlite-vec wasm in the core archive by @DenisovAV in #526
- Document the 1.8.4 tool-result path where users and agents read it by @DenisovAV in #527
- release skill: re-run Codelabs after the publish, not before by @DenisovAV in #528
- fix(embeddings): web embeddings actually run — @litertjs/core 2.5.3, one home by @DenisovAV in #524
- litertlm 1.8.0: 16 KB page alignment, and native-v0.17.1 by @DenisovAV in #532
- fix(ci): sqlite3 3.3.3 → 3.6.0, its Linux binary no longer matches its hash by @DenisovAV in #531
- fix(codelabs): pin the hybrid apps below the versions that need a tokenizer by @DenisovAV in #530
- refactor: engines ask core for a tokenizer — no package depends on a sibling by @DenisovAV in #525
- fix(rag_sqlite): require sqlite3 3.6.0, and Flutter 3.47 with it by @DenisovAV in #534
- docs(release): the Step 12 work that should have shipped with #525, #532 and #534 by @DenisovAV in #535
- Verify the archive the manifest gate compares against by @DenisovAV in #533
- fix(codelabs): RAG runs on the web now, so stop telling readers it cannot by @DenisovAV in #536
- The codelabs lost their stylesheet and their JavaScript by @DenisovAV in #538
- The on-device RAG codelab: embeddings, a real vector store, and answers you can check by @DenisovAV in #537
- Windows end-users need nothing installed — and the gate now checks that by @DenisovAV in #539
- docs(litertlm): the conversation handle doc promised concurrency it does not provide (#516) by @samarthsinh2660 in #540
- Inflect TTS spoke gibberish: the encoder was missing its blank tokens by @DenisovAV in #543
- A .litertlm chat stopped mid-reply answered every later message with nothing by @DenisovAV in #544
- The voice-assistant codelab: hear, speak, interrupt, and call tools by @DenisovAV in #547
- Codelabs: the no-account path is Gemma 4 E2B, and the RAG codelab's notes render by @DenisovAV in #548
- fix(litertlm): patch Android GPU accelerators with DT_NEEDED libandroid.so (#545) by @kevincardenas18 in #546
- An Android library that imports what its NEEDED cannot reach fails the build (#545) by @DenisovAV in #549
- litertlm 1.8.2: Mali GPUs no longer crash at engine_create (native-v0.17.1-a) by @DenisovAV in #550
- F32 Fixes scrambled digits on GPU by @callmephil in #520
- activationDataType: the test proves what it claims, and ignored values say so by @DenisovAV in #553
- flutter_gemma 1.10.0: activationDataType; litertlm 1.8.3 + README releases by @DenisovAV in #555
- No backend is reported that did not run, and three embedder caches become one by @DenisovAV in #542
- The READMEs that ship in 1.11.0 / 1.8.4 / 0.5.0 describe activeBackend and the NPU gate by @DenisovAV in #561
New Contributors
- @samarthsinh2660 made their first contribution in #540
- @kevincardenas18 made their first contribution in #546
- @callmephil made their first contribution in #520
Full Changelog: v1.8.3...v1.11.0
Native dylibs native-v0.17.1-a
Native LiteRT-LM prebuilts for flutter_gemma_litertlm, built from upstream
v0.17.1 (5e58e9a0) — the same bytes as native-v0.17.1 except two Android
libraries.
Why this release
The Android GPU backend crashed at engine_create on Mali GPUs (#545).
Upstream v0.17.0's libLiteRtOpenClAccelerator.so and
libLiteRtGpuAccelerator.so import AHardwareBuffer_allocate/_release weakly
without libandroid.so in DT_NEEDED, so bionic binds both to NULL. Adreno
never calls them; Mali does, and the process jumps to address 0 (upstream
LiteRT-LM #3575, fixed on their main in 6a9af909).
Both accelerators now carry libandroid.so in DT_NEEDED (#546), and the
build refuses an Android library whose imports its own NEEDED chain cannot
reach (#549).
What changed
litertlm-android_arm64.tar.gz:libLiteRtOpenClAccelerator.soand
libLiteRtGpuAccelerator.sopatched; the other 17 files are byte-identical
tonative-v0.17.1.- Every other platform's archive is byte-identical to
native-v0.17.1.
Verified on hardware
Filled in as the matrix runs.
Native dylibs native-v0.17.1
Native LiteRT-LM prebuilts for flutter_gemma_litertlm, built from upstream
v0.17.1 (5e58e9a0). LiteRT pin unchanged (9fe5be45).
Why this release
Google Play rejected apps shipping the previous bundle. Four Qualcomm
Hexagon DSP blobs — libQnnHtpV{73,75,79,81}Skel.so — arrive from the QAIRT
SDK with p_align=0x1000, and androidExtraLibs puts them in the APK of every
app that depends on this package. Play scans lib/**/*.so and does not care
that a Hexagon image is parsed by the DSP rather than mapped by the kernel:
"Your app does not support 16 KB memory page sizes" (#529).
The blobs are now raised to p_align=0x4000 while they are staged, and the
release gate refuses to publish an Android archive that still holds one below
16 KB. Verified on a release APK of the example: 45 of 45 native libraries at
16 KB.
Also in this build
- Upstream
5e58e9a0: a tool-call argument declared"type": "integer"reaches
the app as an integer instead of1000.0. libGemmaModelConstraintProvidercontinues to come from upstream main
(4453b286), because v0.17.1 still ships the pre-ComputeMaskone — against
a runtime built from its own source every tool call segfaults.
Verified on hardware
| Platform | Tool calling | Inference + embeddings | STT |
|---|---|---|---|
| macOS arm64 | 6/6 | 24/24 | ✅ |
| Linux x86_64 | — | 24/24 (T4, Vulkan) | ✅ |
| Windows x86_64 | — | 24/24 (T4, DX12) | ✅ |
| Android arm64 | 7/7 (Pixel 8a) | — | — |
| iOS simulator | 6/6 | — | — |
Not covered: Linux arm64 (no hardware), iOS on device, and both NPU paths.
Checksums
checksums_litertlm.txt on this release, the bytes GitHub serves and the
_checksums map in hook/build.dart all carry the same SHA256 for every
platform.