Skip to main content

Engram logo

Engram

High-recall memory for Conversational agents
93.9% LoCoMo • Zero LLM calls • Local-first, cloud-ready

Website PyPI CI License Python


Why Engram

LLMs are getting better — but memory is still broken.

Even the best agents:

  • forget past interactions
  • lose long-term context
  • rely on expensive reprocessing

Engram fixes this at the infrastructure layer.

No LLM calls at query time. No summarization. No paraphrasing. Your exact words, retrieved with state-of-the-art recall.

Without memory infrastructure With Engram
✕ Forgets past turns ✓ 93.9% recall across sessions
✕ Re-embeds or paraphrases on every call ✓ Exact words, retrieved verbatim
✕ $ per query, rate limits, prompt drift ✓ $0 per query, deterministic, reproducible

Benchmark Results

Tested on two major benchmarks — no LLM required, zero cost per query.

LongMemEval (500 questions)

Metric Score
R@5 98.4% (492/500)
R@10 99.4%
NDCG@5 0.934
Question Type R@5
knowledge-update 98.7%
multi-session 99.2%
single-session-assistant 100.0%
single-session-user 100.0%
temporal-reasoning 97.0%
single-session-preference 93.3%

LoCoMo (1982 questions, 10 conversations)

Metric Score
R@5 93.9% (1862/1982)
R@10 95.0%
NDCG@5 0.894
Category R@5 R@10
Single-hop (factual) 90.4% 93.3%
Temporal (dates) 93.1% 94.7%
Multi-hop (inference) 75.0% 78.3%
Contextual (details) 97.1% 97.5%
Adversarial (speaker) 94.6% 94.8%

Reported with --mode rerank (chunking + cross-encoder reranker + speaker-name injection).

What It Does

Engram stores conversation history and retrieves it with state-of-the-art accuracy. It uses a three-stage retrieval pipeline — dense embeddings, sparse keyword matching, and cross-encoder reranking — to achieve higher recall than systems relying on LLM-based extraction or summarization.

Nothing is summarized. Nothing is paraphrased. Your exact words are stored and returned.

How It Compares

LoCoMo Benchmark Comparison

Disclaimer: Results are compiled from multiple papers and evaluation reports. They are not directly comparable due to differences in backbone LLMs, prompting strategies, and evaluation setups.

System LoCoMo Accuracy LLM Required Open Source Source
Engram 93.9% (R@5) No Yes (MIT) This repo (reproducible)
EverMemOS 86.76% – 93.05% Yes No arXiv:2601.02163
Zep 85.22% Yes Partial EverMemOS evaluation
MemOS 80.76% Yes Partial EverMemOS evaluation
Mem0 64.20% Yes Partial EverMemOS evaluation
MemU 61.15% Yes Partial arXiv:2601.02163
Other LLM-based systems (Hindsight, MemGPT, Letta) ~83 – 92% Yes Varies Secondary reports
Non-LLM systems (SLM variants) ~74 – 75% No Yes Secondary reports

Engram is the top-performing system on LoCoMo — and the only one in the top tier with zero LLM calls at query time.

LongMemEval

Engram MemPalace Mem0
R@5 (LongMemEval) 98.4% 96.6% —
Embedding model bge-large (1024d) all-MiniLM (384d) Varies
Sparse retrieval BM25 + RRF fusion Ad-hoc keyword overlap N/A
Reranking Cross-encoder (free) LLM call ($0.001/q) N/A
Indexing User + assistant + preference docs User turns only LLM-extracted facts
Cloud deployment Qdrant backend No Yes
LLM required No No (optional rerank) Yes

Install

pip install engram-search

Optional extras:

# With cloud backend (Qdrant)
pip install engram-search[cloud]

# With cross-encoder reranker
pip install engram-search[rerank]

# Everything (dev + cloud + rerank)
pip install engram-search[all]

Quickstart — CLI

# Initialize a memory store
engram init ./my_memories

