Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Python API

Varun Pratap Bhardwaj edited this page May 24, 2026 · 2 revisions

Python API

Programmatic access to SuperLocalMemory - Import statements, core classes, code examples, and complete API reference for developers.


Installation

SuperLocalMemory is already installed if you ran ./install.sh. The Python modules are located at ~/.claude-memory/.

# Verify installation
ls -la ~/.claude-memory/memory_store_v2.py
ls -la ~/.claude-memory/graph_engine.py
ls -la ~/.claude-memory/pattern_learner.py

Quick Start

Basic Usage

import sys
sys.path.append('/Users/YOUR_USERNAME/.claude-memory/')
from memory_store_v2 import MemoryStoreV2
# Initialize
store = MemoryStoreV2()
# Save memory
memory_id = store.save_memory(
 content="We use FastAPI for REST APIs",
 tags=["python", "backend", "api"],
 project_name="myapp",
 importance=7
)
print(f"Saved memory ID: {memory_id}")
# Search memories
results = store.search_memories("FastAPI", limit=5)
for result in results:
 print(f"[{result['id']}] {result['content']} (Score: {result['score']:.2f})")
# List recent
recent = store.list_recent(limit=10)
for mem in recent:
 print(f"[{mem['id']}] {mem['content']}")

Core Classes

MemoryStoreV2

Location: ~/.claude-memory/memory_store_v2.py

Description: Main memory management class with SQLite storage, full-text search, and semantic search.

Initialization

from memory_store_v2 import MemoryStoreV2
# Default profile
store = MemoryStoreV2()
# Specific profile
store = MemoryStoreV2(profile="work")
# Custom database path
store = MemoryStoreV2(db_path="/custom/path/memory.db")

Methods

save_memory()
memory_id = store.save_memory(
 content: str,
 tags: list = None,
 project_name: str = "default",
 importance: int = 5,
 parent_id: int = None
) -> int

Parameters:

  • content (str, required): Memory content (max 1MB)
  • tags (list, optional): List of tags
  • project_name (str, optional): Project name (default: "default")
  • importance (int, optional): Priority 1-10 (default: 5)
  • parent_id (int, optional): Parent memory ID for hierarchical organization

Returns: Memory ID (int)

Example:

memory_id = store.save_memory(
 content="JWT tokens expire after 24 hours",
 tags=["security", "auth", "jwt"],
 project_name="api-project",
 importance=8
)
search_memories()
results = store.search_memories(
 query: str,
 limit: int = 10,
 min_score: float = 0.3,
 tags: list = None,
 project_name: str = None
) -> list[dict]

Parameters:

  • query (str, required): Search query
  • limit (int, optional): Max results (default: 10)
  • min_score (float, optional): Minimum relevance 0.0-1.0 (default: 0.3)
  • tags (list, optional): Filter by tags
  • project_name (str, optional): Filter by project

Returns: List of dicts with keys: id, content, score, tags, project_name, created_at

Example:

results = store.search_memories(
 query="authentication",
 limit=5,
 min_score=0.7,
 tags=["security"]
)
for result in results:
 print(f"[{result['id']}] Score: {result['score']:.2f}")
 print(f" {result['content']}")
 print(f" Tags: {', '.join(result['tags'])}")
list_recent()
recent = store.list_recent(
 limit: int = 10,
 project_name: str = None
) -> list[dict]

Parameters:

  • limit (int, optional): Number to return (default: 10)
  • project_name (str, optional): Filter by project

Returns: List of dicts (same structure as search_memories)

Example:

recent = store.list_recent(limit=20)
for mem in recent:
 print(f"[{mem['id']}] {mem['created_at']}: {mem['content'][:50]}...")
list_all()
all_memories = store.list_all(
 project_name: str = None,
 tags: list = None
) -> list[dict]

Parameters:

  • project_name (str, optional): Filter by project
  • tags (list, optional): Filter by tags

Returns: List of all memories (no limit)

Example:

