mcikalmerdeka's picture
refactor application structure and enhance logging capabilities
9d5041f
"""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