SurfSense/surfsense_backend/app/agents/new_chat/utils.py
2025-12-20 18:35:39 +02:00

63 lines
1.7 KiB
Python

"""
Utility functions for SurfSense agents.
This module provides shared utility functions used across the new_chat agent modules.
"""
from datetime import UTC, datetime, timedelta
def parse_date_or_datetime(value: str) -> datetime:
"""
Parse either an ISO date (YYYY-MM-DD) or ISO datetime into an aware UTC datetime.
- If `value` is a date, interpret it as start-of-day in UTC.
- If `value` is a datetime without timezone, assume UTC.
Args:
value: ISO date or datetime string
Returns:
Aware datetime object in UTC
Raises:
ValueError: If the date string is empty or invalid
"""
raw = (value or "").strip()
if not raw:
raise ValueError("Empty date string")
# Date-only
if "T" not in raw:
d = datetime.fromisoformat(raw).date()
return datetime(d.year, d.month, d.day, tzinfo=UTC)
# Datetime (may be naive)
dt = datetime.fromisoformat(raw)
if dt.tzinfo is None:
return dt.replace(tzinfo=UTC)
return dt.astimezone(UTC)
def resolve_date_range(
start_date: datetime | None,
end_date: datetime | None,
) -> tuple[datetime, datetime]:
"""
Resolve a date range, defaulting to the last 2 years if not provided.
Ensures start_date <= end_date.
Args:
start_date: Optional start datetime (UTC)
end_date: Optional end datetime (UTC)
Returns:
Tuple of (resolved_start_date, resolved_end_date) in UTC
"""
resolved_end = end_date or datetime.now(UTC)
resolved_start = start_date or (resolved_end - timedelta(days=730))
if resolved_start > resolved_end:
resolved_start, resolved_end = resolved_end, resolved_start
return resolved_start, resolved_end