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.2.1.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.2.1-py3-none-any.whl (12.8 kB view details)

Uploaded Python 3

File details

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

File metadata

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

File hashes

Hashes for emem_langmem-1.2.1.tar.gz
Algorithm Hash digest
SHA256 f50e6e015a6dc04a1563ca1914156ab2b7a851b0f99050c1f7c66b006cf546e8
MD5 f6c733fd90ebd9f197b6b4ae9cde793a
BLAKE2b-256 97f8958a8612aaca34816acd080f7436e4e2555e3e946064e392aebc9e505461

See more details on using hashes here.

Provenance

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

File metadata

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

File hashes

Hashes for emem_langmem-1.2.1-py3-none-any.whl
Algorithm Hash digest
SHA256 014ec47e595bbead28db5f7db68bb6400f501c0a79da02db0e675ec634ac624d
MD5 951126ee9bd9f0c7e3e1bb5e3af04135
BLAKE2b-256 10578152725dbee20ca9e9948c27e05d5653447de71f5a436b3de5233af1ee08

See more details on using hashes here.

Provenance

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