Memory API
The Memory API provides interfaces for storing, retrieving, and managing both short-term and long-term memory in the SkinFlow framework.
MemorySystem Class
Main class for managing all memory operations.
Constructor
import { MemorySystem } from 'skingflow'
const memorySystem = new MemorySystem({
shortTerm: {
maxItems: 100,
ttl: 3600000 // 1 hour
},
longTerm: {
storage: {
type: 'postgres',
config: {
host: 'localhost',
database: 'skingflow',
user: 'postgres',
password: 'your-password'
}
}
},
search: {
enabled: true,
provider: 'openai',
model: 'text-embedding-ada-002'
}
})Methods
store(memory)
Stores a memory in both short-term and long-term storage.
const memory = {
id: 'mem123',
userId: 'user123',
type: 'conversation',
content: 'User prefers concise responses with bullet points',
timestamp: Date.now(),
metadata: {
sessionId: 'session456',
importance: 0.8,
tags: ['preference', 'communication-style']
}
}
await memorySystem.store(memory)Parameters:
memory(Object): Memory object to storeid(string): Unique memory identifieruserId(string): User identifiertype(string): Memory typecontent(string): Memory contenttimestamp(number): Creation timestampmetadata(Object): Additional metadata
Returns:
- Promise<void>
retrieve(query, options)
Retrieves memories relevant to a query.
const results = await memorySystem.retrieve(
'user preferences for response style',
{
userId: 'user123',
limit: 10,
threshold: 0.7,
types: ['preference', 'conversation']
}
)Parameters:
query(string): Search queryoptions(Object): Search optionsuserId(string): Filter by userlimit(number): Maximum resultsthreshold(number): Similarity threshold (0-1)types(Array<string>): Filter by memory typestimeRange(Object): Time range filter
Returns:
- Promise<Array<Object>>: Relevant memories
id(string): Memory IDcontent(string): Memory contentsimilarity(number): Similarity scoremetadata(Object): Memory metadata
update(memoryId, updates)
Updates an existing memory.
await memorySystem.update('mem123', {
content: 'User prefers very concise responses with bullet points',
metadata: {
importance: 0.9,
lastUpdated: Date.now()
}
})Parameters:
memoryId(string): Memory ID to updateupdates(Object): Updates to apply
Returns:
- Promise<void>
delete(memoryId)
Deletes a memory from storage.
await memorySystem.delete('mem123')Parameters:
memoryId(string): Memory ID to delete
Returns:
- Promise<void>
consolidate()
Moves important memories from short-term to long-term storage.
await memorySystem.consolidate()Returns:
- Promise<Object>: Consolidation results
moved(number): Number of memories movedretained(number): Number of memories retainederrors(Array<string>): Any errors encountered
ShortTermMemory Class
Manages in-memory session data.
Constructor
import { ShortTermMemory } from 'skingflow'
const shortTermMemory = new ShortTermMemory({
maxItems: 100,
ttl: 3600000, // 1 hour
cleanupInterval: 300000 // 5 minutes
})Methods
add(memory)
Adds a memory to short-term storage.
await shortTermMemory.add({
id: 'short123',
userId: 'user123',
type: 'session_context',
content: 'Current conversation about AI trends',
timestamp: Date.now()
})Parameters:
memory(Object): Memory to add
Returns:
- Promise<void>
get(memoryId)
Retrieves a specific memory by ID.
const memory = await shortTermMemory.get('short123')Parameters:
memoryId(string): Memory ID
Returns:
- Promise<Object>: Memory object or null if not found
getAll(userId)
Gets all memories for a user.
const memories = await shortTermMemory.getAll('user123')Parameters:
userId(string): User identifier
Returns:
- Promise<Array<Object>>: User's short-term memories
clear(userId)
Clears all memories for a user.
await shortTermMemory.clear('user123')Parameters:
userId(string): User identifier
Returns:
- Promise<void>
cleanup()
Removes expired memories.
const results = await shortTermMemory.cleanup()
console.log(`Cleaned up ${results.removed} expired memories`)Returns:
- Promise<Object>: Cleanup results
removed(number): Number of memories removedtotal(number): Total memories before cleanup
LongTermMemory Class
Manages persistent memory storage.
Constructor
import { LongTermMemory } from 'skingflow'
const longTermMemory = new LongTermMemory({
storage: {
type: 'postgres',
config: {
host: 'localhost',
database: 'skingflow',
user: 'postgres',
password: 'your-password'
}
},
indexing: {
enabled: true,
provider: 'openai',
model: 'text-embedding-ada-002'
}
})Methods
persist(memory)
Persists a memory to long-term storage.
await longTermMemory.persist({
id: 'long123',
userId: 'user123',
type: 'user_preference',
content: 'Prefers dark mode themes',
embedding: await generateEmbedding('Prefers dark mode themes'),
timestamp: Date.now(),
metadata: {
category: 'ui',
importance: 0.7
}
})Parameters:
memory(Object): Memory to persist
Returns:
- Promise<void>
search(query, options)
Searches for memories using semantic similarity.
const results = await longTermMemory.search(
'user interface preferences',
{
userId: 'user123',
limit: 10,
threshold: 0.6,
timeRange: {
start: Date.now() - 30 * 24 * 60 * 60 * 1000, // 30 days ago
end: Date.now()
}
}
)Parameters:
query(string): Search queryoptions(Object): Search options
Returns:
- Promise<Array<Object>>: Search results with similarity scores
getByType(type, options)
Gets memories by type.
const preferences = await longTermMemory.getByType('user_preference', {
userId: 'user123',
limit: 50,
sortBy: 'importance',
sortOrder: 'desc'
})Parameters:
type(string): Memory typeoptions(Object): Query options
Returns:
- Promise<Array<Object>>: Memories of specified type
updateEmbeddings(memoryIds)
Updates embeddings for specified memories.
await longTermMemory.updateEmbeddings(['long123', 'long456'])Parameters:
memoryIds(Array<string>): Memory IDs to update
Returns:
- Promise<void>
SemanticSearch Class
Provides semantic search capabilities using embeddings.
Constructor
import { SemanticSearch } from 'skingflow'
const semanticSearch = new SemanticSearch({
provider: 'openai',
model: 'text-embedding-ada-002',
dimensions: 1536,
batchSize: 100
})Methods
generateEmbedding(text)
Generates an embedding for text.
const embedding = await semanticSearch.generateEmbedding(
'User prefers concise responses with bullet points'
)Parameters:
text(string): Text to embed
Returns:
- Promise<Array<number>>: Embedding vector
similarity(embedding1, embedding2)
Calculates similarity between two embeddings.
const similarity = await semanticSearch.similarity(embedding1, embedding2)
console.log(`Similarity score: ${similarity}`)Parameters:
embedding1(Array<number>): First embeddingembedding2(Array<number>): Second embedding
Returns:
- Promise<number>: Similarity score (0-1)
findSimilar(query, embeddings, options)
Finds most similar embeddings to a query.
const results = await semanticSearch.findSimilar(
queryEmbedding,
memoryEmbeddings,
{
limit: 10,
threshold: 0.7
}
)Parameters:
query(Array<number>): Query embeddingembeddings(Array<Object>): Candidate embeddingsoptions(Object): Search options
Returns:
- Promise<Array<Object>>: Similar embeddings with scores
Memory Backend Classes
PostgreSQLBackend
PostgreSQL-based memory storage.
import { PostgreSQLBackend } from 'skingflow'
const pgBackend = new PostgreSQLBackend({
host: 'localhost',
port: 5432,
database: 'skingflow',
user: 'postgres',
password: 'your-password',
ssl: false,
pool: {
max: 20,
min: 5,
idle: 30000
}
})
// Initialize tables
await pgBackend.initialize()SQLiteBackend
SQLite-based memory storage for development.
import { SQLiteBackend } from 'skingflow'
const sqliteBackend = new SQLiteBackend({
database: './skingflow_memory.db',
timeout: 30000
})
await sqliteBackend.initialize()RedisBackend
Redis-based memory storage for caching.
import { RedisBackend } from 'skingflow'
const redisBackend = new RedisBackend({
host: 'localhost',
port: 6379,
password: process.env.REDIS_PASSWORD,
db: 0,
keyPrefix: 'skingflow:memory:'
})Memory Manager
High-level memory management interface.
import { MemoryManager } from 'skingflow'
const memoryManager = new MemoryManager({
system: memorySystem,
consolidation: {
enabled: true,
interval: 300000, // 5 minutes
importanceThreshold: 0.7
},
cleanup: {
enabled: true,
interval: 3600000, // 1 hour
retentionPeriod: 2592000000 // 30 days
}
})
// Start background processes
await memoryManager.start()
// Stop background processes
await memoryManager.stop()Context Management
Manage conversation context:
// Create context manager
const contextManager = memorySystem.createContextManager({
userId: 'user123',
sessionId: 'session456',
maxContextLength: 100,
maxTokens: 4000
})
// Add message to context
await contextManager.addMessage({
role: 'user',
content: 'Hello, I need help with my project',
timestamp: Date.now()
})
// Get current context
const context = await contextManager.getContext()
console.log('Current context:', context.messages)
// Clear context
await contextManager.clear()User Preferences
Store and retrieve user preferences:
// Store user preference
await memorySystem.store({
id: 'pref_theme',
userId: 'user123',
type: 'user_preference',
content: 'dark_mode',
metadata: {
category: 'ui',
importance: 0.8,
lastUpdated: Date.now()
}
})
// Retrieve user preferences
const preferences = await memorySystem.retrieve(
'user interface preferences',
{
userId: 'user123',
types: ['user_preference'],
limit: 20
}
)
// Get specific preference
const themePreference = preferences.find(p =>
p.content === 'dark_mode' || p.metadata.category === 'ui'
)Memory Analytics
Analyze memory usage and patterns:
// Get memory statistics
const stats = await memorySystem.getStatistics()
console.log('Memory Statistics:', stats)
// Output example:
{
"totalMemories": 15420,
"shortTermMemories": 1230,
"longTermMemories": 14190,
"usersCount": 856,
"averageMemoriesPerUser": 18.01,
"memoryTypes": {
"conversation": 8920,
"user_preference": 3450,
"session_context": 2050,
"learning": 1000
},
"storageUsage": {
"totalSize": "2.3GB",
"averageSizePerMemory": "156KB"
},
"searchPerformance": {
"averageSearchTime": 234,
"successRate": 0.98
}
}Memory Export/Import
Export and import memory data:
// Export memories
const exportData = await memorySystem.export({
userId: 'user123',
formats: ['json', 'csv'],
includeEmbeddings: false,
timeRange: {
start: Date.now() - 30 * 24 * 60 * 60 * 1000,
end: Date.now()
}
})
// Import memories
const importResult = await memorySystem.import(exportData, {
userId: 'user123',
deduplicate: true,
updateExisting: true
})Best Practices
1. Memory Design
- Use descriptive memory types and categories
- Include relevant metadata for better searchability
- Set appropriate importance scores for consolidation
- Use semantic search for context-aware retrieval
2. Performance
- Configure appropriate TTL for short-term memory
- Use indexing for frequently searched memory types
- Implement batch operations for bulk operations
- Monitor memory usage and cleanup regularly
3. Privacy and Security
- Implement proper access controls for user data
- Encrypt sensitive memory content
- Comply with data retention regulations
- Provide user control over their memory data
4. Scalability
- Choose appropriate storage backend for your use case
- Implement connection pooling for database backends
- Use caching for frequently accessed memories
- Design for horizontal scaling when needed
Next Steps
- Framework API - Main framework API documentation
- Agent API - Agent system API documentation
- Tool API - Tool system API documentation
- Examples - Practical implementations