from __future__ import annotations from abc import ABC, abstractmethod from typing import TYPE_CHECKING, Protocol, runtime_checkable if TYPE_CHECKING: from ..items import TResponseInputItem @runtime_checkable class Session(Protocol): """Protocol for session implementations. Session stores conversation history for a specific session, allowing agents to maintain context without requiring explicit manual memory management. """ session_id: str async def get_items(self, limit: int | None = None) -> list[TResponseInputItem]: """Retrieve the conversation history for this session. Args: limit: Maximum number of items to retrieve. If None, retrieves all items. When specified, returns the latest N items in chronological order. Returns: List of input items representing the conversation history """ ... async def add_items(self, items: list[TResponseInputItem]) -> None: """Add new items to the conversation history. Args: items: List of input items to add to the history """ ... async def pop_item(self) -> TResponseInputItem | None: """Remove and return the most recent item from the session. Returns: The most recent item if it exists, None if the session is empty """ ... async def clear_session(self) -> None: """Clear all items for this session.""" ... class SessionABC(ABC): """Abstract base class for session implementations. Session stores conversation history for a specific session, allowing agents to maintain context without requiring explicit manual memory management. This ABC is intended for internal use and as a base class for concrete implementations. Third-party libraries should implement the Session protocol instead. """ session_id: str @abstractmethod async def get_items(self, limit: int | None = None) -> list[TResponseInputItem]: """Retrieve the conversation history for this session. Args: limit: Maximum number of items to retrieve. If None, retrieves all items. When specified, returns the latest N items in chronological order. Returns: List of input items representing the conversation history """ ... @abstractmethod async def add_items(self, items: list[TResponseInputItem]) -> None: """Add new items to the conversation history. Args: items: List of input items to add to the history """ ... @abstractmethod async def pop_item(self) -> TResponseInputItem | None: """Remove and return the most recent item from the session. Returns: The most recent item if it exists, None if the session is empty """ ... @abstractmethod async def clear_session(self) -> None: """Clear all items for this session.""" ...