87 lines
3.6 KiB
Python
87 lines
3.6 KiB
Python
"""
|
|
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 |