RAM / agent_memory.py
anu151105's picture
Upload 6 files
a3738dd verified
import time
from typing import Dict, List, Any, Optional, Union
class MemoryManager:
"""Memory management for the autonomous AI agent
This module provides capabilities for:
1. Storing and retrieving conversation history
2. Managing context windows
3. Implementing forgetting mechanisms
4. Prioritizing important information
"""
def __init__(self, max_history_length: int = 20):
"""Initialize the memory manager
Args:
max_history_length: Maximum number of conversation turns to store
"""
self.conversation_history = []
self.max_history_length = max_history_length
self.important_facts = []
self.max_facts = 50
self.session_data = {}
def add_message(self, role: str, content: str) -> None:
"""Add a message to the conversation history
Args:
role: The role of the message sender (user or assistant)
content: The content of the message
"""
self.conversation_history.append({
"role": role,
"content": content,
"timestamp": time.time()
})
# Trim history if it gets too long
if len(self.conversation_history) > self.max_history_length * 2:
self.conversation_history = self.conversation_history[-self.max_history_length*2:]
def get_conversation_history(self, max_turns: Optional[int] = None) -> List[Dict[str, Any]]:
"""Get the conversation history
Args:
max_turns: Maximum number of turns to retrieve (None for all)
Returns:
List of conversation messages
"""
if max_turns is None:
return self.conversation_history
else:
# Calculate the number of messages (2 messages per turn)
max_messages = max_turns * 2
return self.conversation_history[-max_messages:]
def format_conversation_for_prompt(self, max_turns: Optional[int] = None) -> str:
"""Format the conversation history for inclusion in a prompt
Args:
max_turns: Maximum number of turns to include
Returns:
Formatted conversation string
"""
history = self.get_conversation_history(max_turns)
formatted = ""
for msg in history:
formatted += f"{msg['role']}: {msg['content']}\n"
return formatted
def add_important_fact(self, fact: str, source: str) -> None:
"""Add an important fact to memory
Args:
fact: The important fact to remember
source: The source of the fact (e.g., user, inference)
"""
self.important_facts.append({
"fact": fact,
"source": source,
"timestamp": time.time()
})
# Trim facts if they get too numerous
if len(self.important_facts) > self.max_facts:
self.important_facts = self.important_facts[-self.max_facts:]
def get_important_facts(self) -> List[Dict[str, Any]]:
"""Get the list of important facts
Returns:
List of important facts
"""
return self.important_facts
def format_facts_for_prompt(self) -> str:
"""Format important facts for inclusion in a prompt
Returns:
Formatted facts string
"""
if not self.important_facts:
return ""
formatted = "Important information I know about the user and context:\n"
# Sort facts by timestamp (newest first)
sorted_facts = sorted(self.important_facts, key=lambda x: x.get('timestamp', 0), reverse=True)
# Group facts by source
user_facts = [fact for fact in sorted_facts if fact.get('source') == 'user']
inference_facts = [fact for fact in sorted_facts if fact.get('source') == 'inference']
# Add user facts first (they're more reliable)
for i, fact in enumerate(user_facts):
formatted += f"{i+1}. {fact['fact']} (from user)\n"
# Then add inference facts
start_idx = len(user_facts) + 1
for i, fact in enumerate(inference_facts):
formatted += f"{start_idx + i}. {fact['fact']} (inferred)\n"
return formatted
def store_session_data(self, key: str, value: Any) -> None:
"""Store data for the current session
Args:
key: The key to store the data under
value: The data to store
"""
self.session_data[key] = {
"value": value,
"timestamp": time.time()
}
def get_session_data(self, key: str) -> Optional[Any]:
"""Retrieve data from the current session
Args:
key: The key to retrieve data for
Returns:
The stored data, or None if not found
"""
if key in self.session_data:
return self.session_data[key]["value"]
else:
return None
def clear_conversation_history(self) -> None:
"""Clear the conversation history"""
self.conversation_history = []
def clear_all_memory(self) -> None:
"""Clear all memory (conversation history, facts, and session data)"""
self.conversation_history = []
self.important_facts = []
self.session_data = {}
def get_memory_stats(self) -> Dict[str, Any]:
"""Get statistics about the agent's memory usage
Returns:
Dictionary containing memory statistics
"""
return {
"conversation_turns": len(self.conversation_history) // 2,
"important_facts": len(self.important_facts),
"session_data_keys": list(self.session_data.keys()),
"memory_usage": {
"conversation": len(str(self.conversation_history)),
"facts": len(str(self.important_facts)),
"session": len(str(self.session_data))
}
}