|
37 | 37 | RealtimeModelAudioInterruptedEvent,
|
38 | 38 | RealtimeModelConnectionStatusEvent,
|
39 | 39 | RealtimeModelErrorEvent,
|
| 40 | + RealtimeModelInputAudioBufferTimeoutEvent, |
40 | 41 | RealtimeModelInputAudioTranscriptionCompletedEvent,
|
41 | 42 | RealtimeModelItemDeletedEvent,
|
42 | 43 | RealtimeModelItemUpdatedEvent,
|
@@ -367,6 +368,25 @@ async def test_ignored_events_only_generate_raw_events(self, mock_model, mock_ag
|
367 | 368 | event = await session._event_queue.get()
|
368 | 369 | assert isinstance(event, RealtimeRawModelEvent)
|
369 | 370 |
|
| 371 | + @pytest.mark.asyncio |
| 372 | + async def test_idle_timeout_event_forwarded(self, mock_model, mock_agent): |
| 373 | + """Test that idle timeout events are forwarded as raw model events.""" |
| 374 | + session = RealtimeSession(mock_model, mock_agent, None) |
| 375 | + |
| 376 | + timeout_event = RealtimeModelInputAudioBufferTimeoutEvent( |
| 377 | + event_id="evt_1", |
| 378 | + audio_start_ms=0, |
| 379 | + audio_end_ms=500, |
| 380 | + item_id="item_1", |
| 381 | + ) |
| 382 | + |
| 383 | + await session.on_event(timeout_event) |
| 384 | + |
| 385 | + assert session._event_queue.qsize() == 1 |
| 386 | + event = await session._event_queue.get() |
| 387 | + assert isinstance(event, RealtimeRawModelEvent) |
| 388 | + assert event.data == timeout_event |
| 389 | + |
370 | 390 | @pytest.mark.asyncio
|
371 | 391 | async def test_function_call_event_triggers_tool_handling(self, mock_model, mock_agent):
|
372 | 392 | """Test that function_call events trigger tool call handling"""
|
@@ -1360,6 +1380,27 @@ async def test_session_gets_model_settings_from_agent_during_connection(self):
|
1360 | 1380 |
|
1361 | 1381 | await session.__aexit__(None, None, None)
|
1362 | 1382 |
|
| 1383 | + @pytest.mark.asyncio |
| 1384 | + async def test_idle_timeout_ms_passed_to_model(self): |
| 1385 | + """Test that idle_timeout_ms is forwarded to the model connect settings.""" |
| 1386 | + mock_model = Mock(spec=RealtimeModel) |
| 1387 | + mock_model.connect = AsyncMock() |
| 1388 | + mock_model.add_listener = Mock() |
| 1389 | + |
| 1390 | + agent = Mock(spec=RealtimeAgent) |
| 1391 | + agent.get_system_prompt = AsyncMock(return_value="") |
| 1392 | + agent.get_all_tools = AsyncMock(return_value=[]) |
| 1393 | + agent.handoffs = [] |
| 1394 | + |
| 1395 | + run_config: RealtimeRunConfig = {"model_settings": {"idle_timeout_ms": 1000}} |
| 1396 | + session = RealtimeSession(mock_model, agent, None, run_config=run_config) |
| 1397 | + |
| 1398 | + await session.__aenter__() |
| 1399 | + connect_config = mock_model.connect.call_args[0][0] |
| 1400 | + assert connect_config["initial_model_settings"]["idle_timeout_ms"] == 1000 |
| 1401 | + |
| 1402 | + await session.__aexit__(None, None, None) |
| 1403 | + |
1363 | 1404 | @pytest.mark.asyncio
|
1364 | 1405 | async def test_model_config_overrides_model_settings_not_agent(self):
|
1365 | 1406 | """Test that initial_model_settings from model_config override model settings
|
|
0 commit comments