Human-like memory for AI agents. 10x cheaper than RAG. Zero vector DB needed.
Project description
om-memory
Human-like memory for AI agents. 10x cheaper than RAG. Zero vector DB needed.
om-memory is the first-ever Python implementation of Observational Memory (OM) — a revolutionary approach to AI agent memory. Instead of embedding every message and retrieving similar ones per turn (RAG), OM continuously compresses conversation history into a dense, evolving text log of "observations" using two background agents (Observer and Reflector).
What is Observational Memory?
Observational Memory (OM) maintains a stable text context window of the user's conversation. The observation log is plain text that stays stable in the context window, enabling prompt caching (75-90% token cost discount from providers like OpenAI/Anthropic). Traditional RAG injects different retrieved chunks every turn, breaking the cache and costing up to 10x more.
Why om-memory?
- 10x Cheaper than RAG: By leveraging prompt caching on a stable context window.
- Zero Vector DB Needed: Uses standard storage backends (SQLite, Postgres, etc.) — no embeddings, no vector search.
- Better Accuracy: Maintains narrative continuity better than fragmented vector retrieval (Highest recorded on LongMemEval).
- Framework-Agnostic: Middleware pattern.
om-memorymanages context, you make your own LLM calls with LangChain, LlamaIndex, or raw Python. - Observable by Default: Full event tracking, metrics, and Streamlit dashboard integration.
Quick Start
om-memory provides sensible defaults out of the box (SQLite storage, OpenAI gpt-4o-mini for background compression).
import asyncio
from om_memory import ObservationalMemory
async def main():
# 1. Initialize OM (Zero config needed, uses SQLite + OPENAI_API_KEY)
om = ObservationalMemory()
# 2. Get context for a user thread
thread_id = "user_123"
context = await om.aget_context(thread_id=thread_id)
# 3. Build your prompt and call YOUR LLM
prompt = f"System: You are a helpful assistant.\n{context}\nUser: Hello!"
response = "Hello! How can I help you today?" # Replace with actual LLM call
# 4. Tell OM what happened so it can remember for next time
await om.aadd_message(thread_id=thread_id, role="user", content="Hello!")
await om.aadd_message(thread_id=thread_id, role="assistant", content=response)
if __name__ == "__main__":
asyncio.run(main())
How It Works
- Block 1 (Observations): A compressed, timestamped log of facts, decisions, and preferences. Handled by the Reflector agent.
- Block 2 (Recent Messages): The uncompressed recent turns of the conversation. Once this grows past a threshold, the Observer agent compresses it into Block 1.
Installation
pip install om-memory
Optional dependencies:
pip install om-memory[anthropic]- Anthropic provider supportpip install om-memory[postgres]- PostgreSQL storage backendpip install om-memory[dashboard]- Streamlit dashboard
Documentation
Full documentation available in the repository examples.
License
Apache 2.0
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file om_memory-0.2.2.tar.gz.
File metadata
- Download URL: om_memory-0.2.2.tar.gz
- Upload date:
- Size: 29.4 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.3
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
f541fd11864f3a00817e66296d72983b08ac9863b366590eeae7d688f689eef0
|
|
| MD5 |
8590be164b947e71a041186f1c001ecb
|
|
| BLAKE2b-256 |
95b6f8db8fbf1e61895cd0ac4bc05ebe3506fa89bfe590d918a92d364261c66b
|
File details
Details for the file om_memory-0.2.2-py3-none-any.whl.
File metadata
- Download URL: om_memory-0.2.2-py3-none-any.whl
- Upload date:
- Size: 36.9 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.3
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
ab75769e4d73ef26da58fc6ffbd01351fab8eed4585de37a1c9422409ae8d5d5
|
|
| MD5 |
624b85030f523a4fa8710b73c2722c9c
|
|
| BLAKE2b-256 |
6555ff012d0ab81a11154c3aed3750bc570877118167b8ca9b348fce5dc86704
|