Long-term memory tier for AI agents backed by Valkey Search: semantic recall with recency/importance ranking, scoped capacity eviction, and consolidation. Pairs with @betterdb/agent-cache.
Project description
@betterdb/agent-memory (Python)
betterdb-agent-memory is the long-term memory tier for AI agents, backed by
Valkey Search. It is the Python port of
@betterdb/agent-memory
and pairs with betterdb-agent-cache
(the short-term llm/tool/session cache tiers).
Where the cache tiers are exact-match and ephemeral, the memory tier is semantic and durable: it embeds content, stores it in an HNSW vector index, and recalls it by meaning with a composite score that blends similarity, recency (half-life decay), and importance.
Features
- Semantic recall — KNN vector search with a tunable composite score.
- Scoping — memories carry
thread_id/agent_id/namespace/tags; recall, forget, and consolidation all filter by scope. - Reinforcement — recalled memories bump
last_accessed_at+access_count, so frequently-used memories stay recallable. - Capacity eviction —
max_items_per_scopeevicts the lowest-scoring memories (importance + recency) once a scope exceeds its cap. - Consolidation — fold a set of older/low-importance memories into a single summary memory.
- Live config — re-read
recall.threshold/ weights /halfLifeSeconds/maxItemsPerScopefrom a Valkey hash without a restart. - Observability — OpenTelemetry spans + Prometheus metrics.
- Discovery — registers a marker so BetterDB Monitor can enumerate the tier.
Installation
pip install betterdb-agent-memory
You also need a Valkey server with the Search module loaded (e.g.
valkey/valkey-bundle) and the valkey
async client.
Quick start
import valkey.asyncio as valkey
from betterdb_agent_memory import AgentMemory, AgentMemoryOptions
async def embed(text: str) -> list[float]:
# Replace with a real embedding model (OpenAI, sentence-transformers, ...).
...
async def main() -> None:
client = valkey.Valkey(host="localhost", port=6379)
agent = AgentMemory(AgentMemoryOptions(client=client, embed_fn=embed))
await agent.initialize()
await agent.memory.remember(
"User prefers dark mode and concise answers.",
importance=0.8,
tags=["preference", "ui"],
thread_id="t1",
)
hits = await agent.memory.recall("what UI settings does the user like?", thread_id="t1")
for hit in hits:
print(hit.score, hit.item.content)
# Short-term cache tiers remain available:
# agent.llm, agent.tool, agent.session
await agent.close()
Using the memory tier standalone
If you only need the memory tier, construct MemoryStore directly:
from betterdb_agent_memory import MemoryStore
store = MemoryStore(client=client, name="myapp", embed_fn=embed)
await store.ensure_index()
await store.remember("hello", thread_id="t1")
hits = await store.recall("hi", thread_id="t1")
API
MemoryStore
await ensure_index()— create the{name}:mem:idxHNSW index if absent.await remember(content, *, importance=None, tags=None, source=None, ttl=None, thread_id=None, agent_id=None, namespace=None) -> strawait recall(query, *, k=None, threshold=None, tags=None, weights=None, reinforce=None, thread_id=None, agent_id=None, namespace=None) -> list[MemoryHit]await forget(id) -> boolawait forget_by_scope(*, thread_id=None, agent_id=None, namespace=None, tags=None) -> intawait consolidate(*, summarize, older_than_seconds=None, max_importance=None, delete_sources=None, summary_importance=None, tags=None, thread_id=None, agent_id=None, namespace=None) -> ConsolidateResultcurrent_config() -> MemoryConfigSnapshotawait refresh_config()await ensure_discovery_ready()await close()
AgentMemory
The batteries-included facade: an AgentCache (llm/tool/session) plus a
MemoryStore sharing one client and name. initialize() creates the index and
readies discovery for both tiers; close() tears both down.
Scoring
composite_score = w.similarity * similarity + w.recency * recency + w.importance * importance
where similarity = 1 - distance / 2 (cosine distance → 0..1) and recency
decays with a true half-life (0.5 at one half_life_seconds). Default weights
are {similarity: 0.6, recency: 0.25, importance: 0.15}, default threshold
0.25, default half-life 7 days.
License
MIT
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file betterdb_agent_memory-0.1.0.tar.gz.
File metadata
- Download URL: betterdb_agent_memory-0.1.0.tar.gz
- Upload date:
- Size: 31.5 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
e81a00b7a006886e88bc150fd8d666c06657b1b6dbd45e0a75e25e3607a676f9
|
|
| MD5 |
87fdca9e6e583d680d022b8ce9d2f90e
|
|
| BLAKE2b-256 |
771c6b0c85585a552a0c6773c4633a514a6a0f86f0db235b23a43f6e354ab365
|
Provenance
The following attestation bundles were made for betterdb_agent_memory-0.1.0.tar.gz:
Publisher:
agent-memory-py-release.yml on BetterDB-inc/monitor
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
betterdb_agent_memory-0.1.0.tar.gz -
Subject digest:
e81a00b7a006886e88bc150fd8d666c06657b1b6dbd45e0a75e25e3607a676f9 - Sigstore transparency entry: 1956979839
- Sigstore integration time:
-
Permalink:
BetterDB-inc/monitor@4db6ad58fee39a2d569675732f37a385c9897d1d -
Branch / Tag:
refs/tags/agent-memory-py-v0.1.0 - Owner: https://github.com/BetterDB-inc
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
agent-memory-py-release.yml@4db6ad58fee39a2d569675732f37a385c9897d1d -
Trigger Event:
push
-
Statement type:
File details
Details for the file betterdb_agent_memory-0.1.0-py3-none-any.whl.
File metadata
- Download URL: betterdb_agent_memory-0.1.0-py3-none-any.whl
- Upload date:
- Size: 24.2 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
59a74e4066509051a8ce10dd730ab90dcffc285537ad590156fbb477cc5c27d7
|
|
| MD5 |
d242a08c8223ff97196f4f3b912d62f5
|
|
| BLAKE2b-256 |
2b44147ec32fdb3eb8fefe52869ba60fabba0d15dba0a1cd5407111583cee3b7
|
Provenance
The following attestation bundles were made for betterdb_agent_memory-0.1.0-py3-none-any.whl:
Publisher:
agent-memory-py-release.yml on BetterDB-inc/monitor
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
betterdb_agent_memory-0.1.0-py3-none-any.whl -
Subject digest:
59a74e4066509051a8ce10dd730ab90dcffc285537ad590156fbb477cc5c27d7 - Sigstore transparency entry: 1956979957
- Sigstore integration time:
-
Permalink:
BetterDB-inc/monitor@4db6ad58fee39a2d569675732f37a385c9897d1d -
Branch / Tag:
refs/tags/agent-memory-py-v0.1.0 - Owner: https://github.com/BetterDB-inc
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
agent-memory-py-release.yml@4db6ad58fee39a2d569675732f37a385c9897d1d -
Trigger Event:
push
-
Statement type: