NEWVectors or files. Pick a path.Start →

    Changelog

    Release Notes

    New capabilities and performance improvements across the Mixpeek platform. Every entry links to relevant documentation and examples.

    November 2026

    APIFeature

    Build one retriever-made collection per brand, team or customer with trigger inputs

    POST /v1/collections/{id}/trigger accepts inputs for a collection built by a retriever transform, and every stage reads them as INPUT.*, the same as an execute request. One view definition can then build a slice per scope: trigger it once per brand with that brand's inputs and source_filters, and a composite unique_id_field keeps a row per brand and source document. Inputs are checked against the retriever's input_schema before any batch starts (a missing required input is a 422, an unknown key a 400), omitted inputs take their schema defaults, and dedup_strategy "replace" is refused with inputs because two scopes can share a source document. Scheduled collection_trigger actions take the same field. When the retriever requires an input, a rebuild that starts without one, such as the one that follows an upstream ingest, now fails its job and writes nothing. Triggers without inputs behave as before.

    APIFeature

    attribute_filter stays after the stage that writes the field it reads

    The retriever optimizer moves filters earlier to save work. It used to move an attribute_filter ahead of a stage that writes the field the filter reads, for example feature_search, then code_execution writing match.x, then a filter on match.x. The filter saw documents without that field and the retriever returned nothing, with only a warning. A filter now stays after the last stage that writes any field it reads, and stages that add fields they can't name in advance, such as taxonomy_enrich, keep every filter after them. Filters on other fields still move ahead.

    APIFeature

    Omitted retriever inputs take their schema default in per-document templates

    A template that reads both INPUT and DOC, such as {{ INPUT.label }} beside {{ DOC.document_id }} in json_transform, rendered null for an input the request left out, even when input_schema gave it a default. The retriever now fills in schema defaults once, right after it validates the request, so every stage sees the same values. Inputs without a default still read as absent to on_empty and run_if.

    APIFeature

    feature_search names a search arm that failed in degraded

    When one arm of a multi-arm feature_search could not embed its query, the search logged a warning and left the degraded list empty, so if the other arms found nothing the response looked like an ordinary no-match. Each dropped arm now has its own entry in degraded with the error that stopped it.

    Vector StoreFeature

    A query the vector store refuses fails on its own and leaves the shard serving

    The circuit breaker in front of each vector store shard opens after five failures in 30 seconds and then refuses every request to that shard. It counted requests the shard turned down on purpose, such as a facet on a field with no keyword index past the 200,000-document scan limit, so a few of those from one caller could make the shard unavailable to everyone else. A refusal like that now fails only the request that caused it. A shard that can't serve still opens the breaker.

    APIFeature

    Retriever evaluations report metrics for every query, and can grade at a multiple of R

    Each entry in an evaluation's query_results now carries its own metrics, with the same keys as overall_metrics, and the number of relevant documents for that query. Set evaluation_config.k_multiples_of_relevant to [1, 2] and every query is also graded at k = R and k = 2R, where R is its own relevant count, reported as f1_at_1r, f2_at_2r and metrics_by_k["2r"]. One dataset and one run now give F1 at R and F2 at 2R together. The list route leaves per-query metrics out so a page of runs stays small, and runs without the new field return the same keys as before.

    Evaluations
    StudioFeature

    Star a namespace to pin it to the top of the list

    Namespaces have a starred field you can set on create or PATCH. It is free, shared across your organization, and starred namespaces come first in every list with no sort, across pages and in search. In Studio, Pin to top in the table and grid menus and the pin button in the header switcher now set it, so a pin follows you to every browser and teammate. Inside each group, a list with no sort is newest first.

    APIPerformance

    feature_search can read only the fields you need from each hit

    A deep candidate pool used to return every hit in full, and read it again during hydration. The optional select_fields parameter on feature_search returns only the fields you list. In our test with a 5,000-document pool, the search answer fell from 2,271 KB to 233 KB and the retriever call from about 6.2 s to 2.4 s. Include every field a later stage filters or sorts on, since a field you leave out is missing for those stages. Without the parameter nothing changes.

    APIFeature

    agent_search sees what each field means before it filters on it

    The namespace map an agent_search agent reads now includes the field descriptions from your bucket schema, so the agent can tell a field it should filter, group or sort on from one with a similar name. Every string from your data in the map is escaped and fenced as data, so a field name or value cannot read as an instruction. Large namespaces share a fixed budget, and the map says how many descriptions it showed and skipped.

    APIFeature

    Custom plugins with several vector indexes embed queries for the right one

    A plugin can serve more than one vector index from one realtime service, such as a visual vector and a text vector on the same shot. feature_search now passes parameters.vector_index on each query embed request so the service can pick the model, and the query embedding cache is keyed by index. Before this, the second index of a plugin could be served the first index's cached vector. Built-in extractors are unchanged.

    APIFeature

    llm_enrich returns nothing when the search before it found nothing

    When an earlier stage returned no documents, llm_enrich used to treat the request as a fresh question and return a model answer with no evidence, as a document scored 1.0. It now returns no documents, makes no model call and adds a warning, the same way query_expand and feature_search handle an empty input. llm_enrich as the first stage still answers the query.

    APIFeature

    A document the NSFW classifier could not score reads as unscored

    classify with task nsfw stored is_nsfw false when the model call failed, returned nothing, or got a video with no frames. Those documents now get null for is_nsfw, nsfw_score and label, the response counts them in documents_unscored and is marked degraded with the reason. drop_if_unsafe refuses an unscored document, and the upload gate follows the fail-open or fail-closed setting your organization chose.

    APIFeature

    Rerank and MMR say which field ordered the results

    After a rerank, documents[].score keeps the retrieval value, so it does not follow the page order. Rerank and MMR now put ordered_by in their stage metadata, as the attribute and relevance stages already do. score_normalize warns when the field it normalizes is out of order on the incoming documents. score keeps its value, so thresholds you filter on do not move.

    rerank stage
    APIFeature

    A streamed retriever execution says which consistency served it

    The execution_complete event of a streamed execute now carries consistency_mode, with the value the JSON response gives, so a streaming caller can tell a strong read from an eventual one. Other events leave it null. A stream on a collection that has been deleted now names the collection in its error, as execute does.

    Retrievers
    APIFeature

    Getting one document resolves ?expand= on metadata fields

    GET on a single document now resolves ?expand=metadata.<field>, as the collection list route already did. A document stored with metadata at the root now returns that metadata on GET. The parent and ancestors keywords also resolve documents whose ids do not start with doc_, such as directly upserted ones.

    APIFeature

    Syncs and webhooks keep one object per source file

    A repeated or concurrent create for the same source file, or a bucket sync racing an Iconik webhook, could leave two or three live objects for one file. Single and bulk creates now claim the source first, and the sync and the webhook wait for each other, so the second finds the object the first made. A replace whose delete fails now fails that file instead of adding a second object.

    Iconik

    Run the latest on your own files

    Everything above is live. Point Mixpeek at the storage you already have and search your video, images, audio, and documents through one API. Build starts at $25/mo for up to 1M vectors.