@@ -21,53 +21,9 @@ public RealtimeHub(IServiceProvider services, ILogger<RealtimeHub> logger)
21
21
_logger = logger ;
22
22
}
23
23
24
- public async Task Listen ( WebSocket userWebSocket ,
25
- Action < string > onUserMessageReceived )
24
+ public async Task ConnectToModel ( Func < string , Task > responseToUser )
26
25
{
27
- var buffer = new byte [ 1024 * 32 ] ;
28
- WebSocketReceiveResult result ;
29
-
30
- do
31
- {
32
- Array . Clear ( buffer , 0 , buffer . Length ) ;
33
- result = await userWebSocket . ReceiveAsync ( new ArraySegment < byte > ( buffer ) , CancellationToken . None ) ;
34
- string receivedText = Encoding . UTF8 . GetString ( buffer , 0 , result . Count ) ;
35
-
36
- if ( string . IsNullOrEmpty ( receivedText ) )
37
- {
38
- continue ;
39
- }
40
-
41
- onUserMessageReceived ( receivedText ) ;
42
-
43
- if ( _conn . Event == "user_connected" )
44
- {
45
- await ConnectToModel ( userWebSocket ) ;
46
- }
47
- else if ( _conn . Event == "user_data_received" )
48
- {
49
- await _completer . AppenAudioBuffer ( _conn . Data ) ;
50
- }
51
- else if ( _conn . Event == "user_dtmf_receiving" )
52
- {
53
- }
54
- else if ( _conn . Event == "user_dtmf_received" )
55
- {
56
- await HandleUserDtmfReceived ( ) ;
57
- }
58
- else if ( _conn . Event == "user_disconnected" )
59
- {
60
- await _completer . Disconnect ( ) ;
61
- await HandleUserDisconnected ( ) ;
62
- }
63
- } while ( ! result . CloseStatus . HasValue ) ;
64
-
65
- await userWebSocket . CloseAsync ( result . CloseStatus . Value , result . CloseStatusDescription , CancellationToken . None ) ;
66
- }
67
-
68
- private async Task ConnectToModel ( WebSocket userWebSocket )
69
- {
70
- var hookProvider = _services . GetRequiredService < ConversationHookProvider > ( ) ;
26
+ var hookProvider = _services . GetService < ConversationHookProvider > ( ) ;
71
27
var convService = _services . GetRequiredService < IConversationService > ( ) ;
72
28
convService . SetConversationId ( _conn . ConversationId , [ ] ) ;
73
29
var conversation = await convService . GetConversation ( _conn . ConversationId ) ;
@@ -103,7 +59,7 @@ await _completer.Connect(_conn,
103
59
onModelAudioDeltaReceived : async ( audioDeltaData , itemId ) =>
104
60
{
105
61
var data = _conn . OnModelMessageReceived ( audioDeltaData ) ;
106
- await SendEventToUser ( userWebSocket , data ) ;
62
+ await responseToUser ( data ) ;
107
63
108
64
// If this is the first delta of a new response, set the start timestamp
109
65
if ( ! _conn . ResponseStartTimestamp . HasValue )
@@ -118,12 +74,12 @@ await _completer.Connect(_conn,
118
74
}
119
75
120
76
// Send mark messages to Media Streams so we know if and when AI response playback is finished
121
- await SendMark ( userWebSocket , _conn ) ;
77
+ // await SendMark(userWebSocket, _conn);
122
78
} ,
123
79
onModelAudioResponseDone : async ( ) =>
124
80
{
125
81
var data = _conn . OnModelAudioResponseDone ( ) ;
126
- await SendEventToUser ( userWebSocket , data ) ;
82
+ await responseToUser ( data ) ;
127
83
} ,
128
84
onAudioTranscriptDone : async transcript =>
129
85
{
@@ -151,7 +107,7 @@ await _completer.Connect(_conn,
151
107
dialogs . Add ( message ) ;
152
108
storage . Append ( _conn . ConversationId , message ) ;
153
109
154
- foreach ( var hook in hookProvider . HooksOrderByPriority )
110
+ foreach ( var hook in hookProvider ? . HooksOrderByPriority ?? [ ] )
155
111
{
156
112
hook . SetAgent ( agent )
157
113
. SetConversation ( conversation ) ;
@@ -172,7 +128,7 @@ await _completer.Connect(_conn,
172
128
storage . Append ( _conn . ConversationId , message ) ;
173
129
routing . Context . SetMessageId ( _conn . ConversationId , message . MessageId ) ;
174
130
175
- foreach ( var hook in hookProvider . HooksOrderByPriority )
131
+ foreach ( var hook in hookProvider ? . HooksOrderByPriority ?? [ ] )
176
132
{
177
133
hook . SetAgent ( agent )
178
134
. SetConversation ( conversation ) ;
@@ -186,69 +142,10 @@ await _completer.Connect(_conn,
186
142
_conn . ResetResponseState ( ) ;
187
143
188
144
var data = _conn . OnModelUserInterrupted ( ) ;
189
- await SendEventToUser ( userWebSocket , data ) ;
145
+ await responseToUser ( data ) ;
190
146
} ) ;
191
147
}
192
148
193
- private async Task SendMark ( WebSocket userWebSocket , RealtimeHubConnection conn )
194
- {
195
- if ( ! string . IsNullOrEmpty ( conn . StreamId ) )
196
- {
197
- var markEvent = new
198
- {
199
- @event = "mark" ,
200
- streamSid = conn . StreamId ,
201
- mark = new { name = "responsePart" }
202
- } ;
203
- await SendEventToUser ( userWebSocket , markEvent ) ;
204
- conn . MarkQueue . Enqueue ( "responsePart" ) ;
205
- }
206
- }
207
-
208
- private async Task HandleUserDtmfReceived ( )
209
- {
210
- var routing = _services . GetRequiredService < IRoutingService > ( ) ;
211
- var hookProvider = _services . GetRequiredService < ConversationHookProvider > ( ) ;
212
- var agentService = _services . GetRequiredService < IAgentService > ( ) ;
213
- var agent = await agentService . LoadAgent ( _conn . CurrentAgentId ) ;
214
- var dialogs = routing . Context . GetDialogs ( ) ;
215
- var convService = _services . GetRequiredService < IConversationService > ( ) ;
216
- var conversation = await convService . GetConversation ( _conn . ConversationId ) ;
217
-
218
- var message = new RoleDialogModel ( AgentRole . User , _conn . Data )
219
- {
220
- CurrentAgentId = routing . Context . GetCurrentAgentId ( )
221
- } ;
222
- dialogs . Add ( message ) ;
223
-
224
- var storage = _services . GetRequiredService < IConversationStorage > ( ) ;
225
- storage . Append ( _conn . ConversationId , message ) ;
226
-
227
- foreach ( var hook in hookProvider . HooksOrderByPriority )
228
- {
229
- hook . SetAgent ( agent )
230
- . SetConversation ( conversation ) ;
231
-
232
- await hook . OnMessageReceived ( message ) ;
233
- }
234
-
235
- await _completer . InsertConversationItem ( message ) ;
236
- var instruction = await _completer . UpdateSession ( _conn ) ;
237
- await _completer . TriggerModelInference ( $ "{ instruction } \r \n \r \n Reply based on the user input: { message . Content } ") ;
238
- }
239
-
240
- private async Task HandleUserDisconnected ( )
241
- {
242
-
243
- }
244
-
245
- private async Task SendEventToUser ( WebSocket webSocket , object message )
246
- {
247
- var data = JsonSerializer . Serialize ( message ) ;
248
- var buffer = Encoding . UTF8 . GetBytes ( data ) ;
249
- await webSocket . SendAsync ( new ArraySegment < byte > ( buffer ) , WebSocketMessageType . Text , true , CancellationToken . None ) ;
250
- }
251
-
252
149
public RealtimeHubConnection SetHubConnection ( string conversationId )
253
150
{
254
151
_conn = new RealtimeHubConnection
0 commit comments