Skip to content

feat(registry,core,litertlm,speech): the LiteRT model registry and the model catalog (core 2.5.5) - #734

Merged
DenisovAV merged 65 commits into
mainfrom
feat/model-catalog
Oct 30, 2026
Merged

DenisovAV merged 65 commits into
mainfrom
feat/model-catalog

Conversation

@DenisovAV

@DenisovAV DenisovAV commented Oct 26, 2026 •

Copy link
Copy Markdown
Owner

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 .litertlm and .tflite the 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 check validates the schema, the derived facts, the claims and the generated files; CI runs it on every PR, and model-registry-live.yml asks Hugging Face weekly for every pinned file.

Catalog API: core adds engine-free catalog types (ModelArtifact, NpuVendor, NpuTarget, CatalogModel, the sealed CatalogVariant, ModelCatalog, ModelCatalogSource) and FlutterEdgeAi.catalog (the catalogs of the providers passed to initialize). Installs go through the existing builders: FlutterEdgeAi.installModelFromCatalog(variant) returns an InferenceInstallationBuilder, and installEmbedder(), installStt() and installTts() take fromCatalog(variant). litertlm ships the generated LiteRtLmModels and LiteRtEmbedders, speech LiteRtSpeechModels.

await FlutterEdgeAi.installModelFromCatalog(LiteRtLmModels.gemma4E2bIt.generic).install();
await FlutterEdgeAi.installEmbedder().fromCatalog(LiteRtEmbedders.embeddinggemma300m.seq256).withProgress(print).install();

Under them, for any network install: expectedSize / expectedSha256 on the network sources, checked before the model is made active (ModelValidationException, now exported, with expectedSize; the file stays installed); fromNetwork(filename:) and InferenceModelSpec.filename install an LLM under a name of its own, restored by that name after a restart on mobile and web; withProgress on 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.json and 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.yaml lists the cells a litertlm or speech release must have verified; a hook runs release-check before dart pub publish of 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.

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.
@DenisovAV DenisovAV changed the title feat(registry,core,litertlm,speech): the LiteRT model registry and the model catalog (core 2.5.4, litertlm 1.19.0, speech 0.5.12) feat(registry,core,litertlm,speech): the LiteRT model registry and the model catalog (core 2.5.5) Oct 29, 2026
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
DenisovAV merged commit 68195f3 into main Oct 30, 2026
19 of 20 checks passed
DenisovAV added a commit that referenced this pull request Oct 31, 2026
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.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant