Редактировать history_manager.py
This commit is contained in:
@@ -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})")
|
||||
|
||||
|
||||
Reference in New Issue
Block a user