import vantadb_py as vantadb
from typing import List, Dict, Any, Optional
import os
DB_PATH = "./crewai_memory_db"
class VantaDBMemory:
def __init__(self, db_path: str = DB_PATH, namespace: str = "crewai/agent"):
self.db = vantadb.VantaDB(db_path, memory_limit_bytes=256_000_000)
self.namespace = namespace
def add(
self,
key: str,
content: str,
vector: Optional[List[float]] = None,
metadata: Optional[Dict[str, Any]] = None
) -> Dict[str, Any]:
meta = metadata or {}
record = self.db.put(
self.namespace,
key,
content,
metadata=meta,
vector=vector
)
return {
"key": key,
"content": content,
"metadata": meta,
"created_at": record["created_at_ms"]
}
def get(self, key: str) -> Optional[Dict[str, Any]]:
record = self.db.get(self.namespace, key)
if record:
return {
"key": record["key"],
"content": record["payload"],
"metadata": record["metadata"],
"created_at": record["created_at_ms"],
"updated_at": record["updated_at_ms"]
}
return None
def search(
self,
query: str,
query_vector: Optional[List[float]] = None,
top_k: int = 5,
filters: Optional[Dict[str, Any]] = None
) -> List[Dict[str, Any]]:
hits = self.db.search_memory(
self.namespace,
query_vector=query_vector,
text_query=query,
top_k=top_k,
filters=filters or {}
)
results = []
for hit in hits:
record = hit["record"]
results.append({
"key": record["key"],
"content": record["payload"],
"metadata": record["metadata"],
"score": hit["score"],
"created_at": record["created_at_ms"]
})
return results
def delete(self, key: str) -> bool:
return self.db.delete(self.namespace, key)
def list(self, limit: int = 100, filters: Optional[Dict[str, Any]] = None) -> List[Dict[str, Any]]:
options = {
"limit": limit,
"filters": filters or {}
}
records = self.db.list(self.namespace, options)
return [
{
"key": r["key"],
"content": r["payload"],
"metadata": r["metadata"],
"created_at": r["created_at_ms"]
}
for r in records
]
def close(self):
self.db.flush()
self.db.close()
def main():
memory = VantaDBMemory(namespace="crewai/agent-001")
print("๐ Storing agent memories...")
memory.add(
"task-001",
"User requested a Python script for data processing with pandas",
metadata={"type": "task", "priority": "high", "status": "pending"}
)
memory.add(
"pref-001",
"User prefers verbose output with detailed error messages",
metadata={"type": "preference", "category": "output"}
)
memory.add(
"ctx-001",
"Project uses Python 3.11 and requires pandas 2.0+",
metadata={"type": "context", "category": "environment"}
)
print("\n๐ Searching for 'pandas'...")
results = memory.search("pandas", top_k=3)
for i, result in enumerate(results, 1):
print(f" [{i}] Score: {result['score']:.3f}")
print(f" Content: {result['content']}")
print(f" Metadata: {result['metadata']}")
print("\n๐ Searching with metadata filter (type=preference)...")
results = memory.search("", filters={"type": "preference"})
for result in results:
print(f" Content: {result['content']}")
print(f" Metadata: {result['metadata']}")
print("\n๐ Listing all memories...")
all_memories = memory.list(limit=10)
for mem in all_memories:
print(f" [{mem['key']}] {mem['content'][:50]}...")
print("\n๐งน Cleaning up...")
memory.close()
if os.path.exists(DB_PATH):
import shutil
shutil.rmtree(DB_PATH)
print("Database cleaned up.")
if __name__ == "__main__":
main()