# Ingest conversations
engram ingest conversations.json --store ./my_memories

# Search
engram search "why did we switch to GraphQL" --store ./my_memories

Quickstart — Python API

from engram.backends.faiss_backend import FaissBackend
from engram.backends.base import Document
from engram.ingestion.parser import session_to_documents
from engram.retrieval.embedder import Embedder
from engram.retrieval.pipeline import RetrievalPipeline

# Initialize
embedder = Embedder("bge-large")
backend = FaissBackend(path="./my_memories", dimension=1024)
pipeline = RetrievalPipeline(embedder=embedder)

# Ingest a conversation
turns = [
    {"role": "user", "content": "I'm switching our API from REST to GraphQL."},
    {"role": "assistant", "content": "What's driving the switch?"},
    {"role": "user", "content": "Too many round trips. Our mobile app makes 12 calls per screen."},
]
docs = session_to_documents(turns, session_id="session_1", timestamp="2025-01-15")
texts = [d["text"] for d in docs]
embeddings = embedder.encode_documents(texts)

documents = [
    Document(id=d["id"], text=d["text"], embedding=e.tolist(), metadata=d["metadata"])
    for d, e in zip(docs, embeddings)
]
backend.add(documents)

# Search
results = pipeline.search("why did we switch to GraphQL", documents=documents, top_k=3)
for r in results:
    print(r.text)

Quickstart — Cloud Mode

# Set up Qdrant (managed or self-hosted)
export ENGRAM_BACKEND=qdrant
export ENGRAM_QDRANT_URL=https://your-cluster.qdrant.io:6333
export ENGRAM_QDRANT_API_KEY=your-api-key

# Start the API server
pip install fastapi uvicorn
uvicorn engram.server:app --host 0.0.0.0 --port 8000

API Endpoints

Method Endpoint Description
POST /ingest Add conversations
POST /search Search memories
GET /health Health check
GET /stats Store statistics

Quickstart — MCP Server

Expose Engram as a Model Context Protocol tool for Claude Desktop, Cursor, Windsurf, Zed, and other MCP clients.

pip install "engram-search[mcp]"
engram init ./engram_store   # create a store

