From 1dbdb67a46a2c4a7426fe829d0fde93c315ae627 Mon Sep 17 00:00:00 2001 From: Haiping Chen Date: Tue, 23 Sep 2025 11:19:03 -0500 Subject: [PATCH] Fix Twilio dispose issue. --- .../Websocket/AsyncWebsocketDataResultEnumerator.cs | 1 - .../BotSharp.Core/Session/LlmRealtimeSession.cs | 1 - .../Providers/Realtime/RealTimeCompletionProvider.cs | 1 - .../BotSharp.Plugin.Twilio/TwilioStreamMiddleware.cs | 10 +++------- 4 files changed, 3 insertions(+), 10 deletions(-) diff --git a/src/Infrastructure/BotSharp.Core/Infrastructures/Websocket/AsyncWebsocketDataResultEnumerator.cs b/src/Infrastructure/BotSharp.Core/Infrastructures/Websocket/AsyncWebsocketDataResultEnumerator.cs index 59eac9901..246bb55a3 100644 --- a/src/Infrastructure/BotSharp.Core/Infrastructures/Websocket/AsyncWebsocketDataResultEnumerator.cs +++ b/src/Infrastructure/BotSharp.Core/Infrastructures/Websocket/AsyncWebsocketDataResultEnumerator.cs @@ -31,7 +31,6 @@ public AsyncWebsocketDataResultEnumerator( public ValueTask DisposeAsync() { ArrayPool.Shared.Return(_buffer, clearArray: true); - _webSocket?.Dispose(); return new ValueTask(Task.CompletedTask); } diff --git a/src/Infrastructure/BotSharp.Core/Session/LlmRealtimeSession.cs b/src/Infrastructure/BotSharp.Core/Session/LlmRealtimeSession.cs index fe2831bc7..9e1df1cd1 100644 --- a/src/Infrastructure/BotSharp.Core/Session/LlmRealtimeSession.cs +++ b/src/Infrastructure/BotSharp.Core/Session/LlmRealtimeSession.cs @@ -26,7 +26,6 @@ public LlmRealtimeSession( public async Task ConnectAsync(Uri uri, Dictionary? headers = null, CancellationToken cancellationToken = default) { _disposed = false; - _webSocket?.Dispose(); _webSocket = new ClientWebSocket(); if (!headers.IsNullOrEmpty()) diff --git a/src/Plugins/BotSharp.Plugin.OpenAI/Providers/Realtime/RealTimeCompletionProvider.cs b/src/Plugins/BotSharp.Plugin.OpenAI/Providers/Realtime/RealTimeCompletionProvider.cs index d8a597274..da5ef0b9c 100644 --- a/src/Plugins/BotSharp.Plugin.OpenAI/Providers/Realtime/RealTimeCompletionProvider.cs +++ b/src/Plugins/BotSharp.Plugin.OpenAI/Providers/Realtime/RealTimeCompletionProvider.cs @@ -69,7 +69,6 @@ public async Task Connect( _model = realtimeSettings.Model; var settings = settingsService.GetSetting(Provider, _model); - _session?.Dispose(); _session = new LlmRealtimeSession(_services, new ChatSessionOptions { Provider = Provider, diff --git a/src/Plugins/BotSharp.Plugin.Twilio/TwilioStreamMiddleware.cs b/src/Plugins/BotSharp.Plugin.Twilio/TwilioStreamMiddleware.cs index 686233806..95bf44751 100644 --- a/src/Plugins/BotSharp.Plugin.Twilio/TwilioStreamMiddleware.cs +++ b/src/Plugins/BotSharp.Plugin.Twilio/TwilioStreamMiddleware.cs @@ -23,7 +23,6 @@ public class TwilioStreamMiddleware { private readonly RequestDelegate _next; private readonly ILogger _logger; - private BotSharpRealtimeSession _session; public TwilioStreamMiddleware( RequestDelegate next, @@ -52,7 +51,6 @@ public async Task Invoke(HttpContext httpContext) } catch (Exception ex) { - _session?.Dispose(); _logger.LogError(ex, $"Error in WebSocket communication: {ex.Message} for conversation {conversationId}"); } return; @@ -64,8 +62,7 @@ public async Task Invoke(HttpContext httpContext) private async Task HandleWebSocket(IServiceProvider services, string agentId, string conversationId, WebSocket webSocket) { - _session?.Dispose(); - _session = new BotSharpRealtimeSession(services, webSocket, new ChatSessionOptions + using var session = new BotSharpRealtimeSession(services, webSocket, new ChatSessionOptions { Provider = "BotSharp Twilio Stream", BufferSize = 1024 * 32, @@ -92,7 +89,7 @@ private async Task HandleWebSocket(IServiceProvider services, string agentId, st var routing = services.GetRequiredService(); routing.Context.Push(agentId); - await foreach (ChatSessionUpdate update in _session.ReceiveUpdatesAsync(CancellationToken.None)) + await foreach (ChatSessionUpdate update in session.ReceiveUpdatesAsync(CancellationToken.None)) { var receivedText = update?.RawResponse; if (string.IsNullOrEmpty(receivedText)) @@ -144,8 +141,7 @@ private async Task HandleWebSocket(IServiceProvider services, string agentId, st } convService.SaveStates(); - await _session.DisconnectAsync(); - _session.Dispose(); + await session.DisconnectAsync(); } private async Task ConnectToModel(IRealtimeHub hub, WebSocket webSocket)