diff --git a/CHANGELOG.md b/CHANGELOG.md index 1792f3c5..6cf0c05a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,6 +9,38 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] +## [0.55.0] — 2026-09-11 + +A transformers-only release, same pattern as 0.54.1: no new engine version, still against +**SKaiNET engine 0.54.0**. Adds a new `asr-domain` module and extends `BackendProvider`, +generalizing plumbing that used to live downstream in one ASR cartridge family's repo. + +### Added — `asr-domain` module + `BackendProvider` capabilities/options (#432) + +- **New `asr-domain` module** (`sk.ainet.asr.domain`, publishes as + `skainet-transformers-asr-domain`): generic ASR task types — `Transcription`, + `TranscriptionTimings`, `StopReason`, `AsrEvent`, `DecodingOptions`, `FeatureFrames`. Moved up + from the downstream ASR cartridge ecosystem, where they lived only because that's where the + original `whisper-cli` extraction happened to put them, not because they're Whisper-specific — + both the Whisper and Moonshine cartridge families depend on these, and keeping them downstream + in one family's repo made the other structurally dependent on it for generic plumbing. + Framework-free (empty `commonMain` deps), full KMP target spread matching `llm-api`'s + convention for consumer-facing SPI modules (ios/linux/macos/jvm/js/wasm/android). +- **`BackendProvider` gains `capabilities: BackendCapabilities`** (supported dtypes, compile + support, NPU usage, max sequence length — defaulted, so existing implementers don't need to + change) **and `createContext(options: BackendOptions = BackendOptions())`** (was + parameterless). `kllama`'s `CpuBackendProvider` updated to match. +- **No second backend-registry module.** Downstream's own `backend-spi` + `ExecutionContextFactory`/`BackendRegistry` seam is *not* duplicated here — unified into this + existing `BackendProvider`/`BackendRegistry` instead, since both did the same job (select a + strategy producing a SKaiNET `ExecutionContext`). `BackendRegistry` itself is unchanged. +- Verified: `:asr-domain:build`, `:llm-core:build`, `:llm-runtime:kllama:build` and the + corresponding `allTests` all green; `apiDump` regenerated for both `llm-core` and `kllama`'s + binary-compatibility-validator baselines. Downstream (`asr-whisper-iree-cartridge`, `asr-cli`) + verified against this branch via the `useLocalSkainet`-style opt-in composite substitution + pattern before this release — full `check` green in both, including a Docker smoke test of the + shipped `asr-cli` image. + ## [0.54.1] — 2026-09-07 A transformers-only release, same pattern as 0.40.2: no new engine version, still against diff --git a/README.md b/README.md index e57e00ce..89e66b45 100644 --- a/README.md +++ b/README.md @@ -109,8 +109,22 @@ Honest status — see the project-status note at the top of this README. ## Current release -The current release is **0.54.1** (against **SKaiNET 0.54.0** — a transformers-only release, same -pattern as 0.40.2: no new engine version needed). +The current release is **0.55.0** (against **SKaiNET 0.54.0** — a transformers-only release, same +pattern as 0.54.1: no new engine version needed). + +**A new `asr-domain` module, and `BackendProvider` learns capabilities/options.** Generic ASR +task types (`Transcription`, `DecodingOptions`, `FeatureFrames`, ...) move up from the downstream +ASR cartridge ecosystem, where they lived only because that's where the original `whisper-cli` +extraction happened to put them — both the Whisper and Moonshine cartridge families depend on +these, so keeping them in one family's repo made the other structurally dependent on it for +generic plumbing. `BackendProvider` gains a `capabilities: BackendCapabilities` property and a +defaulted `createContext(options: BackendOptions = BackendOptions())` (was parameterless) — +source-compatible with every existing implementer. Downstream's own execution-backend registry +seam is *not* duplicated as a second module here; it's unified into this existing +`BackendProvider`/`BackendRegistry` instead, since both already did the same job. (#432) + +It builds on **0.54.1**, which made attention heads run in parallel and stopped positional K/V +caches from copying the whole prefix per layer per token. **Attention heads run in parallel.** `MultiHeadAttention` is the first consumer of the engine's SKEEP-005 `Schedule`: heads (or GQA groups) map onto cores via `AttentionSchedulePolicy` @@ -218,7 +232,7 @@ The recommended way to consume is via the BOM. It pins every published `skainet- ```kotlin dependencies { - implementation(platform("sk.ainet.transformers:skainet-transformers-bom:0.54.1")) + implementation(platform("sk.ainet.transformers:skainet-transformers-bom:0.55.0")) // Versions resolved from the BOM: implementation("sk.ainet.transformers:skainet-transformers-core") @@ -250,6 +264,7 @@ dependencies { | `llm-agent` | Chat templates, tool-call parsers, agent loops; Java surface. | | `llm-apps` | CLIs: `skainet-cli` (unified), `kllama-cli`, `kbert-cli`, plus `kllama-java-sample`. | | `llm-test/llm-test-java` | JUnit 5 end-to-end tests for the Java surface (gated on `TINYLLAMA_MODEL_PATH`). | +| `asr-domain` | Generic ASR task types (`Transcription`, `DecodingOptions`, `FeatureFrames`) — framework-free, no dependency on the rest of this repo. Consumed by downstream ASR cartridges (Whisper, Moonshine). | ## Supported targets @@ -273,6 +288,7 @@ Which Maven artifact publishes which Kotlin target (derived from each module's | `llm-runtime/kapertus` | ✓ | — | — | — | — | — | — | — | | `llm-performance` | ✓ | ✓ | — | ✓ | — | ✓ | ✓ | ✓ | | `llm-providers`, `llm-apps/*`, `llm-test/*` | ✓ | — | — | — | — | — | — | — | +| `asr-domain` | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ¹ `transformer-core` additionally publishes `androidNativeArm32`/`androidNativeArm64`. ² `moonshine` publishes `iosArm64` and `androidNativeArm64` but no simulator or Android (AGP) variant. diff --git a/docs/modules/ROOT/pages/reference/moonshine-encoder.adoc b/docs/modules/ROOT/pages/reference/moonshine-encoder.adoc index 27410bfe..cbe92d8c 100644 --- a/docs/modules/ROOT/pages/reference/moonshine-encoder.adoc +++ b/docs/modules/ROOT/pages/reference/moonshine-encoder.adoc @@ -24,7 +24,7 @@ a DSL decoder is future work. [source,kotlin] ---- dependencies { - implementation(platform("sk.ainet.transformers:skainet-transformers-bom:0.54.1")) + implementation(platform("sk.ainet.transformers:skainet-transformers-bom:0.55.0")) implementation("sk.ainet.transformers:skainet-transformers-inference-moonshine") } ---- diff --git a/docs/modules/ROOT/pages/tutorials/android-getting-started.adoc b/docs/modules/ROOT/pages/tutorials/android-getting-started.adoc index cc8a8d94..4566e258 100644 --- a/docs/modules/ROOT/pages/tutorials/android-getting-started.adoc +++ b/docs/modules/ROOT/pages/tutorials/android-getting-started.adoc @@ -55,7 +55,7 @@ dependencies { // self-registers it on ART at process start — nothing to call. runtimeOnly("sk.ainet.core:skainet-backend-jni-cpu") - implementation(platform("sk.ainet.transformers:skainet-transformers-bom:0.54.1")) + implementation(platform("sk.ainet.transformers:skainet-transformers-bom:0.55.0")) implementation("sk.ainet.transformers:skainet-transformers-core") implementation("sk.ainet.transformers:skainet-transformers-runtime-kllama") implementation("sk.ainet.transformers:skainet-transformers-inference-llama") diff --git a/docs/modules/ROOT/pages/tutorials/getting-started-java.adoc b/docs/modules/ROOT/pages/tutorials/getting-started-java.adoc index 997d5868..5ab61f64 100644 --- a/docs/modules/ROOT/pages/tutorials/getting-started-java.adoc +++ b/docs/modules/ROOT/pages/tutorials/getting-started-java.adoc @@ -25,7 +25,7 @@ In your `build.gradle.kts`: [source,kotlin] ---- dependencies { - implementation(platform("sk.ainet.transformers:skainet-transformers-bom:0.54.1")) + implementation(platform("sk.ainet.transformers:skainet-transformers-bom:0.55.0")) implementation("sk.ainet.transformers:skainet-transformers-runtime-kllama") implementation("sk.ainet.transformers:skainet-transformers-agent") @@ -41,7 +41,7 @@ Or in Maven (Maven needs the `-jvm` classifier suffix on platform artifacts): sk.ainet.transformers skainet-transformers-bom - 0.54.1 + 0.55.0 pom import diff --git a/docs/modules/ROOT/pages/tutorials/getting-started-leaf.adoc b/docs/modules/ROOT/pages/tutorials/getting-started-leaf.adoc index 7a1e4463..fb513278 100644 --- a/docs/modules/ROOT/pages/tutorials/getting-started-leaf.adoc +++ b/docs/modules/ROOT/pages/tutorials/getting-started-leaf.adoc @@ -34,7 +34,7 @@ encoder output to the advertised dimensionality. The runtime applies it automati [source,kotlin] ---- dependencies { - implementation(platform("sk.ainet.transformers:skainet-transformers-bom:0.54.1")) + implementation(platform("sk.ainet.transformers:skainet-transformers-bom:0.55.0")) implementation("sk.ainet.transformers:skainet-transformers-providers") } ---- diff --git a/docs/modules/ROOT/pages/tutorials/llama3-tool-calling.adoc b/docs/modules/ROOT/pages/tutorials/llama3-tool-calling.adoc index 856d8615..a9ade40c 100644 --- a/docs/modules/ROOT/pages/tutorials/llama3-tool-calling.adoc +++ b/docs/modules/ROOT/pages/tutorials/llama3-tool-calling.adoc @@ -52,7 +52,7 @@ The pieces you need live in three modules: [source,kotlin] ---- dependencies { - implementation(platform("sk.ainet.transformers:skainet-transformers-bom:0.54.1")) + implementation(platform("sk.ainet.transformers:skainet-transformers-bom:0.55.0")) implementation("sk.ainet.transformers:skainet-transformers-runtime-kllama") implementation("sk.ainet.transformers:skainet-transformers-agent") diff --git a/docs/modules/ROOT/pages/tutorials/parallel-attention-getting-started.adoc b/docs/modules/ROOT/pages/tutorials/parallel-attention-getting-started.adoc index 851d5109..a8202b3b 100644 --- a/docs/modules/ROOT/pages/tutorials/parallel-attention-getting-started.adoc +++ b/docs/modules/ROOT/pages/tutorials/parallel-attention-getting-started.adoc @@ -10,7 +10,7 @@ schedule only decides where the work runs. * JDK 21+ (the JVM is the only target with a parallel schedule; others run `Schedule.Sequential`). * A Llama 3.2 or Qwen3 GGUF, for example `Llama-3.2-1B-Instruct-Q8_0.gguf`. -* SKaiNET-transformers 0.54.1 or later. +* SKaiNET-transformers 0.55.0 or later. == Step 1: Dependencies diff --git a/gradle.properties b/gradle.properties index bc9a86b9..9cf5e6bd 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,5 +1,5 @@ GROUP=sk.ainet.transformers -VERSION_NAME=0.54.1 +VERSION_NAME=0.55.0 POM_DESCRIPTION=SKaiNET-transformers diff --git a/llm-inference/gemma/README.md b/llm-inference/gemma/README.md index f4828453..8a54538a 100644 --- a/llm-inference/gemma/README.md +++ b/llm-inference/gemma/README.md @@ -4,7 +4,7 @@ Reusable **Gemma** model (incl. the FunctionGemma tool-calling fine-tune) author a portable graph producer with **no runtime/board/Torq code**. Pair it with the runtime module below to decode on-device. -- **Coordinate:** `sk.ainet.transformers:skainet-transformers-inference-gemma:0.54.1` +- **Coordinate:** `sk.ainet.transformers:skainet-transformers-inference-gemma:0.55.0` - **Targets:** `android`, `iosArm64`, `iosSimulatorArm64`, `macosArm64`, `linuxX64`, `linuxArm64` (broadly portable — mobile through server). - **Entry point:** `gemmaNetwork()` / `GemmaNetworkLoader` (loads a GGUF, builds the DSL graph, incl. the @@ -24,8 +24,8 @@ FunctionGemma has a one-liner facade in `…:skainet-transformers-runtime-kgemma ```kotlin dependencies { - implementation("sk.ainet.transformers:skainet-transformers-inference-gemma:0.54.1") - implementation("sk.ainet.transformers:skainet-transformers-runtime-gemma-iree:0.54.1") // on-device decode + implementation("sk.ainet.transformers:skainet-transformers-inference-gemma:0.55.0") + implementation("sk.ainet.transformers:skainet-transformers-runtime-gemma-iree:0.55.0") // on-device decode } ```