Skip to content

get_session() event retrieval lacks pagination support #4917

@ferponse

Description

@ferponse

Description

When calling get_session(), all events for a session are loaded into memory at once. While GetSessionConfig offers num_recent_events and after_timestamp for basic filtering, there is no proper pagination mechanism (offset/token-based) to retrieve events in manageable chunks.

For sessions with thousands of events (e.g. long-running agent conversations), this causes high memory usage and slow response times when fetching a session.

Impact

  • Memory pressure: Loading 5k+ events into a single Session object is expensive, especially when the caller only needs a subset.
  • Latency: In our deployment with PostgreSQL, get_session() for a session with ~3k events takes ~8 seconds due to deserializing all event data at once.
  • No random access: There's no way to fetch events starting from a specific position (e.g. "give me events 100-120") without loading everything up to that point.

Current behavior

config = GetSessionConfig(num_recent_events=50)
session = await session_service.get_session(
    app_name="app", user_id="user", session_id="sid", config=config
)
# Gets last 50 events, but no way to get the *next* 50 before those

num_recent_events acts as a simple LIMIT from the tail — there's no continuation mechanism.

Proposed solution

Add an EventPagination class (similar to SessionPagination from #4873) to GetSessionConfig:

from google.adk.sessions.base_session_service import EventPagination

config = GetSessionConfig(
    event_pagination=EventPagination(page_size=50)
)
session = await session_service.get_session(
    app_name="app", user_id="user", session_id="sid", config=config
)

# Access paginated events
events = session.events  # up to 50 events
next_token = session.next_event_page_token  # token for next page

This would allow efficient retrieval of event history in chunks, which is essential for building features like scrollable conversation history in UIs.

Related

Environment

  • google-adk version: 1.27.2
  • Python: 3.11
  • Database: PostgreSQL (async via asyncpg)

Metadata

Metadata

Assignees

No one assigned

    Labels

    services[Component] This issue is related to runtime services, e.g. sessions, memory, artifacts, etc

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions