Remove SetCompleter, load from settings.

This commit is contained in:
Haiping Chen 2025-04-07 20:16:47 -05:00
parent 2ddfb5289f
commit cbb4776532
8 changed files with 17 additions and 23 deletions

View file

@ -12,7 +12,6 @@ public interface IRealtimeHub
RealtimeHubConnection SetHubConnection(string conversationId);
IRealTimeCompletion Completer { get; }
IRealTimeCompletion SetCompleter(string provider);
Task ConnectToModel(Func<string, Task> responseToUser);
}

View file

@ -2,7 +2,9 @@ namespace BotSharp.Abstraction.Realtime.Models;
public class RealtimeModelSettings
{
public bool InterruptResponse { get; set; } = false;
public string Provider { get; set; } = "openai";
public string Model { get; set; } = "gpt-4o-mini-realtime-preview";
public bool InterruptResponse { get; set; } = true;
public string InputAudioFormat { get; set; } = "g711_ulaw";
public string OutputAudioFormat { get; set; } = "g711_ulaw";
public string Voice { get; set; } = "alloy";

View file

@ -47,7 +47,9 @@ public class RealtimeHub : IRealtimeHub
routing.Context.SetMessageId(_conn.ConversationId, dialogs.Last().MessageId);
var states = _services.GetRequiredService<IConversationStateService>();
var realtimeModelSettings = _services.GetRequiredService<RealtimeModelSettings>();
var settings = _services.GetRequiredService<RealtimeModelSettings>();
_completer = _services.GetServices<IRealTimeCompletion>().First(x => x.Provider == settings.Provider);
await _completer.Connect(_conn,
onModelReady: async () =>
@ -139,7 +141,7 @@ public class RealtimeHub : IRealtimeHub
},
onUserInterrupted: async () =>
{
if (realtimeModelSettings.InterruptResponse)
if (settings.InterruptResponse)
{
// Reset states
_conn.ResetResponseState();
@ -159,10 +161,4 @@ public class RealtimeHub : IRealtimeHub
return _conn;
}
public IRealTimeCompletion SetCompleter(string provider)
{
_completer = _services.GetServices<IRealTimeCompletion>().First(x => x.Provider == provider);
return _completer;
}
}

View file

@ -1,4 +1,3 @@
using BotSharp.Abstraction.MLTasks.Settings;
using GenerativeAI;
using GenerativeAI.Core;
using GenerativeAI.Live;
@ -65,8 +64,8 @@ public class GoogleRealTimeProvider : IRealTimeCompletion
this.onInputAudioTranscriptionCompleted = onInputAudioTranscriptionCompleted;
this.onUserInterrupted = onUserInterrupted;
var llmProviderService = _services.GetRequiredService<ILlmProviderService>();
_model = llmProviderService.GetProviderModel(Provider, "gemini-2.0", modelType: LlmModelType.Realtime).Name;
var realtimeModelSettings = _services.GetRequiredService<RealtimeModelSettings>();
_model = realtimeModelSettings.Model;
var client = ProviderHelper.GetGeminiClient(Provider, _model, _services);
_chatClient = client.CreateGenerativeModel(_model);

View file

@ -39,8 +39,8 @@ public class RealTimeCompletionProvider : IRealTimeCompletion
Action<RoleDialogModel> onInputAudioTranscriptionCompleted,
Action onUserInterrupted)
{
var llmProviderService = _services.GetRequiredService<ILlmProviderService>();
_model = llmProviderService.GetProviderModel(Provider, "gpt-4o", modelType: LlmModelType.Realtime).Name;
var realtimeModelSettings = _services.GetRequiredService<RealtimeModelSettings>();
_model = realtimeModelSettings.Model;
var settingsService = _services.GetRequiredService<ILlmProviderService>();
var settings = settingsService.GetSetting(Provider, _model);

View file

@ -53,9 +53,9 @@ public class TwilioStreamMiddleware
private async Task HandleWebSocket(IServiceProvider services, string conversationId, WebSocket webSocket)
{
var settings = services.GetRequiredService<RealtimeModelSettings>();
var hub = services.GetRequiredService<IRealtimeHub>();
var conn = hub.SetHubConnection(conversationId);
var completer = hub.SetCompleter("openai");
// load conversation and state
var convService = services.GetRequiredService<IConversationService>();
@ -90,18 +90,18 @@ public class TwilioStreamMiddleware
}
else if (eventType == "user_data_received")
{
await completer.AppenAudioBuffer(data);
await hub.Completer.AppenAudioBuffer(data);
}
else if (eventType == "user_dtmf_receiving")
{
}
else if (eventType == "user_dtmf_received")
{
await HandleUserDtmfReceived(services, conn, completer, data);
await HandleUserDtmfReceived(services, conn, hub.Completer, data);
}
else if (eventType == "user_disconnected")
{
await completer.Disconnect();
await hub.Completer.Disconnect();
await HandleUserDisconnected();
}
} while (!result.CloseStatus.HasValue);

View file

@ -11,7 +11,6 @@
<ItemGroup Condition="$(SolutionName)==PizzaBot">
<PackageReference Include="BotSharp.Logger" />
<PackageReference Include="BotSharp.OpenAPI" />
<PackageReference Include="BotSharp.Core.Realtime" />
<PackageReference Include="BotSharp.Plugin.Dashboard" />
<PackageReference Include="BotSharp.Plugin.AzureOpenAI" />
<PackageReference Include="BotSharp.Plugin.GoogleAI" />

View file

@ -3,7 +3,6 @@ using BotSharp.Abstraction.Conversations.Models;
using BotSharp.Abstraction.Conversations;
using BotSharp.OpenAPI;
using System.Text.Json;
using Google.Ai.Generativelanguage.V1Beta2;
var services = ServiceBuilder.CreateHostBuilder();
var channel = services.GetRequiredService<IStreamChannel>();
@ -23,9 +22,9 @@ conv = await convService.NewConversation(conv);
await channel.ConnectAsync(conv.Id);
var settings = services.GetRequiredService<RealtimeModelSettings>();
var hub = services.GetRequiredService<IRealtimeHub>();
var conn = hub.SetHubConnection(conv.Id);
var completer = hub.SetCompleter("openai");
await hub.ConnectToModel(async data =>
{
@ -65,7 +64,7 @@ do
var seg = new ArraySegment<byte>(buffer);
result = await channel.ReceiveAsync(seg, CancellationToken.None);
await completer.AppenAudioBuffer(seg, result.Count);
await hub.Completer.AppenAudioBuffer(seg, result.Count);
// Display the audio level
int audioLevel = CalculateAudioLevel(buffer, result.Count);