All notable changes to dynavec are documented here. This project adheres to Semantic Versioning.
Concurrency and scale: a native async client, a lexical/hybrid retrieval path, per-document TTL, a new framework connector, and a graph data-loss fix.
- Native async client (#270) —
AsyncDynavecoffersasync/awaitupsert/search/get/deletebuilt on non-blocking I/O, so agent and web workloads can fan out concurrent calls without thread pools. - BM25 lexical retriever + dense hybrid fusion (#233, #264) —
BM25Retrieverfor pure lexical search andBM25HybridRetriever/db.hybrid_search()combining dense ANN and sparse BM25 via Reciprocal Rank Fusion, with tunabledense_weight/sparse_weight. - Per-document TTL + automatic table provisioning (#22) — pass
ttl_seconds=toupsert()/update()for DynamoDB-native expiry; the TTL attribute is provisioned automatically. - Semantic Kernel vector store connector (#69) —
DynavecStore/DynavecCollectionimplementing Microsoft Semantic Kernel'sVectorStoreinterface, including lambda-filter translation to the S3 Vectors dialect. search_many()(#258) — run several queries concurrently against a namespace in one call.- Optimistic concurrency on
update()(#24) — each update stores aversionon the DynamoDB item and writes with aConditionExpression, so a concurrent change raisesConflictError(nothing written) instead of being silently overwritten. Passexpected_version=to guard across your own read/update cycle;UpsertResult.versionreturns the new version. Plainupsert()stays last-writer-wins and resets the version. - Weighted graph edge properties (#268) —
add_edge()acceptsweightandprops, stored on the edge and surfaced through graph traversal. - Client-side rate limiting (#262) — opt-in token-bucket throttling of outbound AWS calls to stay under account limits.
update()now writes DynamoDB before S3 Vectors (previously in parallel) so a conflict leaves both stores untouched, and reads the document with a strongly consistentGetItem.- Parallelized
put_vectors(#259) — S3 Vectors writes fan out across batches with a thread pool for higher ingest throughput. - Strict mypy now runs in CI (#207) and the package ships type hints throughout.
- Graph node metadata preservation (#271) —
add_edge()/link_docs()no longer wipe an existing node'sntypeandprops; unspecified attributes are preserved viaif_not_exists, while explicit values still overwrite (#272). - Markdown front-matter date normalization on ingest (#253).
- Cross-encoder reranker type-narrowing fix (#254).
A large release: new retrieval strategies, quantization methods, graph and cache capabilities, more integrations, and quality-of-life tooling.
- Query-expansion retrievers (#215) —
MultiQueryRetriever(concurrent reformulation search + RRF) andHyDERetriever(hypothetical-document embeddings; average / fuse strategies). - Learned RRF fusion weights (#204, #223) —
RRFWeightFitterfits per-retriever RRF weights by maximizing nDCG (grid / random / optional Bayesian), withFitResultsave/load. - Optimized Product Quantization (#198) —
OPQRotation+OptimizedProductQuantizer(rotate-then-PQ with Procrustes refinement); ScalarQuantizer INT8 (#201). - Cross-encoder reranking (#208).
- Hybrid graph + ANN search (#206) —
hybrid_graph_searchfuses ANN and graph-scoped results with weighted RRF; graph shortest path (#237); graph node/edge deletion (#209). search().explain()debug output — per-stage timing and candidate counts (#228).- Query-cache invalidation on write (#236) —
invalidate(namespace)across backends,cache_invalidate_on_writeconfig;warm_cache()to pre-populate the cache (#194); optional embedding cache (CachedEmbedder, #213). - Client
describe()returningIndexInfodiagnostics (#218);dynavec --version(#238). - CLI namespace export/import to/from JSONL (#217).
- Ingestion:
CsvSource+ row-wise spreadsheets (#205);S3Sourcebucket ingestion (#61). - Hot-tier LRU/FIFO eviction policy (#216).
- DynamoDB: gzip-compress large text before storing (#231); item-size validation (#211).
- Integrations: OpenAI Assistants file-search tool (#73), LlamaIndex metadata-filter translation (#219), Strands retriever example, multi-tenant RAG example/docs.
- Embeddings: OpenAI retry with
Retry-Afterhandling (#242); dimension > 4096 warning (#241). - Eval: retrieval-quality run trend tracking (#212).
- Site: landing-page revamp + interactive cost calculator (#104).
XlsxSourcenow yields one record per row (header →"column: value"), not per worksheet (#205). Behavior change vs 0.5.0.max_workersis validated eagerly in config (#250).
- Office document ingestion (#188) —
DocxSource,PptxSource, andXlsxSourcefor Word, PowerPoint, and Excel files, each lazy-importing its parser. - Hugging Face Inference embedder (#191) —
HFInferenceEmbedderbacked by the HF Serverless Inference API. - DSPy retrieval integration (#195) —
DynavecRM(dspy.Retrieve)so a dynavec client can back a DSPy pipeline (closes #68). - Structured logging (#200) — opt-in
structured_logging=Trueemits JSON store events with secret redaction;log_levelconfig. - ProductQuantizer persistence (#199) —
save()/load()vianp.savezwithallow_pickle=False(safe serialization). - Dashboard dark mode (#187) — theme toggle + parity with the landing page.
- Vectorized MMR (#197) — reranking over large candidate sets is now O(k·N) instead of O(k·N·k).
- Property-based tests for the metric layer via Hypothesis (#192), plus rescore metric-override coverage (#196).
- In-memory hot tier (#186) — opt-in
hot_tier=Truekeeps the hot working set in RAM via the built-inSPFreshHotIndex. Afterdb.warm(namespace), a namespace is served entirely from memory — no S3 Vectors query and no DynamoDB hydration — for in-memory-engine latency without a paid cluster. Write-through on upsert/update/delete keeps it current; filters, rescore, and MMR run on the hot path; non-authoritative namespaces fall back to S3 safely. New:warm(),hot_stats(), andhot_tier*config. - Retrieval quality runner (#185) — recall@k, MRR, and nDCG@k evaluation.
- Async LangChain retrieval (#183) —
asimilarity_search/asimilarity_search_with_score/amax_marginal_relevance_search, so the retrieverainvoke()path runs on an owned async surface (closes #70). - Graph export (#182) —
graph_export()to Mermaid and Graphviz DOT. - Ollama local embedder (#180) and URL ingestion source (#181).
- Markdown directory ingestion (#174) and DynamoDB cache TTL jitter (#145).
- Async embeddings —
aembed_documents/aembed_queryon every backend, offloading sync clients to threads viaasyncio.to_thread(#172). - New embedding backends — Mistral (#152), Voyage AI (#149), and Bedrock Titan multimodal image embeddings (#173).
- SPFresh hot-tier — incremental hot-index rebalancing for freshly upserted vectors (#170).
- PDF ingestion source for the document pipeline (#169).
- FastMCP server exposing semantic and graph search as MCP tools (#165).
- Observability — native telemetry recorder + a stdlib dashboard on real
query data, plus a full Next.js + TypeScript + Tailwind + Recharts dashboard
under
dashboard/. max_pool_connectionsconfig, threaded into every boto3 client for high-concurrency workloads (#175).list_vectorsmaintenance iterator for the S3 Vectors store (#166).- Optional score normalization on search results (#147).
- Cache
hits/missescounters and astats()method on cache backends (#121). - AWS doctor command for diagnosing credentials/permissions (#144).
- Ingestion chunk deduplication by content hash (#120).
py.typedmarker — dynavec now ships as a typed package (#154).- Docs: FAQ, S3 Vectors regional availability matrix, embedding-dimension guide, IAM setup guide; pre-commit config + contributing guide (#160).
- Semantic cache is now bounded by bytes rather than entry count (#146).
- Escape structured-storage key components to avoid namespace/id collisions (#140).
- Drain
QueryVectorspages fully and add apage_sizecontrol (#151). - Pin
crewaiaway from the yanked 1.14.0 release (#161). - Resolve optional dependencies correctly on Python 3.9 (#1).
- Initial public release: hybrid DynamoDB + Amazon S3 Vectors store, pluggable embedders, namespace RAG, product quantization, RRF fusion, MMR rerank, GraphRAG layer, caching backends, framework adapters, and provisioning.