ExtensionsAI onnxembeddinggenerator generateasync - CyrilB1531/lodestar GitHub Wiki

Development build. This page describes main, not a released package. The latest published Lodestar.Extensions.AI is 0.1.1 — read its documentation.

Home › ExtensionsAI › Embedding generation

OnnxEmbeddingGenerator.GenerateAsync

Embeds each text into one normalized vector.

public Task<GeneratedEmbeddings<Embedding<float>>> GenerateAsync(IEnumerable<string> values, EmbeddingGenerationOptions options = null, CancellationToken cancellationToken = default)

Parameters — values are the texts to embed. options carries the request a Microsoft.Extensions.AI caller makes; only Dimensions is read, and see the remarks for what that means. cancellationToken abandons the run.

Returns — a GeneratedEmbeddings<Embedding<float>> holding one embedding per input, in input order. Each is what OnnxTextEmbedder.EmbedBatch returned for that text — mean-pooled and L2 normalized — with nothing added to the vector. Each carries ModelId, the identifier the generator was built with (null if none was given), and CreatedAt, one UTC timestamp taken when the batch finished, as Microsoft.Extensions.AI's own OpenAI generator fills them.

Exceptions — every one of these comes back in the returned task, never from the call itself. ArgumentNullException when values is null. ArgumentException when options asks for a dimension the loaded model does not produce, or when the encoder refuses a text in values — as it refuses one over its MaxLength under TruncationStrategy.None — naming values (#1345). OperationCanceledException when cancellationToken is already cancelled, or is cancelled between sub-batches — it is the batch path underneath that observes it, so the point at which it fires is that path's, not this one's. ObjectDisposedException after OnnxEmbeddingGenerator.Dispose.

Example — driving it from a synchronous entry point.

using Lodestar.Embeddings.Persistence;
using Lodestar.Embeddings.Tokenization;
using Lodestar.Extensions.AI;
using Lodestar.Onnx;
using Microsoft.Extensions.AI;

async Task<int> EmbedAsync()
{
    var tokenizer = new WordPieceTokenizer(VocabTxtLoader.Load("vocab.txt"));

    using IEmbeddingGenerator<string, Embedding<float>> generator = new OnnxEmbeddingGenerator(
        new OnnxTextEmbedder("model.onnx", tokenizer), new BatchEncoder(tokenizer));

    GeneratedEmbeddings<Embedding<float>> vectors =
        await generator.GenerateAsync(["a first sentence", "a second one"]);

    return vectors[0].Dimensions;
}

int width = EmbedAsync().GetAwaiter().GetResult();

The GetAwaiter().GetResult() is only what lets a synchronous example drive an async one; in your own code, await it.

Remarks — the task is already completed when it comes back. The model runs in this process, so the work happens on the calling thread and there is nothing to wait for. That is the honest shape: an implementation that posted the same CPU to the thread pool would return a task the caller could await without the machine doing less. A failure completes it too — faulted, or cancelled when cancellationToken was — rather than throwing from the call, which is where Microsoft.Extensions.AI's own generators put it: theirs are async methods, so even their null checks reach the caller through the task.

Dimensions is checked, not honoured. An ONNX model's output width is fixed at export, so a different width cannot be produced; asking for one the model does not produce is refused rather than silently ignored. The check only fires when the model declares a fixed output axis — most exports declare a symbolic one, and there the request is left alone, because refusing it would mean guessing.

ModelId is not read. It selects among the models a service hosts, and this generator holds exactly one — the file its embedder was opened on.

Applies to — net10.0, netstandard2.0.

See also — OnnxEmbeddingGenerator, OnnxEmbeddingGenerator.GetService.

⚠️ **GitHub.com Fallback** ⚠️