""" FILE: modules/web_api/llm/db/db_chat.py ROLE: Управление историей сообщений и очисткой эфемерного контекста. """ from typing import List, Dict, Any from .connection import get_db_connection def db_save_chat_message(session_id: str, role: str, content: str, is_ephemeral: int = 0) -> None: """Сохраняет сообщение в БД (is_ephemeral=1 для временных служебных шагов, 0 для постоянных).""" conn = get_db_connection(row_factory=True) cursor = conn.cursor() cursor.execute(""" INSERT INTO chat_messages (session_id, role, content, is_ephemeral) VALUES (?, ?, ?, ?) """, (session_id, role, content, is_ephemeral)) conn.commit() conn.close() def db_get_chat_history(session_id: str, limit: int = 50) -> list: """Возвращает историю сообщений диалога для сессии.""" with get_db_connection(row_factory=True) as conn: cursor = conn.cursor() cursor.execute(""" SELECT role, content, is_ephemeral, created_at FROM chat_messages WHERE session_id = ? ORDER BY id DESC LIMIT ? """, (session_id, limit)) rows = cursor.fetchall() return [{"role": r["role"], "content": r["content"], "is_ephemeral": r["is_ephemeral"]} for r in reversed(rows)] def db_purge_ephemeral_messages(session_id: str) -> int: """ Физически удаляет все временные служебные сообщения выбранной сессии после завершения сценария работы с инструментом. """ conn = get_db_connection(row_factory=True) cursor = conn.cursor() cursor.execute("DELETE FROM chat_messages WHERE session_id = ? AND is_ephemeral = 1", (session_id,)) deleted = cursor.rowcount conn.commit() conn.close() return deleted def db_clear_chat_history(session_id: str) -> None: """Полная очистка всех сообщений сессии.""" conn = get_db_connection(row_factory=True) cursor = conn.cursor() cursor.execute("DELETE FROM chat_messages WHERE session_id = ?", (session_id,)) conn.commit() conn.close() def db_clear_all_chat_context(session_id: str = None, purge_all: bool = False) -> int: """Удаляет сообщения чата и стейты сессий.""" with get_db_connection(row_factory=True) as conn: cursor = conn.cursor() if purge_all: if session_id: cursor.execute("DELETE FROM chat_messages WHERE session_id = ?", (session_id,)) cursor.execute("DELETE FROM session_states WHERE session_id = ?", (session_id,)) else: cursor.execute("DELETE FROM chat_messages") cursor.execute("DELETE FROM session_states") cnt = cursor.rowcount conn.commit() return cnt query = """ DELETE FROM chat_messages WHERE is_ephemeral = 1 OR content LIKE '%Предпросмотр изменений%' OR content LIKE '%Удален пункт:%' OR content LIKE '%добавлен пункт:%' """ if session_id: cursor.execute(query + " AND session_id = ?", (session_id,)) cursor.execute("DELETE FROM session_states WHERE session_id = ?", (session_id,)) else: cursor.execute(query) cursor.execute("DELETE FROM session_states") cnt = cursor.rowcount conn.commit() return cnt