Skip to main content

TenseMem

Memory that knows its tenses. Embedded, deterministic memory that AI agents can safely act on.

One SQLite file. No server required. The model proposes typed facts; the engine decides what is current.

pip install tensemem
from tensemem import FakeExtractor, Memory

mem = Memory(llm=FakeExtractor())
mem.register_predicate("lives_in")
added = mem.add("u1", "I live in Delhi")
ctx = mem.context(user_id="u1", min_seq=added.seq, wait=1.5)
print(ctx.text)  # fenced block the model can read
print(ctx.freshness.is_current)  # True once extract finished

FakeExtractor is rule-based and needs no API key. Same API with tensemem[openai], tensemem[anthropic], tensemem[ollama], tensemem[litellm], or Gemini (GEMINI_API_KEY in the process environment).

Why this exists

Similarity search returns both “I live in Delhi” and “I moved to Bangalore” and leaves the model to guess. TenseMem keeps one current value per slot, says whether the read is fresh, and refuses to learn from its own output.

  • One current truth per ONE slot. A new city supersedes the old one. History still answers “where did I live before?”
  • Every read reports freshness. as_of_seq, pending, is_current. Wait for a message, or see that it is not applied yet.
  • No self-echo. Recalled context() is fenced. Extract needs a verbatim quote from the user.
  • Corrections stick. correct() restores the displaced value and survives rebuild() with a newer model.
  • The engine decides. The LLM emits typed ops. Deterministic rules apply them.
  • No infrastructure. Default store is one SQLite file inside your process.

Delhi, then Bangalore

mem.add("u1", "I live in Delhi")
mem.set(user_id="u1", predicate="lives_in", value="Bangalore")

print(mem.state("u1").values)
# {"lives_in": "Bangalore"}

history = mem.history("u1", predicate="lives_in")
# ACTIVE Bangalore, SUPERSEDED Delhi

bangalore = next(f for f in history.facts if f.object == "Bangalore")
mem.correct(bangalore.id)  # that move was never true
print(mem.state("u1").values)
# {"lives_in": "Delhi"}
flowchart LR
  E[episodes] --> X[extractor proposes ops]
  X --> R[resolver]
  R --> F[facts]
  F --> C["context() + freshness"]
  C -.->|fence stripped| X

Architecture

Every surface is an adapter over Memory / AsyncMemory. The model proposes typed ops; resolve() decides mutations; apply() writes one SQLite file. Facts are a rebuildable projection of an append-only episode log.

TenseMem architecture: surfaces, write path, extract worker, read path, SQLite store, and providers

Editable source: docs/architecture.excalidraw. File map: Architecture.

If you are changing… Start here
Python / CLI / REST / MCP API src/tensemem/memory.py, cli/main.py, server.py, mcp.py
Studio UI studio/app/ (board, memories, playground, echo, ops) and studio/lib/api.ts
Extract prompt or worker pipeline/prompts/extract_v1.md, pipeline/worker.py, pipeline/extractor.py
What an op is allowed to do core/resolver.py (pure), pipeline/normalize.py, pipeline/policy.py, pipeline/guard.py
A new LLM or embedder providers/llm/, providers/embed/ — keys in process env only
SQLite schema or reads storage/sqlite/ (one writer; ADR 0003 / 0020)
Freshness, fence, corrections storage/sqlite/snapshot.py, security/fence.py, correct()
Invariants tests/core/, tests/property/, tests/golden/ — default pytest never calls a hosted model

Do not auto-register unknown predicates, skip keep_ops, or teach the engine from fenced context() text. Those are locked by tests.

Safe to act (TenseBench)

tensemem bench scores the packaged 101 conversations with FakeExtractor (no network):

System Current-state accuracy Stale-fact leak Freshness honesty Contamination
TenseMem 1.00 0.00 1.00 0.00
Concatenated transcript 0.37 1.00 0.00 n/a
Token-overlap retrieval 0.37 1.00 0.00 n/a

Reproduce with tensemem bench. Methodology: TenseBench.

Inspect

tensemem inspect --user u1
tensemem history --user u1 lives_in
tensemem search --user u1 "where did I live"

TenseMem Studio is a local Next.js inspector over tensemem serve (board, memories table, playground, compare, echo). It is not a chatbot. Secrets stay in the serve process environment — never in the Token field. Studio lives in the git checkout, not on PyPI.

git clone https://github.com/tensemem/tensemem.git
cd tensemem
pip install "tensemem[server]"

Terminal 1 — HTTP:

tensemem --db ./studio.db serve --port 8080

Terminal 2 — Studio:

cd studio && npm install && npm run dev

Extras

Extra What you get
tensemem[openai] / [anthropic] / [ollama] / [litellm] Hosted or local extract
tensemem[server] tensemem serve REST + Studio backend
tensemem[mcp] stdio or tensemem mcp --http
tensemem[langgraph] TenseMemStore (put / search)
tensemem[llamaindex] TenseMemChatMemory (put / get)
tensemem[local] FastEmbed vectors for search

Gemini extract uses GEMINI_API_KEY (or GOOGLE_API_KEY) in the environment of the process that runs extract. No extra package beyond the server if you use the built-in Gemini adapter.

--token / TENSEMEM_TOKEN is optional bearer auth on HTTP. Bind stays loopback unless you put a TLS proxy in front.

Status

0.1.0 alpha. The Python API, CLI, REST, MCP, and Studio are usable on a single SQLite file. The default store is SQLite; a second SQL dialect is not shipped. Multi-tenant hosted Studio is not in this tree.

Docs

Quickstart · Concepts · Architecture · API · CLI · REST · Studio · MCP · Operations · ADRs

uvx mkdocs serve previews the same pages locally.

Contributing

See CONTRIBUTING.md. main is protected; every change is a pull request. Merges wait until CI, PR quality, and CodeQL are green.

License

Apache-2.0

Metadata

Release files for tensemem 0.1.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for tensemem 0.1.0
File Size Uploaded Provenance
tensemem-0.1.0.tar.gz 238.1 kB With provenance Details

Built distribution (wheel)

Table of built distributions (wheels) for tensemem 0.1.0
File Interpreter ABI Platform
tensemem-0.1.0-py3-none-any.whl Python 3 none any Details

Total release size: 398.0 kB

Release files / tensemem-0.1.0.tar.gz

Download URL tensemem-0.1.0.tar.gz
Size 238.1 kB
Tags Source
SHA-256 checksum
How to use checksums
abcecedf060c81dcccd8149def7da65afac2559fa0623a82d11e7695fe3eaccf
BLAKE2b-256 checksum
How to use checksums
9c505d6ae64b899d57b74d82d822b6be332276472b99679c44ef2a02d88c65bd
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 21, 2026.

Transparency log

Release files / tensemem-0.1.0-py3-none-any.whl

Download URL tensemem-0.1.0-py3-none-any.whl
Size 160.0 kB
Tags Python 3
SHA-256 checksum
How to use checksums
b773d61fb924df4b892ae9c7c1ff1c219f2d0ebd97314c8217d8db0f644ac498
BLAKE2b-256 checksum
How to use checksums
c6aa9aa49dedee47cacf519e995122e361a8ff375890b3b4bccc2e77f57ccd6c
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 21, 2026.

Transparency log

Security for tensemem 0.1.0

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

Full provenance

All 2 files in this release have been uploaded with provenance metadata.

Select from 2 files

Attestation for tensemem-0.1.0.tar.gz

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 21, 2026.

Transparency log

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

To learn more about protecting yourself from malicious actors, visit our package security documentation.

Release history Release notifications | RSS feed

This release

0.1.0 This release

2 release files Full provenance

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page