Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
21 changes: 21 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,16 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0

## [Unreleased]

## [0.60.0] — 2026-10-15

**Exact GELU from the engine.** Against engine **0.59.0**, which makes `erf` a first-class op and
gives `gelu` an `approximate` flag carried as op metadata. Laya's decision models now run their
exact GELU through `gelu(approximate = false)` instead of a host-side loop per FFN per layer, so the
activation is a regular op on the compiled path (graph executor, backward rule, StableHLO `chlo.erf`
or `skainet.gelu` composite) and the multilingual predict fixtures still reproduce (55 values,
max |diff| 4.99e-5). The BOM re-exports `skainet-bom:0.59.0`. The SKEEP-006 deprecation schedule
moves by one more minor (see *Deprecated*).

### Changed

- **Engine 0.59.0.** The version catalog moves `sk.ainet.core:*` to 0.59.0.
Expand All @@ -21,6 +31,17 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
the 22-layer encoder no longer pays 44 host round trips per decision. `LayaGelu.geluErf` /
`erf` stay as the double-precision reference the engine kernel is checked against.

### Deprecated

- **Schedule moved by one more minor.** The SKEEP-006 legacy surface (`GGUFTokenizer` and its
strategies, `TokenizerType`, `SentencePieceSpecialTokens`, `TekkenTokenizerAdapter`, `ModelRegistry`,
the `sk.ainet.apps.kllama.GGUFTokenizer` alias) stays at WARNING in 0.60, goes to ERROR in 0.61
and leaves in 0.62; `TokenizerFactory` and the `sk.ainet.apps.llm.Tokenizer` sub-interface are
deprecated in 0.61 and removed in 0.62. The runtimes, CLIs and benchmarks still reach the engine
through the factory (about thirty main-source files); that migration is a release of its own and
did not fit next to the engine bump. This matches the engine, whose io-core aliases also stay at
WARNING in 0.59.

## [0.59.0] — 2026-10-13

**Typed decisions.** Three new modules on the JVM path, against engine **0.58.0**: the
Expand Down
8 changes: 6 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -113,7 +113,11 @@ Honest status — see the project-status note at the top of this README.

## Current release

The current release is **0.59.0**, against **SKaiNET 0.58.0**.
The current release is **0.60.0**, against **SKaiNET 0.59.0**.

**Exact GELU from the engine.** SKaiNET 0.59.0 makes `erf` a first-class op and gives `gelu` an `approximate` flag that travels as op metadata through the graph executor, the backward rule and the StableHLO export. Laya's decision models now run their exact GELU through `gelu(approximate = false)` instead of a host-side loop per FFN per layer, and the multilingual predict fixtures still reproduce (55 values, max |diff| 4.99e-5). The SKEEP-006 legacy tokenizer surface stays at WARNING in 0.60; the schedule moves by one more minor (ERROR in 0.61, gone in 0.62).

It builds on **0.59.0**, against **SKaiNET 0.58.0**:

**Typed decisions, not text.** Three new modules bring decision models to the JVM path. `skainet-transformers-decisions-api` (`sk.ainet.decisions`, no engine dependency) is the contract: a `DecisionRequest` carries a state and up to 64 questions of three primitives — `choice` (one option out of a list), `score` (an ordinal scale), `boolean probability` — and every question ends in `Accepted`, `Abstained(reason, candidate)` or `Failed(error)`, never a silent guess; the caller owns the `AcceptancePolicy`. `skainet-transformers-decisions-runtime` validates a request against the adapter's capabilities and applies the policy. `skainet-transformers-inference-laya` is the first adapter: the Laya multilingual checkpoint (mmBERT-base encoder, decision head, Apache 2.0, Convai Innovations) on the FP32 CPU path with exact GELU, verified against the fixtures shipped with the checkpoint (26/26 packed sequences, a 40-text tokenizer corpus, predictions within 5e-5). The Kotlin DSL — `decisionSchema { }` declares questions, policy and model once and stamps out a request per state; `decisionRequest { }`, `acceptancePolicy { }`; `choice(id)` / `score(id)` / `boolean(id)` readback — follows the NN and data pipeline DSLs. Eager FP32 is seconds per decision on a laptop; the compiled and quantized lanes, batching across questions (#490) and an exact GELU op in the engine (SKaiNET#1342) are the open items. `HuggingFaceBPETokenizer` is removed; the remaining SKEEP-006 deprecations stay at WARNING and leave in 0.61.

Expand Down Expand Up @@ -287,7 +291,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.59.0"))
implementation(platform("sk.ainet.transformers:skainet-transformers-bom:0.60.0"))

