Skip to content

Commit 6581b2e

Browse files
authored
Merge pull request #1172 from iceljc/master
fix chat stream and websocket close
2 parents 3b692a9 + 43691e9 commit 6581b2e

File tree

10 files changed

+36
-45
lines changed

10 files changed

+36
-45
lines changed
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
namespace BotSharp.Abstraction.MLTasks.Utilities;
2+
3+
public static class LlmUtility
4+
{
5+
public static string? VerifyModelParameter(string? curVal, string? defaultVal, IEnumerable<string>? options = null)
6+
{
7+
if (options.IsNullOrEmpty())
8+
{
9+
return curVal.IfNullOrEmptyAs(defaultVal);
10+
}
11+
12+
return options.Contains(curVal) ? curVal : defaultVal;
13+
}
14+
}

src/Infrastructure/BotSharp.Core/Session/BotSharpRealtimeSession.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,7 @@ public async Task DisconnectAsync()
7474
return;
7575
}
7676

77-
await _websocket.CloseAsync(WebSocketCloseStatus.Empty, null, CancellationToken.None);
77+
await _websocket.CloseAsync(WebSocketCloseStatus.NormalClosure, $"Normal Closure from {nameof(BotSharpRealtimeSession)}-{_sessionOptions?.Provider}", CancellationToken.None);
7878
}
7979

8080
public void Dispose()

src/Infrastructure/BotSharp.Core/Session/LlmRealtimeSession.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -111,7 +111,7 @@ public async Task DisconnectAsync()
111111

112112
if (_webSocket.State == WebSocketState.Open)
113113
{
114-
await _webSocket.CloseAsync(WebSocketCloseStatus.Empty, null, CancellationToken.None);
114+
await _webSocket.CloseAsync(WebSocketCloseStatus.NormalClosure, $"Normal Closure from {nameof(LlmRealtimeSession)}-{_sessionOptions?.Provider}", CancellationToken.None);
115115
}
116116
}
117117

src/Plugins/BotSharp.Plugin.ChatHub/ChatStreamMiddleware.cs

