-
Notifications
You must be signed in to change notification settings - Fork 3k
Description
Description
DatabaseSessionService.list_sessions() queries all session rows for a given app_name (and optional user_id) without any pagination mechanism (LIMIT/OFFSET or cursor-based). When the number of sessions under an app grows large, this causes severe performance issues.
Impact
In our production environment with ~10k sessions per app, calling list_sessions() takes approximately 74 seconds to return, making the API endpoint essentially unusable.
Current Behavior
# base_session_service.py
class ListSessionsResponse(BaseModel):
sessions: list[Session] = Field(default_factory=list)
async def list_sessions(
self, *, app_name: str, user_id: Optional[str] = None
) -> ListSessionsResponse:
...The method returns all sessions at once with no way to limit the result set.
Proposed Solution
Add pagination support to BaseSessionService.list_sessions() and DatabaseSessionService:
class ListSessionsResponse(BaseModel):
sessions: list[Session] = Field(default_factory=list)
next_page_token: str | None = None
async def list_sessions(
self,
*,
app_name: str,
user_id: str | None = None,
page_size: int = 20,
page_token: str | None = None,
) -> ListSessionsResponse:
...The implementation should:
- Accept
page_size(with a reasonable default, e.g. 20, max 100) andpage_token - Query with
LIMIT/OFFSET(or cursor-based pagination) - Order by
update_time DESCfor consistent results - Return
next_page_tokenwhen more results are available - Maintain backward compatibility (default behavior returns first page)
Workaround
We currently bypass DatabaseSessionService.list_sessions() by querying PostgreSQL directly with LIMIT/OFFSET in our service layer.
Environment
- ADK version: 1.25.1
- Python: 3.12
- Database: PostgreSQL with asyncpg