Memory Operations
Detailed guide to Remina's core memory operations.
Operation Overview
| Operation | Description |
|---|---|
add() | Extract and store memories from text or conversations |
search() | Semantic search with hybrid scoring |
get() | Retrieve a specific memory by ID |
get_all() | List all memories for a user |
update() | Modify memory content |
delete() | Remove memories |
Adding Memories
From Plain Text
from remina import Memory
memory = Memory()
result = memory.add(
messages="I'm Sarah, a data scientist. I specialize in NLP and prefer PyTorch.",
user_id="sarah_001"
)
# Result structure
# {
# "results": [
# {"id": "abc123", "memory": "Name is Sarah", "event": "ADD"},
# {"id": "def456", "memory": "Is a data scientist", "event": "ADD"},
# {"id": "ghi789", "memory": "Specializes in NLP", "event": "ADD"},
# {"id": "jkl012", "memory": "Prefers PyTorch", "event": "ADD"}
# ]
# }From Conversation Messages
result = memory.add(
messages=[
{"role": "user", "content": "I relocated to Seattle last month"},
{"role": "assistant", "content": "How's the transition?"},
{"role": "user", "content": "Good overall, adjusting to the weather"}
],
user_id="sarah_001"
)With Metadata
result = memory.add(
messages="I prefer using PyTorch over TensorFlow",
user_id="sarah_001",
metadata={
"source": "preferences_conversation",
"confidence": 0.95,
"category": "tools"
}
)Searching Memories
Basic Search
results = memory.search(
query="What ML frameworks does Sarah use?",
user_id="sarah_001",
limit=5
)
for mem in results['results']:
print(f"[{mem['score']:.3f}] {mem['memory']}")Score Interpretation
Remina uses hybrid scoring:
- Semantic similarity (50%) — Vector cosine similarity
- Importance score (30%) — Recency + frequency + base importance
- Keyword overlap (20%) — Direct term matching
Scores range from 0.0 to 1.0.
With Metadata Filters
results = memory.search(
query="user preferences",
user_id="sarah_001",
limit=10,
filters={"category": "tools"}
)Retrieving Memories
By ID
memory_data = memory.get(memory_id="abc123")
if memory_data:
print(f"Content: {memory_data['content']}")
print(f"Created: {memory_data['created_at']}")All User Memories
all_memories = memory.get_all(user_id="sarah_001", limit=100)
print(f"Total: {len(all_memories['results'])}")
for mem in all_memories['results']:
print(f" - {mem['memory']}")Updating Memories
result = memory.update(
memory_id="abc123",
content="Name is Sarah Chen"
)
if result['success']:
print("Memory updated")Deleting Memories
Single Memory
result = memory.delete(memory_id="abc123")All User Memories
result = memory.delete_all(user_id="sarah_001")
print(result['message']) # "Deleted 15 memories"Async API
For async applications:
from remina import AsyncMemory
import asyncio
async def main():
memory = AsyncMemory()
await memory.add(
messages="I prefer async Python patterns",
user_id="async_user"
)
results = await memory.search(
query="coding preferences",
user_id="async_user"
)
await memory.close()
asyncio.run(main())Best Practices
User ID Design
# Recommended: unique, identifiable
user_id = "user_12345"
user_id = "org_acme_user_john"
# Avoid: generic identifiers
user_id = "user"
user_id = "1"Metadata Usage
memory.add(
messages="...",
user_id="user_123",
metadata={
"session_id": "sess_abc",
"source": "onboarding",
"timestamp": "2024-01-15T10:30:00Z"
}
)Resource Cleanup
# Always close connections
memory.close()Error Handling
from remina.exceptions import ReminaError, StorageError
try:
memory.add(messages="...", user_id="user_123")
except StorageError as e:
print(f"Storage error: {e.message}")
print(f"Suggestion: {e.suggestion}")
except ReminaError as e:
print(f"Error [{e.error_code}]: {e.message}")Next Steps
- Core Concepts — Architecture details
- Configuration — Provider setup
- API Reference — Complete API documentation