From f63bacc671be89f11f196f7ea1ea7e9c8985549c Mon Sep 17 00:00:00 2001 From: Markov Andrey Date: Tue, 30 Jun 2026 22:29:24 +0000 Subject: [PATCH] =?UTF-8?q?=D0=A0=D0=B5=D0=B4=D0=B0=D0=BA=D1=82=D0=B8?= =?UTF-8?q?=D1=80=D0=BE=D0=B2=D0=B0=D1=82=D1=8C=20history=5Fmanager.py?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- rag/history_manager.py | 33 ++++++++++++++++++++++++++++----- 1 file changed, 28 insertions(+), 5 deletions(-) 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})")