| """Conversation memory management""" |
|
|
| from typing import List |
| from langchain.messages import HumanMessage, AIMessage |
| from config import logger_memory |
|
|
|
|
| class ConversationMemory: |
| """Manages conversation history with smart truncation""" |
| |
| def __init__(self, max_messages: int = 4): |
| self.messages = [] |
| self.max_messages = max_messages |
| logger_memory.info(f"ConversationMemory initialized with max_messages={max_messages}") |
| |
| def add_user_message(self, content: str): |
| """Add user message to history""" |
| logger_memory.debug(f"Adding user message: {content[:50]}..." if len(content) > 50 else f"Adding user message: {content}") |
| self.messages.append(HumanMessage(content=content)) |
| current_count = len(self.messages) |
| logger_memory.info(f"User message added. Current message count: {current_count}") |
| self._truncate() |
| |
| def add_ai_message(self, content: str): |
| """Add AI message to history""" |
| content_preview = content[:50] + "..." if len(content) > 50 else content |
| logger_memory.debug(f"Adding AI message: {content_preview}") |
| self.messages.append(AIMessage(content=content)) |
| current_count = len(self.messages) |
| logger_memory.info(f"AI message added. Current message count: {current_count}") |
| self._truncate() |
| |
| def _truncate(self): |
| """Keep only recent messages to avoid context bloat""" |
| if len(self.messages) > self.max_messages: |
| removed_count = len(self.messages) - self.max_messages |
| self.messages = self.messages[-self.max_messages:] |
| logger_memory.info(f"Memory truncated: removed {removed_count} oldest messages, keeping {len(self.messages)} most recent") |
| else: |
| logger_memory.debug(f"No truncation needed. Current count: {len(self.messages)}, max: {self.max_messages}") |
| |
| def get_history(self) -> List: |
| """Get formatted conversation history""" |
| history = self.messages |
| logger_memory.debug(f"Retrieving history: {len(history)} messages") |
| return history |
| |
| def get_history_text(self) -> str: |
| """Get history as formatted text""" |
| if not self.messages: |
| logger_memory.debug("No conversation history available") |
| return "No previous conversation" |
| |
| history_text = [] |
| for msg in self.messages: |
| role = "User" if isinstance(msg, HumanMessage) else "Assistant" |
| history_text.append(f"{role}: {msg.content}") |
| |
| formatted = "\n".join(history_text) |
| logger_memory.debug(f"Formatted history: {len(formatted)} characters, {len(self.messages)} messages") |
| return formatted |
|
|