Skip to content

Releases

Starlings 0.5.0

Choose a tag to compare

@github-actions github-actions released this 03 Nov 13:47
ce52258

ai-dotnet release 0.5.0

Qwen3.5 int4 and guided decoding on the hosted files, GLiNER2 text classification, reranking helpers, and generated capability records for every model package. This release follows the 0.4.0 record (ai-0.4.0.md, merged in #272; see Publishing) and carries the work merged since: round 2 of the backlog sweep (#259, #260, #261, #264, #265, #267, #268, #269, #270, #271, integrated by #273; #262 and #263 are design notes only) and round 3 (#274, #275). The publishable set is unchanged at 27 packages: no package joins or leaves it. Starlings.Models.Qwen3Embedding and Starlings.Models.Qwen3Embedding.Extensions.AI are new in the repository but source only, pending the reranker decision (#144, #100; see Not published). The one compile break is KevModelProfile's two new required members (#246); the lock of every Qwen3.5 variant gains two files (hosting revision r2), so a cache acquired earlier must download again. See Upgrading.

Publishing. The release workflow publishes this release from the tag ai-v0.5.0 on main, after a maintainer approves the release environment. It publishes the 27 packages of the publishable set below through NuGet trusted publishing, and creates a GitHub release with this record as notes. When this candidate was prepared, ai-v0.4.0 had not been pushed and nuget.org's last ai-dotnet version was 0.3.0 (2026-10-19). 0.4.0 can still be tagged on the commit its record describes, d9b003f (the merge of #272); then this record is the step from 0.4.0. If 0.4.0 is never tagged, 0.5.0 is the first published version after 0.3.0, and the upgrade notes of both records apply.

Tokenizer. Unchanged: every package that tokenizes pins Starlings.Tokenizers [0.3.4], as in 0.4.0. 0.3.5 follows in a later release.

Maturity. Maturity belongs to profiles, not packages, and each package README has a generated maturity table. Every Stable profile of 0.4.0 is still Stable with the same contract: no gate, tolerance or protected/ file changed. On the Stable Qwen3.5 profiles (ortgenai-fp32x-cpu, ortgenai-fp32x-cuda, ortgenai-fp16x-cuda), structured_output moves from unsupported to experimental (guided decoding on the hosted r2 files); the Stable contracts are unchanged. The E5 CUDA manifest now states concurrent_calls (Supported), which its README contract already said. New registry profiles:

Profile Maturity Package Admission
qwen3.5-0.8b/ortgenai-int4-cpu Experimental Starlings.Models.Qwen35.OnnxGenAI (published) #163, #269; hosted since r2 (#274)
qwen3-embedding-0.6b/onnx-fp32-cpu Experimental Starlings.Models.Qwen3Embedding (not published) model-pipeline/admissions/qwen3-embedding.md (decided 2026-11-02 by the maintainer's delegate, revisitable; closes #108)

The registry profile qwen3-embedding-0.6b/onnx-fp32-cpu also appears in the generated maturity table of the published Starlings.Acquisition README, whose lock types it uses; that table row does not mean the Qwen3 embedding package is published. The catalog links every gate to its evidence.

Packages

All packages target net10.0 and have SourceLink to the commit. All are licensed MIT OR Apache-2.0, except Starlings.Models.Lfm3, whose NuGet license is the LFM Open License v1.0 file (commercial use licensed only below USD 10 million annual revenue; see ai-0.4.0.md). Sibling and tokenizer dependencies are exact ([version]).

Package Version Change since 0.4.0
Starlings.Tokenizers 0.3.4 dependency, unchanged
Starlings.Runtime.Onnx 0.5.0 rebuilt, no public change
Starlings.Acquisition 0.5.0 README maturity table lists qwen3.5-0.8b/ortgenai-int4-cpu and qwen3-embedding-0.6b/onnx-fp32-cpu
Starlings.Models.Abstractions 0.5.0 Reranking and RerankedItem<T> (experimental, #168)
Starlings.Models.E5 0.5.0 concurrent_calls (Supported) in the CUDA profile's capability record (#258); README qualification runner row (#252)
Starlings.Models.E5.Extensions.AI 0.5.0 rebuilt, no change
Starlings.Models.E5.MLNet 0.5.0 rebuilt, no change
Starlings.Runtime.OnnxWeb 0.5.0 rebuilt, no change
Starlings.Runtime.OnnxWeb.WebGpu 0.5.0 rebuilt, no change
Starlings.Models.E5.Browser 0.5.0 rebuilt, no change
Starlings.Models.Gliner2 0.5.0 Gliner2TextClassifier, Gliner2ClassificationHead, Gliner2ModelAssets.ClassificationLock, Gliner2EntityExtractor.LastHiddenStateName: text classification, Experimental on CPU (#183 step 1); README runner row
Starlings.Generation.Abstractions 0.5.0 README maturity table lists the int4 profile
Starlings.Generation.OnnxGenAI 0.5.0 README maturity table lists the int4 profile
Starlings.Models.Qwen35 0.5.0 documentation only (guidance files are hosted since r2); README maturity table lists the int4 profile
Starlings.Models.Qwen35.OnnxGenAI 0.5.0 Qwen35Variant.Int4 (Experimental, #163); hosting revision r2 with the guidance files per variant and the int4 download (#139, #274; every variant's lock gains two files); Qwen35Capabilities.ProfileCapabilities (#177); now depends on Starlings.Models.Abstractions
Starlings.Models.Qwen35.Extensions.AI 0.5.0 structured_output, extensions_ai.tool_mode.required and extensions_ai.structured_output experimental on the hosted r2 files (README)
Starlings.Models.EmbeddingGemma2 0.5.0 EmbeddingGemma2MultimodalOptions.AutoBatchLimits (experimental, #172); concurrent-call CUDA tests and the 16 GB memory warning (#257); README runner row
Starlings.Models.EmbeddingGemma2.Extensions.AI 0.5.0 rebuilt, no change
Starlings.Models.EmbeddingGemma2.MLNet 0.5.0 rebuilt, no change
Starlings.Models.EmbeddingGemma2.Imaging.SkiaSharp 0.5.0 rebuilt, no change
Starlings.Models.EmbeddingGemma2.Video.FFmpeg 0.5.0 rebuilt, no change
Starlings.Models.EmbeddingGemma2.Video.FFmpeg9 0.5.0 rebuilt, no change
Starlings.Models.Kev 0.5.0 breaking: KevModelProfile.CheckpointLock and BaseCheckpointLock are new required members (#246); packed checkpoint locks; now depends on Starlings.Acquisition
Starlings.Models.Kev.Onnx 0.5.0 KevCapabilities.ProfileCapabilities (#177); state_reuse_across_calls.cuda experimental (#140, no code change); now depends on Starlings.Models.Abstractions
Starlings.Models.QwenChat 0.5.0 QwenChatCheckpoint.Lock and packed checkpoint locks (#246); now depends on Starlings.Acquisition
Starlings.Models.QwenChat.OnnxGenAI 0.5.0 QwenChatCapabilities.ProfileCapabilities (#177); now depends on Starlings.Models.Abstractions
Starlings.Models.Bert 0.5.0 BertCapabilities.ProfileCapabilities (#177); README notes the reranking helpers
Starlings.Models.Lfm3 0.5.0 Lfm3Capabilities.ProfileCapabilities (#177); now depends on Starlings.Models.Abstractions. License unchanged (LFM Open License v1.0)

Publishable set (27 packages): every row at 0.5.0. Nothing is held (HELD is empty in .github/workflows/release.yml). The release drill's package list and nuspec dependency expectations (tools/release-drill-ai.sh, .ps1) already carry the new dependencies and packed locks above (#260, #265).

Not published:

  • Starlings.Models.Qwen3Embedding and Starlings.Models.Qwen3Embedding.Extensions.AI (#268, #275): source only, pending the reranker decision (#144, #100 comments). The embedding profile is admitted at Experimental; the reranker profile failed its predeclared hidden-state bound on two long inputs and is held, and the admission record keeps both packages out of the release set until it is decided. They are packable but not in the drill's package set. Publishing them needs its own change: the reranker decision, the package description's per-profile line, and the drill and publish entries.
  • Starlings.Models.Whisper and Starlings.Models.PaddleOcr: packable, not in the drill's package set, for the reasons in ai-0.4.0.md.
  • Starlings.Interventions, Starlings.Models.Lfm3.Interventions and Starlings.Models.Clover: source only (not packable).

Changes merged since 0.4.0

Everything below was merged to main after the 0.4.0 record (moved here from docs/releases/unreleased.md).

Starlings.Models.Abstractions: reranking helpers for vector-search pipelines (Experimental; #168)

New Reranking and RerankedItem<T>(Item, Index, Score) put an IReranker (today BertReranker, for example bge-reranker-v2-m3) after a first-stage retriever. Microsoft.Extensions.AI has no reranker abstraction, so the helpers take any sequence plus a text selector and add no package reference: RerankAsync reads an IAsyncEnumerable<T> such as a Microsoft.Extensions.VectorData SearchAsync top-k, scores it with one Score call and orders by descending score (ties in input order, optional top); Rerank is the synchronous form; AsScoringFunction wraps an IReranker as a Func<string, IReadOnlyList<string>, Task<float[]>>, and a RerankAsync overload takes any such scorer. AsScoringFunction scores synchronously and returns a completed task; RerankAsync validates its arguments synchronously and scores after the last candidate arrives, on the thread that resumed it. API only and Experimental; every reranker profile stays Experimental (the Stable bge-reranker-v2-m3 profile is still open in #168).

Starlings.Models.E5: concurrent_calls recorded for the CUDA profile; README qualification runner (#258, #252)

  • E5Capabilities.ProfileCapabilities["multilingual-e5-small/onnx-fp32-cuda"].Capabilities (...
Read more

Starlings 0.4.0

Choose a tag to compare

@github-actions github-actions released this 03 Nov 13:47
d9b003f

ai-dotnet release 0.4.0

Starlings.Models.Bert reaches nuget.org. This release follows 0.3.0 (published 2026-10-19) and carries the work merged since (#128 to #263). It adds ten packages to the publishable set. Starlings.Models.Bert carries the BERT route's seven embedding and reranking profiles, now including the multilingual BAAI/bge-m3 embedder (#128) and the BAAI/bge-reranker-v2-m3 cross-encoder reranker (#146, closes #99). All seven profiles are Experimental. The package now carries its profiles: BertModelProfile.BuiltIn(name) works from the package alone, with no repository checkout. The browser packages Starlings.Runtime.OnnxWeb, Starlings.Runtime.OnnxWeb.WebGpu and Starlings.Models.E5.Browser (#149, #150) run multilingual-e5-small in .NET browser-wasm apps on onnxruntime-web; their four profiles are Experimental. Starlings.Models.Abstractions (shared model contracts) is new, and the generation packages are split into model definitions without a runtime and their ONNX Runtime packages: Starlings.Generation.Abstractions, Starlings.Models.Qwen35.OnnxGenAI, Starlings.Models.Kev.Onnx and Starlings.Models.QwenChat.OnnxGenAI are new, and the split is breaking for 0.3.0 users of Starlings.Models.Qwen35, Starlings.Models.QwenChat and Starlings.Models.Kev (see Upgrading from 0.3.0). Starlings.Models.Lfm3 (#217, #218, #220) runs LiquidAI/LFM3-1.7B text generation on ONNX Runtime; its profile is Experimental, and its model license is the LFM Open License v1.0, not MIT or Apache-2.0: commercial use is licensed only to an entity below USD 10 million annual revenue (see LFM3).

Publishing. The release workflow publishes this release from the tag ai-v0.4.0 on main, after a maintainer approves the release environment. It publishes the 27 packages of the publishable set below through NuGet trusted publishing, and creates a GitHub release with this record as notes.

Tokenizer. Every package that tokenizes now pins Starlings.Tokenizers [0.3.4] (0.3.0 in the previous release). #128 raised the pin to 0.3.1, which adds the lstrip/rstrip added-token options bge-m3 needs. #135 raised it to 0.3.2, which adds ByteLevel use_regex for Whisper. The move to 0.3.4 brings 0.3.3's Sequence post-processor, the Llama 3 split regex and the profiles lfm3-bpe-chat, qwen3-bpe-embedding and qwen3-bpe-chat, and 0.3.4's profile clover-bpe-chat. LFM3 needs lfm3-bpe-chat. No pinned asset of an existing profile declares any of these options, so their outputs are unchanged, and the tokenizer's conformance fixtures pass unchanged (starlinghq/tokenizers CHANGELOG). Every manifest's processing.tokenizer.version moved with the pin.

Maturity. Maturity belongs to profiles, not packages, and each package README has a generated maturity table. Every Stable profile of 0.3.0 is still Stable with the same contract: no gate, tolerance or protected/ file changed. The new profiles are Experimental: no gate has run on them, and their capabilities are at most Experimental. They get registry manifests in this release candidate so the package README can state their maturity. Each manifest has every gate not-run. Their tolerances are the candidate's predeclared development policy (qualification.tolerances points at the candidate profile.json, as for QwenChat). Their references are proposed and not adopted into protected/. The BERT route has no admission record. The models were admitted to the onboarding route in the PRs below.

Profile Maturity Admitted to the route
all-minilm-l6-v2/onnx-fp32-cpu Experimental initial five-model onboarding (model-pipeline/FIVE_MODELS.md)
bge-small-en-v1.5/onnx-fp32-cpu Experimental initial five-model onboarding
ms-marco-minilm-l6-v2/onnx-fp32-cpu Experimental initial five-model onboarding
nomic-embed-text-v1.5/onnx-fp32-cpu Experimental #120
bge-base-en-v1.5/onnx-fp32-cpu Experimental #121
bge-m3/onnx-fp32-cpu Experimental #128
bge-reranker-v2-m3/onnx-fp32-cpu Experimental #146 (closes #99)
lfm3-1.7b/onnx-fp32-cpu Experimental admission record model-pipeline/admissions/lfm3.md (#217, decided 2026-10-30)

Candidate contracts: model-pipeline/candidates/{minilm,bge-small,ms-marco,nomic-embed,bge-base,bge-m3,bge-reranker-v2-m3,lfm3-1.7b}/profile.json. Registry manifests: model-pipeline/registry/<family>/onnx-fp32-cpu/manifest.yaml. The Stable profiles are listed in ai-0.2.0.md, and the Kev and QwenChat profiles in ai-0.3.0.md. The catalog links every gate to its evidence.

Packages

All packages target net10.0 and have SourceLink to the commit. All are licensed MIT OR Apache-2.0, except Starlings.Models.Lfm3, whose NuGet license is the LFM Open License v1.0 file (see its row). Sibling and tokenizer dependencies are exact ([version]).

Package Version Change since 0.3.0
Starlings.Tokenizers 0.3.4 dependency, raised from 0.3.0 (#128, #135, then 0.3.4 for LFM3); outputs of existing profiles unchanged
Starlings.Runtime.Onnx 0.4.0 provider probe, CUDA options, logging, I/O binding, warmup, exception base (D2); known model digest (C7); shared encoder core; buildTransitive native package checks (E1); OnnxCudaProviderOptions.AdditionalProviderOptions and public Validate(); OnnxInterventionDiagnostics (experimental); README maturity table lists the BERT and LFM3 profiles
Starlings.Acquisition 0.4.0 status, cleanup, progress, waits, concurrent files, mirrors, pruning, lock format 3 (D1); README maturity table lists the BERT profiles
Starlings.Models.Abstractions 0.4.0 first publish. CapabilityStatus, ModelProfileCapabilities, ITextEmbedder, IReranker, IModelAssets<TFiles>, InputTooLongException, TextChunker (A2, C2, C3)
Starlings.Models.E5 0.4.0 tokenizer 0.3.4 (README contract row); references Starlings.Models.Abstractions (A2, C2 to C5); outputs unchanged
Starlings.Models.E5.Extensions.AI 0.4.0 rebuilt, no change
Starlings.Models.E5.MLNet 0.4.0 rebuilt, no change
Starlings.Models.Gliner2 0.4.0 tokenizer 0.3.4 (README contract row); references Starlings.Models.Abstractions (A2, C2 to C5); outputs unchanged
Starlings.Generation.Abstractions 0.4.0 first publish. Backend-neutral generation types moved from Starlings.Generation.OnnxGenAI (namespace Starlings.Generation), chat seams, IGenerationSequence
Starlings.Generation.OnnxGenAI 0.4.0 references Starlings.Generation.Abstractions (the moved types); guided decoding (B1); buildTransitive native package checks (E1)
Starlings.Models.Qwen35 0.4.0 breaking: now the model definition without ONNX Runtime (template, parser, tool grammar, Qwen35Checkpoint); Qwen35ChatModel moved to Starlings.Models.Qwen35.OnnxGenAI. Guided decoding (B1). Outputs unchanged
Starlings.Models.Qwen35.OnnxGenAI 0.4.0 first publish. Qwen35ChatModel and the bundle locks, split from Starlings.Models.Qwen35; CPU prefill in 1,024-token chunks (B2). The Stable Qwen3.5 contracts are unchanged
Starlings.Models.Qwen35.Extensions.AI 0.4.0 references Starlings.Models.Qwen35.OnnxGenAI; tool modes and JSON response format through guidance when the model directory has the guidance files (B1)
Starlings.Models.EmbeddingGemma2 0.4.0 tokenizer 0.3.4 (README contract rows, capability comment); references Starlings.Models.Abstractions (A2, C2 to C5); outputs unchanged
Starlings.Models.EmbeddingGemma2.Extensions.AI 0.4.0 rebuilt, no change
Starlings.Models.EmbeddingGemma2.MLNet 0.4.0 rebuilt, no change
Starlings.Models.EmbeddingGemma2.Imaging.SkiaSharp 0.4.0 MaxEncodedBytes (default 64 MiB) bounds Decode(Stream) (#194; behavior change above 64 MiB)
Starlings.Models.EmbeddingGemma2.Video.FFmpeg 0.4.0 rebuilt, no change
Starlings.Models.EmbeddingGemma2.Video.FFmpeg9 0.4.0 rebuilt, no change
Starlings.Models.Kev 0.4.0 breaking: now the model definition without ONNX Runtime (depends on Starlings.Tokenizers only); the runtime moved to Starlings.Models.Kev.Onnx. Kev API items (B9); KevDecision[id] is a hash lookup and a null id throws ArgumentNullException (#166). See Changes merged since #155
Starlings.Models.Kev.Onnx 0.4.0 first publish. KevDecisionModel and the bundle locks on ONNX Runtime, split from Starlings.Models.Kev; state reuse, placement and calibration flag (B9); KevDecisionModel.CanLoad (#166). Experimental profiles
Starlings.Models.QwenChat 0.4.0 breaking: now the model definition without ONNX Runtime (templates, parser, QwenChatCheckpoint); the runtime moved to Starlings.Models.QwenChat.OnnxGenAI
Starlings.Models.QwenChat.OnnxGenAI 0.4.0 first publish. QwenChatModel, QwenChatModelAssets and QwenChatProfile on ONNX Runtime GenAI, split from Starlings.Models.QwenChat. Experimental profiles
Starlings.Runtime.OnnxWeb 0.4.0 first publish (#149, #150). onnxruntime-web 1.30.0 (WASM backend) for .NET browser-wasm apps: model download with SHA-256 verification and Cache Storage, sessions and runs from C# through [JSImport]. Ships onnxruntime-web's WASM-only bundle as static web assets, with onnxruntime's license and notices
Starlings.Runtime.OnnxWeb.WebGpu 0.4.0 first publish (#149, #150). onnxruntime-web 1.30.0's WebGPU-capable bundle as static web assets for Starlings.Runtime.OnnxWeb
Starlings.Models.E5.Browser 0.4.0 first publish (#149, #150). multilingual-e5-small embeddings in the browser with the owned tokenizer and an `IEmbeddingGener...
Read more

Starlings 0.3.0

Choose a tag to compare

@github-actions github-actions released this 19 Oct 20:57
9d18276

ai-dotnet release 0.3.0

Kev and QwenChat reach nuget.org. This release follows 0.2.0 (published 2026-10-17) and carries the work merged since (#116 to #127). It adds two packages to the publishable set, Starlings.Models.Kev and Starlings.Models.QwenChat, both with Experimental profiles only, and hosts their model files publicly. It also adds opt-in batching to the embedding and extraction packages and makes the stop-string matcher public (#124).

Publishing. The release workflow publishes this release from the tag ai-v0.3.0 on main, after a maintainer approves the release environment: the 17 packages of the publishable set below, through NuGet trusted publishing, plus a GitHub release with this record as notes.

Tokenizer. Unchanged: every package that tokenizes pins Starlings.Tokenizers [0.3.0].

Maturity. Maturity belongs to profiles, not packages (each package README has a generated maturity table). Every Stable profile of 0.2.0 is still Stable, with the same contract; no gate, tolerance or protected/ file changed. The new profiles are Experimental: no gate has run on them, and their capabilities are at most Experimental.

Profile Maturity Admitted
kev-0.8b/onnx-fp32-cpu, kev-0.8b/onnx-fp32-cuda Experimental model-pipeline/admissions/kev.md, CUDA profiles in #116
kev-4b/onnx-fp32-cpu, kev-4b/onnx-fp32-cuda Experimental model-pipeline/admissions/kev.md, CUDA profiles in #116
qwen3-0.6b/ortgenai-fp32-cpu Experimental model-pipeline/admissions/qwen-chat.md (#127)
qwen2.5-0.5b-instruct/ortgenai-fp32-cpu Experimental model-pipeline/admissions/qwen-chat.md (#127)

The Stable profiles are listed in ai-0.2.0.md. The catalog links every gate to its evidence.

Packages

All packages target net10.0, are licensed MIT OR Apache-2.0 and have SourceLink to the commit. Sibling and tokenizer dependencies are exact ([version]).

Package Version Change since 0.2.0
Starlings.Tokenizers 0.3.0 dependency, unchanged
Starlings.Runtime.Onnx 0.3.0 Starlings.Runtime.Onnx.Batching.MicroBatcher and MicroBatchingOptions: opt-in cross-request micro-batching, Experimental; the batcher owns cancellation, so one caller cancelling never cancels a shared run (#126)
Starlings.Acquisition 0.3.0 README maturity table lists the Kev and QwenChat profiles (#116, #127)
Starlings.Models.E5 0.3.0 opt-in SortByLength and MaxBatchTokens for explicit batches, results in input order, Experimental (#126); defaults unchanged
Starlings.Models.E5.Extensions.AI 0.3.0 opt-in MicroBatching on the IEmbeddingGenerator, Experimental (#126)
Starlings.Models.E5.MLNet 0.3.0 documentation only (#123)
Starlings.Models.Gliner2 0.3.0 opt-in SortByLength, MaxBatchTokens and MicroBatching on ExtractAsync (only requests with the same labels and descriptions share a run), Experimental (#126)
Starlings.Generation.OnnxGenAI 0.3.0 StopSequenceMatcher is public, with argument validation and a defensive copy of the stops; TextGenerator behaves as before (#125)
Starlings.Models.Qwen35 0.3.0 documentation only (#123)
Starlings.Models.Qwen35.Extensions.AI 0.3.0 documentation only (#123)
Starlings.Models.EmbeddingGemma2 0.3.0 opt-in SortByLength and MaxBatchTokens for explicit text batches (encoder and multimodal text options), Experimental (#126); defaults unchanged
Starlings.Models.EmbeddingGemma2.Extensions.AI 0.3.0 opt-in MicroBatching on the text IEmbeddingGenerator, Experimental (#126)
Starlings.Models.EmbeddingGemma2.MLNet 0.3.0 documentation only (#123)
Starlings.Models.EmbeddingGemma2.Imaging.SkiaSharp 0.3.0 documentation only (#123)
Starlings.Models.EmbeddingGemma2.Video.FFmpeg 0.3.0 documentation only (#123)
Starlings.Models.EmbeddingGemma2.Video.FFmpeg9 0.3.0 documentation only (#123)
Starlings.Models.Kev 0.3.0 first publish: Kev 1.0 decision models (Kev-0.8B, Kev-4B), CPU and CUDA profiles, explicit download from public hosting (KevModelAssets.DownloadAsync), Experimental (#91, #116); internal batched-rows spike, batched_rows stays Unsupported (#126)
Starlings.Models.QwenChat 0.3.0 first publish: Qwen3-0.6B and Qwen2.5-0.5B-Instruct text chat on ONNX Runtime GenAI 0.17.1, CPU fp32, with the bundle lock pinned in code and explicit download from public hosting (QwenChatModelAssets.DownloadAsync), Experimental (#127)

Publishable set (17 packages): every row at 0.3.0. Nothing is held (HELD is empty in .github/workflows/release.yml).

Not published: Starlings.Models.Bert (the BERT route: bge and nomic embeddings, #120, #121, batching options #126) builds and tests on main but is not in the release drill's package set.

ML.NET under Native AOT is unsupported (Microsoft.ML emits code at run time).

Upgrading from 0.2.0

  • Raise every Starlings.* reference to 0.3.0 together.
  • No default changed: batching options are off unless set, and Stable profiles produce the same outputs.
  • Kev on Linux needs MALLOC_MMAP_THRESHOLD_=65536 in the process environment for bounded memory in long-running processes (package README), as GLiNER2 and EmbeddingGemma 2 video do.
  • QwenChat: the application adds Microsoft.ML.OnnxRuntimeGenAI 0.17.1. QwenChatOptions.MaxNewTokens defaults to 16 (the corpus setting); set your own.

Hosting

The files Starling builds are downloadable without a token, each pinned by commit and by SHA-256 in the packages' locks. New since 0.2.0:

Repository Revision Files
Starlinghq/kev-0.8b-onnx 8a9fe0175d294a89c6fa963a2245eb32e3fa1505 Kev-0.8B graph, pointer head, tokenizer
Starlinghq/kev-4b-onnx 8179da507de7de4bddfdbfa44894ff24b1dcd959 Kev-4B graph, pointer head, tokenizer
Starlinghq/qwen3-0.6b-ortgenai c24cd59cad1444863ddfdb372736da610a09c9c4 Qwen3-0.6B GenAI build, tokenizer, chat template
Starlinghq/qwen2.5-0.5b-instruct-ortgenai 6b6957c8305ef950450da2c0c846bce6fac3e8a0 Qwen2.5-0.5B-Instruct GenAI build, tokenizer, chat template

Unchanged since 0.2.0: Starlinghq/gliner2-base-v1-onnx, Starlinghq/embeddinggemma-2-onnx, Starlinghq/embeddinggemma-2-vision-onnx and Starlinghq/qwen3.5-0.8b-ortgenai at the revisions in ai-0.2.0.md.

Evidence

  • Release drill: the release workflow's candidate job (tools/release-drill-ai.sh --no-model) packs every package from a clean clone, checks each nuspec and the per-profile maturity statements, and installs the packages into clean consumers outside the checkout.
  • Kev: docs/evidence/kev-cuda-2026-10-17/ and the admission record. QwenChat: docs/evidence/qwenchat-onboarding-2026-10-18/ (development parity 14/14 per profile and an offline clean-consumer drill). Batching: docs/evidence/batching-sweep-2026-10-18/.
  • Gates: docs/catalog/README.md (generated), with links to docs/evidence/.
  • Regression: the qualification workflow on the release tag (CPU release gates and soaks; cuda (runpod) on the RTX 3090).

Starlings 0.2.0

Choose a tag to compare

@github-actions github-actions released this 17 Oct 21:27
e9ea3be

ai-dotnet release 0.2.0

The first release with Stable profiles, and the first ai-dotnet version without a preview suffix (docs/kickoff.md, "ai-dotnet package versions and maturity", 2026-10-15). It follows 0.1.0-preview.6 (published 2026-10-14) and carries the qualification work merged since (#16 to #97).

Publishing. The release workflow publishes this release from the tag ai-v0.2.0 on main, after a maintainer approves the release environment: the 15 packages of the publishable set below, through NuGet trusted publishing, plus a GitHub release with this record as notes.

Tokenizer. Every package that tokenizes pins Starlings.Tokenizers [0.3.0], released from starlinghq/tokenizers before this one. 0.3.0 is the code of 0.3.0-preview.1 released without a preview suffix (a stable package cannot depend on a prerelease one, NuGet NU5104); its conformance fixtures pass unchanged, so token ids, offsets and decoded text are those of the qualified 0.3.0-preview.1. The manifests' processing.tokenizer.version is 0.3.0.

Maturity. Maturity belongs to profiles, not packages: each package README has a maturity table generated from the registry manifests (model-pipeline catalog). A Stable profile passed every gate G0 to G7 on its P-030 release sets, with the maintainer recording each result (M10), and has regression support: weekly CPU qualification on hosted runners, and a GPU run on an NVIDIA GeForce RTX 3090 for every release tag (.github/workflows/qualification.yml, job cuda (runpod)). The packages stay at 0.x: the public C# API may change between minor versions; a Stable profile's contract (docs/support-policy.md, the package README's "Stable contract") does not.

Profile Maturity Promoted
gliner2-base-v1/onnx-fp32-cpu Stable 2026-10-15 (#59)
multilingual-e5-small/onnx-fp32-cpu Stable 2026-10-16 (#68)
embeddinggemma-2/onnx-fp32-cpu Stable 2026-10-16 (#68)
embeddinggemma-2/image-fp32-cpu Stable 2026-10-16 (#75)
qwen3.5-0.8b/ortgenai-fp32x-cpu Stable 2026-10-16 (#75)
multilingual-e5-small/onnx-fp32-cuda Stable (RTX 3090) 2026-10-16 (#82)
gliner2-base-v1/onnx-fp32-cuda Stable (RTX 3090) 2026-10-16 (#82)
embeddinggemma-2/onnx-fp32-cuda Stable (RTX 3090) 2026-10-16 (#82)
embeddinggemma-2/image-fp32-cuda Stable (RTX 3090) 2026-10-16 (#82)
qwen3.5-0.8b/ortgenai-fp32x-cuda Stable (RTX 3090) 2026-10-16 (#82)
qwen3.5-0.8b/ortgenai-fp16x-cuda Stable (RTX 3090) 2026-10-16 (#82)
embeddinggemma-2/video-fp32-cpu Stable 2026-10-17 (#95): hosted soak closed (#83, #86, #93); release-set G2 on AVX-512 hosts diagnosed (#89) and the token-embedding bound set from the reference's cross-CPU spread, 4e-3 (#90, maintainer)
embeddinggemma-2/video-fp32-cuda Stable (RTX 3090) 2026-10-17 (#95): green per-release runs on the RTX 3090 (39012176735, 39023915026)

Every registry profile is Stable. Stable on CUDA means Linux x64 with an RTX 3090; other GPUs are untested (EmbeddingGemma 2 video fails its bound on the RTX 4090). Windows CPU is experimental; macOS and ARM64 are untested. The catalog links every gate to its evidence, and the compatibility matrix lists each platform and provider.

Single release owner. Stable promotions carry the recorded single-owner exception (docs/support-policy.md, M7): a second release owner is still open.

Packages

All packages target net10.0, are licensed MIT OR Apache-2.0 and have SourceLink to the commit. Sibling and tokenizer dependencies are exact ([version]).

Package Version Change since 0.1.0-preview.6
Starlings.Tokenizers 0.3.0 dependency, released from starlinghq/tokenizers; same code as 0.3.0-preview.1
Starlings.Runtime.Onnx 0.2.0 a CUDA run is never terminated mid-graph: it completes, then the call throws OperationCanceledException (#61, GLiNER2 CUDA wrong output); heap trim on session release (#66); container-aware intra-op thread defaults (#63); placement capture fix (#84); EmbeddingGemma 2 CPU sessions without ONNX Runtime's CPU arena and dedicated run threads (#83, #86)
Starlings.Acquisition 0.2.0 description and README: per-profile maturity table instead of the Preview label (#56)
Starlings.Models.E5 0.2.0 Stable CPU and CUDA profiles, capability statuses and contract (#56, #82); CUDA cancellation (#61); dedicated run threads by default on CPU (#87)
Starlings.Models.E5.Extensions.AI 0.2.0 CUDA cancellation follows Runtime.Onnx (#61); maturity table (#56)
Starlings.Models.E5.MLNet 0.2.0 maturity table (#56)
Starlings.Models.Gliner2 0.2.0 Stable CPU and CUDA profiles (#56, #59, #82); per-token id memoization (#54); capability closure (#19); CUDA cancellation (#61)
Starlings.Generation.OnnxGenAI 0.2.0 container-aware intra-op thread defaults (#63); maturity table (#56)
Starlings.Models.Qwen35 0.2.0 tool calling, experimental (#17): tools rendered by the C# chat template and a parser for the tool-call format; capability closure (#19); Stable fp32x CPU, fp32x CUDA and fp16x CUDA profiles
Starlings.Models.Qwen35.Extensions.AI 0.2.0 IChatClient tool calling (AIFunction tools, FunctionCallContent, FunctionResultContent, UseFunctionInvocation) (#17)
Starlings.Models.EmbeddingGemma2 0.2.0 Stable text, image and video profiles, CPU and CUDA (#56, #68, #75, #82, #95); image and video soaks: native heap trims and reused request buffers (#93); AVX2, row- and frame-parallel image preprocessing (#55); CPU sessions without ONNX Runtime's CPU arena and dedicated run threads (#83, #86); capability closure (#19); CUDA cancellation (#61)
Starlings.Models.EmbeddingGemma2.Extensions.AI 0.2.0 CUDA cancellation follows Runtime.Onnx (#61); maturity table (#56)
Starlings.Models.EmbeddingGemma2.MLNet 0.2.0 maturity table (#56)
Starlings.Models.EmbeddingGemma2.Imaging.SkiaSharp 0.2.0 decoder capability closure (#19); maturity table (#56)
Starlings.Models.EmbeddingGemma2.Video.FFmpeg 0.2.0 first publish (D2 cleared, #48): FFmpeg 8 adapter, decoding as torchcodec does, seeking where it seeks (#41)
Starlings.Models.EmbeddingGemma2.Video.FFmpeg9 0.2.0 first publish (D2 cleared, #48): FFmpeg 9 adapter, bindings verified against the pinned n9.0.1 headers (#47, #65)

Publishable set (15 packages): every row at 0.2.0. Nothing is held (HELD is empty in .github/workflows/release.yml).

Not published: Starlings.Models.Kev (Kev-0.8B and Kev-4B decision models, Experimental, #91) is built and tested on main but is not in the release drill's package set and has no registry profile yet, so it is not part of 0.2.0. Starlings.Models.Bert and Starlings.Models.QwenChat are not published either.

ML.NET under Native AOT is unsupported (Microsoft.ML emits code at run time); every other package publishes and runs under Native AOT (docs/evidence/aot/).

Upgrading from 0.1.0-preview.6

  • Raise every Starlings.* reference to 0.2.0 together; --prerelease is no longer needed.
  • Starlings.Tokenizers moves from 0.3.0-preview.1 to 0.3.0 transitively; outputs are unchanged.
  • GLiNER2 and EmbeddingGemma 2 video on Linux need MALLOC_MMAP_THRESHOLD_=65536 in the process environment for bounded memory in long-running processes (package READMEs).

Gemma Prohibited Use Policy

EmbeddingGemma 2 weights are Apache-2.0. The model card also states:

Deployments must adhere to the Gemma Prohibited Use Policy.

The sentence appears in the description and README of Starlings.Models.EmbeddingGemma2 and of its adapter packages, and in the hosting repositories' notices.

Hosting

Unchanged since 0.1.0-preview.6. The files Starling builds are downloadable without a token, each pinned by commit and by SHA-256 in the packages' locks:

Repository Revision Files
Starlinghq/gliner2-base-v1-onnx c02c3350a0dcaf0bd6d2878043cc6a4ba950dccb GLiNER2 graph
Starlinghq/embeddinggemma-2-onnx 92a02ae2887a91180e611776dd9c286dc5fa35da EmbeddingGemma 2 text graph
Starlinghq/embeddinggemma-2-vision-onnx 1a22d40bf395c7f0a42388df72c883b661a7b3d6 EmbeddingGemma 2 vision and multimodal text graphs
Starlinghq/qwen3.5-0.8b-ortgenai 95a690c1774f144957cb7b76986a9126e8b1bb5f Qwen 3.5 GenAI builds, tokenizer, chat template

Evidence

  • Release drill: the release workflow's candidate job (tools/release-drill-ai.sh --no-model) packs every package from a clean clone, checks each nuspec and the per-profile maturity statements, and installs the packages into clean consumers outside the checkout.
  • Gates: docs/catalog/README.md (generated), with links to docs/evidence/.
  • Regression: the qualification workflow on the release tag (CPU release gates and soaks; cuda (runpod) on the RTX 3090).

Starlings 0.1.0-preview.6

Pre-release

Choose a tag to compare

@github-actions github-actions released this 14 Oct 06:50
8feb506

ai-dotnet release candidate 0.1.0-preview.6

Supersedes 0.1.0-preview.5, which was never published. The preview.5 record also contradicts itself on the tokenizer pin: its summary says every package pins Starlings.Tokenizers [0.1.0-preview.4], but the code it describes already pinned [0.3.0-preview.1]. This candidate states the actual pin and carries the production-readiness work merged since (docs/plan/production-readiness.md).

Publishing. The release workflow publishes this candidate from the tag ai-v0.1.0-preview.6 on main, after a maintainer approves the release environment: the 13 packages of the publishable set below, through NuGet trusted publishing, plus a GitHub release with this record as notes. Starlings.Tokenizers is not part of this publish; it is already on nuget.org (0.3.0-preview.1, published from starlinghq/tokenizers).

FFmpeg adapters held. Starlings.Models.EmbeddingGemma2.Video.FFmpeg (FFmpeg 8) and the new Starlings.Models.EmbeddingGemma2.Video.FFmpeg9 are built and drilled but not publishable until the legal review of the FFmpeg adapters (decision D2). Both are in HELD in .github/workflows/release.yml. No other package depends on them.

Maturity. The packages carry the Preview label (plan 14). multilingual-e5-small/onnx-fp32-cpu is the only profile at maturity preview; every other profile is experimental. No gate became passed and no maturity changed in this candidate: the new evidence below is development evidence, and recording gate results is a maintainer act (M10). The generated catalog (docs/catalog/) lists every profile's gates and what blocks Stable.

Packages

All packages target net10.0, are licensed MIT OR Apache-2.0 and have SourceLink to the commit.

Package Version Set Change since 0.1.0-preview.5
Starlings.Tokenizers 0.3.0-preview.1 dependency, already on nuget.org unchanged; every package that uses it pins [0.3.0-preview.1]
Starlings.Runtime.Onnx 0.1.0-preview.6 publishable AOT-compatible (IsAotCompatible)
Starlings.Acquisition 0.1.0-preview.6 publishable AOT-compatible
Starlings.Models.E5 0.1.0-preview.6 publishable AOT-compatible; operational tests
Starlings.Models.E5.Extensions.AI 0.1.0-preview.6 publishable AOT-compatible
Starlings.Models.E5.MLNet 0.1.0-preview.6 publishable parallel cursor-set fix for any scheduler (found on Windows)
Starlings.Models.Gliner2 0.1.0-preview.6 publishable graph hosting public; mlnet capability unsupported; AOT-compatible
Starlings.Generation.OnnxGenAI 0.1.0-preview.6 publishable AOT-compatible
Starlings.Models.Qwen35 0.1.0-preview.6 publishable hosting public (no token); AOT-compatible
Starlings.Models.Qwen35.Extensions.AI 0.1.0-preview.6 publishable AOT-compatible
Starlings.Models.EmbeddingGemma2 0.1.0-preview.6 publishable text and vision graph hosting public; AOT-compatible
Starlings.Models.EmbeddingGemma2.Extensions.AI 0.1.0-preview.6 publishable AOT-compatible
Starlings.Models.EmbeddingGemma2.MLNet 0.1.0-preview.6 publishable parallel cursor-set fix
Starlings.Models.EmbeddingGemma2.Imaging.SkiaSharp 0.1.0-preview.6 publishable (adapter) version only
Starlings.Models.EmbeddingGemma2.Video.FFmpeg 0.1.0-preview.6 held (D2) source shared with the FFmpeg 9 adapter; not-found message names each OS's library files
Starlings.Models.EmbeddingGemma2.Video.FFmpeg9 0.1.0-preview.6 held (D2) new: bindings generated from the FFmpeg n9.0.1 headers; every frame of the 22 fixture videos equal to torchcodec on FFmpeg 9.0.1 (a GPL distribution build, loaded with AllowNonLgplBuild; no LGPL FFmpeg 9 build tested)

Publishable set (13 packages): every row at 0.1.0-preview.6 except the two FFmpeg adapters.

ML.NET under Native AOT is unsupported (Microsoft.ML emits code at run time); every other package published and ran under Native AOT with results equal to JIT (docs/evidence/aot/).

Interoperability

The libraries integrate with the .NET AI ecosystem through Microsoft.Extensions.AI.Abstractions only: IEmbeddingGenerator<string, Embedding<float>> (e5, EmbeddingGemma 2), multimodal IEmbeddingGenerator (EmbeddingGemma 2) and IChatClient (Qwen 3.5). CI rejects any cloud SDK or AI provider package (Azure.*, Microsoft.Azure.*, OpenAI, Microsoft.Extensions.AI.OpenAI, .AzureAIInference, .Ollama) in any library, directly or transitively. Qwen35ChatClient rejects tools and structured output (NotSupportedException), which is the main gap for code ported from other IChatClient providers.

Gemma Prohibited Use Policy

EmbeddingGemma 2 weights are Apache-2.0. The model card also states:

Deployments must adhere to the Gemma Prohibited Use Policy.

The sentence appears in the description and README of Starlings.Models.EmbeddingGemma2 and of its adapter packages, and in the hosting repositories' notices.

Hosting

The files Starling builds are downloadable without a token since 2026-10-14, each pinned by commit and by SHA-256 in the packages' locks:

Repository Revision Files
Starlinghq/gliner2-base-v1-onnx c02c3350a0dcaf0bd6d2878043cc6a4ba950dccb GLiNER2 graph
Starlinghq/embeddinggemma-2-onnx 92a02ae2887a91180e611776dd9c286dc5fa35da EmbeddingGemma 2 text graph
Starlinghq/embeddinggemma-2-vision-onnx 1a22d40bf395c7f0a42388df72c883b661a7b3d6 EmbeddingGemma 2 vision and multimodal text graphs
Starlinghq/qwen3.5-0.8b-ortgenai 95a690c1774f144957cb7b76986a9126e8b1bb5f Qwen 3.5 GenAI builds, tokenizer, chat template

What else changed since 0.1.0-preview.5

Integrated from draft PRs #3 to #12 and #14:

Area Change
Plan docs/plan/production-readiness.md: per-model gate status, workstreams, maintainer actions (#3)
Catalog model-pipeline catalog: catalog and compatibility matrix generated from the manifests, checked in CI (#4)
Gate records G0 to G7 recorded in every manifest; G1/G2 rerun at tokenizer 0.3.0-preview.1 on CPU development fixtures, all passed with unchanged errors; GLiNER2 CUDA manifest (#6)
G3 evaluators retrieval, NER span F1 and the Qwen generation task in model-pipeline evaluate; no budgets yet (#5)
G4 Starlings.Soak.Tool and per-model operational tests (#9)
G5 GLiNER2, EmbeddingGemma 2 and Qwen benchmark harnesses on a shared core (#7)
G6 Native AOT check, ML.NET and public-hosting drill steps, Windows drill script (#10)
Qwen 85-case chat-template corpus (proposed), long-context evidence to 16,391 tokens, upstream report draft (#12)
Docs support policy, Stable contracts, maintained-update drill design, upstream change detector (#8)
EmbeddingGemma 2 FFmpeg 9 adapter, CUDA fidelity tool, long-input fixture proposal (#14)
CI Windows x64 job, weekly qualification workflow, SDK pinned exactly (rollForward: disable) (#11, #10)

Checks run for this candidate

Run on 2026-10-14: Intel i7-5820K, Linux x64, CPU only, .NET SDK 10.0.100 (pinned exactly), shared machine. The drill built commit 5204eea; the commits after it change two capability statuses (from the drill's own evidence) and documentation only. The release workflow packs and drills the tagged commit again before publishing, so the published bytes come from that run.

Check Result
tools/release-drill-ai.sh --seed-model-from <e5> --seed-gliner2-from <GLiNER2> --seed-embeddinggemma2-from <EmbeddingGemma 2> --seed-qwen35-from <Qwen fp32x> --public-hosting --aot PASS (seed, GLiNER2 run, EmbeddingGemma 2 run, Qwen3.5 run, public hosting: GLiNER2, EmbeddingGemma 2, Qwen 3.5, AOT check). rc-drill.log
Drill: packing and consumers 15 packages packed from a clean clone with locked restore and an empty package cache; nuspecs and exact dependencies checked (Starlings.Tokenizers [0.3.0-preview.1]); consumers outside the checkout restored only the packed packages and nuget.org's tokenizer.
Drill: public hosting (no token, no seed, empty cache) GLiNER2 graph (829,284,599 bytes), EmbeddingGemma 2 text graph (1,084,327,317 bytes) and the Qwen 3.5 fp32x bundle (3,077,177,344-byte data file) downloaded anonymously, every SHA-256 verified, each sample then ran offline: GLiNER2 expected entities; EmbeddingGemma 2 expected top document 4/4 and Matryoshka 256 same top 4/4; Qwen 3.5 answered and stopped at `<
Drill: Native AOT Every core and Extensions.AI package: 0 trim or AOT warnings, AOT output equal to JIT (max abs 0). ML.NET adapters: AOT unsupported, as expected. The EmbeddingGemma 2 core-only AOT target was skipped for a missing seed file; its Extensions.AI target ran and matched.
dotnet test --solution ai-dotnet/AI.slnx -c Release --max-parallel-test-modules 2, model weights present 1,031 tests: 988 passed, 43 skipped, 0 failed. Skips: 39 video and image fixture tests (no FFmpeg libraries or fixture media on this machine) and 4 opt-in network tests.
model-pipeline: pytest, ruff check, ruff format, validate registry, catalog --check 539 passed; clean; 142 files formatted; 13 manifests valid; catalog up to date
tools/check-boundary.py ok
CI library dependency boundaries, including the new vendor-neutral rule no library lock file contains a cloud SDK or AI provider package

Not run for this candidate: CUDA of any kind; Windows beyond CI; model-pipeline evaluate against P-030 release sets (none exist yet); the one-hour soak.

Known issues

  • Qwen 3.5 on CPU, unchunked prefill. By default a request computes the whole prompt in one native call: it cannot be cancelled until that cal...
Read more