Merge pull request #1171 from hchen2020/master

Fix Twilio dispose issue.
This commit is contained in:
Haiping 2025-09-23 11:20:08 -05:00 committed by GitHub
commit 3b692a958d
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
4 changed files with 3 additions and 10 deletions

View file

@ -31,7 +31,6 @@ internal class AsyncWebsocketDataResultEnumerator : IAsyncEnumerator<ClientResul
public ValueTask DisposeAsync() public ValueTask DisposeAsync()
{ {
ArrayPool<byte>.Shared.Return(_buffer, clearArray: true); ArrayPool<byte>.Shared.Return(_buffer, clearArray: true);
_webSocket?.Dispose();
return new ValueTask(Task.CompletedTask); return new ValueTask(Task.CompletedTask);
} }

View file

@ -26,7 +26,6 @@ public class LlmRealtimeSession : IDisposable
public async Task ConnectAsync(Uri uri, Dictionary<string, string>? headers = null, CancellationToken cancellationToken = default) public async Task ConnectAsync(Uri uri, Dictionary<string, string>? headers = null, CancellationToken cancellationToken = default)
{ {
_disposed = false; _disposed = false;
_webSocket?.Dispose();
_webSocket = new ClientWebSocket(); _webSocket = new ClientWebSocket();
if (!headers.IsNullOrEmpty()) if (!headers.IsNullOrEmpty())

View file

@ -69,7 +69,6 @@ public class RealTimeCompletionProvider : IRealTimeCompletion
_model = realtimeSettings.Model; _model = realtimeSettings.Model;
var settings = settingsService.GetSetting(Provider, _model); var settings = settingsService.GetSetting(Provider, _model);
_session?.Dispose();
_session = new LlmRealtimeSession(_services, new ChatSessionOptions _session = new LlmRealtimeSession(_services, new ChatSessionOptions
{ {
Provider = Provider, Provider = Provider,

View file

@ -23,7 +23,6 @@ public class TwilioStreamMiddleware
{ {
private readonly RequestDelegate _next; private readonly RequestDelegate _next;
private readonly ILogger<TwilioStreamMiddleware> _logger; private readonly ILogger<TwilioStreamMiddleware> _logger;
private BotSharpRealtimeSession _session;
public TwilioStreamMiddleware( public TwilioStreamMiddleware(
RequestDelegate next, RequestDelegate next,
@ -52,7 +51,6 @@ public class TwilioStreamMiddleware
} }
catch (Exception ex) catch (Exception ex)
{ {
_session?.Dispose();
_logger.LogError(ex, $"Error in WebSocket communication: {ex.Message} for conversation {conversationId}"); _logger.LogError(ex, $"Error in WebSocket communication: {ex.Message} for conversation {conversationId}");
} }
return; return;
@ -64,8 +62,7 @@ public class TwilioStreamMiddleware
private async Task HandleWebSocket(IServiceProvider services, string agentId, string conversationId, WebSocket webSocket) private async Task HandleWebSocket(IServiceProvider services, string agentId, string conversationId, WebSocket webSocket)
{ {
_session?.Dispose(); using var session = new BotSharpRealtimeSession(services, webSocket, new ChatSessionOptions
_session = new BotSharpRealtimeSession(services, webSocket, new ChatSessionOptions
{ {
Provider = "BotSharp Twilio Stream", Provider = "BotSharp Twilio Stream",
BufferSize = 1024 * 32, BufferSize = 1024 * 32,
@ -92,7 +89,7 @@ public class TwilioStreamMiddleware
var routing = services.GetRequiredService<IRoutingService>(); var routing = services.GetRequiredService<IRoutingService>();
routing.Context.Push(agentId); 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; var receivedText = update?.RawResponse;
if (string.IsNullOrEmpty(receivedText)) if (string.IsNullOrEmpty(receivedText))
@ -144,8 +141,7 @@ public class TwilioStreamMiddleware
} }
convService.SaveStates(); convService.SaveStates();
await _session.DisconnectAsync(); await session.DisconnectAsync();
_session.Dispose();
} }
private async Task ConnectToModel(IRealtimeHub hub, WebSocket webSocket) private async Task ConnectToModel(IRealtimeHub hub, WebSocket webSocket)