Skip to content

Suprnova v4.3.0

Choose a tag to compare

@eas4ai eas4ai released this 18 Oct 12:13
· 469 commits to main since this release

Added

  • Searchable models can declare ordered media parts. Path fields name an
    image, audio or video kind and a storage disk. Indexing loads bounded parts
    through Storage. Boot and settings sync reject incompatible model profiles.
  • EmbeddingGemma 2 can embed images, audio and video locally. The media
    profile verifies both encoder graphs and their weights with the text model.
    Rust processors prepare image patches and WAV log-mel features. Video uses
    a host ffmpeg binary with a timeout. Reference fixtures run without ONNX.
  • A knowledge-graph recommender ranks from your own events and relations.
    RECOMMEND_ENGINE=graph selects it. A queued rebuild derives a graph of
    shared engagement (stored only where RECOMMEND_MIN_PEERS actors agree),
    public engagement for the types RECOMMEND_PUBLIC_EVENT_TYPES lists, and
    relations declared with Recommend::graph_relation. Reads authorize every
    node and edge first, blend graph paths, stored vectors, followed actors'
    agreement, freshness, negatives and trust risk per surface with diversity
    caps, cite the evidence each row rests on, and answer with the starter's
    rows when the graph's support is thin.
  • The graph lives in your database or in Memgraph. The GraphStore trait
    ships a database store and, behind the graph-memgraph feature, a
    memgraph store over Bolt. recommendations:graph-rebuild rebuilds the
    graph into a new generation and switches readers when it completes.
  • Search engines recommend and discover from their stored vectors.
    SearchEngine gains stored_vectors, recommend and discover; Qdrant
    answers the latter two natively, and the database and collection engines
    fold their stored vectors. Recommend::discover steers a discover query by
    the viewer's own events. SearchEngine::stored_keys reports which documents
    a generation holds, so the graph engine leaves out a document that left its
    index; every shipped engine implements it, and a custom engine needs it to
    serve the graph engine.

Changed

  • Recommendation, search and explanation structs carry new fields. RecommendConfig gains the graph settings and
    min_peers, SearchConfig gains media_max_bytes, IndexTimeSettings
    gains embed_media, and RecommendationExplanation gains engine,
    evidence and fallback_reason. Code that builds one of them field by
    field without ..Default::default() no longer compiles.

Fixed

  • A starter suggestion stands on at least three peers. The starter engine kept a
    collaborative candidate a single peer contributed, and its explanation
    showed a peer count of 1 beside the shared item, which points at that
    person; the candidate was one of their own views or purchases.
    Recommend::for_user and Recommend::similar_to now count a collaborative
    candidate only when RECOMMEND_MIN_PEERS distinct peers contribute it,
    default 3. With fewer, it can still arrive through the affinity, popularity
    or recent tier, which names no peers.
  • A model without updated_at keeps a search version per row. A searchable model without
    updated_at carried version 0 in every document, so a recommendation event
    or a graph fact could not tell one revision of the row from the next. Each
    save now raises a version kept in the new search_source_versions table, in
    the save's own transaction, and Eloquent loads the kept versions with the
    rows, so to_search_document() returns the row's version without a query of
    its own. Run your migrations: the table comes with
    suprnova::search::migrations().
  • A local embedding model keeps its memory bounded on long documents. The fastembed
    provider padded every text in a batch to the batch's longest, and attention
    memory grows with the square of that length, so one long document among
    short ones could take a single inference call past 24 GB. It now measures
    each text with the model's own tokenizer and batches texts of similar
    length: SEARCH_EMBED_BATCH counts texts of 512 tokens, a longer text takes
    the room of several by the square of its length, and a text longer than
    that runs alone.