Describe the Bug
#6582 / 73e8625 added _drop_orphaned_function_responses, which correctly prunes id'd function responses with no matching function call before contents assembly.
Two gaps remain and can still permanently poison a session (raise happens in request preprocessing, before any user callback):
_rearrange_events_for_latest_function_response still raises ValueError: No function call event found for function responses ids: ... when it cannot pair the trailing FR event. @GWeale noted on #6587 that this rearrange-path drop is still worth having as defense in depth (main only prunes responses that carry an id).
- Id-less / empty-id trailing FRs are intentionally skipped by the prune helper (
if response.id), but then rearrange adds None / '' into the id set and raises — so sessions with stripped or missing FR ids still die on the next turn.
Related hole: when rearrange finds a matching FC event but the trailing FR event also carries unmatched ids (Last response event should only contain the responses...), it still raises instead of dropping the unmatched parts.
Steps to Reproduce
from google.adk.events.event import Event
from google.adk.flows.llm_flows.contents import _get_contents
from google.genai import types
events = [
Event(author='user', content=types.Content(role='user', parts=[types.Part(text='hi')])),
Event(author='agent', content=types.Content(role='model', parts=[types.Part(text='done')])),
Event(
author='agent',
content=types.Content(
role='user',
parts=[types.Part(function_response=types.FunctionResponse(name='tool', id=None, response={'ok': True}))],
),
),
]
_get_contents(None, events, 'agent') # ValueError: ... ids: {None}
Expected Behavior
Orphaned / unpairable trailing function responses are dropped (with a warning), contents assembly continues, and the session stays usable.
Observed Behavior
ValueError during contents assembly; every later turn replays the same fatal history.
Environment
- ADK: current
main (post-73e8625)
- Related:
#6582 (closed), #6587 (closed as duplicate of landed prune; rearrange follow-up requested)
Additional Context
Happy to send the rearrange-path follow-up PR referenced by @GWeale on #6587.
Describe the Bug
#6582/73e8625added_drop_orphaned_function_responses, which correctly prunes id'd function responses with no matching function call before contents assembly.Two gaps remain and can still permanently poison a session (raise happens in request preprocessing, before any user callback):
_rearrange_events_for_latest_function_responsestill raisesValueError: No function call event found for function responses ids: ...when it cannot pair the trailing FR event.@GWealenoted on#6587that this rearrange-path drop is still worth having as defense in depth (mainonly prunes responses that carry an id).if response.id), but then rearrange addsNone/''into the id set and raises — so sessions with stripped or missing FR ids still die on the next turn.Related hole: when rearrange finds a matching FC event but the trailing FR event also carries unmatched ids (
Last response event should only contain the responses...), it still raises instead of dropping the unmatched parts.Steps to Reproduce
Expected Behavior
Orphaned / unpairable trailing function responses are dropped (with a warning), contents assembly continues, and the session stays usable.
Observed Behavior
ValueErrorduring contents assembly; every later turn replays the same fatal history.Environment
main(post-73e8625)#6582(closed),#6587(closed as duplicate of landed prune; rearrange follow-up requested)Additional Context
Happy to send the rearrange-path follow-up PR referenced by
@GWealeon#6587.