Skip to content

v0.9.0 — which backend produced a vector

Choose a tag to compare

@Cloto-dev Cloto-dev released this 01 Oct 23:30
· 5 commits to main since this release

Feature release. A caller that stores vectors comes back later to ask whether a stored one may still be compared with a fresh one. Over /embed it cannot tell: the request carries texts and the server picks the model, so the model's name never crosses the wire, and a client that falls back to a configured name reads two different models as one. That includes two precisions of one model, which return different vectors through the same tokenizer. 0.9.0 lets the server say what actually ran. Nothing changes for a caller who does not ask.

The report

GET /capabilities
Response: { "identity":    { "provider": ..., "model": ..., "dimensions": <int>,
                             "window": <int>, "pooling": ..., "normalized": <bool>,
                             "digests": { "graph": ..., "tokenizer": ..., "weights": ... } },
            "incomplete":  [ ... ],
            "fingerprint": "1:<hex>" | null }
  • fingerprint is the one value to store beside a vector. Two vectors may be compared when their fingerprints are equal.
  • It covers everything that moves the numbers: the files the provider actually opened (graph, tokenizer, and for jina-v5-nano its external weights, since that graph is a stub), the width, the truncation window, the pooling, normalization, and the provider.
  • When a component cannot be established, incomplete names it and fingerprint is null — never a fingerprint over the part that was known. api_openai and mlx_bge_m3 land there, because the files that would be hashed are not this process's to read.
  • null means unknown, not unchanged. A caller that receives it should keep whatever it did before this endpoint existed.
  • The route sits behind the same bearer middleware as the other REST endpoints.

Verified end to end on jina-v5-nano: a complete identity with a fingerprint; with CEMBEDDING_AUTH_TOKEN set, 401 without the token or with a wrong one and 200 with it; and a client pointed at a server without the route reads the 404 as unknown.

Cost

Digests are computed once per file state, off the event loop, and cached, so the size of a model graph is read once per restart. /embed is untouched.

Compatibility

Additive. No existing route or response changed. A client should treat a missing /capabilities (404 from an older server) as unknown.

34 regression tests.