Add to claude_desktop_config.json (or your MCP client's equivalent):

{
  "mcpServers": {
    "engram": {
      "command": "engram-mcp",
      "env": {
        "ENGRAM_STORE_PATH": "/absolute/path/to/engram_store"
      }
    }
  }
}

Restart the client. Engram exposes three tools:

Tool Description
search_memory(query, top_k, min_score) Retrieve relevant memories
add_memory(text, metadata) Store a new memory fact
memory_stats() Count documents in the store

Use Cases

  • AI assistants with long-term memory — recall user preferences, past decisions, and prior context across sessions
  • Customer support agents — pull a customer's full history on every interaction without re-feeding transcripts to an LLM
  • Agent memory layer — give autonomous agents persistent memory across runs without blowing up the context window
  • Multi-session chatbots — resolve references to prior conversations ("like we discussed last week") without re-embedding history
  • RAG over conversations — index dialogues, meeting transcripts, or support tickets with higher recall than vanilla semantic search

Examples

Check out the interactive notebooks in examples/:

Notebook Description
Getting Started Ingest conversations, search memories, understand hybrid retrieval
Customer Support Build a support agent with full customer history recall
Personal Assistant AI assistant with long-term memory across conversations

Docker

# Local mode
docker compose up

# Or build and run directly
docker build -t engram .
docker run -p 8000:8000 -v engram_data:/data engram

Architecture

┌─────────────────────────────────────────────────────────────┐
│                        Engram                               │
│                                                             │
│  ┌────────────┐  ┌─────────────┐  ┌───────────────────┐    │
│  │ Ingestion  │  │   Index     │  │    Retrieval      │    │
│  │            │→ │             │→ │                   │    │
│  │ user+asst  │  │ FAISS (local│  │ 1. Dense (bi-enc) │    │
│  │ turns      │  │  or Qdrant  │  │ 2. BM25 (sparse)  │    │
│  │ preference │  │ (cloud)     │  │ 3. RRF fusion     │    │
│  │ extraction │  │             │  │ 4. Cross-encoder   │    │
│  └────────────┘  └─────────────┘  └───────────────────┘    │
│                                                             │
│  Local: FAISS + SQLite    Cloud: Qdrant + REST API          │
└─────────────────────────────────────────────────────────────┘

Run Benchmarks

LongMemEval

# Download dataset
curl -fsSL -o data/longmemeval_s_cleaned.json \
  https://huggingface.co/datasets/xiaowu0162/longmemeval-cleaned/resolve/main/longmemeval_s_cleaned.json

pip install engram-search[all]

python benchmarks/longmemeval_bench.py data/longmemeval_s_cleaned.json --mode hybrid

LoCoMo

# Download dataset (from Snap Research)
curl -fsSL -o data/locomo10.json \
  https://raw.githubusercontent.com/snap-research/locomo/main/data/locomo10.json

python benchmarks/locomo_bench.py data/locomo10.json --mode rerank

Requirements

  • Python 3.9+
  • ~1.3 GB disk for bge-large embedding model (downloaded on first use)
  • No API keys required for local mode

Roadmap

  • LangChain + LlamaIndex integrations — drop-in memory modules for existing agent stacks
  • MCP server — expose Engram as a Model Context Protocol tool for Claude, Cursor, and other MCP clients
  • Streaming ingestion — append turns to a live session without re-indexing
  • Multi-tenant isolation — per-user namespaces for hosted deployments
  • Async API — non-blocking ingest/search for high-throughput workloads
  • More backends — pgvector, Weaviate, Pinecone adapters
  • Temporal reasoning boost — improved date-grounding for "when did we..." queries
  • Benchmark expansion — add MSC, DialogSum, and custom domain benchmarks

Have a use case we're missing? Open an issue.

License

MIT

Metadata

Release files for engram-search 0.1.7

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for engram-search 0.1.7
File Size Uploaded Provenance Actions
engram_search-0.1.7.tar.gz 329.5 kB With provenance Details for engram_search-0.1.7.tar.gz

Built distribution (wheel)

Table of built distributions (wheels) for engram-search 0.1.7
File Interpreter ABI Platform Actions
engram_search-0.1.7-py3-none-any.whl Python 3 none any Details for engram_search-0.1.7-py3-none-any.whl

Total release size: 361.4 kB

Release files / engram_search-0.1.7.tar.gz

Download URL engram_search-0.1.7.tar.gz
Size 329.5 kB
Tags Source
SHA-256 checksum
How to use checksums
38eca71321c11ba339c90eb559a7e8324e9cafc7c5b0aae22cbcdba28b351581
BLAKE2b-256 checksum
How to use checksums
93dd7d0bff0c0484ed2a9a5ccdce7e9c3dd5b2ab05f72e4047b5718999aefa0b
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.13.12

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Apr 19, 2026.

Transparency log

Release files / engram_search-0.1.7-py3-none-any.whl

Download URL engram_search-0.1.7-py3-none-any.whl
Size 31.9 kB
Tags Python 3
SHA-256 checksum
How to use checksums
c82505127ead951cb5de0584b3ac83a9d8dd946852b53900a0f355e7ac90369f
BLAKE2b-256 checksum
How to use checksums
1e129aae74966672e67e7a071c1d1231d5046304fed060718022f52fe66c70d8
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.13.12

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Apr 19, 2026.

Transparency log

Security for engram-search 0.1.7

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

Full provenance

All 2 files in this release have been uploaded with provenance metadata.

Select from 2 files

Attestation for engram_search-0.1.7.tar.gz

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Apr 19, 2026.

Transparency log

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

To learn more about protecting yourself from malicious actors, visit our package security documentation.

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page