# Get all memories
all_memories = store.list_all()
print(f"Total memories: {len(all_memories)}")
# Filter by project
work_memories = store.list_all(project_name="work")
get_memory()
memory = store.get_memory(memory_id: int) -> dict

Parameters:

  • memory_id (int, required): Memory ID

Returns: Dict with memory details or None if not found

Example:

memory = store.get_memory(42)
if memory:
 print(f"Content: {memory['content']}")
 print(f"Tags: {memory['tags']}")
else:
 print("Memory not found")
delete_memory()
success = store.delete_memory(memory_id: int) -> bool

Parameters:

  • memory_id (int, required): Memory ID to delete

Returns: True if deleted, False if not found

Example:

if store.delete_memory(42):
 print("Memory deleted")
else:
 print("Memory not found")
get_stats()
stats = store.get_stats() -> dict

Returns: Dict with keys: total_memories, database_size_mb, profiles

Example:

stats = store.get_stats()
print(f"Total memories: {stats['total_memories']}")
print(f"Database size: {stats['database_size_mb']:.2f} MB")
get_attribution()
attribution = store.get_attribution() -> dict

Returns: Dict with creator metadata

Example:

attr = store.get_attribution()
print(f"Creator: {attr['creator']}")
print(f"Project: {attr['project']}")
print(f"License: {attr['license']}")

GraphEngine

Location: ~/.claude-memory/graph_engine.py

Description: Knowledge graph management with TF-IDF entity extraction and Leiden clustering.

Initialization

from graph_engine import GraphEngine
# Default profile
graph = GraphEngine()
# Specific profile
graph = GraphEngine(profile="work")

Methods

build_graph()
result = graph.build_graph(
 force: bool = False,
 clustering: bool = False,
 verbose: bool = False
) -> dict

Parameters:

  • force (bool, optional): Force complete rebuild (default: False)
  • clustering (bool, optional): Run Leiden clustering (default: False)
  • verbose (bool, optional): Print progress (default: False)

Returns: Dict with keys: nodes, edges, clusters, build_time

Example:

result = graph.build_graph(clustering=True, verbose=True)
print(f"Nodes: {result['nodes']}")
print(f"Edges: {result['edges']}")
print(f"Clusters: {result['clusters']}")
print(f"Build time: {result['build_time']:.2f}s")
get_stats()
stats = graph.get_stats() -> dict

Returns: Dict with graph statistics

Example:

stats = graph.get_stats()
print(f"Nodes: {stats['nodes']}")
print(f"Edges: {stats['edges']}")
print(f"Density: {stats['density']:.2f}%")
print(f"Largest component: {stats['largest_component']}")
get_related_memories()
related = graph.get_related_memories(
 memory_id: int,
 limit: int = 5
) -> list[tuple]

Parameters:

  • memory_id (int, required): Source memory ID
  • limit (int, optional): Max related memories (default: 5)

Returns: List of tuples: (memory_id, similarity_score)

Example:

related = graph.get_related_memories(42, limit=10)
for mem_id, score in related:
 print(f"Memory {mem_id}: similarity {score:.2f}")
get_clusters()
clusters = graph.get_clusters() -> list[dict]

Returns: List of clusters with keys: id, name, size, top_entities

Example:

clusters = graph.get_clusters()
for cluster in clusters:
 print(f"Cluster {cluster['id']}: {cluster['name']}")
 print(f" Size: {cluster['size']} memories")
 print(f" Top entities: {', '.join(cluster['top_entities'])}")

PatternLearner

Location: ~/.claude-memory/pattern_learner.py

Description: Pattern learning with multi-dimensional identity extraction and confidence scoring.

Initialization

from pattern_learner import PatternLearner
# Default profile
learner = PatternLearner()
# Specific profile
learner = PatternLearner(profile="work")

Methods

update_patterns()
result = learner.update_patterns() -> dict

Returns: Dict with keys: patterns_updated, categories, update_time

Example:

