Skip to content

NischalBhusal/MemoryOS

Repository files navigation

MemoryOS 🧠

PyPI version Python 3.10+ License: MIT Code style: ruff

Persistent, semantic, long-term memory for any LLM app β€” 100% local, 100% free, zero setup.

Quickstart Β· How it works Β· API Reference Β· Contributing


Why MemoryOS?

LLMs forget everything between sessions. MemoryOS solves this by giving your app a persistent, searchable memory layer that:

  • Stores memories in a local SQLite database (zero external dependencies)
  • Retrieves relevant context via cosine similarity over local embeddings
  • Summarises sessions with a locally-running Ollama model
  • Runs offline on an 8 GB laptop β€” no API keys, no cloud, no cost

⚑ Quickstart

1. Install

pip install memoryos

Prerequisites: Ollama installed and running with a model pulled:

ollama pull llama3

The embedding model (all-MiniLM-L6-v2) downloads automatically on first use.

2. Use it

from memoryos import Memory

mem = Memory()                           # zero config β€” works instantly

mem.add("User prefers dark mode")        # store a memory
mem.add("User is learning Python")

results = mem.search("what does the user like?", top_k=3)
for r in results:
    print(r.text, r.score)

mem.remember(session_id="chat_001")      # compress & store a session
summary = mem.summarize()                # AI summary of all memories
mem.forget("dark mode")                  # delete by semantic match
count = mem.clear()                      # wipe all; returns count deleted

3. Custom config

from memoryos import Memory, Config

mem = Memory(config=Config(
    db_path="my_app.db",
    embedding_model="all-mpnet-base-v2",   # higher quality embeddings
    llm_model="phi3",                       # use a lighter Ollama model
    forget_threshold=0.6,                   # stricter forget matching
    log_level="DEBUG",
))

πŸ› οΈ How it Works

mem.add("User likes Python")
       β”‚
       β–Ό
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”      β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚  LocalEmbeddings    β”‚ ───► β”‚  Storage (SQLite / WAL mode)     β”‚
β”‚  sentence-          β”‚      β”‚  id β”‚ text          β”‚ vector      β”‚
β”‚  transformers       β”‚      β”‚   1 β”‚ User likes …  β”‚ [0.12, …]  β”‚
β”‚  (CPU, offline)     β”‚      β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

mem.search("what language does user prefer?")
       β”‚
       β–Ό
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚  Embed query β†’ vector    β”‚
β”‚  cosine_similarity(      β”‚
β”‚    query_vec, all_vecs)  β”‚  β†’ ranked SearchResult list
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

mem.summarize()
       β”‚
       β–Ό
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚  All memory texts        β”‚
β”‚  β†’ Ollama prompt         β”‚  β†’ narrative summary string
β”‚  (local LLM, offline)   β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
Step Module Technology
Embed text embeddings.py sentence-transformers (CPU)
Store vector storage.py SQLite + WAL mode
Retrieve context search.py NumPy cosine similarity
Summarise memory.py Ollama local LLM

πŸ“– API Reference

Memory(config=None)

Method Description Returns
add(text, session_id=None) Store a memory int (memory ID)
search(query, top_k=3, min_score=None, session_id=None) Semantic search List[SearchResult]
forget(query, threshold=None) Delete best-matching memory bool
remember(session_id) Summarise & store a session Optional[int]
summarize() AI narrative of all memories str
list_all(session_id=None, limit=None) List all memories List[SearchResult]
count() Total memory count int
clear() Wipe everything int (count deleted)
close() Release DB connection None

SearchResult

@dataclass(frozen=True)
class SearchResult:
    text: str
    score: float          # cosine similarity, 0–1
    memory_id: int
    session_id: Optional[str]

Exceptions

Exception When raised
MemoryOSError Base class for all MemoryOS errors
StorageError SQLite backend failure
EmbeddingError Embedding model failure
OllamaUnavailableError Ollama not running or model not found
ValidationError Empty text, invalid top_k, etc.

πŸ†š Comparison

Feature MemoryOS Chroma / Weaviate LangChain Memory OpenAI Memory
Cost βœ… Free βœ… / ❌ Paid tiers βœ… Free ❌ Paid
Offline βœ… 100% ⚠️ Self-host needed βœ… / ❌ depends ❌ Cloud
Setup βœ… pip install ❌ Docker / daemon ⚠️ Complex ❌ API key
Dependencies Minimal Heavy Very heavy HTTP only
Privacy βœ… Data stays local ⚠️ Self-host Varies ❌ Cloud
RAG-ready βœ… βœ… βœ… ❌

🀝 Contributing

We love contributions! See CONTRIBUTING.md for the full guide.

git clone https://github.com/NischalBhusal/MemoryOS
cd MemoryOS
pip install -e ".[dev]"
pytest                  # run tests
ruff check memoryos/    # lint
mypy memoryos/          # type check

Please update CHANGELOG.md with your changes.


πŸ“„ License

MIT Β© MemoryOS Contributors

About

Persistent, semantic, long-term memory for any LLM app which is 100% local, 100% free, zero setup.

Topics

Resources

License

Contributing

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors

Languages