Lines changed: 7 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@ public class ChatStreamMiddleware
1010
{
1111
private readonly RequestDelegate _next;
1212
private readonly ILogger<ChatStreamMiddleware> _logger;
13-
private BotSharpRealtimeSession _session;
1413

1514
public ChatStreamMiddleware(
1615
RequestDelegate next,
@@ -40,7 +39,6 @@ public async Task Invoke(HttpContext httpContext)
4039
}
4140
catch (Exception ex)
4241
{
43-
_session?.Dispose();
4442
_logger.LogError(ex, $"Error when connecting Chat stream. ({ex.Message})");
4543
}
4644
return;
@@ -52,8 +50,7 @@ public async Task Invoke(HttpContext httpContext)
5250

5351
private async Task HandleWebSocket(IServiceProvider services, string agentId, string conversationId, WebSocket webSocket)
5452
{
55-
_session?.Dispose();
56-
_session = new BotSharpRealtimeSession(services, webSocket, new ChatSessionOptions
53+
using var session = new BotSharpRealtimeSession(services, webSocket, new ChatSessionOptions
5754
{
5855
Provider = "BotSharp Chat Stream",
5956
BufferSize = 1024 * 32,
@@ -72,7 +69,7 @@ private async Task HandleWebSocket(IServiceProvider services, string agentId, st
7269
convService.SetConversationId(conversationId, []);
7370
await convService.GetConversationRecordOrCreateNew(agentId);
7471

75-
await foreach (ChatSessionUpdate update in _session.ReceiveUpdatesAsync(CancellationToken.None))
72+
await foreach (ChatSessionUpdate update in session.ReceiveUpdatesAsync(CancellationToken.None))
7673
{
7774
var receivedText = update?.RawResponse;
7875
if (string.IsNullOrEmpty(receivedText))
@@ -87,7 +84,7 @@ private async Task HandleWebSocket(IServiceProvider services, string agentId, st
8784
_logger.LogCritical($"Start chat stream connection for conversation ({conversationId})");
8885
#endif
8986
var request = InitRequest(data, conversationId);
90-
await ConnectToModel(hub, webSocket, request?.States);
87+
await ConnectToModel(hub, session, request?.States);
9188
}
9289
else if (eventType == "media")
9390
{
@@ -107,17 +104,16 @@ private async Task HandleWebSocket(IServiceProvider services, string agentId, st
107104
}
108105

109106
convService.SaveStates();
110-
await _session.DisconnectAsync();
111-
_session.Dispose();
107+
await session.DisconnectAsync();
112108
}
113109

114-
private async Task ConnectToModel(IRealtimeHub hub, WebSocket webSocket, List<MessageState>? states = null)
110+
private async Task ConnectToModel(IRealtimeHub hub, BotSharpRealtimeSession session, List<MessageState>? states = null)
115111
{
116112
await hub.ConnectToModel(responseToUser: async data =>
117113
{
118-
if (_session != null)
114+
if (session != null)
119115
{
120-
await _session.SendEventAsync(data);
116+
await session.SendEventAsync(data);
121117
}
122118
}, initStates: states);
123119
}

src/Plugins/BotSharp.Plugin.OpenAI/Providers/Audio/AudioTranscriptionProvider.cs

Lines changed: 2 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -47,8 +47,8 @@ private AudioTranscriptionOptions PrepareTranscriptionOptions(string? text)
4747
temperature = $"{settings.Temperature}";
4848
}
4949

50-
responseFormat = settings?.ResponseFormat != null ? VerifyTranscriptionParameter(responseFormat, settings.ResponseFormat.Default, settings.ResponseFormat.Options) : null;
51-
granularity = settings?.Granularity != null ? VerifyTranscriptionParameter(granularity, settings.Granularity.Default, settings.Granularity.Options) : null;
50+
responseFormat = settings?.ResponseFormat != null ? LlmUtility.VerifyModelParameter(responseFormat, settings.ResponseFormat.Default, settings.ResponseFormat.Options) : null;
51+
granularity = settings?.Granularity != null ? LlmUtility.VerifyModelParameter(granularity, settings.Granularity.Default, settings.Granularity.Options) : null;
5252

5353
var options = new AudioTranscriptionOptions
5454
{
@@ -131,14 +131,4 @@ private AudioTimestampGranularities GetGranularity(string input)
131131

132132
return temperature;
133133
}
134-
135-
private string? VerifyTranscriptionParameter(string? curVal, string? defaultVal, IEnumerable<string>? options = null)
136-
{
137-
if (options.IsNullOrEmpty())
138-
{
139-
return curVal.IfNullOrEmptyAs(defaultVal);
140-
}
141-
142-
return options.Contains(curVal) ? curVal : defaultVal;
143-
}
144134
}

src/Plugins/BotSharp.Plugin.OpenAI/Providers/Image/ImageCompletionProvider.Edit.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -61,9 +61,9 @@ public async Task<RoleDialogModel> GetImageEdits(Agent agent, RoleDialogModel me
6161

6262
var settings = settingsService.GetSetting(Provider, _model)?.Image?.Edit;
6363

64-
size = settings?.Size != null ? VerifyImageParameter(size, settings.Size.Default, settings.Size.Options) : null;
65-
responseFormat = settings?.ResponseFormat != null ? VerifyImageParameter(responseFormat, settings.ResponseFormat.Default, settings.ResponseFormat.Options) : null;
66-
background = settings?.Background != null ? VerifyImageParameter(background, settings.Background.Default, settings.Background.Options) : null;
64+
size = settings?.Size != null ? LlmUtility.VerifyModelParameter(size, settings.Size.Default, settings.Size.Options) : null;
65+
responseFormat = settings?.ResponseFormat != null ? LlmUtility.VerifyModelParameter(responseFormat, settings.ResponseFormat.Default, settings.ResponseFormat.Options) : null;
66+
background = settings?.Background != null ? LlmUtility.VerifyModelParameter(background, settings.Background.Default, settings.Background.Options) : null;
6767

6868
var options = new ImageEditOptions();
6969
if (!string.IsNullOrEmpty(size))

src/Plugins/BotSharp.Plugin.OpenAI/Providers/Image/ImageCompletionProvider.Generation.cs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -42,11 +42,11 @@ public async Task<RoleDialogModel> GetImageGeneration(Agent agent, RoleDialogMod
4242

4343
var settings = settingsService.GetSetting(Provider, _model)?.Image?.Generation;
4444

45-
size = settings?.Size != null ? VerifyImageParameter(size, settings.Size.Default, settings.Size.Options) : null;
46-
quality = settings?.Quality != null ? VerifyImageParameter(quality, settings.Quality.Default, settings.Quality.Options) : null;
47-
style = settings?.Style != null ? VerifyImageParameter(style, settings.Style.Default, settings.Style.Options) : null;
48-
responseFormat = settings?.ResponseFormat != null ? VerifyImageParameter(responseFormat, settings.ResponseFormat.Default, settings.ResponseFormat.Options) : null;
49-
background = settings?.Background != null ? VerifyImageParameter(background, settings.Background.Default, settings.Background.Options) : null;
45+
size = settings?.Size != null ? LlmUtility.VerifyModelParameter(size, settings.Size.Default, settings.Size.Options) : null;
46+
quality = settings?.Quality != null ? LlmUtility.VerifyModelParameter(quality, settings.Quality.Default, settings.Quality.Options) : null;
47+
style = settings?.Style != null ? LlmUtility.VerifyModelParameter(style, settings.Style.Default, settings.Style.Options) : null;
48+
responseFormat = settings?.ResponseFormat != null ? LlmUtility.VerifyModelParameter(responseFormat, settings.ResponseFormat.Default, settings.ResponseFormat.Options) : null;
49+
background = settings?.Background != null ? LlmUtility.VerifyModelParameter(background, settings.Background.Default, settings.Background.Options) : null;
5050

5151
var options = new ImageGenerationOptions();
5252
if (!string.IsNullOrEmpty(size))

src/Plugins/BotSharp.Plugin.OpenAI/Providers/Image/ImageCompletionProvider.Variation.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -35,8 +35,8 @@ public async Task<RoleDialogModel> GetImageVariation(Agent agent, RoleDialogMode
3535

3636
var settings = settingsService.GetSetting(Provider, _model)?.Image?.Variation;
3737

38-
size = settings?.Size != null ? VerifyImageParameter(size, settings.Size.Default, settings.Size.Options) : null;
39-
responseFormat = settings?.ResponseFormat != null ? VerifyImageParameter(responseFormat, settings.ResponseFormat.Default, settings.ResponseFormat.Options) : null;
38+
size = settings?.Size != null ? LlmUtility.VerifyModelParameter(size, settings.Size.Default, settings.Size.Options) : null;
39+
responseFormat = settings?.ResponseFormat != null ? LlmUtility.VerifyModelParameter(responseFormat, settings.ResponseFormat.Default, settings.ResponseFormat.Options) : null;
4040

4141
var options = new ImageVariationOptions();
4242
if (!string.IsNullOrEmpty(size))

src/Plugins/BotSharp.Plugin.OpenAI/Providers/Image/ImageCompletionProvider.cs

Lines changed: 0 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -201,15 +201,5 @@ private int GetImageCount(string count)
201201
}
202202
return retCount;
203203
}
204-
205-
private string? VerifyImageParameter(string? curVal, string? defaultVal, IEnumerable<string>? options = null)
206-
{
207-
if (options.IsNullOrEmpty())
208-
{
209-
return curVal.IfNullOrEmptyAs(defaultVal);
210-
}
211-
212-
return options.Contains(curVal) ? curVal : defaultVal;
213-
}
214204
#endregion
215205
}

src/Plugins/BotSharp.Plugin.OpenAI/Using.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
global using BotSharp.Abstraction.Files.Utilities;
2727
global using BotSharp.Abstraction.Functions.Models;
2828
global using BotSharp.Abstraction.MLTasks.Settings;
29+
global using BotSharp.Abstraction.MLTasks.Utilities;
2930
global using BotSharp.Abstraction.Options;
3031
global using BotSharp.Abstraction.Realtime;
3132
global using BotSharp.Abstraction.Realtime.Models;

0 commit comments

Comments
 (0)