ag-ui-protocol / ag-ui-protocol/ag-ui
use_thread_id_as_session_id: _find_session_by_thread_id still runs the O(n) list_sessions scan
- Langage dominant
- Python
- Étoiles
- 15.9k
- Forks
- 1.4k
- Merge moyen
- 1 j 17 h
- PR mergées (30 j)
- 163
Description
## Summary
`use_thread_id_as_session_id=True` gives `SessionManager.get_or_create_session` an O(1) direct-lookup path — but `SessionManager._find_session_by_thread_id` has **no flag branch**: it always runs the O(n) `list_sessions` scan over all the user's sessions, matching `_ag_ui_thread_id` in each session's state.
`ADKAgent.run` calls `_find_session_by_thread_id` once per `(thread, user)` per process to hydrate the multi-instance session cache, so the scan still fires for every fresh chat and every cold thread — even with the flag on.
## Measured impact (ag-ui-adk 0.6.5 + `VertexAiSessionService`, Cloud Run)
Each `list_sessions` scan against Vertex AI Agent Engine costs ~0.4–0.9s (API processing time), paid inside the user's turn before the first model call. With the flag-aware direct lookup below, our request→run-start segment dropped from ~1.1s to ~0.28s.
## Suggested fix
The lookup should honor the flag (this is what we ship as a local monkey-patch today):
```python
async def _find_session_by_thread_id(self, app_name, user_id, thread_id):
if self._use_thread_id_as_session_id:
return await self.get_session(thread_id, app_name, user_id)
# ... existing list_sessions scan for the legacy id-mapping mode ...
```
With the flag on, the thread id IS the session id, so a direct `get_session` (None when absent) is both correct and O(1); the scan remains the right recovery path only for the legacy mode where the backend generates session ids.
Guide de contribution
Ouvrir le guide de contribution
Évaluation
Cette issue n'a pas encore été évaluée.