Skip to content

DatabaseSessionService with Postgres: sqlalchemy.exc.MissingGreenlet: greenlet_spawn has not been called #548

Description

@chungtran4078

Describe the bug
I used postgres database to store my agent session. But Its seems not work:
This is err:

ERROR:    Traceback (most recent call last):
  File "/Volumes/Work/RD/A2A-Demo/Test Agent/.venv/lib/python3.13/site-packages/starlette/routing.py", line 692, in lifespan
    async with self.lifespan_context(app) as maybe_state:
               ~~~~~~~~~~~~~~~~~~~~~^^^^^
  File "/usr/local/Cellar/python@3.13/3.13.3/Frameworks/Python.framework/Versions/3.13/lib/python3.13/contextlib.py", line 214, in __aenter__
    return await anext(self.gen)
           ^^^^^^^^^^^^^^^^^^^^^
  File "/Volumes/Work/RD/A2A-Demo/Test Agent/main.py", line 17, in lifespan
    runner, exit_stack = await create_main_agent()
                         ^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/Volumes/Work/RD/A2A-Demo/Test Agent/app/agent.py", line 123, in create_main_agent
    session_service = DatabaseSessionService("postgresql+asyncpg://postgres:postgres@localhost:5432/test_mcp")
  File "/Volumes/Work/RD/A2A-Demo/Test Agent/.venv/lib/python3.13/site-packages/google/adk/sessions/database_session_service.py", line 274, in __init__
    self.inspector = inspect(self.db_engine)
                     ~~~~~~~^^^^^^^^^^^^^^^^
  File "/Volumes/Work/RD/A2A-Demo/Test Agent/.venv/lib/python3.13/site-packages/sqlalchemy/inspection.py", line 140, in inspect
    ret = reg(subject)
  File "/Volumes/Work/RD/A2A-Demo/Test Agent/.venv/lib/python3.13/site-packages/sqlalchemy/engine/reflection.py", line 313, in _engine_insp
    return Inspector._construct(Inspector._init_engine, bind)
           ~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/Volumes/Work/RD/A2A-Demo/Test Agent/.venv/lib/python3.13/site-packages/sqlalchemy/engine/reflection.py", line 246, in _construct
    init(self, bind)
    ~~~~^^^^^^^^^^^^
  File "/Volumes/Work/RD/A2A-Demo/Test Agent/.venv/lib/python3.13/site-packages/sqlalchemy/engine/reflection.py", line 257, in _init_engine
    engine.connect().close()
    ~~~~~~~~~~~~~~^^
  File "/Volumes/Work/RD/A2A-Demo/Test Agent/.venv/lib/python3.13/site-packages/sqlalchemy/engine/base.py", line 3274, in connect
    return self._connection_cls(self)
           ~~~~~~~~~~~~~~~~~~~~^^^^^^
  File "/Volumes/Work/RD/A2A-Demo/Test Agent/.venv/lib/python3.13/site-packages/sqlalchemy/engine/base.py", line 146, in __init__
    self._dbapi_connection = engine.raw_connection()
                             ~~~~~~~~~~~~~~~~~~~~~^^
  File "/Volumes/Work/RD/A2A-Demo/Test Agent/.venv/lib/python3.13/site-packages/sqlalchemy/engine/base.py", line 3298, in raw_connection
    return self.pool.connect()
           ~~~~~~~~~~~~~~~~~^^
  File "/Volumes/Work/RD/A2A-Demo/Test Agent/.venv/lib/python3.13/site-packages/sqlalchemy/pool/base.py", line 449, in connect
    return _ConnectionFairy._checkout(self)
           ~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^
  File "/Volumes/Work/RD/A2A-Demo/Test Agent/.venv/lib/python3.13/site-packages/sqlalchemy/pool/base.py", line 1264, in _checkout
    fairy = _ConnectionRecord.checkout(pool)
  File "/Volumes/Work/RD/A2A-Demo/Test Agent/.venv/lib/python3.13/site-packages/sqlalchemy/pool/base.py", line 713, in checkout
    rec = pool._do_get()
  File "/Volumes/Work/RD/A2A-Demo/Test Agent/.venv/lib/python3.13/site-packages/sqlalchemy/pool/impl.py", line 179, in _do_get
    with util.safe_reraise():
         ~~~~~~~~~~~~~~~~~^^
  File "/Volumes/Work/RD/A2A-Demo/Test Agent/.venv/lib/python3.13/site-packages/sqlalchemy/util/langhelpers.py", line 146, in __exit__
    raise exc_value.with_traceback(exc_tb)
  File "/Volumes/Work/RD/A2A-Demo/Test Agent/.venv/lib/python3.13/site-packages/sqlalchemy/pool/impl.py", line 177, in _do_get
    return self._create_connection()
           ~~~~~~~~~~~~~~~~~~~~~~~^^
  File "/Volumes/Work/RD/A2A-Demo/Test Agent/.venv/lib/python3.13/site-packages/sqlalchemy/pool/base.py", line 390, in _create_connection
    return _ConnectionRecord(self)
  File "/Volumes/Work/RD/A2A-Demo/Test Agent/.venv/lib/python3.13/site-packages/sqlalchemy/pool/base.py", line 675, in __init__
    self.__connect()
    ~~~~~~~~~~~~~~^^
  File "/Volumes/Work/RD/A2A-Demo/Test Agent/.venv/lib/python3.13/site-packages/sqlalchemy/pool/base.py", line 901, in __connect
    with util.safe_reraise():
         ~~~~~~~~~~~~~~~~~^^
  File "/Volumes/Work/RD/A2A-Demo/Test Agent/.venv/lib/python3.13/site-packages/sqlalchemy/util/langhelpers.py", line 146, in __exit__
    raise exc_value.with_traceback(exc_tb)
  File "/Volumes/Work/RD/A2A-Demo/Test Agent/.venv/lib/python3.13/site-packages/sqlalchemy/pool/base.py", line 897, in __connect
    self.dbapi_connection = connection = pool._invoke_creator(self)
                                         ~~~~~~~~~~~~~~~~~~~~^^^^^^
  File "/Volumes/Work/RD/A2A-Demo/Test Agent/.venv/lib/python3.13/site-packages/sqlalchemy/engine/create.py", line 646, in connect
    return dialect.connect(*cargs, **cparams)
           ~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^
  File "/Volumes/Work/RD/A2A-Demo/Test Agent/.venv/lib/python3.13/site-packages/sqlalchemy/engine/default.py", line 625, in connect
    return self.loaded_dbapi.connect(*cargs, **cparams)  # type: ignore[no-any-return]  # NOQA: E501
           ~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^
  File "/Volumes/Work/RD/A2A-Demo/Test Agent/.venv/lib/python3.13/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 961, in connect
    await_only(creator_fn(*arg, **kw)),
    ~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^
  File "/Volumes/Work/RD/A2A-Demo/Test Agent/.venv/lib/python3.13/site-packages/sqlalchemy/util/_concurrency_py3k.py", line 123, in await_only
    raise exc.MissingGreenlet(
    ...<2 lines>...
    )
