@@ -144,13 +144,28 @@ private async Task ReceiveMessage(RealtimeHubConnection conn,
144144 Action onUserInterrupted )
145145 {
146146 var buffer = new byte [ 1024 * 32 ] ;
147- WebSocketReceiveResult result ;
147+ // Model response timeout
148+ var timeout = 30 ;
149+ WebSocketReceiveResult ? result = default ;
148150
149151 do
150152 {
151153 Array . Clear ( buffer , 0 , buffer . Length ) ;
152- result = await _webSocket . ReceiveAsync (
153- new ArraySegment < byte > ( buffer ) , CancellationToken . None ) ;
154+
155+ var taskWorker = _webSocket . ReceiveAsync ( new ArraySegment < byte > ( buffer ) , CancellationToken . None ) ;
156+ var taskTimer = Task . Delay ( 1000 * timeout ) ;
157+ var completedTask = await Task . WhenAny ( taskWorker , taskTimer ) ;
158+
159+ if ( completedTask == taskWorker )
160+ {
161+ result = taskWorker . Result ;
162+ }
163+ else
164+ {
165+ _logger . LogWarning ( $ "Timeout { timeout } seconds waiting for Model response.") ;
166+ await TriggerModelInference ( "Response user immediately" ) ;
167+ continue ;
168+ }
154169
155170 // Convert received data to text/audio (Twilio sends Base64-encoded audio)
156171 string receivedText = Encoding . UTF8 . GetString ( buffer , 0 , result . Count ) ;
@@ -187,7 +202,6 @@ private async Task ReceiveMessage(RealtimeHubConnection conn,
187202 {
188203 _logger . LogInformation ( $ "{ response . Type } : { receivedText } ") ;
189204 var data = JsonSerializer . Deserialize < ResponseAudioTranscript > ( receivedText ) ;
190- await Task . Delay ( 1000 ) ;
191205 onModelAudioTranscriptDone ( data . Transcript ) ;
192206 }
193207 else if ( response . Type == "response.audio.delta" )
0 commit comments