From c8b60ac05237f3be68820be441ca0a025239ccd9 Mon Sep 17 00:00:00 2001 From: celeritatem Date: Wed, 3 Sep 2025 10:37:52 +0545 Subject: [PATCH 1/2] Don't emit AG-UI text message content events with empty text part update deltas --- pydantic_ai_slim/pydantic_ai/ag_ui.py | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/pydantic_ai_slim/pydantic_ai/ag_ui.py b/pydantic_ai_slim/pydantic_ai/ag_ui.py index 87c67b48eb..b768029418 100644 --- a/pydantic_ai_slim/pydantic_ai/ag_ui.py +++ b/pydantic_ai_slim/pydantic_ai/ag_ui.py @@ -488,10 +488,11 @@ async def _handle_model_request_event( # noqa: C901 elif isinstance(agent_event, PartDeltaEvent): delta = agent_event.delta if isinstance(delta, TextPartDelta): - yield TextMessageContentEvent( - message_id=stream_ctx.message_id, - delta=delta.content_delta, - ) + if delta.content_delta: # pragma: no branch + yield TextMessageContentEvent( + message_id=stream_ctx.message_id, + delta=delta.content_delta, + ) elif isinstance(delta, ToolCallPartDelta): # pragma: no branch assert delta.tool_call_id, '`ToolCallPartDelta.tool_call_id` must be set' yield ToolCallArgsEvent( From 5d4342cedc1714314e1019954fe86e463d097e55 Mon Sep 17 00:00:00 2001 From: celeritatem Date: Wed, 3 Sep 2025 21:38:11 +0545 Subject: [PATCH 2/2] Update AG-UI thinking test case to confirm that empty text parts are ignored --- tests/test_ag_ui.py | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/test_ag_ui.py b/tests/test_ag_ui.py index 0795ae37dc..12f68d42bb 100644 --- a/tests/test_ag_ui.py +++ b/tests/test_ag_ui.py @@ -864,6 +864,7 @@ async def stream_function( ) -> AsyncIterator[DeltaThinkingCalls | str]: yield {0: DeltaThinkingPart(content='')} yield "Let's do some thinking" + yield '' yield {1: DeltaThinkingPart(content='Thinking ')} yield {1: DeltaThinkingPart(content='about the weather')} yield {2: DeltaThinkingPart(content='')}