// Versions resolved from the BOM:
implementation("sk.ainet.transformers:skainet-transformers-core")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ From your own build, resolve the published module and run its main class:
----
val exportTool by configurations.creating
dependencies {
exportTool(platform("sk.ainet.transformers:skainet-transformers-bom:0.59.0"))
exportTool(platform("sk.ainet.transformers:skainet-transformers-bom:0.60.0"))
exportTool("sk.ainet.transformers:skainet-transformers-inference-moonshine")
}
tasks.register<JavaExec>("exportMoonshine") {
Expand Down
2 changes: 1 addition & 1 deletion docs/modules/ROOT/pages/reference/moonshine-encoder.adoc
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ a DSL decoder is future work.
[source,kotlin]
----
dependencies {
implementation(platform("sk.ainet.transformers:skainet-transformers-bom:0.59.0"))
implementation(platform("sk.ainet.transformers:skainet-transformers-bom:0.60.0"))
implementation("sk.ainet.transformers:skainet-transformers-inference-moonshine")
}
----
Expand Down
7 changes: 4 additions & 3 deletions docs/modules/ROOT/pages/reference/tokenizer-api.adoc
Original file line number Diff line number Diff line change
Expand Up @@ -87,6 +87,7 @@ descriptor with `+`. `GGUFModelInfo.identity` is the string identity
|===

`HuggingFaceBPETokenizer` (no callers since 0.58) was removed in 0.59.0. The schedule for the
rest moved by one minor in 0.59.0: the legacy classes stay at WARNING through 0.59, go to ERROR
in 0.60 and leave in 0.61, because the runtimes, CLIs and benchmarks still reach the engine
through `TokenizerFactory` and the sub-interface, and moving them is a release of its own.
rest moved by one minor in 0.59.0 and by one more in 0.60.0: the legacy classes stay at WARNING
through 0.60, go to ERROR in 0.61 and leave in 0.62, because the runtimes, CLIs and benchmarks
still reach the engine through `TokenizerFactory` and the sub-interface, and moving them is a
release of its own.
2 changes: 1 addition & 1 deletion docs/modules/ROOT/pages/reference/typed-decisions.adoc
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ below put that on the JVM path with the same contract for every model.
[source,kotlin]
----
dependencies {
implementation(platform("sk.ainet.transformers:skainet-transformers-bom:0.59.0"))
implementation(platform("sk.ainet.transformers:skainet-transformers-bom:0.60.0"))
implementation("sk.ainet.transformers:skainet-transformers-decisions-api") // the contract, no engine dependency
implementation("sk.ainet.transformers:skainet-transformers-decisions-runtime") // validation + acceptance policy
implementation("sk.ainet.transformers:skainet-transformers-inference-laya") // Laya as a DecisionAdapter
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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.59.0"))
implementation(platform("sk.ainet.transformers:skainet-transformers-bom:0.60.0"))
implementation("sk.ainet.transformers:skainet-transformers-core")
implementation("sk.ainet.transformers:skainet-transformers-runtime-kllama")
implementation("sk.ainet.transformers:skainet-transformers-inference-llama")
Expand Down
4 changes: 2 additions & 2 deletions docs/modules/ROOT/pages/tutorials/getting-started-java.adoc
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ In your `build.gradle.kts`:
[source,kotlin]
----
dependencies {
implementation(platform("sk.ainet.transformers:skainet-transformers-bom:0.59.0"))
implementation(platform("sk.ainet.transformers:skainet-transformers-bom:0.60.0"))

implementation("sk.ainet.transformers:skainet-transformers-runtime-kllama")
implementation("sk.ainet.transformers:skainet-transformers-agent")
Expand All @@ -41,7 +41,7 @@ Or in Maven (Maven needs the `-jvm` classifier suffix on platform artifacts):
<dependency>
<groupId>sk.ainet.transformers</groupId>
<artifactId>skainet-transformers-bom</artifactId>
<version>0.59.0</version>
<version>0.60.0</version>
<type>pom</type>
<scope>import</scope>
</dependency>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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.59.0"))
implementation(platform("sk.ainet.transformers:skainet-transformers-bom:0.60.0"))
implementation("sk.ainet.transformers:skainet-transformers-providers")
}
----
Expand Down
2 changes: 1 addition & 1 deletion docs/modules/ROOT/pages/tutorials/llama3-tool-calling.adoc
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,7 @@ The pieces you need live in three modules:
[source,kotlin]
----
dependencies {
implementation(platform("sk.ainet.transformers:skainet-transformers-bom:0.59.0"))
implementation(platform("sk.ainet.transformers:skainet-transformers-bom:0.60.0"))

implementation("sk.ainet.transformers:skainet-transformers-runtime-kllama")
implementation("sk.ainet.transformers:skainet-transformers-agent")
Expand Down
2 changes: 1 addition & 1 deletion gradle.properties
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
GROUP=sk.ainet.transformers
VERSION_NAME=0.59.0
VERSION_NAME=0.60.0

POM_DESCRIPTION=SKaiNET-transformers

Expand Down
Loading