diff --git a/rag/history_manager.py b/rag/history_manager.py index 8e90c7d..2254c9d 100644 --- a/rag/history_manager.py +++ b/rag/history_manager.py @@ -6,6 +6,8 @@ - Сжатие длинной истории с помощью иерархического резюмирования. - Форматирование истории в список сообщений для передачи в LLM. - Сохранение новых сообщений в историю. +- Обрезка сообщений до лимита символов. +- Пагинация при получении истории. Используется в RAGOrchestrator для управления контекстом диалога. """ @@ -56,20 +58,35 @@ class HistoryManager: self, user_jid: str, room_jid: Optional[str] = None, - limit: int = 100 + limit: int = 100, + offset: int = 0 ) -> List[Dict[str, str]]: """ - Получает историю диалога из БД. + Получает историю диалога из БД с поддержкой пагинации. Аргументы: user_jid: JID пользователя (без ресурса) room_jid: JID комнаты (None для личного чата) - limit: максимальное количество сообщений + limit: максимальное количество сообщений для возврата + offset: смещение (количество пропускаемых сообщений) Возвращает: List[Dict[str, str]]: список сообщений с ключами 'role' и 'content' """ - raw_history: List[Dict[str, Any]] = await self.db.get_history(user_jid, room_jid, limit=limit) + # Так как PostgresService.get_history не поддерживает offset, + # мы запрашиваем на offset больше записей, а затем обрезаем. + # Это неэффективно для больших offset, но допустимо для умеренных значений. + # В будущем следует добавить поддержку offset в PostgresService. + fetch_limit = limit + offset + raw_history: List[Dict[str, Any]] = await self.db.get_history( + user_jid, room_jid, limit=fetch_limit + ) + # Применяем offset и limit + if offset > 0: + raw_history = raw_history[offset:offset + limit] + else: + raw_history = raw_history[:limit] + # Преобразуем в формат, ожидаемый LLM return [ {"role": rec['role'], "content": rec['content']} @@ -177,7 +194,7 @@ class HistoryManager: room_jid: Optional[str] = None ) -> None: """ - Сохраняет одно сообщение в историю диалога. + Сохраняет одно сообщение в историю диалога с обрезкой до лимита символов. Аргументы: user_jid: JID пользователя @@ -185,6 +202,12 @@ class HistoryManager: content: текст сообщения room_jid: JID комнаты (None для личного чата) """ + # Получаем лимит из конфига или используем значение по умолчанию + max_len: int = getattr(self.config, 'max_history_message_length', 10000) + if len(content) > max_len: + content = content[:max_len] + "..." + logger.debug(f"Сообщение обрезано до {max_len} символов") + await self.db.add_history(user_jid, role, content, room_jid) logger.debug(f"Сохранено сообщение {role} для {user_jid} (room={room_jid})")