From db06ef2415d83d93ec8688255382d9ee5f1abab9 Mon Sep 17 00:00:00 2001 From: nileshpatil6 Date: Tue, 21 Apr 2026 01:03:28 +0530 Subject: [PATCH 1/2] fix: emit RealtimeHistoryUpdated when transcript_delta updates history transcript_delta mutates self._history via _get_new_history but never emits RealtimeHistoryUpdated, so UI consumers listening to history events miss live partial transcript changes. Emit the event consistently with the item_updated and item_deleted branches. Fixes #2940 --- src/agents/realtime/session.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/agents/realtime/session.py b/src/agents/realtime/session.py index 89f63b02fa..7ddf19813c 100644 --- a/src/agents/realtime/session.py +++ b/src/agents/realtime/session.py @@ -313,6 +313,9 @@ async def on_event(self, event: RealtimeModelEvent) -> None: content=[AssistantAudio(transcript=self._item_transcripts[item_id])], ), ) + await self._put_event( + RealtimeHistoryUpdated(info=self._event_info, history=self._history) + ) # Check if we should run guardrails based on debounce threshold current_length = len(self._item_transcripts[item_id]) From aee9372a4ecd7c5b966a25a8f654953c1bac5292 Mon Sep 17 00:00:00 2001 From: Nilesh Patil <128893479+nileshpatil6@users.noreply.github.com> Date: Tue, 21 Apr 2026 03:08:35 +0530 Subject: [PATCH 2/2] test: update test to reflect transcript_delta now emits RealtimeHistoryUpdated --- tests/realtime/test_session.py | 24 ++++++++++++++++++------ 1 file changed, 18 insertions(+), 6 deletions(-) diff --git a/tests/realtime/test_session.py b/tests/realtime/test_session.py index c1c919a866..e5382ed428 100644 --- a/tests/realtime/test_session.py +++ b/tests/realtime/test_session.py @@ -565,11 +565,13 @@ async def test_item_deleted_event_removes_item(self, mock_model, mock_agent): @pytest.mark.asyncio async def test_ignored_events_only_generate_raw_events(self, mock_model, mock_agent): - """Test that ignored events (transcript_delta, connection_status, other) only generate raw - events""" + """Test that connection_status and other events only generate raw events. + + transcript_delta now also emits RealtimeHistoryUpdated after updating history. + """ session = RealtimeSession(mock_model, mock_agent, None) - # Test transcript delta (should be ignored per TODO comment) + # transcript_delta updates history and emits RealtimeHistoryUpdated transcript_event = RealtimeModelTranscriptDeltaEvent( item_id="item_1", delta="hello", response_id="resp_1" ) @@ -583,10 +585,20 @@ async def test_ignored_events_only_generate_raw_events(self, mock_model, mock_ag other_event = RealtimeModelOtherEvent(data={"custom": "data"}) await session.on_event(other_event) - # Should only have 3 raw events (no transformed events) - assert session._event_queue.qsize() == 3 + # transcript_delta emits: 1 raw + 1 RealtimeHistoryUpdated + # connection_status and other each emit: 1 raw + assert session._event_queue.qsize() == 4 + + # raw event for transcript_delta + event = await session._event_queue.get() + assert isinstance(event, RealtimeRawModelEvent) + + # history updated from transcript_delta + event = await session._event_queue.get() + assert isinstance(event, RealtimeHistoryUpdated) - for _ in range(3): + # raw events for connection_status and other + for _ in range(2): event = await session._event_queue.get() assert isinstance(event, RealtimeRawModelEvent)