BaseToolset caches prefixed tools by a single invocation ID, breaking multi-agent concurrency
- Lingua principale
- Python
- Stelle
- 21.5k
- Fork
- 4k
- Merge medio
- 1g 14h
- PR unite (30g)
- 37
Descrizione
### 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()`).
Guida per i contributori
Apri la guida per i contributori
Valutazione
Questa issue non è ancora stata valutata.