Skip to content

CoreAIKit 0.3.0

Latest

Choose a tag to compare

@john-rocky john-rocky released this 28 Jul 03:16

Fixed: the offline fallback resolved unpinned revisions

ModelCatalog.load() falls back to the compiled-in ModelCatalog.builtin when the network fetch of catalog.json fails — and that literal carried no revision pins, while CatalogEntry.modelID(path:) resolves revision ?? "main". A network failure therefore downgraded a shipped app from the exact bytes that were gated to whatever a model repository's main branch held at that moment: the opposite of what the catalog promises.

Pins are now generated from catalog.json into BuiltinPins.swift and overlaid onto the literal. CI fails if the two drift, and a unit test fails if any entry reaches builtin without a pin.

Apps pinned to 0.2.0 or earlier are affected, along the fallback path only — an app that has never seen a catalog fetch failure has never hit it. Upgrading needs no code change.

New capabilities

  • KitDialogue — multi-speaker text-to-speech (VibeVoice-Realtime-0.5B). perform("Speaker 1: …\nSpeaker 2: …") renders each turn from its own voice preset. 25 packaged voices, free text, no torch dependency. Pairs with KitDiarizer for a generate → diarize loop.
  • KitSeparator — music source separation (Mel-Band RoFormer): a song in, vocals and instrumental stems out. ~6.5× real-time on an iPhone 17 Pro.
  • Nanbeige4.2 3B — the catalog's first community-contributed model, ported and published by @ukint-vs (zoo PR #6) and served from their own Hugging Face repo at a pinned revision. Device-gated on iPhone 17 Pro: token-exact against the fp32 oracle, 24/24 across two runs.
  • iOS dynamic-KV guard — the on-device compiler miscompiles dynamically-sized-KV specializations at sequence length ≥ 2048, producing corrupt output from the first token. The engine now caps a pipelined turn's KV pre-grow at 1024 on iOS for those bundles. Tracked in #5; upstream apple/coreai-models#124. The guard comes out when the compiler fix lands.
  • StatefulGraphModel.seedState(keys:values:prefillLength:) — seed a decode bundle's KV cache from an external prefill instead of replaying it.
  • AudioFile.pcmStereo(_:sampleRate:) — full-band stereo decode, for the separation models.

Documentation

  • SECURITY.md — the trust boundary, including what is absent: catalog.json is unsigned, downloads carry no independent checksum manifest, bundles are not code-signed. Production apps can host their own catalog via ModelCatalog.load(from:).
  • AGENTS.md — the contract for coding agents: which layer to reach for, the catalog as data to read rather than guess at, and the failures that only appear on real hardware.
  • Every example app now has a README, and the package publishes an llms.txt index.

Full detail in CHANGELOG.md.