| name | heretek-memory-system |
| description | Memory system development for Heretek Swarm's Cognee-backed memory. Use when implementing memory operations, working with knowledge graphs, or debugging memory issues. Covers Cognee API, access patterns, and intelligent prefetching. |
Heretek Swarm Memory System
Architecture Overview
The memory system is built on Cognee (knowledge graph + vector memory engine) with access-pattern optimization and intelligent pre-fetching.
Core Components
backend/heretek_swarm/memory/
├── __init__.py # Package exports (23 symbols)
├── access_patterns.py # Tier classification, pattern analysis
├── cognee_reader.py # Read-only Cognee client
├── cognee_writer.py # Write-path Cognee client
├── eliza_memory.py # Importance-decay memory manager
└── prefetcher.py # LRU/LFU caches, pre-fetch scheduling
No Legacy Code
The following have been deleted and must not be reintroduced:
base.py, persistent.py, tiering.py, versioned.py, compression.py, migration_strategies.py
- Legacy classes:
DualTierMemory, PersistentMemory, TieringManager, VersionedMemory, CompressionManager
Cognee API
Reader Operations
from heretek_swarm.memory import CogneeMemoryReader
reader = CogneeMemoryReader()
results = await reader.search(
query="search text",
limit=10,
agent="agent_name",
min_importance=0.5
)
memory = await reader.get(memory_id="abc123")
memories = await reader.list(
tags=["learning", "observation"],
created_after=datetime(2024, 1, 1)
)
Writer Operations
from heretek_swarm.memory import CogneeMemoryWriter
writer = CogneeMemoryWriter()
memory_id = await writer.add(
content="observation text",
metadata={
"agent": "explorer",
"importance": 0.8,
"tags": ["observation", "learning"],
"context": {"task_id": "T001"}
}
)
await writer.cognify()
await writer.update(
memory_id=memory_id,
content="updated text",
metadata={"importance": 0.9}
)
await writer.delete(memory_id=memory_id)
Access Patterns
Tier Classification
from heretek_swarm.memory import AccessPattern, AccessTier
analyzer = AccessPatternAnalyzer()
pattern = analyzer.analyze(access_logs)
tier = pattern.recommended_tier
await writer.set_tier(memory_id, tier)
Pattern Types
- Sequential - Accesses in order
- Random - No pattern
- Temporal - Time-based access
- Frequency - Based on access count
Usage
from heretek_swarm.memory import AccessPatternAnalyzer, MemoryAccessProfile
analyzer = AccessPatternAnalyzer()
profile = MemoryAccessProfile(
agent="explorer",
time_window=timedelta(hours=24),
access_count=150
)
recommendations = analyzer.recommend(profile)
Intelligent Prefetching
Cache Types
from heretek_swarm.memory import LRUCache, LFUCache
lru = LRUCache(max_size=1000)
await lru.set("key", value)
value = await lru.get("key")
lfu = LFUCache(max_size=1000)
await lfu.set("key", value)
value = await lfu.get("key")
Prefetch Scheduling
from heretek_swarm.memory import (
IntelligentPrefetcher,
PreFetchScheduler,
PreFetchRequest,
PreFetchPriority
)
prefetcher = IntelligentPrefetcher(
reader=reader,
cache=lru
)
request = PreFetchRequest(
query="likely needed context",
priority=PreFetchPriority.HIGH,
agent="explorer",
estimated_access_time=datetime.now() + timedelta(minutes=5)
)
scheduler = PreFetchScheduler(prefetcher)
await scheduler.schedule(request)
Prefetch Strategies
- Pattern-based - Based on historical access patterns
- Time-based - Scheduled prefetching
- Priority-based - High priority items first
- Predictive - ML-based prediction
Eliza Memory Manager
Importance-Decay Pattern
from heretek_swarm.memory import MemoryManager, create_memory_manager
manager = create_memory_manager(
decay_rate=0.1,
importance_threshold=0.3
)
memory_id = await manager.remember(
content="important observation",
importance=0.9,
agent="explorer"
)
memories = await manager.recall(
query="relevant context",
limit=10,
min_importance=0.5
)
forgotten = await manager.forget(
threshold=0.2,
older_than=timedelta(days=30)
)
Memory Types
- Episodic - Events and experiences
- Semantic - Knowledge and facts
- Procedural - Skills and procedures
- Emotional - Emotional associations
Testing Memory Operations
Unit Tests
import pytest
from heretek_swarm.memory import CogneeMemoryReader, CogneeMemoryWriter
@pytest.mark.asyncio
async def test_memory_roundtrip():
writer = CogneeMemoryWriter()
reader = CogneeMemoryReader()
memory_id = await writer.add(
content="test memory",
metadata={"importance": 0.8}
)
memory = await reader.get(memory_id)
assert memory.content == "test memory"
assert memory.metadata["importance"] == 0.8
@pytest.mark.asyncio
async def test_search():
writer = CogneeMemoryWriter()
reader = CogneeMemoryReader()
await writer.add("Python programming", tags=["coding"])
await writer.add("JavaScript programming", tags=["coding"])
await writer.cognify()
results = await reader.search("programming", limit=2)
assert len(results) == 2
Integration Tests
@pytest.mark.asyncio
async def test_memory_with_agent():
agent = ExplorerAgent(config)
writer = CogneeMemoryWriter()
observation = await agent.observe(context)
await writer.add(
content=observation,
metadata={"agent": "explorer", "importance": 0.7}
)
reader = CogneeMemoryReader()
memories = await reader.search("observation", agent="explorer")
assert len(memories) > 0
Debugging Memory Issues
Common Problems
-
Cognee connection failed
- Check if Cognee service is running
- Verify connection string
- Check network connectivity
-
Memory not found
- Verify memory_id exists
- Check access permissions
- Ensure memory wasn't deleted
-
Search returns empty
- Run
cognify() after adding memories
- Check search query
- Verify memory tags
-
Prefetch not working
- Check cache size limits
- Verify prefetch schedule
- Monitor access patterns
Debug Commands
python -c "from heretek_swarm.memory import CogneeMemoryReader; import asyncio; r = CogneeMemoryReader(); print(asyncio.run(r.count()))"
python -c "from heretek_swarm.memory import CogneeMemoryReader; import asyncio; r = CogneeMemoryReader(); print(asyncio.run(r.list(limit=10)))"
python -c "from heretek_swarm.memory import LRUCache; c = LRUCache(100); print(c.stats())"
Performance Optimization
Batch Operations
memories = [
{"content": f"memory {i}", "metadata": {"importance": 0.5}}
for i in range(100)
]
await writer.add_batch(memories)
queries = ["query1", "query2", "query3"]
results = await reader.search_batch(queries, limit=10)
Caching Strategy
- Hot data - Keep in LRU cache
- Warm data - Prefetch on access
- Cold data - Load on demand
- Archive - Compress and store
Indexing
- Use tags for fast filtering
- Create custom indexes for common queries
- Monitor query performance
Gotchas
- Always run
cognify() after adding memories - they're not searchable until processed
- No legacy imports - Only use Cognee-backed types
- Async operations - All memory operations are async
- Importance decay - Memories fade over time unless reinforced
- Cache invalidation - Manual invalidation may be needed
- Batch limits - Respect Cognee API rate limits
Best Practices
- Use meaningful tags for memories
- Set appropriate importance levels
- Implement memory cleanup schedules
- Monitor memory usage and performance
- Use negative assertions to prevent legacy code creep
- Test both read and write paths
- Document memory schemas