You've already forked adk-python
mirror of
https://github.com/encounter/adk-python.git
synced 2026-03-30 10:57:20 -07:00
fix: Update session last update time when appending events
The `database_session_service` now updates the `update_time` of a session to the event's timestamp when an event is appended Close #2721 Co-authored-by: George Weale <gweale@google.com> PiperOrigin-RevId: 834994070
This commit is contained in:
committed by
Copybara-Service
parent
848fdbef7c
commit
a3e4ad3cd1
@@ -722,6 +722,11 @@ class DatabaseSessionService(BaseSessionService):
|
||||
if session_state_delta:
|
||||
storage_session.state = storage_session.state | session_state_delta
|
||||
|
||||
if storage_session._dialect_name == "sqlite":
|
||||
update_time = datetime.utcfromtimestamp(event.timestamp)
|
||||
else:
|
||||
update_time = datetime.fromtimestamp(event.timestamp)
|
||||
storage_session.update_time = update_time
|
||||
sql_session.add(StorageEvent.from_event(session, event))
|
||||
|
||||
await sql_session.commit()
|
||||
|
||||
@@ -323,7 +323,7 @@ class SqliteSessionService(BaseSessionService):
|
||||
|
||||
# Trim temp state before persisting
|
||||
event = self._trim_temp_delta_state(event)
|
||||
now = time.time()
|
||||
event_timestamp = event.timestamp
|
||||
|
||||
async with self._get_db_connection() as db:
|
||||
# Check for stale session
|
||||
@@ -355,11 +355,15 @@ class SqliteSessionService(BaseSessionService):
|
||||
|
||||
if app_state_delta:
|
||||
await self._upsert_app_state(
|
||||
db, session.app_name, app_state_delta, now
|
||||
db, session.app_name, app_state_delta, event_timestamp
|
||||
)
|
||||
if user_state_delta:
|
||||
await self._upsert_user_state(
|
||||
db, session.app_name, session.user_id, user_state_delta, now
|
||||
db,
|
||||
session.app_name,
|
||||
session.user_id,
|
||||
user_state_delta,
|
||||
event_timestamp,
|
||||
)
|
||||
if session_state_delta:
|
||||
await self._update_session_state_in_db(
|
||||
@@ -368,7 +372,7 @@ class SqliteSessionService(BaseSessionService):
|
||||
session.user_id,
|
||||
session.id,
|
||||
session_state_delta,
|
||||
now,
|
||||
event_timestamp,
|
||||
)
|
||||
has_session_state_delta = True
|
||||
|
||||
@@ -392,12 +396,17 @@ class SqliteSessionService(BaseSessionService):
|
||||
await db.execute(
|
||||
"UPDATE sessions SET update_time=? WHERE app_name=? AND user_id=?"
|
||||
" AND id=?",
|
||||
(now, session.app_name, session.user_id, session.id),
|
||||
(
|
||||
event_timestamp,
|
||||
session.app_name,
|
||||
session.user_id,
|
||||
session.id,
|
||||
),
|
||||
)
|
||||
await db.commit()
|
||||
|
||||
# Update timestamp with commit time
|
||||
session.last_update_time = now
|
||||
# Update timestamp based on event time
|
||||
session.last_update_time = event_timestamp
|
||||
|
||||
# Also update the in-memory session
|
||||
await super().append_event(session=session, event=event)
|
||||
|
||||
@@ -531,6 +531,79 @@ async def test_append_event_complete(service_type, tmp_path):
|
||||
)
|
||||
|
||||
|
||||
@pytest.mark.asyncio
|
||||
@pytest.mark.parametrize(
|
||||
'service_type',
|
||||
[
|
||||
SessionServiceType.IN_MEMORY,
|
||||
SessionServiceType.DATABASE,
|
||||
SessionServiceType.SQLITE,
|
||||
],
|
||||
)
|
||||
async def test_session_last_update_time_updates_on_event(
|
||||
service_type, tmp_path
|
||||
):
|
||||
session_service = get_session_service(service_type, tmp_path)
|
||||
app_name = 'my_app'
|
||||
user_id = 'user'
|
||||
|
||||
session = await session_service.create_session(
|
||||
app_name=app_name, user_id=user_id
|
||||
)
|
||||
original_update_time = session.last_update_time
|
||||
|
||||
event_timestamp = original_update_time + 10
|
||||
event = Event(
|
||||
invocation_id='invocation',
|
||||
author='user',
|
||||
timestamp=event_timestamp,
|
||||
)
|
||||
await session_service.append_event(session=session, event=event)
|
||||
|
||||
assert session.last_update_time == pytest.approx(event_timestamp, abs=1e-6)
|
||||
|
||||
refreshed_session = await session_service.get_session(
|
||||
app_name=app_name, user_id=user_id, session_id=session.id
|
||||
)
|
||||
assert refreshed_session is not None
|
||||
assert refreshed_session.last_update_time == pytest.approx(
|
||||
event_timestamp, abs=1e-6
|
||||
)
|
||||
assert refreshed_session.last_update_time > original_update_time
|
||||
|
||||
|
||||
@pytest.mark.asyncio
|
||||
@pytest.mark.parametrize(
|
||||
'service_type',
|
||||
[
|
||||
SessionServiceType.IN_MEMORY,
|
||||
SessionServiceType.DATABASE,
|
||||
SessionServiceType.SQLITE,
|
||||
],
|
||||
)
|
||||
async def test_get_session_with_config(service_type):
|
||||
session_service = get_session_service(service_type)
|
||||
app_name = 'my_app'
|
||||
user_id = 'user'
|
||||
|
||||
session = await session_service.create_session(
|
||||
app_name=app_name, user_id=user_id
|
||||
)
|
||||
original_update_time = session.last_update_time
|
||||
|
||||
event = Event(invocation_id='invocation', author='user')
|
||||
await session_service.append_event(session=session, event=event)
|
||||
|
||||
assert session.last_update_time >= event.timestamp
|
||||
|
||||
refreshed_session = await session_service.get_session(
|
||||
app_name=app_name, user_id=user_id, session_id=session.id
|
||||
)
|
||||
assert refreshed_session is not None
|
||||
assert refreshed_session.last_update_time >= event.timestamp
|
||||
assert refreshed_session.last_update_time > original_update_time
|
||||
|
||||
|
||||
@pytest.mark.asyncio
|
||||
@pytest.mark.parametrize(
|
||||
'service_type',
|
||||
|
||||
Reference in New Issue
Block a user