import vantadb_py as vantadb
from typing import List, Dict, Any, Optional
import json
import os
DB_PATH = "./semantic_kernel_vantadb_db"
class VantaDBSemanticMemory:
def __init__(self, db_path: str = DB_PATH, collection_name: str = "default"):
self.db = vantadb.VantaDB(db_path, memory_limit_bytes=512_000_000)
self.collection_name = collection_name
self.namespace = f"semantic-kernel/{collection_name}"
def save_information(
self,
text: str,
key: Optional[str] = None,
metadata: Optional[Dict[str, Any]] = None,
embedding: Optional[List[float]] = None
) -> str:
import uuid
memory_key = key or f"mem-{uuid.uuid4().hex[:8]}"
meta = metadata or {}
meta.update({
"collection": self.collection_name,
"type": "information"
})
record = self.db.put(
self.namespace,
memory_key,
text,
metadata=meta,
vector=embedding
)
return memory_key
def save_reference(
self,
text: str,
external_id: str,
external_source: str,
metadata: Optional[Dict[str, Any]] = None,
embedding: Optional[List[float]] = None
) -> str:
memory_key = f"ref-{external_source}-{external_id}"
meta = metadata or {}
meta.update({
"collection": self.collection_name,
"type": "reference",
"external_id": external_id,
"external_source": external_source
})
record = self.db.put(
self.namespace,
memory_key,
text,
metadata=meta,
vector=embedding
)
return memory_key
def retrieve(
self,
query: str,
query_embedding: Optional[List[float]] = None,
limit: int = 10,
min_relevance_score: float = 0.0,
filters: Optional[Dict[str, Any]] = None
) -> List[Dict[str, Any]]:
search_filters = filters or {}
hits = self.db.search_memory(
self.namespace,
query_vector=query_embedding,
text_query=query,
top_k=limit,
filters=search_filters
)
memories = []
for hit in hits:
if hit["score"] >= min_relevance_score:
record = hit["record"]
memories.append({
"key": record["key"],
"text": record["payload"],
"metadata": record["metadata"],
"relevance": hit["score"]
})
return memories
def get(self, key: str) -> Optional[Dict[str, Any]]:
record = self.db.get(self.namespace, key)
if record:
return {
"key": record["key"],
"text": record["payload"],
"metadata": record["metadata"],
"created_at": record["created_at_ms"]
}
return None
def remove(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]]:
records = self.db.list(self.namespace, {"limit": limit, "filters": filters or {}})
return [
{
"key": r["key"],
"text": r["payload"],
"metadata": r["metadata"],
"created_at": r["created_at_ms"]
}
for r in records
]
def search_by_type(
self,
memory_type: str,
query: str,
limit: int = 10
) -> List[Dict[str, Any]]:
return self.retrieve(
query,
limit=limit,
filters={"type": memory_type}
)
def get_stats(self) -> Dict[str, Any]:
memories = self.list(limit=100000)
type_counts = {}
for mem in memories:
mem_type = mem["metadata"].get("type", "unknown")
type_counts[mem_type] = type_counts.get(mem_type, 0) + 1
return {
"collection": self.collection_name,
"total_memories": len(memories),
"type_distribution": type_counts
}
def close(self):
self.db.flush()
self.db.close()
def main():
memory = VantaDBSemanticMemory(collection_name="demo-app")
print("๐ Saving information...")
memory.save_information(
"User prefers concise technical answers with code examples",
metadata={"category": "preference", "priority": "high"}
)
memory.save_information(
"User is working on a Python project using Semantic Kernel",
metadata={"category": "project", "status": "active"}
)
memory.save_reference(
"Semantic Kernel documentation: https://learn.microsoft.com/en-us/semantic-kernel/",
external_id="sk-docs",
external_source="microsoft",
metadata={"type": "documentation"}
)
print("\n๐ Retrieving memories for 'Semantic Kernel'...")
results = memory.retrieve("Semantic Kernel", limit=5)
for result in results:
print(f" Relevance: {result['relevance']:.3f}")
print(f" Text: {result['text'][:80]}...")
print(f" Metadata: {result['metadata']}")
print("\n๐ Searching by type (reference)...")
references = memory.search_by_type("reference", "documentation")
for ref in references:
print(f" {ref['text'][:80]}...")
print("\n๐ Collection statistics:")
stats = memory.get_stats()
print(f" Collection: {stats['collection']}")
print(f" Total memories: {stats['total_memories']}")
print(f" Type distribution: {stats['type_distribution']}")
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()