Download agent_memory.py from anu151105/RAM: direct link, hf CLI and curl.
- Browser
- Download file 6.4 kB
-
https://huggingface.co/spaces/anu151105/RAM/resolve/main/agent_memory.py
- Command line
-
hf download hf://spaces/anu151105/RAM/agent_memory.py
-
curl -L -o agent_memory.py https://huggingface.co/spaces/anu151105/RAM/resolve/main/agent_memory.py
6.4 kB
| 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)) | |
| } | |
| } |