mirror of
https://github.com/pewdiepie-archdaemon/odysseus.git
synced 2026-06-20 19:55:25 -04:00
fix(sessions): keep fresh chats during auto tidy (#1871)
Co-authored-by: Alexandre Teixeira <111787685+alteixeira20@users.noreply.github.com>
This commit is contained in:
+35
-4
@@ -8,7 +8,7 @@ and the task scheduler / builtin actions system.
|
||||
import json
|
||||
import logging
|
||||
import re
|
||||
from datetime import datetime, timedelta
|
||||
from datetime import datetime, timedelta, timezone
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
@@ -23,6 +23,34 @@ _THROWAWAY_NAMES = {
|
||||
}
|
||||
_THROWAWAY_MAX_MESSAGES = 4
|
||||
_FRESH_EMPTY_SESSION_GRACE = timedelta(minutes=10)
|
||||
_FRESH_SESSION_GRACE = _FRESH_EMPTY_SESSION_GRACE
|
||||
|
||||
|
||||
def _utcnow_naive() -> datetime:
|
||||
"""Return naive UTC for existing session DateTime columns."""
|
||||
return datetime.now(timezone.utc).replace(tzinfo=None)
|
||||
|
||||
|
||||
def _as_naive_utc(value):
|
||||
if value is None:
|
||||
return None
|
||||
if getattr(value, "tzinfo", None) is not None:
|
||||
return value.astimezone(timezone.utc).replace(tzinfo=None)
|
||||
return value
|
||||
|
||||
|
||||
def is_session_recently_active(row, now=None, grace=_FRESH_SESSION_GRACE) -> bool:
|
||||
"""Return True while a new or active session is too fresh to auto-delete."""
|
||||
now = _as_naive_utc(now) or _utcnow_naive()
|
||||
for attr in ("last_message_at", "last_accessed", "updated_at", "created_at"):
|
||||
value = _as_naive_utc(getattr(row, attr, None))
|
||||
if not value:
|
||||
continue
|
||||
if value >= now:
|
||||
return True
|
||||
if now - value <= grace:
|
||||
return True
|
||||
return False
|
||||
|
||||
|
||||
async def run_auto_sort(owner: str, skip_llm: bool = False, delete_throwaway: bool = True) -> str:
|
||||
@@ -52,15 +80,18 @@ async def run_auto_sort(owner: str, skip_llm: bool = False, delete_throwaway: bo
|
||||
*([DbSession.owner == owner] if owner else []),
|
||||
).all()
|
||||
|
||||
cleanup_now = _utcnow_naive()
|
||||
for row in rows:
|
||||
if getattr(row, 'is_important', False):
|
||||
continue
|
||||
created_at = row.created_at or row.updated_at or datetime.utcnow()
|
||||
is_fresh = (datetime.utcnow() - created_at) < _FRESH_EMPTY_SESSION_GRACE
|
||||
created_at = _as_naive_utc(row.created_at or row.updated_at) or _utcnow_naive()
|
||||
is_fresh = (_utcnow_naive() - created_at) < _FRESH_EMPTY_SESSION_GRACE
|
||||
if (row.name or "").strip() == "Incognito":
|
||||
deleted_throwaway += 1
|
||||
db.delete(row)
|
||||
continue
|
||||
if is_session_recently_active(row, now=cleanup_now):
|
||||
continue
|
||||
|
||||
msg_count = db.query(DbMsg.id).filter(
|
||||
DbMsg.session_id == row.id
|
||||
@@ -208,7 +239,7 @@ async def run_auto_sort(owner: str, skip_llm: bool = False, delete_throwaway: bo
|
||||
db_sess = db.query(DbSession).filter(DbSession.id == full_id).first()
|
||||
if db_sess:
|
||||
db_sess.folder = folder_name
|
||||
db_sess.updated_at = datetime.utcnow()
|
||||
db_sess.updated_at = _utcnow_naive()
|
||||
updated += 1
|
||||
db.commit()
|
||||
|
||||
|
||||
Reference in New Issue
Block a user