diff --git a/core/session_manager.py b/core/session_manager.py index 699a59b..e9a2740 100644 --- a/core/session_manager.py +++ b/core/session_manager.py @@ -20,6 +20,15 @@ from .models import Session, ChatMessage logger = logging.getLogger(__name__) +def _message_timestamp_iso(value: Optional[datetime]) -> Optional[str]: + """Return a stable ISO timestamp for chat message metadata.""" + if not value: + return None + if value.tzinfo is None: + value = value.replace(tzinfo=timezone.utc) + return value.isoformat().replace("+00:00", "Z") + + class SessionManager: """ Manages chat sessions with database persistence. @@ -107,6 +116,7 @@ class SessionManager: meta = json.loads(db_msg.meta_data) if db_msg.meta_data else {} if meta is None: meta = {} meta['_db_id'] = db_msg.id + meta.setdefault('timestamp', _message_timestamp_iso(db_msg.timestamp)) history.append(ChatMessage( role=db_msg.role, content=db_msg.content, @@ -121,6 +131,7 @@ class SessionManager: meta = json.loads(db_msg.meta_data) if db_msg.meta_data else {} if meta is None: meta = {} meta['_db_id'] = db_msg.id + meta.setdefault('timestamp', _message_timestamp_iso(db_msg.timestamp)) history.append(ChatMessage( role=db_msg.role, content=db_msg.content, @@ -177,12 +188,17 @@ class SessionManager: db = SessionLocal() try: msg_id = str(uuid.uuid4()) + msg_time = datetime.utcnow() + if message.metadata is None: + message.metadata = {} + message.metadata.setdefault('timestamp', _message_timestamp_iso(msg_time)) db_message = DbChatMessage( id=msg_id, session_id=session_id, role=message.role, content=message.content, - meta_data=json.dumps(message.metadata) if message.metadata else None + meta_data=json.dumps(message.metadata) if message.metadata else None, + timestamp=msg_time, ) db.add(db_message) @@ -199,8 +215,6 @@ class SessionManager: db.commit() # Store DB ID on the in-memory message for edit/delete by ID - if message.metadata is None: - message.metadata = {} message.metadata['_db_id'] = msg_id logger.debug(f"Persisted message to session {session_id}")