Source code for sqlspec.extensions.adk.converters

"""Conversion functions between ADK models and database records.

Implements full-event JSON storage: the entire Event is serialized via
``Event.model_dump(exclude_none=True, mode="json")`` into a single ``event_data``
column, with a small set of indexed scalar columns extracted alongside for
query performance. Reconstruction uses ``Event.model_validate()``.

Also provides scoped-state helpers that normalise ADK state prefixes
(``app:``, ``user:``, ``temp:``) so the shared service layer can split,
filter, and merge state before handing it to backend stores.
"""

from datetime import datetime, timezone
from typing import Any

from google.adk.events.event import Event
from google.adk.sessions import Session

from sqlspec.extensions.adk._types import StoredEvent, StoredSession

__all__ = (
    "compute_update_marker",
    "event_to_record",
    "filter_temp_state",
    "merge_scoped_state",
    "merge_state",
    "record_to_event",
    "record_to_session",
    "session_to_record",
    "split_scoped_state",
    "split_state_by_prefix",
)


# ---------------------------------------------------------------------------
# Session converters
# ---------------------------------------------------------------------------


def session_to_record(session: "Session") -> StoredSession:
    """Convert ADK Session to database record.

    Args:
        session: ADK Session object.

    Returns:
        StoredSession for database storage.
    """
    return StoredSession(
        id=session.id,
        app_name=session.app_name,
        user_id=session.user_id,
        state=filter_temp_state(session.state),
        # create_time is not exposed by ADK Session; a re-upsert of a restored session will reset this timestamp.
        create_time=datetime.now(timezone.utc),
        update_time=datetime.fromtimestamp(session.last_update_time, tz=timezone.utc),
    )
def compute_update_marker(update_time: "datetime") -> str: """Compute a stable revision marker from an update timestamp. Uses the same format as ADK's ``StorageSession.get_update_marker()``: ISO 8601 with microsecond precision, normalized to UTC. Args: update_time: The session's update timestamp. Returns: ISO 8601 string with microsecond precision. """ if update_time.tzinfo is not None: update_time = update_time.astimezone(timezone.utc) else: update_time = update_time.replace(tzinfo=timezone.utc) return update_time.isoformat(timespec="microseconds")