Skip to main content

AbstractMemory

AbstractMemory is a Python library for durable, append-only agent memory. It provides two layers:

  • Layer 1 — triple truth: append-only, temporal, provenance-aware triple assertions with deterministic structured queries and optional vector/semantic retrieval, over in-memory, SQLite, or LanceDB backends.
  • Layer 2 — the memory system: a MemorySystem facade that turns those triples plus an append-only journal into a usage-weighted memory graph: typed record formation, stimulus-driven reconstruction (working memory that emerges from use), attention and decay, identity cores for long-lived entities, valence/gradation (how experience felt), diary conventions, sleep/consolidation, and a replay stream for observability.

Storage never decays and nothing is ever deleted; only retrieval strength changes. Reads are pure — rendering a memory does not strengthen it; only committed use does.

Status

Ecosystem (AbstractFramework)

AbstractMemory is a component of the AbstractFramework ecosystem. It has no dependency on AbstractCore or AbstractRuntime; embeddings for semantic retrieval can come from any OpenAI-compatible /embeddings endpoint (OpenAICompatTextEmbedder), from an AbstractGateway deployment (AbstractGatewayTextEmbedder), or from your own TextEmbedder implementation.

flowchart LR
  APP["Your app or agent"] --> MS["MemorySystem (layer 2)"]
  MS --> ST["Triple store (layer 1)"]
  MS --> J["Journal (append-only)"]
  ST --> IM["InMemoryTripleStore"]
  ST --> SQL["SQLiteTripleStore"]
  ST --> LDB["LanceDBTripleStore"]
  SQL --> F[("one SQLite file")]
  J --> F
  MS -. "optional embeddings" .-> E["TextEmbedder (OpenAI-compatible / Gateway / custom)"]

Related projects:

  • AbstractFramework: https://github.com/lpalbou/abstractframework
  • AbstractCore: https://github.com/lpalbou/abstractcore
  • AbstractRuntime: https://github.com/lpalbou/abstractruntime

Install

From source (recommended inside the AbstractFramework monorepo):

python -m pip install -e .

Optional LanceDB backend:

python -m pip install -e ".[lancedb]"

PyPI (packaged release):

python -m pip install AbstractMemory
python -m pip install "AbstractMemory[lancedb]"

The distribution name is AbstractMemory (pip is case-insensitive); the import name is abstractmemory. The [apple]/[gpu] extras are no-op compatibility aliases; [all], [all-apple], and [all-gpu] install the LanceDB backend.

Quick example — layer 1 (triples)

from abstractmemory import InMemoryTripleStore, TripleAssertion, TripleQuery

store = InMemoryTripleStore()
store.add([
    TripleAssertion(
        subject="Scrooge",
        predicate="related_to",
        object="Christmas",
        scope="session",
        owner_id="sess-1",
        provenance={"span_id": "span_123"},
    )
])

hits = store.query(TripleQuery(subject="scrooge", scope="session", owner_id="sess-1"))
assert hits[0].object == "christmas"      # terms are canonicalized (trim + lowercase)
assert hits[0].assertion_id is not None   # stores stamp read-side identity on results

Quick example — layer 2 (the memory system)

from abstractmemory import (
    MemorySystem, MemoryRecordInput, SQLiteTripleStore, SQLiteJournal, Stimulus,
)

store = SQLiteTripleStore("memory.sqlite3")
journal = SQLiteJournal("memory.sqlite3")   # sidecar tables in the same file
system = MemorySystem(store=store, journal=journal)

# Form a typed record (idempotent by key; forming is not using).
[record_id] = system.remember_many(
    [MemoryRecordInput(kind="episode", title="Pool outage",
                       digest="The connection pool saturated at noon.",
                       keywords=("pool", "outage"))],
    scope="session", owner_id="s1", idempotency_key="turn-1",
)

# Reconstruct working memory for a cue (pure read), then commit what you used.
result = system.reconstruct(Stimulus(cue_text="pool outage"), scopes=[("session", "s1")])
system.commit_selection(result.trace_id, [h.record_id for h in result.handles[:2]])

Documentation

Project

Design principles

  • Append-only, no deletion: updates are new assertions; belief revision is closure records (retract/supersede); forgetting is decay of retrieval strength plus closures and silencing — the substrate is lossless.
  • Reads are pure: reconstruction, inspection, replay, and the entity card deposit nothing. commit_selection is the only strengthening path.
  • One seq axis: the journal assigns a monotonic seq to every record; any past state is reproducible by anchoring reads at as_of.
  • Works-or-loud: degraded paths are labeled #FALLBACK in result warnings; invalid inputs raise actionable errors instead of silently meaning something else.
  • No heavy dependencies: SQLite persistence and vector scoring use the standard library; LanceDB and embedders are optional.

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

abstractmemory-0.3.0.tar.gz (916.9 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

abstractmemory-0.3.0-py3-none-any.whl (408.4 kB view details)

Uploaded Python 3

File details

Details for the file abstractmemory-0.3.0.tar.gz.

File metadata

  • Download URL: abstractmemory-0.3.0.tar.gz
  • Upload date:
  • Size: 916.9 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/7.0.0 CPython/3.13.14

File hashes

Hashes for abstractmemory-0.3.0.tar.gz
Algorithm Hash digest
SHA256 48e9d859c4a194a14fc329a3875058bab2d90f88014401b781a7126b436fa2a9
MD5 db212849f9d9b7fce1e1de7693571d02
BLAKE2b-256 9db4b8d0dc9a1253dcf1a40497d8fe84f16a5db13a34ae4cf3e64fd640e2b209

See more details on using hashes here.

Provenance

The following attestation bundles were made for abstractmemory-0.3.0.tar.gz:

Publisher: release.yml on lpalbou/AbstractMemory

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file abstractmemory-0.3.0-py3-none-any.whl.

File metadata

  • Download URL: abstractmemory-0.3.0-py3-none-any.whl
  • Upload date:
  • Size: 408.4 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/7.0.0 CPython/3.13.14

File hashes

Hashes for abstractmemory-0.3.0-py3-none-any.whl
Algorithm Hash digest
SHA256 f1984dcd4b8623ef2c918e8bcd3ced43f1a67ddaaca7a2ba92f3d11ad17e458b
MD5 cba14be8c1dfc21c83324c7e859aec85
BLAKE2b-256 864630d1c05af7fe01fa8255659765aa2ca37a59e6701e66465658bafbc7591c

See more details on using hashes here.

Provenance

The following attestation bundles were made for abstractmemory-0.3.0-py3-none-any.whl:

Publisher: release.yml on lpalbou/AbstractMemory

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Release history Release notifications | RSS feed

This release

0.3.0 This release

2 files

0.2.6

2 files

0.2.5

2 files

0.2.3

2 files

0.2.2

2 files

0.2.1

2 files

0.1.0

2 files

0.0.2

2 files

0.0.1

2 files

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page