Persistent memory for AI agents. Three methods. Zero infra.
Project description
kemi
Persistent memory for AI agents. Three methods. Zero infra.
from kemi import Memory
memory = Memory() # SQLite + local embeddings, no API keys needed
memory.remember("user123", "User prefers dark mode")
memory.remember("user123", "User is vegetarian")
results = memory.recall("user123", "what are the user's preferences?")
# Returns ranked, deduplicated memories
memory.forget("user123") # GDPR-compliant deletion
Install
# Zero dependencies — SQLite storage, no embedding (bring your own)
pip install kemi
# With local embeddings (no API key needed, ~130MB model download)
pip install kemi[local]
# With OpenAI embeddings
pip install kemi[openai]
Why kemi
Every existing memory library either hosts your data on their servers, requires Docker and 4 services to run, or locks you into a specific framework.
kemi is different:
- Zero infrastructure — runs on your machine, single pip install
- Your data — never leaves your machine, stored in SQLite by default
- Bring your own embedding — OpenAI, local models, or any function
- Framework agnostic — works with LangChain, CrewAI, AutoGen, or plain Python
- 100% free — MIT license, no paid tiers, no cloud lock-in
Usage
Zero-config (local embeddings)
from kemi import Memory
memory = Memory()
memory.remember("user123", "User is vegetarian", importance=0.9)
results = memory.recall("user123", "food preferences")
With OpenAI embeddings
from kemi import Memory
from kemi.adapters.embedding.openai import OpenAIEmbedAdapter
memory = Memory(embed=OpenAIEmbedAdapter())
memory.remember("user123", "User prefers concise responses")
results = memory.recall("user123", "communication style")
Async usage (FastAPI, asyncio)
from fastapi import FastAPI
from kemi import Memory
app = FastAPI()
memory = Memory()
@app.post("/chat")
async def chat(user_id: str, message: str):
await memory.aremember(user_id, message)
context = await memory.acontext_block(user_id, message)
return {"context": context}
Inject into system prompt
context = memory.context_block("user123", query="user preferences", max_tokens=500)
# Returns formatted string ready for system prompt injection
GDPR-compliant deletion
memory.forget("user123") # Delete all memories for user
memory.forget("user123", memory_id) # Delete one specific memory
How it works
kemi sits between your agent and your storage. It handles:
- Semantic deduplication — "I'm vegetarian" and "I don't eat meat" are the same memory
- Importance-weighted scoring — recent, important memories rank higher
- Temporal decay — memories fade if never recalled
- Conflict detection — flags contradictory memories for review
- Lifecycle management — active → decaying → archived → deleted
Adapters
| Type | Default | Available |
|---|---|---|
| Embedding | fastembed (local) | OpenAI, custom |
| Storage | SQLite | JSON, custom |
Integrations
MCP Server
Any MCP-compatible agent (Claude, Cursor, Continue) can use kemi as memory:
pip install kemi[mcp]
python -m kemi.mcp_server
LangChain
from kemi import Memory
from kemi.integrations.langchain import KemiMemory
memory = Memory()
chat_memory = KemiMemory(user_id="alice", memory=memory)
Export / Import
memory.export("backup.json") # backup all memories
memory.import_from("backup.json") # restore from backup
Documentation
- Quickstart — get running in 5 minutes
- Recipes — complete working examples
- Configuration — tuning kemi for your use case
- Adapters — embeddings, storage, and custom implementations
License
MIT — free forever, no exceptions.
Project details
Release history Release notifications | RSS feed
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 kemi-0.2.0.tar.gz.
File metadata
- Download URL: kemi-0.2.0.tar.gz
- Upload date:
- Size: 32.4 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.14.3
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
e5062ca60ca8f2682eddc1d3c1ef3ada96dedebcf7ed52a6d31a9571dab72c7b
|
|
| MD5 |
785c431133adb8d451e75b09dbd9fa69
|
|
| BLAKE2b-256 |
772922d35a102bce96b7058b1b8abacb41465f5a1e869f666f622184a7356a3b
|
File details
Details for the file kemi-0.2.0-py3-none-any.whl.
File metadata
- Download URL: kemi-0.2.0-py3-none-any.whl
- Upload date:
- Size: 25.0 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.14.3
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
3990cac7d926eb110812c43d1f1549cfd5366d197abac005d66ac5c514f95963
|
|
| MD5 |
f432ca8effa603f9b9872afa0c77dbde
|
|
| BLAKE2b-256 |
cab16cab0ba2b76797c2ea548dbfb2e6ce640baf6cb17197ab8e95fa695415f8
|