Skip to content

Conversation

tylerslaton
Copy link
Contributor

testing #471

contextablemark and others added 10 commits October 2, 2025 00:00
Replace fragile usage_metadata-based logic with robust streaming detection
that checks multiple explicit streaming indicators.

**Problem:**
The original logic relied on `not adk_event.usage_metadata` to determine
if an event should be processed as streaming. This was fragile because
Claude models can include usage_metadata even in streaming chunks,
causing responses to disappear.

**Solution:**
Implement comprehensive streaming detection that checks:
- `partial` attribute (explicitly marked as partial)
- `turn_complete` attribute (live streaming completion status)
- `is_final_response()` method (final response indicator)
- `finish_reason` attribute (fallback for content without finish reason)

This ensures all streaming content is captured regardless of usage_metadata
presence, fixing compatibility with Claude Sonnet 4 and other models.

**Testing:**
✅ All 277 tests pass
✅ Streaming detection works across different model providers

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <[email protected]>
…k-agent

Add regression test for partial final ADK chunks
Change TextMessageContentEvent to TextMessageChunkEvent in test to match
actual AG-UI protocol event types.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <[email protected]>
…ttranslator

Add test for ADK streaming fallback branch
@contextablemark
Copy link
Contributor

@tylerslaton I see the failures - I'll take a look this evening.

contextablemark and others added 13 commits October 3, 2025 22:41
The Tool Based Generative UI haiku test was exhibiting flaky behavior
where it would sometimes pass and sometimes fail with the same test
conditions. The test was more reliable when run with --headed than
when run headless, suggesting a timing-related issue.

Root cause: The extractMainDisplayHaikuContent() method was concatenating
ALL visible haiku lines from the main display, while the chat extraction
only captured the most recent haiku. When multiple haikus were displayed
simultaneously (due to rendering timing), this caused mismatches.

Fix: Modified extractMainDisplayHaikuContent() to extract only the last
3 lines (the most recent haiku), matching the behavior of the chat
extraction and eliminating timing-related flakiness.

This affects all 10 platform integration tests that use ToolBaseGenUIPage.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <[email protected]>
Setup Workload Identity Federation

(cherry picked from commit 979b3dc)
🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <[email protected]>
Add fallback logic to detect streaming completion using finish_reason
when is_final_response returns False but finish_reason is set.

**Problem:**
Gemini returns events with partial=True and is_final_response()=False
even on the final chunk that contains finish_reason="STOP". This caused
streaming messages to remain open and require force-closing, resulting
in warnings.

**Solution:**
Enhanced should_send_end logic to check for finish_reason as a fallback:
- Check if finish_reason attribute exists and is truthy
- If streaming is active and finish_reason is present, emit TEXT_MESSAGE_END
- Formula: should_send_end = (is_final_response and not is_partial) or
           (has_finish_reason and self._is_streaming)

**Testing:**
✅ All 277 tests pass
✅ Added test_partial_with_finish_reason to verify the fix
✅ Eliminates "Force-closing unterminated streaming message" warnings
✅ Properly emits TEXT_MESSAGE_END for events with finish_reason

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <[email protected]>
- Prefer LRO routing in ADKAgent when long‑running tool call IDs are present in event.content.parts (prevents misrouting into streaming path and tool loops; preserves HITL pause)
- Force‑close any active streaming text before emitting LRO tool events (guarantees TEXT_MESSAGE_END precedes TOOL_CALL_START)
- Harden EventTranslator.translate to filter out long‑running tool calls from the general path; only emit non‑LRO calls (avoids duplicate tool events)
- Add tests:
  * test_lro_filtering.py (translator‑level filtering + LRO‑only emission)
  * test_integration_mixed_partials.py (streaming → non‑LRO → final LRO: order, no duplicates, correct IDs)
@contextablemark contextablemark mentioned this pull request Oct 5, 2025
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants