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) memory_view read, no signature
mset(pairs) memory_create yes
mdelete(ks) memory_delete yes
yield_keys 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": "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-1.4.0.tar.gz (16.9 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-1.4.0-py3-none-any.whl (12.8 kB view details)

Uploaded Python 3

File details

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

File metadata

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

File hashes

Hashes for emem_langmem-1.4.0.tar.gz
Algorithm Hash digest
SHA256 7493a5e4c7684e88bac6a0bf856237cad7804c1b922a5f8df2ccbca37c18922b
MD5 99ba040a0b6e2437ace1dc2df4308486
BLAKE2b-256 7cda153efe39b059fb9e8fe379fe760473d31aa8482b02423b0cc99abf863dff

See more details on using hashes here.

Provenance

The following attestation bundles were made for emem_langmem-1.4.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-1.4.0-py3-none-any.whl.

File metadata

  • Download URL: emem_langmem-1.4.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-1.4.0-py3-none-any.whl
Algorithm Hash digest
SHA256 ec13a63d0cdf3fd08005a3af39cc44372fae00f2ff1de335bf8c154ec517f7ee
MD5 d91b1d8e64fa869a0117345128da4478
BLAKE2b-256 a680910718bd1cfa407edbd94df524b741e8dd7659a73d8a7f51f2cbd146da7a

See more details on using hashes here.

Provenance

The following attestation bundles were made for emem_langmem-1.4.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