google / google/adk-python

BaseToolset caches prefixed tools by a single invocation ID, breaking multi-agent concurrency

Abierto
#5,721 1 comentario 0 reacciones 2 asignados Reclamado por @rohityan Ver en GitHub
needs review tools
Lenguaje dominante
Python
Estrellas
21.5k
Forks
4k
Merge medio
1 d 14 h
PR fusionados (30 d)
37

Descripción

### Description
In `google.adk.tools.base_toolset.BaseToolset`, prefixed tool wrappers are cached using a single instance variable `self._cached_invocation_id`.

When orchestrating multiple agents concurrently (e.g., via `ParallelAgent` or custom `asyncio.TaskGroup` harnesses), concurrent worker coroutines call `get_tools(invocation_id="worker_N")`. Because `self._cached_invocation_id` only stores the last caller's ID, concurrent workers constantly overwrite each other's cached ID. This results in a cache miss on every single turn, forcing redundant tool wrapper re-instantiations and causing severe lock contention.

### Proposed Solution
Refactor `self._cached_prefixed_tools` to be a dictionary keyed by `invocation_id`:
```python
self._cached_prefixed_tools: dict[Optional[str], list[BaseTool]] = {}
```
When `get_tools` is called, check `if invocation_id in self._cached_prefixed_tools` and return the cached list for that specific agent thread. Ensure `close()` clears the dictionary (`self._cached_prefixed_tools.clear()`).

Guía de contribución

Abrir la guía de contribución

Evaluación

Este issue todavía no se ha evaluado.

Recibe los nuevos issues en tu correo

Un resumen breve de issues de GitHub para principiantes.