Repository navigation
feat(registry,core,litertlm,speech): the LiteRT model registry and the model catalog (core 2.5.5) - #734
Merged
Conversation
The example's model lists move onto the model catalog next. This records, per model and per native platform, the URL it downloads, the id it is installed under, the embedder and tokenizer file names, the RAG profile ids, the model and file types and which per-SoC embedders each platform lists, so that move can change only what it means to change, and every such change shows up as a diff of test/goldens/example_model_identity.json.
#692 moved Qwen3 0.6B to the dynamic INT4 bundle (a new installed id), dropped the web URL of Qwen3, Phi-4 Mini and FunctionGemma (no -web export), pinned the Qwen3-TTS revision and moved the moonshine tokenizer to the moonshine-ai repo. Each of those is an intended identity change.
… bytes model_registry/models/ holds one YAML entry per model: 32 models and 204 variants. That is every .litertlm and .tflite in the repositories the example installs from, including each per-SoC NPU build. Each variant is pinned to a commit, with the file's sha256, size and install file name. The entries were seeded from the example's catalog and the Hugging Face API. All 56 LiteRT identities the example installs today match the registry exactly: install file names, RAG profile ids, sha256 and tokenizers. derived/ holds what inspect_bundle_test.dart read from each of 197 files over HTTP range requests, using the package's own readers (54 MB fetched in all): - the compiler's NPU stamp; - for a .litertlm, its sections, LlmMetadata.max_num_tokens and the KV-cache length of its decode graph. The NPU targets and the compiled contexts in the YAML come from these facts, not from file names. Two findings so far: - At 29888fce the four embeddinggemma-300m *.google.tensor_g6.tflite files are byte copies of the Tensor G5 builds. Main 459f1d37 replaced them, so those NPU variants are pinned there. - The Gemma 3n -Web.litertlm files are plain TFLite flatbuffers, not LiteRT-LM containers. tool/model_registry (not a workspace member) adds `check`. It validates the closed schema, pinned revisions, NPU targets and contexts against the bytes, install-name and profile-id collisions, frozen fields against published snapshots, and Cyrillic. Its tests prove each rule fails its own fixture and that the repo registry passes.
Core's model catalog adds a public NpuVendor, and every litertlm file that imports core and npu_stacks.dart would see two of them. The enum describes the NPU dispatch stacks this package ships (their ABIs and compiler stamp), so it takes that name. No behaviour change; it was never exported.
…atalog Engine-free catalog types: - ModelArtifact: a Hugging Face file pinned to a commit, with its sha256, size and install file name. - NpuVendor and NpuTarget. - CatalogModel, with a default variantFor. - A sealed CatalogVariant with one kind per installer: InferenceVariant, EmbedderVariant, SttVariant and TtsVariant. - ModelCatalog, and ModelCatalogSource for providers that ship one. FlutterEdgeAi.catalog joins the catalogs of the providers passed to initialize. A model id two packages offer is one model, and the first registered package's variants come first. It throws before initialize. installFromCatalog dispatches a variant to the existing installer of its kind, with the variant's model type, file type, file names and profile. After the download each file's size is checked against the catalog's. An LLM must install under its URL's file name: core keys LLMs by that name. Tests: variant choice, NPU builds and ambiguity, the merge, and real installs through a fixture download service. Each of five mutations turns a test red. The public-surface goldens list the 14 new symbols.
…e registry `registry.dart generate` writes the litertlm catalog part from model_registry/: a class per model with a getter per variant (LiteRtLmModels.gemma4E2bIt.npuSm8750), every file pinned with its sha256, size and install file name. `check` fails when the checked-in file is stale, or when an id or slug has no clean Dart name. Two slugs that were the reserved word `default` are now `standard` and `bundle`. backendsHere follows the loader: - A generic LLM file runs natively on its text model's backends, read from its bytes: the generator applies _textBackendsAllowed's rule, and a test checks every variant against the function itself. - A web bundle runs on the web only, on the GPU. - A build compiled for an NPU runs only where NpuStack ships its vendor's dispatch (MediaTek nowhere). - EmbeddingGemma 2 runs on the CPU natively and on WebGPU on the web. - A .tflite embedder runs on the CPU, never as an NPU build. - Withheld backends and variants are left out. model_registry/snapshots/flutter_edge_ai_litertlm.json records every variant on every host. LiteRtLmEngine and LiteRtEmbeddingBackend (native and web) implement ModelCatalogSource, and LiteRtLmNpuTarget extends core's NpuTarget. Three mutations each turn a test red: the vendor table, the vendor names, and a variant's backends.
The registry generates the speech catalog part: LiteRtSpeechModels, with speech-to-text and text-to-speech in one namespace, a class per model and a getter per variant (LiteRtSpeechModels.moonshineTiny.f32, .qwen3Tts0_6b.bundle). Model names are checked for clashes across the whole package. backendsHere: speech runs natively on the CPU or the GPU it is asked for. It does not run on the web, and it does not run a file compiled for an NPU, since it loads no NPU dispatch. LiteRtSttBackend and LiteRtTtsBackend (native and web stub) implement ModelCatalogSource. A test checks every TTS bundle against core's TtsModelType.manifest, and that the URL core's installer fetches for each file is the pinned one, Inflect's Matcha G2P files at ee321481 included. Dropping one file turns it red. model_registry/snapshots/flutter_edge_ai_speech.json records each variant natively and on the web. flutter_edge_ai_speech 0.5.9 requires flutter_edge_ai ^2.5.0 and flutter_edge_ai_litertlm ^1.16.0.
# Conflicts: # packages/flutter_edge_ai/CHANGELOG.md
Every example entry that installs a LiteRT build now takes it from the generated catalog, through a typed reference (LiteRtLmModels.gemma4E2bIt.generic), not from a URL literal. This covers: - 24 LLM builds; - both TranslateGemma builds; - 21 embedders; - 6 STT and 3 TTS models. The URLs, install file names, file types, gating, RAG profile ids, dimensions and NPU targets come from the registry. The entries keep their names and their demo settings. They install through FlutterEdgeAi.installFromCatalog: chat, the download screens, voice, STT, TTS and translate. The identity golden shows what changed: - No installed id changed: no model or index users have is stranded. - URLs are pinned to commits. - Gemma 3 1B, Gemma 3 270M, Qwen 2.5 1.5B and Phi-4 Mini now install their desktop .litertlm as litertlm, no longer as task. - LFM2.5 installs its catalog build instead of resolving the repo manifest. - Phi-4 Mini Reasoning's file name is model.litertlm, the name it has always been installed under. - EmbeddingGemma 1 and Gecko gain their sha256. - Kokoro and Supertonic leave the TTS list (owner's decision). catalog_entries_test checks that an entry's model type is the registry's, and that an NPU build is opened within its compiled context.
- registry.dart generate writes the Model Registry page (website/content/docs/registry.md), its data (website/web/models.json) and the language-model table of the Models page between registry markers. - Every variant gets a status per host and backend: untested where the package's snapshot runs it, documented from documented_claims.yaml, broken from withhold, withhold_backends or a broken claim, refused where the package rules it out. Nothing is marked verified yet. - check validates the claims: known variants, hosts and backends, a cell the package runs, a source that is a pull request or docs lines pinned to a commit in the history, an issue for a broken claim. - Models page: the hand-written platform table keeps only the formats the registry does not cover yet (.task, ONNX, built-in, VibeVoice). - Docs theme: below the desktop layout a wide table scrolls in its own box, long words in text and callouts wrap; no docs page scrolls sideways at 390 px any more.
The model catalog missed the 2.5.0 / 1.16.0 / 0.5.9 train, which shipped without it: its CHANGELOG lines move under Unreleased in core, litertlm and speech, and the published sections are main's.
The 2.5.0 train shipped without it. Versions, podspecs, CHANGELOGs, and the floors the catalog needs: litertlm and speech require core ^2.5.1, speech requires litertlm ^1.16.1.
- Release-gate integration tests print FEA_EVIDENCE v1 lines after their expectations, naming the registry build by the sha256 of the installed file (registry_evidence.dart): litertlm_ffi_test (Gemma 4 E2B text, vision, audio on CPU/GPU and the staged NPU bundle), embeddinggemma2_test, stt_moonshine_test and tts_smoke_test. The speech tests and the network fallback of litertlm_ffi_test install the pinned build from the catalog instead of a /resolve/main/ URL. - registry.dart evidence turns a run's log into model_registry/evidence/, recording the commit, package versions, log sha256 and the host's native archive sha256 from the hook. A cell is verified while that build ships and the package minor is the same, stale after. - check validates evidence files against the hosts, the variants, the package snapshots and broken claims.
- A build withheld from the catalog shows as withheld with its reason, not as broken: the pinned Qwen3-0.6B.litertlm is the replacement file, which loads on macOS; its reason now describes those bytes. - Gemma 4 E2B/E4B web exports: thinking is true (the web .litertlm engine takes enable_thinking; the false came from the MediaPipe web entry). - The registry page gives an NPU build's compiled context. - Claims: Gemma 4 E2B on the VENTUNO Q (QCS8275) Adreno GPU and NPU from PR #602; the header no longer contradicts the Linux arm64 claims.
A review of every docs page against the registry, the code and Hugging Face: - Intel Panther Lake and Google Tensor G5 builds load but have not been run; the 740m has Tensor and PTL builds too, each size in its own repository. - NPU bundles are compiled for one context (4096 Gemma 4 E2B, 1280 Gemma 3 1B and FastVLM, 4096 Gemma 3 270M): keep maxTokens at or below it. - The QCS8275 is the only Linux board with bundles; the Gemma 4 E2B Qualcomm bundles left the repository's main and install from the catalog. - Gemma 4 E2B needs 6 GB of RAM, not 8; Qwen3-0.6B.litertlm loads on macOS; desktop runs generic .litertlm builds, not "any". - Models page: speech and embedding tables link the registry, with sizes from its bytes and where each is documented; kokoro/supertonic make no promise; the web footnote covers EmbeddingGemma 2; installFromCatalog documented. - Landing: Gemma 3n E2B has no function calling; NPU note per run.
…stry - READMEs (core, litertlm, speech) and the inference, rag and speech skills install with FlutterEdgeAi.installFromCatalog; dependency lines ^2.5.1 / ^1.16.1. The rag skill's EmbeddingGemma 1 install now uses the registry's revision-qualified file names (its old names differed from the catalog's). - PreferredBackend.npu dartdoc: Google Tensor and Linux arm64, the 1.15.0 generic-bundle fallback, refusal of a foreign NPU bundle; audio dartdocs name Gemma 4 and Gemma 3n, not Gemma 3n E4B only. - Intel Panther Lake and Tensor G5 builds load but have not been run; the S24 "NPU (SM8650)" row was a generic bundle; the Linux NPU stack is not model support (QCS8275 only); the Gemma 4 E2B Qualcomm bundles install from the catalog since they left the repository's main. - AGENTS.md: the model table is a pointer to model_registry/.
- test.yml model-registry job: registry.dart check (with full history, for the commit-pinned docs claims) and the tool's tests. - model-registry-live.yml, weekly and by hand: registry.dart live asks Hugging Face for every pinned file (231 today, all ok): linked sha256 and size from the redirect, a plain git file fetched and hashed; a gated repo without access is reported, not failed.
- release_critical.yaml: 28 cells (Gemma 4 E2B CPU/GPU on five hosts and on the SM8750, Lunar Lake and Tensor G6 NPUs; EmbeddingGemma 2 270m; Moonshine and Matcha) a release must have verified on its native build. - registry.dart freeze <package> writes published/<package>/<version>.json, the frozen fields check then holds later changes to; release-check says whether the package may be published. - .claude/hooks/guard-release-registry.py runs release-check before dart pub publish of either package and blocks unless it passes or the command carries RELEASE_SKIP_REGISTRY="<reason>"; registered in .claude/settings.json. Release skill DoD item 8c.
A PreToolUse hook that runs repository code (dart run) executes it before the command it guards is approved. release-check now writes the HEAD it passed at to tool/model_registry/.dart_tool/release_check/<package>-<version>.ok; the hook reads that and asks git whether HEAD and the registry, the tool and the package are unchanged since.
litertlm_ffi_test (Gemma 4 E2B text on CPU, text, vision and audio on GPU), embeddinggemma2_test golden, stt_moonshine_test and tts_smoke_test on native-v0.18.0-f: five cells verified.
STT_MODEL_FILE / STT_TOKENIZER_FILE and TTS_BUNDLE_DIR install the same registry files from a staged copy (a DDP phone reaches Hugging Face over IPv6/NAT64 at a few KB/s); the evidence then comes from the file's sha256.
Brings MediaTek NPU (#697), OpenVINO 2026.4.1 (#702) and the core 2.5.1 / litertlm 1.17.0 releases into the catalog branch. The MediaTek bundles join the registry as NPU builds for Android arm64 (stamped `mt6991`/`mt6993` in lower case), the example's MT6991 embedder installs from LiteRtEmbedders, and the generated catalog, snapshots and site tables are regenerated.
Brings core 2.5.3, litertlm 1.18.0 (thinking budget #721, foreign libLiteRtLm refusal #722), speech 0.5.11, the format gate (#725) and #727. The catalog's CHANGELOG lines move above the released sections; litertlm's engines carry both ModelCatalogSource and thinkingTokenBudget. models.md keeps the registry tables with its footnotes renumbered to follow #719's page-wide numbering.
Core 2.5.3, litertlm 1.18.0 and speech 0.5.11 were published without it. Catalog-only releases are patches; core shares 2.5.4 with #729 and litertlm shares the unreleased 1.19.0 with #714. litertlm and speech require core ^2.5.4, speech requires litertlm ^1.19.0. The docs that name the catalog's versions and the generated registry page follow.
- installFromCatalog refuses a variant with no backend here before any download, checks sizes before the model becomes active, and ends its progress at 100; a model installed from /resolve/main/ downloads once more (documented). - variantFor(backend: npu) needs the device SoC; SoCs compare without case. - Gemma 4 vision and audio evidence names the encoder's backend and checks the fixtures' content; evidence lines are v2, v1 lines and schema 1 vision/audio cells no longer count. - The release hooks see quoted and empty env prefixes; the registry hook checks every publish and takes a non-empty skip on that publish only. - The freeze covers the tokenizer; the weekly HF check fails on files it could not check and reads RepoNotFound as missing. - The NPU refusal links the registry page instead of a stale SoC list; example embedder progress per file; CHANGELOG sections shared with #714 and #729.
Before the first download the installer reads each file's size (HEAD for network files, X-Linked-Size over Content-Length, with the download's token and cancel token; disk for files installed already or from fromFile) and weights each file's percent by it. Files installed already count from the start; an unknown size gives every file the same weight. Internal pieces: RemoteSizeProbe in ServiceRegistry, BundleProgress, and knownBundleFileSizes for callers that know the sizes (the model catalog).
…sizes - Progress stays at 99 while files install; 100 only once the bundle is the active voice. - The token goes to the URL's origin only (scheme, host and port). - The size is read from the final 200: X-Linked-Size, else Content-Length; any other status is unknown. HEAD asks for Accept-Encoding: identity, as Hugging Face sends small files gzipped with no Content-Length otherwise. - A cancel closes the HEAD requests at once; reading an answer has a timeout. - A missing file on disk is an unknown size, not 0. - knownBundleFileSizes is documented without naming the catalog.
FlutterEdgeAi.installModelFromCatalog(variant) returns an InferenceInstallationBuilder; installEmbedder(), installStt() and installTts() take fromCatalog(variant). Network sources take expectedSize / expectedSha256, checked before the model is made active (ModelValidationException, now exported, with expectedSize). An LLM can be installed under a name of its own (fromNetwork(filename:), InferenceModelSpec.filename), restored by that name on mobile and web. withProgress on the embedder and STT counts bytes across the files. Removes installFromCatalog, CatalogInstallationBuilder, CatalogInstallation and CatalogInstallException, and the temporary Expando for TTS sizes. phi-4-mini-reasoning installs as phi-4-mini-reasoning.litertlm; registry rule 22 keeps an LLM's extension.
The directory listing is unordered on Linux, and the snapshots order reaches models.json and registry.md, so CI saw them as stale.
A size or sha256 mismatch deletes the file and its record, so a retry downloads it again; an install with an expectation refuses before it writes over the active model's file (the active model's own file is never deleted). The sha256 is computed on a worker isolate, only for files the install downloaded, and a cancel stops it; expectations are checked when set, and a sha256 on the web throws. Every source setter drops the catalog variant, its name and its sizes. Inference progress holds at 99 until the model is active. TTS catalog variants must list the URLs the install fetches; catalog artifacts are checked before a download. ModelValidationException carries expected/actual sha256; .mismatch is internal; a file core has no copy of is a ModelStorageException.
… hosts The catalog offers nothing on a host the native archive is not published for (one table, held equal to the hook; speech keeps a copy held equal by a test), and EmbeddingGemma 2 on the Linux x64 GPU, as the loader does. A withheld variant stays in the generated catalog, deprecated, with no backend; withhold_backends reaches every kind; a deprecated variant is @deprecated. A variant is never removed (README), and check refuses a released catalog version without its published snapshot. The four Gemma 3 Qualcomm NPU builds of LiteRT-LM#3508 are withheld from the NPU.
On the web, in the default Cache API storage, an install whose file is over 2 GB is refused before it downloads, naming WebStorageMode.streaming. NpuTarget.sameSoc matches no SoC for a vendor core has no name for; LiteRtLmNpuTarget maps its stamp through NpuStack and compares without regard to case. Every catalog's variant ids are checked, and FlutterEdgeAi.catalog is built once per initialize. An LLM filename and a registry install name must be portable file names. The catalog docs say what the install checks: the runtime and architecture, not the device's NPU; no size check on the web; the stamp spelling of an NPU target.
A built-in catalog variant installs with nothing to download; others with no file are refused. ModelArtifact compares every field; files is @nonvirtual on the variant kinds; the sealed and simulator rules and the TTS file rule are documented. The size probe reads Hugging Face's size on the redirect that names the file, and a size of 0 or -1 is unknown. Evidence from an Android emulator is marked a simulator, and catalog evidence hashes the installed file. The registry tool sends the token to Hugging Face only, stamps release-check only on committed inputs, and reports a host a snapshot or the hook does not name; snapshot goldens are not rewritten on CI. The release hook reads quoted pubspec names, guards every package a model names, and says why a check was skipped. The longest Windows cache path is pinned (251 characters). Floors and the release checklist name core 2.5.5; CHANGELOG is one line per issue.
With expectedSha256 set every file it names is hashed on every install, so an install stopped before its check proves nothing to the next one; a check that ends without a verdict deletes what the install wrote. A mismatch deletes the record before the file, and a delete that fails is the cause of the ModelValidationException, not its replacement. A file core has no copy of is a ModelValidationException again, and the sha256 values are in its message only. Restore passes an install name only when it is not the source's own, and restores each kind on its own.
The seven Gemma 3 Qualcomm NPU builds of LiteRT-LM#3508 and the ones beside them nobody ran are removed (no release shipped them; a shipped variant is still never removed). LiteRtLmNpuTarget == is the stamp as written again; sameSoc matches a third-party vendor by ==. Installs refuse and keep across every kind of active model; the web 2 GiB refusal covers STT; expectations are checked before a setter changes anything. The example uninstalls the old model when core refuses a catalog install over it, and the docs say so. The site marks a withheld NPU build broken on its vendor hosts only; the live check sends the token to Hugging Face only; the released-catalog check anchors on its snapshots and headings; example pubspec.lock files are outside the release guard, whose skip reason is a systemMessage. Emulator evidence is skipped when it cannot be told, and catalog evidence hashes every file off the UI isolate.
Remove expectedSha256 and its hashing; keep expectedSize. The refusal to write over an active model's file names its kind and uninstall call (held by a test); the example asks before replacing. The publish hook fails closed only for publishes. Evidence hashes a file once per version. Registry check, site and live-check fixes; doc gaps.
A newline escaped in the hook payload hid `pub\npublish` from the raw-text test, so a crash let that publish through. An unreadable payload now blocks too. The 60 s timeout was shorter than the default and only made the gate open sooner; it is removed.
publish_command reads flutter's packages alias and $'...' quoting, and every path that cannot read a command checks it loosely for a publish; fewer false blocks. The refusal's wording is pinned for every kind; the example's replace flow reports keep, a failed uninstall and a failed reinstall as such and asks for each model in the way. STT fromCatalog checks first, restore skips are printed, evidence skips any hash failure, check.dart keeps ### subheadings in a release. Docs and messages.
An expanding command word blocks again whenever the text shows a publish (a variable set elsewhere can hold the rest); an expanding env -S argument counts the whole text; a $'\U...' escape past U+10FFFF no longer crashes the reader. A reader bug is unclear for a publish, and all three guards turn a crash on a possible publish into a block.
The release-registry hook and publish_command are removed, and the two older guards and settings.json are main's again; the release skill makes a green registry.dart release-check at the published HEAD a mandatory step, and release-check no longer writes a stamp only the hook read. The example says the old model is gone before the gated or storage dialog, dispatches each kind's uninstall through core's own calls and tells two same-named models apart. Web restores under WebStorageMode.none skip quietly; restoreNotice goes through debugPrint and honours EdgeAiLogLevel.none.
registry.dart lets freeze, generate, evidence and release-check through the one problem the release in progress has (the snapshot of the version the pubspec and CHANGELOG name, which freeze writes), so the release skill's order works; 8c names the gate tests and what to commit. Both download screens await "already uninstalled" before the gated or storage dialog. Core's refusal sentences are a golden the example parses; the inference uninstall is a comparable tear-off. drop() names the uninstall call, check.dart reads ~~~ and reports an unclosed fence, evidence skips only hash failures, the storage wording names streaming, and logLevel's docs say what release builds print.
The rejected-embedder start-up notice goes through restoreNotice, and the logging docs name what every build prints. The catalog check refuses a built-in variant with files and a TTS variant whose files are not exactly its bundle. release-check and freeze let only their own package's never-committed snapshot pass; check.dart reads fences as CommonMark. The example hands uninstallModel the file, reads only calls that fit their kind, keeps stacks, logs a failure a closed screen cannot show, and leaves the repeated model out of what is gone. The ONNX directory install says 100 once active; web corruption skips are reported in every mode.
Both download screens check mounted before State.context after an await: a screen already gone logs the failure and asks nobody; tests pump each real screen, pop it mid-install and fail the download. freeze lets every package's pending snapshot pass, so litertlm and speech freeze in either order; the was-it-committed git check fails closed. logLevel and edgeAiLog docs say what they print; a malformed web LoRA source is reported under WebStorageMode.none. ActiveModelInTheWay is made by of() only, from one table; stack and fence tests; built-in and web ONNX installs end at 100; freeze of a package without a catalog is usage.
The logging docs no longer say release builds print only the restore notices, and name the sampler latch (once per engine) and the hidden-reasoning note (once per chat). The web restore reads the LoRA source before it looks for the model file, so a malformed one is reported under WebStorageMode.none. The universal download screen does not write its token field after it is gone. Without git, the registry tool says so instead of a stack trace.
The evidence command's dirty-tree check matched nothing below lib/, hook/ and native/: it now uses :(glob) pathspecs and lists untracked files, with a test. The logging docs say the sampler latch is at most once per engine, release builds keep one part of this log, and WebStorageMode.none keeps missing-file notices in the debug log. The registry tool's git messages name the error, not a cause. A LoRA recorded without its source is reported as such.
CHANGELOG Unreleased lines kept from both sides (litertlm, speech). stt_model.dart: #752's parakeetCtcInt8 comes from the catalog's parakeet-ctc-0.6b/i8 build, with #752's names, sizes and wording. models.md: the catalog's STT table with #752's Galaxy S23 facts (Parakeet f32 and int8 on the CPU, int8 for phones); the branch's 'int8 not run' and 'f32 not run on phones' are gone. A documented claim (PR #752) for both on Android CPU, the i8 build's example entry, and the regenerated site files and identity golden.
DenisovAV
added a commit
that referenced
this pull request
Nov 1, 2026
… llama 0.0.5 (#759) * release: core 2.5.5, litertlm 1.20.0, speech 0.5.13, mediapipe 1.2.5, llama 0.0.5 - versions, podspecs, AGENTS.md Current Version - litertlm and speech require core ^2.5.5; speech requires litertlm ^1.20.0 - CHANGELOG: Unreleased -> 1.20.0 / 0.5.13; llama 0.0.5 for its README - README and site pins; models.md documents expectedSize * registry: evidence on android, macos, windows and linux; freeze litertlm 1.20.0 and speech 0.5.13 Galaxy S25 Ultra (DDP pa3q-35, SM8750), Mac17,16 (M5 Pro), Intel Lunar Lake (Core Ultra 7 258V) and GCE flutter-gemma-linux (Tesla T4) at 93e2c31; snapshots and generated site files. * release: flutter_edge_ai_litertlm 1.19.1, not 1.20.0 All five packages are patch releases. Speech requires litertlm ^1.19.1. The 1.20.0 snapshot and the evidence recorded at 1.20.0 are removed; litertlm 1.19.1 is frozen and the site regenerated. * registry: evidence at 7ad63e4 (litertlm 1.19.1) on android, macos, windows and linux Galaxy S25 Ultra (DDP pa3q-35, SM8750: CPU, GPU, NPU), Pixel 11 (DDP cubs-37, Tensor G6: CPU, GPU, NPU, EmbeddingGemma 2), Mac17,16 (M5 Pro), Intel Lunar Lake (CPU, GPU, NPU) and GCE flutter-gemma-linux (Tesla T4); site regenerated. * docs(codelab): the fine-tuning commands are accepted by litetune 0.7.2 Every option and value of prepare, tune, convert, verify, bundle and env checked against litetune 0.7.2's --help from PyPI; its stages still pin LiteRT-LM 0.18.0 and the 0.18.0 builder. * docs: litertlm README lists ^2.5.5 since 1.19.1; core CHANGELOG #734 in one short line * registry: iOS evidence at 9366d02 (iPhone 17 Pro, iOS 26.5.2) Gemma 4 E2B text on CPU and GPU, vision and audio; EmbeddingGemma 2 270m and 440m; moonshine; Matcha. The Gemma 4 E2B file was copied to the device over USB (sha256 the registry's) instead of downloaded; site regenerated.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
The example app was the only place that knew which LiteRT builds exist and which file to install. This PR moves that into a registry checked against the files, and installs builds by name from it.
Registry (
model_registry/,tool/model_registry): 32 models, 204 variants (every.litertlmand.tflitethe example installs from, including each per-SoC NPU build), each pinned to a Hugging Face commit with its sha256, size and install file name.derived/holds what the package's own readers read from 197 of the files over HTTP range requests (NPU stamp, sections,max_num_tokens).registry.dart checkvalidates the schema, the derived facts, the claims and the generated files; CI runs it on every PR, andmodel-registry-live.ymlasks Hugging Face weekly for every pinned file.Catalog API: core adds engine-free catalog types (
ModelArtifact,NpuVendor,NpuTarget,CatalogModel, the sealedCatalogVariant,ModelCatalog,ModelCatalogSource) andFlutterEdgeAi.catalog(the catalogs of the providers passed toinitialize). Installs go through the existing builders:FlutterEdgeAi.installModelFromCatalog(variant)returns anInferenceInstallationBuilder, andinstallEmbedder(),installStt()andinstallTts()takefromCatalog(variant). litertlm ships the generatedLiteRtLmModelsandLiteRtEmbedders, speechLiteRtSpeechModels.Under them, for any network install:
expectedSize/expectedSha256on the network sources, checked before the model is made active (ModelValidationException, now exported, withexpectedSize; the file stays installed);fromNetwork(filename:)andInferenceModelSpec.filenameinstall an LLM under a name of its own, restored by that name after a restart on mobile and web;withProgresson the embedder and STT counts bytes across the files (the rules of #751 for TTS). A catalog variant with no backend in this runtime is refused before anything downloads.Example and site: the example's LiteRT entries read the catalog and keep their names and install identities (a golden of every example model's identity). The site's registry page,
models.jsonand the Models page LLM table are generated from the registry: per platform and backend, verified / documented / untested / refused / broken, with the source of each mark. Kokoro and Supertonic leave the example's TTS list.Release gate:
release_critical.yamllists the cells a litertlm or speech release must have verified; a hook runsrelease-checkbeforedart pub publishof those packages, with an override that needs a reason. Published install file names, sha256 and RAG profile ids are frozen per release.Versions: the core API ships in core 2.5.5. litertlm and speech list their catalog under
## Unreleased; their versions and their core floor are set at release.Checked: format,
flutter analyze packages/(no errors or warnings),tool/test_all.sh(18 packages), the registry check and its tests, the core-surface, web-graph, published-assets and skills checks. Recorded runs so far: one macOS arm64 run (M4 Pro, 2026-10-20, litertlm 1.16.1), shown as stale since the litertlm minor has changed.Not in this PR: a catalog browser screen in the example; VibeVoice-ASR in the registry; GGUF; device runs for the release-critical cells.