Releases: vn-envy/Smriti
Release list
v0.3.0 — Hardening
Production seatbelts, zero new dependencies. The dependency surface is still the Python stdlib + numpy; the core is still one SQLite file you can read in a sitting.
Durability & correctness
WAL journal mode + busy_timeout + synchronous=NORMAL: readers proceed during writes, crashes recover cleanly, concurrent connections wait instead of erroring.
Idempotent ingestion: replaying an identical (messages, timestamp, session) is a no-op — add() returns {"deduped": True}. Double-ingested sessions can't corrupt counts. dedupe=False to force.
Unicode lexical search: non-Latin scripts (Devanagari, CJK, Cyrillic) now reach FTS5's tokenizer instead of being stripped by an ASCII-only regex. मैं बेंगलुरु में रहता हूँ is now findable by BM25, not just vectors.
Data ownership
Owner-initiated erasure — erase_session() / erase_entity() cascade across episodes, facts, FTS rows, entity links, embeddings, and dangling supersession pointers. Deliberately distinct from supersession (correction is history; erasure is ownership), and deliberately not exposed via MCP — untrusted conversation content can never talk an agent into deleting its own memory.
Lossless export/import — export_json() / import_json() round-trip everything including embeddings (base64) and supersession chains. Backup, restore, migrate, leave.
Opt-in secret redaction — Smriti(redact=True) scrubs credential-shaped strings (API keys, tokens, passwords) before anything is persisted or sent to an extraction model.
Entity aliases (canonicalization v1)
add_alias("Rachel Smith", "Rachel") — write-time canonicalization (new facts consolidate under the canonical entity) + read-time resolution (queries mentioning the alias reach it) + chain flattening. Conservative by design: nothing merges unless the owner says so.
Testing
+22 regression tests: contradictions, knowledge updates, date formats, aliases, multilingual content, noisy haystacks, idempotency, erasure cascades, export round-trips, WAL durability. 74 offline tests total — no network, no keys.
v0.2.0 — Agile retrieval / drishti (2026-07-15)
Retrieval profiles (drishti, दृष्टि — "way of seeing"): named, per-query retrieval policies — facts (current-state precision), relations (2-hop entity + semantic linking), timeline (date-anchored), deep (high-recall aggregation), auto (zero-token router). Every built-in profile carries an evidence field citing the A/B that justified it.
Switchable channels: the four channels (lexical / semantic / entity / temporal — Sanskrit aliases accepted) are individually maskable per call; a lexical-only call skips the query embedding entirely.
Profile-aware MCP tools: recall and search take profile and channels, so agents shape retrieval with one enum per call.
Legacy default path byte-identical to 0.1.0 — existing A/B evidence still describes default behavior.
CI workflow, CITATION.cff, README overhaul, landing site (smriti-memory.netlify.app).
v0.1.0 — Initial release
Bi-temporal fact store with supersession (badha) — facts invalidated, never deleted; validity windows printed into the packed context.
Four-channel hybrid retrieval fused with RRF: BM25 (FTS5), vectors (numpy), entity-hop (graph-lite), temporal proximity.
Lite mode (zero write-time LLM calls, fully offline) and full mode (one extraction call per session, two-tier conflict resolution).
Observation/digest layer, per-type router (+10.3 multi-session, p=0.046), MCP server, LongMemEval/LoCoMo benchmark harness (bench/ab.sh).
V 0.1.0 first release
SMRITI is a zero-infrastructure, local-first memory layer for AI agents.
One SQLite file. No Postgres, Neo4j, Docker, or cloud account — stdlib + numpy
is the entire dependency surface.
Why it's different (and tested)
- One line to run, nothing to stand up.
pip install -e .→ a working memory
layer in a single file. Offline test suite (33 tests) and the quickstart run with
no network and no API keys. - Nothing silently lost. Updates supersede rather than delete — the old fact is
kept and marked past — so you can answer "what's true now" and "what was true then,"
and accuracy doesn't decay as sessions accumulate. - Cheap by design. Lite mode does zero LLM calls at write time; budget-capped
context keeps per-query cost in fractions of a cent. Runs well on small models. - Predictable at scale. Measured: ~42k rows/s ingest, single-digit-ms queries to
~12k memories, correct retrieval to 300k+ rows. - Drop-in MCP server.
smriti-mcpgives any MCP agent (Claude Code, Cursor, …)
persistent, auditable memory — six typed tools, offline by default, security-hardened.
What's inside
Bi-temporal store with supersession · four-channel hybrid retrieval (BM25 + vectors +
entity-hop + temporal, RRF-fused) · LLM extraction & write-time consolidation ·
observation/digest layer with a per-type router (recall for aggregation, precision for
current-state) · MCP server · LongMemEval + LoCoMo benchmark harness with one-command A/B.
Honest framing — bring your own benchmark
We don't publish a self-graded headline. SMRITI ships the harness so you generate the
number that matters on your own data, with your own judge: bash bench/ab.sh. In our
within-system A/Bs the per-type router lifts multi-session aggregation ~10 pts (p<0.05)
with no regression on knowledge-update — verify it on your workload.
Next (post-ship)
Entity canonicalization · optional sqlite-vec ANN backend for scale · full
longmemeval_s + LoCoMo numbers · recursive-CTE traversal · production hardening.
Apache-2.0. Everything included — no gated tiers.