Query the past
Every record carries a version interval. Query the index as it existed at any past moment (for audit, reproducible evaluation, or retrieval regression debugging).
RAG with time travel
Vector memory for data that changes


See the support and maturity matrix for the recommended production path, binding status, and compatibility policy.
pip install chronovecBuilding from source requires a C++20 compiler and CMake (
pip install .handles that automatically).
See the Chroma migration guide for the quickest path from a familiar vector-store API to versioned local memory.
Run the offline agent-memory demo:
pip install chronovec
python examples/agent_memory.pyIt retries a mistaken memory update on an isolated branch, merges the corrected result, and keeps the original timeline queryable. For mutable RAG with document corrections, see the RAG with history guide.
For graph-based candidate evaluation, install the optional LangGraph adapter and run python examples/langgraph_branching_memory.py. See the LangGraph integration guide for the branch lifecycle and checkpointing contract.
For tree-search agents, run python examples/lats_chronovec.py: a worked pattern (not a packaged integration) where every explored Language Agent Tree Search trajectory gets its own live branch delta, so nodes can be revisited and scored without rebuilding state, and only the winning trajectory is merged. See the tree-search agents guide.
from chronovec import Collection
col = Collection(dimensions=384, embedding_function=my_embed)
# Add with text: embedding happens automatically
col.add(ids=["a", "b"],
documents=["the user prefers dark mode", "meeting at 3pm Friday"],
metadatas=[{"kind": "pref"}, {"kind": "event"}])
# Query by text or by vector
results = col.query(query_text="appearance settings", k=3)
# Take a snapshot before a correction
t = col.snapshot()
col.add(ids=["a"], documents=["the user prefers light mode"])
# Travel back: "a" still says dark mode here
old = col.query(query_text="appearance settings", k=1, snapshot=t)from chronovec import AgentMemory
mem = AgentMemory(384)
mem.add("fact-1", embedding, text="user writes Python")
# Speculate on a branch
guess = mem.branch("hypothesis")
guess.add("guess-1", other_embedding, text="user might prefer TypeScript")
guess.search(query) # sees both
mem.search(query) # never saw the speculation
guess.discard() # abandon speculation; purge later at a safe horizon