result = learner.update_patterns()
print(f"Patterns updated: {result['patterns_updated']}")
print(f"Categories: {', '.join(result['categories'])}")
get_identity_context()
context = learner.get_identity_context(
 min_confidence: float = 0.5
) -> str

Parameters:

  • min_confidence (float, optional): Minimum confidence threshold (default: 0.5)

Returns: Formatted identity context string

Example:

context = learner.get_identity_context(min_confidence=0.6)
print(context)
list_patterns()
patterns = learner.list_patterns(
 category: str = None
) -> list[dict]

Parameters:

  • category (str, optional): Filter by category

Returns: List of dicts with keys: category, pattern, confidence, frequency

Example:

# All patterns
all_patterns = learner.list_patterns()
# Framework patterns only
frameworks = learner.list_patterns(category="frameworks")
for pattern in frameworks:
 print(f"{pattern['pattern']}: {pattern['confidence']:.0%}")
reset_patterns()
success = learner.reset_patterns() -> bool

Returns: True if reset successful

Example:

if learner.reset_patterns():
 print("Patterns reset successfully")

Complete Example

Building a Memory Assistant

import sys
sys.path.append('/Users/YOUR_USERNAME/.claude-memory/')
from memory_store_v2 import MemoryStoreV2
from graph_engine import GraphEngine
from pattern_learner import PatternLearner
class MemoryAssistant:
 def __init__(self, profile="default"):
 self.store = MemoryStoreV2(profile=profile)
 self.graph = GraphEngine(profile=profile)
 self.learner = PatternLearner(profile=profile)
 def remember(self, content, tags=None, importance=5):
 """Save memory and update patterns"""
 memory_id = self.store.save_memory(
 content=content,
 tags=tags or [],
 importance=importance
 )
 print(f"βœ“ Memory saved (ID: {memory_id})")
 # Update patterns
 self.learner.update_patterns()
 return memory_id
 def recall(self, query, limit=5, min_score=0.7):
 """Search memories with graph enhancement"""
 results = self.store.search_memories(
 query=query,
 limit=limit,
 min_score=min_score
 )
 print(f"πŸ” Found {len(results)} results:\n")
 for result in results:
 print(f"[{result['id']}] Score: {result['score']:.2f}")
 print(f" {result['content']}")
 print(f" Tags: {', '.join(result['tags'])}")
 print()
 return results
 def get_identity(self):
 """Get learned identity context"""
 context = self.learner.get_identity_context(min_confidence=0.5)
 print("Your Coding Identity:")
 print(context)
 return context
 def build_knowledge_graph(self):
 """Build/update knowledge graph"""
 print("Building knowledge graph...")
 result = self.graph.build_graph(clustering=True, verbose=True)
 print(f"\nβœ“ Graph built: {result['nodes']} nodes, {result['edges']} edges")
 return result
 def find_related(self, memory_id, limit=5):
 """Find related memories"""
 related = self.graph.get_related_memories(memory_id, limit=limit)
 print(f"Related to memory {memory_id}:\n")
 for mem_id, score in related:
 memory = self.store.get_memory(mem_id)
 print(f"[{mem_id}] Similarity: {score:.2f}")
 print(f" {memory['content'][:100]}...")
 print()
 return related
# Usage
assistant = MemoryAssistant(profile="work")
# Save memories
assistant.remember("We use FastAPI for REST APIs", tags=["python", "backend"])
assistant.remember("JWT tokens expire after 24h", tags=["security", "auth"])
assistant.remember("PostgreSQL 15 for database", tags=["database"])
# Build graph
assistant.build_knowledge_graph()
# Search
assistant.recall("authentication")
# Get identity
assistant.get_identity()
# Find related
assistant.find_related(1)

Advanced Usage

Context Manager

from contextlib import contextmanager
@contextmanager
def memory_context(profile="default"):
 """Context manager for profile switching"""
 store = MemoryStoreV2(profile=profile)
 yield store
 # Cleanup if needed
