Skip to main content

emem-langmem

LangChain BaseStore backed by emem.dev — drop-in agent memory for LangGraph with ed25519 receipts and content-addressed recall.

Install

pip install emem-langmem

Use

from emem_langmem import EmemStore
from langgraph.graph import StateGraph

store = EmemStore(base_url="https://emem.dev", signing_key=SEED)

graph = StateGraph(...).compile(store=store)

SEED is a raw 32-byte ed25519 seed that you own and persist, for example os.urandom(32) once, then kept wherever the agent's other secrets live. It signs every write, and the responder requires that: an unattested write is refused unless the operator opened the responder with EMEM_MEMORY_OPEN=1. The key also decides where the store writes.

EmemStore implements the four BaseStore verbs by issuing MCP tools/call requests to the emem responder against the six Anthropic memory-tool verbs:

BaseStore verb emem MCP tool Signed
mget(keys) emem_memory_view read, no signature
mset(pairs) emem_memory_create yes
mdelete(ks) emem_memory_delete yes
yield_keys emem_memory_view (directory walk) read, no signature

Namespaces

With a signing key, the store roots itself at /memories/by_attester/<pubkey8>/, where <pubkey8> is the first 8 characters of your base32 pubkey. Only that key can write there, so agents sharing one responder cannot overwrite each other. LangChain calls mget(("ns","key")) and the store reads /memories/by_attester/<pubkey8>/ns/key.

store.root              # '/memories/by_attester/aoqqpp7t'
store.signer.pubkey_b32 # the full base32 pubkey

A key that starts with / is taken as a literal absolute path and is left alone, which is how you reach outside your own root. Writing into another key's namespace is refused with a 403. Without a signing key the root stays /memories and writes go out unattested. See docs/memory.md for the wire format.

EmemSigner is public if you drive the memory tools yourself and need the same attester block:

from emem_langmem import EmemSigner

signer = EmemSigner(SEED)
signer.attester_block("create", f"{signer.namespace_root}/n.md", b"hi")
# {'pubkey_b32': '...', 'sig_b32': '...'}

Async variants amget / amset / amdelete / ayield_keys are implemented over httpx.AsyncClient.

Self-host

EmemStore(base_url="http://127.0.0.1:5051")

or set EMEM_BASE_URL in the environment.

Receipts

Every read and write returns an ed25519 receipt from the emem responder. The receipt is currently dropped at the BaseStore interface boundary (LangChain's contract has no receipt slot). To inspect receipts, call the underlying MCP tool directly:

import json, httpx, uuid
r = httpx.post(
    "https://emem.dev/mcp",
    json={
        "jsonrpc": "2.0",
        "id": str(uuid.uuid4()),
        "method": "tools/call",
        "params": {
            "name": "emem_memory_view",
            "arguments": {"path": "/memories/my/note.txt"},
        },
    },
).json()
print(r["result"]["structuredContent"]["receipt"])

License

Apache-2.0.

Download files

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

Source Distribution

emem_langmem-2.1.0.tar.gz (17.0 kB view details)

Uploaded Source

Built Distribution

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

emem_langmem-2.1.0-py3-none-any.whl (12.8 kB view details)

Uploaded Python 3

File details

Details for the file emem_langmem-2.1.0.tar.gz.

File metadata

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

File hashes

Hashes for emem_langmem-2.1.0.tar.gz
Algorithm Hash digest
SHA256 c360b29e140d071eb84f2cabd402e487f3fe067431049b1e28efa3160b8579ea
MD5 fec8851c5ee0d267ef9ffd347c407fb2
BLAKE2b-256 74dbbbc24c3c4a2b523660e6efe8eb9a6aa55662cb35b6f26bf6f08d2b101f34

See more details on using hashes here.

Provenance

The following attestation bundles were made for emem_langmem-2.1.0.tar.gz:

Publisher: publish-pypi-langmem.yml on Vortx-AI/emem

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

File details

Details for the file emem_langmem-2.1.0-py3-none-any.whl.

File metadata

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

File hashes

Hashes for emem_langmem-2.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 e5b3dbee4a2a14a20ec225eca75616fcfe91cf814dd6727de7870f6a9dc84989
MD5 b45f25d16f1fb730fd6faee02102d453
BLAKE2b-256 bae15a4e82425cbbee4ce8ca6cfdf5cc741fb17dfc0058b1bd44b94214a0e66c

See more details on using hashes here.

Provenance

The following attestation bundles were made for emem_langmem-2.1.0-py3-none-any.whl:

Publisher: publish-pypi-langmem.yml on Vortx-AI/emem

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

Supported by

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