The hand-rolled google.genai generate_a2ui planner (and the orphaned
SalesPipelineAgent that consumed it) in main.py are superseded by the
ag_ui_adk 0.7.0 middleware (get_a2ui_tool), now wired backend-owned in
declarative_gen_ui_agent.py / beautiful_chat_agent.py. main.py is reduced to
the shared tool wrappers + before_model/before_agent callbacks still covered
by tests; dead A2UI imports pruned.
- delete tests/python/test_generate_a2ui.py (tested the removed planner)
- manifest declarative-gen-ui: drop stale src/agents/main.py highlight + fix description
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
The Python unit tests for stop_on_terminal_text /
simple_after_model_modifier built fake LlmResponse objects without a
finish_reason field. That worked before the thinking-mode fix in #4826,
which added a finish_reason="STOP" gate so the callback no longer
terminates on text-only chunks that arrive non-partial with
finish_reason=None (Gemini thinking-mode emits a text-only chunk first,
then a separate function-call chunk — terminating on the first would
skip the second).
Fix: default the fake response's finish_reason to "STOP" (the real
terminal-response shape) and also stub turn_complete=None so the
matcher path the callback walks lines up with what production sees.
Local pytest on Python 3.10 → 23/23 green.
Bumps the default Gemini model across the Google ADK showcase from
gemini-2.5-flash to gemini-3.1-flash-lite — the closest GA model in
the Gemini 3.x line (2.5 family is slated for June 2026 deprecation).
Touches agent factories (DEFAULT_MODEL, _DEFAULT_A2UI_MODEL, _SUB_MODEL),
the A2UI default-model test fixture, QA docs, the manifest description
for the reasoning demo, and prose references in shared_chat docstring +
entrypoint comment.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Pins the three classes of bug from the parent commit at the unit level so
the next refactor fails CI instead of crashing in the browser.
- test_stop_on_terminal_text.py (8 tests): truth table for the universal
loop terminator — terminate on final text-only model response, never
terminate on mixed text+function_call or partial streams, log-and-degrade
when ADK's private _invocation_context is missing.
- test_a2ui_v09_shape.py (17 tests): pins build_a2ui_operations_from_tool_call
to the v0.9 nested shape (createSurface / updateComponents /
updateDataModel with version: "v0.9" and path+value, NOT flat type+data),
the sanitize step that drops empty / missing-id / missing-component
entries, the has_root_component validator, and the unstringify path that
parses Gemini's stringified-JSON data fields back to real arrays.
- test_agent_id_alignment.py (4 tests): harvests every demo page.tsx for
agent / agentId props and asserts each ID is exposed by at least one
route.ts agents map (the main /api/copilotkit agentNames list or a
dedicated route's agents: {...} block). Pins the dashed form for
hitl-in-chat / frontend-tools-async / prebuilt-popup so the next rename
drift breaks the test, not the chat. Cross-checks that the main route's
agentNames is a subset of registry.AGENT_REGISTRY.
- test_after_model_modifier.py: removed two tests that asserted the old
SalesPipelineAgent name-gate. The gate was lifted out when the loop
terminator became universal; equivalent behavior coverage now lives in
test_stop_on_terminal_text.py.
29 new tests + 23 retained from the existing suite, all passing.
Replace sys.path.insert hacks in Python agent files with direct
imports via symlinks to shared/{python,typescript}/tools.
Update Dockerfiles, entrypoints, and configs to support the new
symlink-based tool resolution. Add PARITY_NOTES for frameworks
that have known gaps.
The showcase framework directories better reflect their role as
integration examples rather than distributable packages.
Renames showcase/packages/ -> showcase/integrations/ and updates
the test docker-compose file reference accordingly.