# Usage
with memory_context("work") as store:
 store.save_memory("Work memory", tags=["work"])
with memory_context("personal") as store:
 store.save_memory("Personal memory", tags=["personal"])

Batch Operations

def bulk_import(memories, profile="default"):
 """Import multiple memories efficiently"""
 store = MemoryStoreV2(profile=profile)
 graph = GraphEngine(profile=profile)
 memory_ids = []
 for mem in memories:
 mem_id = store.save_memory(
 content=mem['content'],
 tags=mem.get('tags', []),
 importance=mem.get('importance', 5)
 )
 memory_ids.append(mem_id)
 # Build graph once after all imports
 graph.build_graph(force=True)
 return memory_ids
# Usage
memories = [
 {"content": "Memory 1", "tags": ["tag1"]},
 {"content": "Memory 2", "tags": ["tag2"]},
 {"content": "Memory 3", "tags": ["tag3"]}
]
bulk_import(memories)

Custom Search

def search_with_boost(query, boost_tags, profile="default"):
 """Search with tag boosting"""
 store = MemoryStoreV2(profile=profile)
 # Search
 results = store.search_memories(query)
 # Boost results with specific tags
 for result in results:
 if any(tag in result['tags'] for tag in boost_tags):
 result['score'] *= 1.2 # 20% boost
 # Re-sort by score
 results.sort(key=lambda x: x['score'], reverse=True)
 return results
# Usage
results = search_with_boost(
 query="authentication",
 boost_tags=["critical", "security"]
)

Error Handling

Common Exceptions

from memory_store_v2 import MemoryStoreV2
store = MemoryStoreV2()
try:
 # Save memory
 memory_id = store.save_memory(
 content="", # Empty content
 tags=["test"]
 )
except ValueError as e:
 print(f"Error: {e}") # "Content cannot be empty"
try:
 # Invalid importance
 memory_id = store.save_memory(
 content="Test",
 importance=15 # Invalid (must be 1-10)
 )
except ValueError as e:
 print(f"Error: {e}") # "Importance must be between 1 and 10"

Type Hints

from typing import List, Dict, Optional, Tuple
def save_memory_typed(
 store: MemoryStoreV2,
 content: str,
 tags: Optional[List[str]] = None,
 importance: int = 5
) -> int:
 """Type-hinted memory save function"""
 return store.save_memory(content=content, tags=tags, importance=importance)
def search_typed(
 store: MemoryStoreV2,
 query: str,
 limit: int = 10
) -> List[Dict[str, any]]:
 """Type-hinted search function"""
 return store.search_memories(query=query, limit=limit)

Testing

import unittest
from memory_store_v2 import MemoryStoreV2
class TestMemoryStore(unittest.TestCase):
 def setUp(self):
 """Create test store"""
 self.store = MemoryStoreV2(profile="test")
 def test_save_memory(self):
 """Test memory save"""
 memory_id = self.store.save_memory(
 content="Test memory",
 tags=["test"]
 )
 self.assertIsInstance(memory_id, int)
 self.assertGreater(memory_id, 0)
 def test_search_memories(self):
 """Test memory search"""
 # Save memory
 self.store.save_memory(content="FastAPI test", tags=["test"])
 # Search
 results = self.store.search_memories("FastAPI")
 self.assertGreater(len(results), 0)
 self.assertIn("FastAPI", results[0]['content'])
 def tearDown(self):
 """Cleanup test profile"""
 # Delete test profile
 pass
if __name__ == '__main__':
 unittest.main()

Related Pages


Created by Varun Pratap Bhardwaj Solution Architect β€’ SuperLocalMemory

GitHub β€’ Issues β€’ Wiki

Clone this wiki locally

AltStyle γ«γ‚ˆγ£γ¦ε€‰ζ›γ•γ‚ŒγŸγƒšγƒΌγ‚Έ (->γ‚ͺγƒͺγ‚ΈγƒŠγƒ«) /