Skip to content

Using GoogleProvider multiple times gives Cannot send a request, as the client has been closed. error #3242

@DouweM

Description

@DouweM

As reported in #3217 (comment).

Introduced by #3217 / googleapis/python-genai#1509. The issue is likely that google-genai is closing the client while we're still using it in another Agent/GoogleModel/GoogleProvider instance.

from pydantic_ai import Agent


async def main():
    agent = Agent('google-gla:gemini-2.5-flash-lite')
    result = await agent.run('What is the capital of France?')
    print(result.output)

    agent = Agent('google-gla:gemini-2.5-flash-lite')
    result = await agent.run('What is the capital of Mexico?')
    print(result.output)


if __name__ == '__main__':
    import asyncio

    asyncio.run(main())
The capital of France is **Paris**.
Traceback (most recent call last):
  File "/home/DouweM/pydantic-ai/scratch/scratchpads/__globalScratchpads__/scratch24.py", line 17, in <module>
    asyncio.run(main())
  File "/home/DouweM/.local/share/uv/python/cpython-3.12.9-linux-x86_64-gnu/lib/python3.12/asyncio/runners.py", line 195, in run
    return runner.run(main)
           ^^^^^^^^^^^^^^^^
  File "/home/DouweM/.local/share/uv/python/cpython-3.12.9-linux-x86_64-gnu/lib/python3.12/asyncio/runners.py", line 118, in run
    return self._loop.run_until_complete(task)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/DouweM/.local/share/uv/python/cpython-3.12.9-linux-x86_64-gnu/lib/python3.12/asyncio/base_events.py", line 691, in run_until_complete
    return future.result()
           ^^^^^^^^^^^^^^^
  File "/home/DouweM/pydantic-ai/scratch/scratchpads/__globalScratchpads__/scratch24.py", line 10, in main
    result = await agent.run('What is the capital of Mexico?')
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/DouweM/pydantic-ai/pydantic_ai_slim/pydantic_ai/agent/abstract.py", line 235, in run
    async for node in agent_run:
  File "/home/DouweM/pydantic-ai/pydantic_ai_slim/pydantic_ai/run.py", line 150, in __anext__
    next_node = await self._graph_run.__anext__()
                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/DouweM/pydantic-ai/pydantic_graph/pydantic_graph/graph.py", line 758, in __anext__
    return await self.next(self._next_node)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/DouweM/pydantic-ai/pydantic_graph/pydantic_graph/graph.py", line 731, in next
    self._next_node = await node.run(ctx)
                      ^^^^^^^^^^^^^^^^^^^
  File "/home/DouweM/pydantic-ai/pydantic_ai_slim/pydantic_ai/_agent_graph.py", line 416, in run
    return await self._make_request(ctx)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/DouweM/pydantic-ai/pydantic_ai_slim/pydantic_ai/_agent_graph.py", line 458, in _make_request
    model_response = await ctx.deps.model.request(message_history, model_settings, model_request_parameters)
                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/DouweM/pydantic-ai/pydantic_ai_slim/pydantic_ai/models/google.py", line 239, in request
    response = await self._generate_content(messages, False, model_settings, model_request_parameters)
               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/DouweM/pydantic-ai/pydantic_ai_slim/pydantic_ai/models/google.py", line 388, in _generate_content
    return await func(model=self._model_name, contents=contents, config=config)  # type: ignore
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/DouweM/pydantic-ai/.venv/lib/python3.12/site-packages/google/genai/models.py", line 6762, in generate_content
    response = await self._generate_content(
               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/DouweM/pydantic-ai/.venv/lib/python3.12/site-packages/google/genai/models.py", line 5597, in _generate_content
    response = await self._api_client.async_request(
               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/DouweM/pydantic-ai/.venv/lib/python3.12/site-packages/google/genai/_api_client.py", line 1348, in async_request
    result = await self._async_request(
             ^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/DouweM/pydantic-ai/.venv/lib/python3.12/site-packages/google/genai/_api_client.py", line 1293, in _async_request
    return await self._async_retry(  # type: ignore[no-any-return]
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/DouweM/pydantic-ai/.venv/lib/python3.12/site-packages/tenacity/asyncio/__init__.py", line 111, in __call__
    do = await self.iter(retry_state=retry_state)
         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/DouweM/pydantic-ai/.venv/lib/python3.12/site-packages/tenacity/asyncio/__init__.py", line 153, in iter
    result = await action(retry_state)
             ^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/DouweM/pydantic-ai/.venv/lib/python3.12/site-packages/tenacity/_utils.py", line 99, in inner
    return call(*args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^
  File "/home/DouweM/pydantic-ai/.venv/lib/python3.12/site-packages/tenacity/__init__.py", line 418, in exc_check
    raise retry_exc.reraise()
          ^^^^^^^^^^^^^^^^^^^
  File "/home/DouweM/pydantic-ai/.venv/lib/python3.12/site-packages/tenacity/__init__.py", line 185, in reraise
    raise self.last_attempt.result()
          ^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/DouweM/.local/share/uv/python/cpython-3.12.9-linux-x86_64-gnu/lib/python3.12/concurrent/futures/_base.py", line 449, in result
    return self.__get_result()
           ^^^^^^^^^^^^^^^^^^^
  File "/home/DouweM/.local/share/uv/python/cpython-3.12.9-linux-x86_64-gnu/lib/python3.12/concurrent/futures/_base.py", line 401, in __get_result
    raise self._exception
  File "/home/DouweM/pydantic-ai/.venv/lib/python3.12/site-packages/tenacity/asyncio/__init__.py", line 114, in __call__
    result = await fn(*args, **kwargs)
             ^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/DouweM/pydantic-ai/.venv/lib/python3.12/site-packages/google/genai/_api_client.py", line 1266, in _async_request_once
    client_response = await self._async_httpx_client.request(
                      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/DouweM/pydantic-ai/.venv/lib/python3.12/site-packages/httpx/_client.py", line 1540, in request
    return await self.send(request, auth=auth, follow_redirects=follow_redirects)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/DouweM/pydantic-ai/.venv/lib/python3.12/site-packages/httpx/_client.py", line 1616, in send
    raise RuntimeError("Cannot send a request, as the client has been closed.")
RuntimeError: Cannot send a request, as the client has been closed.

Metadata

Metadata

Assignees

Labels

bugSomething isn't working

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions