candding

Comparison

Where candding sits next to fastembed, fastembed-rs, EmbedAnything, text-embeddings-inference, candle-transformers and hosted embedding APIs.

candding optimises for one situation: a Rust program that needs embeddings in its own process, with no runtime to install beyond the crate itself, numbers that provably match the reference implementation, and a GPU path that is the same code as the CPU path. Everything follows from that. There is no ONNX runtime to ship, no server to operate, no Python in the loop, and no second implementation of a model for the accelerator. The cost is model coverage: the families arrive one phase at a time, each with its own reference vectors.

ProjectRuntimeLanguageBackendsHow models are validatedModel surfaceServing
canddingcandle, in-processRustCPU, Metal, CUDA from one code pathgolden vectors against sentence-transformers, cosine ≥ 0.9999 and max-abs ≤ 1e-4 on CPU F32, plus CPU-to-accelerator parity at 0.999the catalog today: BERT-family dense models, with Qwen3-Embedding and EmbeddingGemma nextnone, you embed in your own process
fastembed (Python)onnxruntimePythonCPU and CUDA execution providerscanonical-vector tests on the first five dimensions at 1e-3dense, sparse, late interaction, rerankers, imagesnone, in-process library
fastembed-rsonnxruntime through the ort crateRustonnxruntime execution providersnone, in-process library
EmbedAnythingcandle through candle-transformers, onnxruntime behind an optional featureRust, with Python bindingsCPU, CUDA, Metal through cargo featuresdense, SPLADE, ColBERT, ColPali, CLIP, Whisper audio, rerankersnone, an in-process library that also ingests files, chunks them and writes to vector databases
text-embeddings-inferencecandleRust, reached over HTTPCPU, Metal, CUDAsnapshot tests at cosine 0.999a server, as a Docker image or a binary
candle-transformers examplescandleRustCPU, Metal, CUDA through candle's featuresa handful of embedding modelsnone, example programs rather than a library API
hosted embedding APIsthe provider'sany HTTP clientthe provider's hardwarethe provider's catalogthe provider's endpoint, priced per token

A dash means this page has no verified number or claim for that cell, not that the project has nothing there. The two numbers worth reading side by side are the validation ones: candding asserts a cosine of at least 0.9999 against sentence-transformers over the whole vector and repeats it for every catalog model, where a canonical-vector check covers the first five dimensions at 1e-3. The testing page lists every assertion and the tolerance for each backend and dtype.

The other structural difference is the runtime. An ONNX-based library needs an exported graph per model and an onnxruntime build per platform, which is why its GPU support is a matter of execution providers rather than of the model code. candding implements the architecture in Rust on candle primitives, so a new backend is a candle feature and the model code does not move; the devices and dtypes page shows the one function where a backend is checked at all.

When to pick something else

  • Your stack is Python: use fastembed. It has the wider model list today, and candding has no Python bindings and no plans for them.
  • Several services need the same embeddings: use text-embeddings-inference. A shared HTTP endpoint gives you one place to load the weights, batch across callers and roll a model forward, none of which an in-process library can do for you.
  • You want the whole ingestion path in one crate: use EmbedAnything. It chunks PDFs, markdown and audio, embeds them on candle or onnxruntime and writes to a vector database; candding stops at the vector and leaves chunking and storage to your code.
  • You need a model candding does not have yet: check the roadmap for the phase it belongs to, and the porting guide if you would rather add it than wait. A family lands with golden references and parity tests, so a port is a checklist with a pass or fail at the end of it.

On this page