6565from trpc_agent_sdk .storage import decode_content
6666from trpc_agent_sdk .storage import decode_grounding_metadata
6767from trpc_agent_sdk .storage import decode_usage_metadata
68+ from trpc_agent_sdk .storage import sanitize_content_json
6869from trpc_agent_sdk .utils import user_key
6970
7071from ._base_session_service import BaseSessionService
@@ -236,7 +237,7 @@ def from_event(cls, session: Session, event: Event) -> SessionStorageEvent:
236237 response_id = event .response_id ,
237238 )
238239 if event .content :
239- storage_event .content = event .content .model_dump (exclude_none = True , mode = "json" )
240+ storage_event .content = sanitize_content_json ( event .content .model_dump (exclude_none = True , mode = "json" ) )
240241 if event .grounding_metadata :
241242 storage_event .grounding_metadata = event .grounding_metadata .model_dump (exclude_none = True , mode = "json" )
242243 if event .custom_metadata :
@@ -269,7 +270,7 @@ def to_event(self) -> Event:
269270 error_message = self .error_message ,
270271 interrupted = self .interrupted ,
271272 response_id = self .response_id ,
272- content = decode_content (self .content ),
273+ content = decode_content (sanitize_content_json ( self .content ) ),
273274 grounding_metadata = decode_grounding_metadata (self .grounding_metadata ),
274275 custom_metadata = self .custom_metadata ,
275276 usage_metadata = decode_usage_metadata (self .usage_metadata ),
@@ -574,7 +575,7 @@ async def _update_app_state(self, sql_session: SqlSession, app_name: str, state_
574575 await self ._sql_storage .add (sql_session , storage_app_state )
575576 else :
576577 storage_app_state .state = app_state # type: ignore
577- storage_app_state .update_time = func .now ()
578+ storage_app_state .update_time = datetime .now ()
578579
579580 return app_state
580581
@@ -604,7 +605,7 @@ async def _get_app_state(self, sql_session: SqlSession, app_name: str) -> dict[s
604605 if storage_app_state :
605606 if not self ._session_config .is_expired_by_timestamp (storage_app_state .update_time .timestamp ()):
606607 app_state = storage_app_state .state
607- storage_app_state .update_time = func .now ()
608+ storage_app_state .update_time = datetime .now ()
608609 await self ._sql_storage .commit (sql_session )
609610
610611 return app_state
@@ -617,7 +618,7 @@ async def _get_user_state(self, sql_session: SqlSession, app_name: str, user_id:
617618 if storage_user_state :
618619 if not self ._session_config .is_expired_by_timestamp (storage_user_state .update_time .timestamp ()):
619620 user_state = storage_user_state .state
620- storage_user_state .update_time = func .now ()
621+ storage_user_state .update_time = datetime .now ()
621622 await self ._sql_storage .commit (sql_session )
622623
623624 return user_state
@@ -633,7 +634,7 @@ async def _get_session(self, sql_session: SqlSession, app_name: str, user_id: st
633634 logger .debug ("Session %s is expired" , session_id )
634635 return None
635636
636- storage_session .update_time = func .now ()
637+ storage_session .update_time = datetime .now ()
637638 await self ._sql_storage .commit (sql_session )
638639
639640 return storage_session
@@ -645,7 +646,7 @@ async def _cleanup_expired_async(self) -> None:
645646 Deletes all expired data in three batch SQL DELETE statements.
646647 """
647648 async with self ._sql_storage .create_db_session () as sql_session :
648- # Calculate expiration threshold once (using database local time)
649+ # Calculate expiration threshold once in application time for cross-database compatibility.
649650 expire_before = datetime .now () - timedelta (seconds = self ._session_config .ttl .ttl_seconds )
650651 total_deleted = 0
651652
@@ -721,7 +722,7 @@ def _start_cleanup_task(self) -> None:
721722 return
722723
723724 self .__cleanup_stop_event = asyncio .Event ()
724- self .__cleanup_task = asyncio .create_task (self ._cleanup_loop ())
725+ self .__cleanup_task = asyncio .get_event_loop (). create_task (self ._cleanup_loop ())
725726 logger .debug ("Cleanup task created" )
726727
727728 def _stop_cleanup_task (self ) -> None :
0 commit comments