Редактировать 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.
- Сохранение новых сообщений в историю.
- Обрезка сообщений до лимита символов.
- Пагинация при получении истории.
Используется в 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})")