BaseToolset caches prefixed tools by a single invocation ID, breaking multi-agent concurrency
- 主要言語
- Python
- スター
- 21.5k
- フォーク
- 4k
- 平均マージ
- 1日 22時間
- マージ済み PR(30日)
- 31
説明
### 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()`).
コントリビューションガイド
評価
この issue はまだ評価されていません。