mirror of
https://github.com/encounter/adk-python.git
synced 2026-07-09 18:19:28 -07:00
Merge https://github.com/google/adk-python/pull/2889 # Implement Full async DatabaseSessionService **Target Issue:** #1005 ## Overview This PR introduces an asynchronous implementation of the `DatabaseSessionService` with minimal breaking changes. The primary goal is to enable effective use of ADK in fully async environments and API endpoints while avoiding event loop blocking during database I/O operations. ## Changes - Converted `DatabaseSessionService` to use async/await patterns throughout ## Testing Plan The implementation has been tested following the project's contribution guidelines: ### Unit Tests - All existing unit tests pass successfully - Minor update to test requirements added to support `aiosqlite` ### Manual End-to-End Testing - E2E tests performed using: - **LLM Provider:** LiteLLM - **Database:** PostgreSQL with `asyncpg` driver ```python from google.adk.sessions.database_session_service import DatabaseSessionService connection_string: str = ( "postgresql+asyncpg://PG_USER:PG_PSWD@PG_HOST:5432/PG_DB" ) session_service: DatabaseSessionService = DatabaseSessionService( db_url=connection_string ) session = await session_service.create_session( app_name="test_app", session_id="test_session", user_id="test_user" ) assert session is not None sessions = await session_service.list_sessions(app_name="test_app", user_id="test_user") assert len(sessions.sessions) > 0 session = await session_service.get_session( app_name="test_app", session_id="test_session", user_id="test_user" ) assert session is not None await session_service.delete_session( app_name="test_app", session_id="test_session", user_id="test_user" ) assert ( await session_service.get_session( app_name="test_app", session_id="test_session", user_id="test_user" ) is None ) ``` The implementation have been also tested using the following configurations for llm provider and Runner: ```python def get_azure_openai_model(deployment_id: str | None = None) -> LiteLlm: ... if not deployment_id: deployment_id = os.getenv("AZURE_OPENAI_DEPLOYMENT_ID") logger.info(f"Using Azure OpenAI deployment ID: {deployment_id}") return LiteLlm( model=f"azure/{os.getenv('AZURE_OPENAI_DEPLOYMENT_ID')}", stream=True, ) ... @staticmethod def _get_runner(agent: Agent) -> Runner: storage=DatabaseSessionService(db_url=get_pg_connection_string()) return Runner( agent=agent, app_name=APP_NAME, session_service=storage, ) ... async for event in self.runner.run_async( user_id=user_id, session_id=session_id, new_message=content, run_config=( RunConfig( streaming_mode=StreamingMode.SSE, response_modalities=["TEXT"] ) if stream else RunConfig() ), ): last_event = event if stream: yield event ... ``` ## Breaking Changes - Database connection string format may need updates for async drivers Co-authored-by: Shangjie Chen <deanchen@google.com> COPYBARA_INTEGRATE_REVIEW=https://github.com/google/adk-python/pull/2889 from GitMarco27:feature/async_database_session_service e1b1b14934c1fb7975a6832cdd1549e94acab985 PiperOrigin-RevId: 830525148