sqlalchemy.exc.MissingGreenlet: greenlet_spawn has not been called; can't call await_only() here. Was IO attempted in an unexpected place? (Background on this error at: https://sqlalche.me/e/20/xd2s)

My code:

async def create_main_agent():
    tools, exit_stack = await get_tools_async()
    
    # Sub agent here

    main_agent = LlmAgent(
        model="gemini-2.0-flash-001",
        name="coordinator_agent",
        description="Coordinates tasks between product consulting and order processing.",
        instruction="""
        You are a smart coordination assistant.

        - Analyze the user's request.
        - Route it to the product_consultant_agent if the user is asking for product recommendations or availability.
        - Route it to the order_processor_agent if the user wants to place an order.
        - Always route it to the product_consultant_agent first.
        """,
        sub_agents=[
            product_consultant_agent,
            order_processor_agent,
        ],
    )

    # session_service = InMemorySessionService()
    session_service = DatabaseSessionService("postgresql+asyncpg://postgres:postgres@localhost:5432/agent_app")
    runner = Runner(
            agent=main_agent,
            app_name=os.getenv("APP_NAME", "coordinator_agent_app"),
            session_service=session_service,
        )

    return runner, exit_stack

Desktop:

  • OS: MacOS 15.1 arm
  • Python version: 3.13
  • ADK version: 0.4.0

Metadata

Metadata

Assignees

Labels

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

Type

No fields configured for Bug.

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions