Skip to content

v0.99.0

Choose a tag to compare

@github-actions github-actions released this 15 Oct 22:50

Changed

  • Breaking: the PostgreSQL, plain SQLite and in-memory vector stores refuse a model other than the one their vectors
    were written with.
    VectorStoreBase now implements BindIdentity/BoundIdentity: binding a different identity on
    the same instance throws EmbeddingModelMismatchException, and the PostgreSQL and SQLite stores record the identity in
    a fluxindex_vector_identity table (created on first use) and compare it at the next write or search — so a later
    request scope (both stores are registered Scoped) or process bound to another model is refused instead of mixing two
    models' vectors in one table. A store that holds vectors but no record (written before this release) adopts the bound
    identity with a warning; ClearAsync removes the record. A custom VectorStoreBase store gets the in-instance check
    and can persist the record by overriding ReadRecordedIdentityAsync / WriteRecordedIdentityAsync /
    ForgetRecordedIdentityAsync. EmbeddingIdentityRecord (Core) is the shared record format. BindIdentity(null)
    throws ArgumentNullException: a test double for IEmbeddingService used with one of these stores (directly, or through
    a pipeline that binds the pair, as FluxFeed does) must return an identity from GetIdentity().

Documentation

  • The README states the SQLite stores' measured search latency: full scan p50 6.6 s vs sqlite-vec 45 ms over 43,293
    vectors (identical top 10), with the guidance to use sqlite-vec past a few thousand chunks.

Fixed

  • Breaking: a Qdrant collection named without the model refuses a switched model after a restart too. With
    CollectionNamingStrategy.Fixed, the store records the bound embedding identity (provider, model, dimension, revision)
    in the collection metadata and compares it when a later instance — another process, a restart — binds an identity:
    a different one throws EmbeddingModelMismatchException instead of storing and searching vectors of two models in
    one collection. A collection that holds points but no record (written before this release) adopts the bound identity
    with a warning; recording leaves the collection's other settings (quantization) as they are. ModelFingerprint
    collections already carry the model in their name and are unchanged. A Qdrant server that keeps no collection metadata
    falls back to the in-process check.
  • Breaking: QdrantVectorStore.ClearAsync clears the store's collection on a new instance too. It used to return
    without deleting anything until the instance had stored or searched once, so a startup clear (a reset command, a test
    fixture) left the data an earlier process wrote. It now clears the collection the naming strategy names — the base name
    (Fixed), or the base name plus the bound identity's fingerprint (ModelFingerprint) — and a missing collection is
    nothing to clear. With ModelFingerprint, no bound identity and nothing resolved yet it throws
    InvalidOperationException instead of guessing; a failed delete now propagates instead of being logged and treated as
    done. Migration: bind the identity before clearing a ModelFingerprint store directly, and handle the delete failure
    where you call it.

Dependencies

  • Re-pinned sibling package(s) FileFlux 0.63.1 -> 0.64.0, FluxCurator 0.15.0 -> 0.16.0.
  • Re-pinned sibling package(s) FileFlux 0.64.0 -> 0.65.0.