Редактировать history_manager.py

This commit is contained in:
Markov Andrey
2026-06-30 22:29:24 +00:00
parent f0c7b92613
commit f63bacc671

View File

@@ -6,6 +6,8 @@
- Сжатие длинной истории с помощью иерархического резюмирования. - Сжатие длинной истории с помощью иерархического резюмирования.
- Форматирование истории в список сообщений для передачи в LLM. - Форматирование истории в список сообщений для передачи в LLM.
- Сохранение новых сообщений в историю. - Сохранение новых сообщений в историю.
- Обрезка сообщений до лимита символов.
- Пагинация при получении истории.
Используется в RAGOrchestrator для управления контекстом диалога. Используется в RAGOrchestrator для управления контекстом диалога.
""" """
@@ -56,20 +58,35 @@ class HistoryManager:
self, self,
user_jid: str, user_jid: str,
room_jid: Optional[str] = None, room_jid: Optional[str] = None,
limit: int = 100 limit: int = 100,
offset: int = 0
) -> List[Dict[str, str]]: ) -> List[Dict[str, str]]:
""" """
Получает историю диалога из БД. Получает историю диалога из БД с поддержкой пагинации.
Аргументы: Аргументы:
user_jid: JID пользователя (без ресурса) user_jid: JID пользователя (без ресурса)
room_jid: JID комнаты (None для личного чата) room_jid: JID комнаты (None для личного чата)
limit: максимальное количество сообщений limit: максимальное количество сообщений для возврата
offset: смещение (количество пропускаемых сообщений)
Возвращает: Возвращает:
List[Dict[str, str]]: список сообщений с ключами 'role' и 'content' 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 # Преобразуем в формат, ожидаемый LLM
return [ return [
{"role": rec['role'], "content": rec['content']} {"role": rec['role'], "content": rec['content']}
@@ -177,7 +194,7 @@ class HistoryManager:
room_jid: Optional[str] = None room_jid: Optional[str] = None
) -> None: ) -> None:
""" """
Сохраняет одно сообщение в историю диалога. Сохраняет одно сообщение в историю диалога с обрезкой до лимита символов.
Аргументы: Аргументы:
user_jid: JID пользователя user_jid: JID пользователя
@@ -185,6 +202,12 @@ class HistoryManager:
content: текст сообщения content: текст сообщения
room_jid: JID комнаты (None для личного чата) 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) await self.db.add_history(user_jid, role, content, room_jid)
logger.debug(f"Сохранено сообщение {role} для {user_jid} (room={room_jid})") logger.debug(f"Сохранено сообщение {role} для {user_jid} (room={room_jid})")