Skip to content

Commit f1fe571

Browse files
authored
Merge pull request #995 from hchen2020/master
Model response timeout
2 parents af04fea + 5ebf9f7 commit f1fe571

File tree

4 files changed

+42
-5
lines changed

4 files changed

+42
-5
lines changed

src/Infrastructure/BotSharp.Core.Realtime/Hooks/RealtimeConversationHook.cs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
using BotSharp.Abstraction.Utilities;
2+
using BotSharp.Core.Infrastructures;
23

34
namespace BotSharp.Core.Realtime.Hooks;
45

@@ -29,6 +30,10 @@ public async Task OnFunctionExecuted(RoleDialogModel message)
2930
{
3031
return;
3132
}
33+
34+
// Clear cache to force to rebuild the agent instruction
35+
Utilities.ClearCache();
36+
3237
var routing = _services.GetRequiredService<IRoutingService>();
3338

3439
message.Role = AgentRole.Function;

src/Infrastructure/BotSharp.Core.Realtime/Services/RealtimeHub.cs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,9 @@ public async Task Listen(WebSocket userWebSocket,
4949
{
5050
await _completer.AppenAudioBuffer(_conn.Data);
5151
}
52+
else if (_conn.Event == "user_dtmf_receiving")
53+
{
54+
}
5255
else if (_conn.Event == "user_dtmf_received")
5356
{
5457
await HandleUserDtmfReceived();

src/Plugins/BotSharp.Plugin.OpenAI/Providers/Realtime/RealTimeCompletionProvider.cs

Lines changed: 23 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -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);
@@ -164,6 +179,11 @@ private async Task ReceiveMessage(RealtimeHubConnection conn,
164179
if (response.Type == "error")
165180
{
166181
_logger.LogError($"{response.Type}: {receivedText}");
182+
var error = JsonSerializer.Deserialize<ServerEventErrorResponse>(receivedText);
183+
if (error?.Body.Type == "server_error")
184+
{
185+
break;
186+
}
167187
}
168188
else if (response.Type == "session.created")
169189
{
@@ -182,7 +202,6 @@ private async Task ReceiveMessage(RealtimeHubConnection conn,
182202
{
183203
_logger.LogInformation($"{response.Type}: {receivedText}");
184204
var data = JsonSerializer.Deserialize<ResponseAudioTranscript>(receivedText);
185-
await Task.Delay(1000);
186205
onModelAudioTranscriptDone(data.Transcript);
187206
}
188207
else if (response.Type == "response.audio.delta")

src/Plugins/BotSharp.Plugin.Twilio/TwilioStreamMiddleware.cs

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
using BotSharp.Abstraction.Realtime;
2-
using BotSharp.Abstraction.Realtime.Models;
32
using BotSharp.Plugin.Twilio.Interfaces;
43
using BotSharp.Plugin.Twilio.Models.Stream;
54
using Microsoft.AspNetCore.Http;
@@ -100,6 +99,7 @@ await hub.Listen(webSocket, (receivedText) =>
10099
}
101100
else
102101
{
102+
conn.Event = "user_dtmf_receiving";
103103
conn.KeypadInputBuffer += dtmfResponse.Body.Digit;
104104
}
105105
break;
@@ -115,19 +115,29 @@ await hub.Listen(webSocket, (receivedText) =>
115115
streamSid = response.StreamSid,
116116
media = new { payload = message }
117117
};
118+
118119
conn.OnModelAudioResponseDone = () =>
119120
new
120121
{
121122
@event = "mark",
122123
streamSid = response.StreamSid,
123124
mark = new { name = "responsePart" }
124125
};
126+
125127
conn.OnModelUserInterrupted = () =>
126128
new
127129
{
128130
@event = "clear",
129131
streamSid = response.StreamSid
130132
};
133+
134+
/*if (response.Event == "dtmf")
135+
{
136+
// Send a Stop command to Twilio
137+
string stopPlaybackCommand = "{ \"action\": \"stop_playback\" }";
138+
var stopBytes = Encoding.UTF8.GetBytes(stopPlaybackCommand);
139+
webSocket.SendAsync(new ArraySegment<byte>(stopBytes), WebSocketMessageType.Text, true, CancellationToken.None);
140+
}*/
131141
});
132142
}
133143
}

0 commit comments

Comments
 (0)