Mnemoverse Python SDK
Persistent memory for AI agents. Not vector search — statistical learning backed by Hebbian associations.
Installation
pip install mnemoverse
Quick Start
export MNEMOVERSE_API_KEY=mk_live_YOUR_KEY
Check the key in one command. It reads the same variable the client reads (in PowerShell, write $env:MNEMOVERSE_API_KEY and type curl.exe):
curl -s -H "X-Api-Key: $MNEMOVERSE_API_KEY" https://core.mnemoverse.com/api/v1/memory/stats
| The API answers (as of 2026-09-23) | What it means |
|---|---|
JSON that includes "total_atoms" |
The key works. |
"message":"This API key is not recognized. Check that the whole key was copied, or create a new key at https://console.mnemoverse.com/dashboard/keys." |
The key is wrong or revoked. |
"message":"This API key is the placeholder from the documentation, not a real key. Create a key at https://console.mnemoverse.com/dashboard/keys and use it instead (MNEMOVERSE_API_KEY for the MCP server, the X-Api-Key header for REST)." |
MNEMOVERSE_API_KEY is still set to the placeholder from the export step above. |
"message":"Missing API key. Send X-Api-Key header." |
No key reached the API: the variable is empty or not set in this shell. |
from mnemoverse import MnemoClient
client = MnemoClient()
# or pass it explicitly — an explicit api_key always wins over the environment:
# client = MnemoClient(api_key="mk_live_YOUR_KEY")
# Store a memory
result = client.write(
"Retry with exponential backoff fixed the timeout issue",
concepts=["retry", "backoff", "timeout"]
)
# Query — Hebbian associations expand "timeout" → "retry", "backoff"
memories = client.read("how to handle timeouts?")
# Report outcome — the system learns what works
client.feedback(
atom_ids=[item.atom_id for item in memories.items],
outcome=1.0,
query_concepts=memories.query_concepts
)
Closing the client
MnemoClient holds a background event loop and a pooled HTTP connection, so
close it when a script is done. Use it as a context manager,
with MnemoClient() as client:, to close automatically on exit, or call
client.close() directly. A client left unclosed closes itself at
interpreter exit, which is a fallback rather than something to rely on.
Async Client
from mnemoverse import AsyncMnemoClient
async with AsyncMnemoClient(api_key="mk_live_YOUR_KEY") as client:
result = await client.write("async memory", concepts=["async"])
memories = await client.read("what about async?")
Features
- Circuit breaker — 5 failures → open → 30s half-open → probe
- Retry with backoff — 3 attempts, rate-limit-aware
- Sync + async —
MnemoClientfor scripts,AsyncMnemoClientfor FastAPI - Type-safe — Pydantic models, full type hints
Methods
| Method | Description |
|---|---|
write(content, concepts, domain, metadata, external_ref, supersedes) |
Store a memory |
write_batch(items) |
Store up to 500 memories |
read(query, top_k, domain, since, until, order_by, exclude_author) |
Semantic search — "what do I know about X" |
recent(domain, since, until, exclude_author, limit, cursor) |
Newest-first feed — "what happened lately" |
graph(seeds, depth, domain, min_weight, limit) |
Bounded read of the concept-association graph around seeds |
feedback(atom_ids, outcome) |
Report success/failure |
stats() |
Memory statistics |
health() |
API health check |
Every method exists on both MnemoClient (sync) and AsyncMnemoClient (async).
Search or feed?
read() answers what do I know about X and ranks by relevance. recent()
answers what happened lately and is complete within one scope by
construction — nothing is skipped, which a semantic search cannot promise.
Reach for recent() to resume after a break or to catch up on a shared room.
from mnemoverse import MnemoClient
client = MnemoClient(api_key="mk_live_...")
# Catch up on a shared room. Rooms are SEPARATE stores: pass the address as
# `domain`, or an unscoped feed will not cover them.
page = client.recent(domain="xroom:room_01ABC", since="2026-08-01T00:00:00Z", limit=20)
for item in page.items:
print(item.created_at, item.content)
if page.next_cursor:
page = client.recent(domain="xroom:room_01ABC", cursor=page.next_cursor)
Read items carry created_at and provenance (who wrote it, where from).
Documentation
License
MIT
Release files for mnemoverse 0.3.1
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| mnemoverse-0.3.1.tar.gz | 84.2 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| mnemoverse-0.3.1-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 105.4 kB
Release files / mnemoverse-0.3.1.tar.gz
| Download URL | mnemoverse-0.3.1.tar.gz |
|---|---|
| Size | 84.2 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
cd213a03ab77c0befd23a88401e396dae4caf7ea3fa74f1b07793f17c50d9a06
|
|
BLAKE2b-256 checksum How to use checksums |
6fbceec90a13397b046254e22d85ea50b8787455181d3ddd4ea2a5d34781b4c2
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Release files / mnemoverse-0.3.1-py3-none-any.whl
| Download URL | mnemoverse-0.3.1-py3-none-any.whl |
|---|---|
| Size | 21.2 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
fa072d7bfe5a17f3130f0003a301879006fbdc69c9121fe6b898c5bc5c7fdc51
|
|
BLAKE2b-256 checksum How to use checksums |
8ce48d8b0e893702ea1139feaad178540a4275d5a667d5b184a34e4e6ddafe5c
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|