apply agent realtime config

This commit is contained in:
Jicheng Lu 2025-10-10 12:16:28 -05:00
parent dc2e3028ec
commit 28e3518e41
3 changed files with 45 additions and 14 deletions

View file

@ -1,3 +1,4 @@
using BotSharp.Abstraction.Agents.Models;
using BotSharp.Abstraction.Functions.Models; using BotSharp.Abstraction.Functions.Models;
using BotSharp.Abstraction.Hooks; using BotSharp.Abstraction.Hooks;
using BotSharp.Abstraction.Models; using BotSharp.Abstraction.Models;
@ -10,7 +11,8 @@ namespace BotSharp.Core.Realtime.Services;
public class RealtimeHub : IRealtimeHub public class RealtimeHub : IRealtimeHub
{ {
private readonly IServiceProvider _services; private readonly IServiceProvider _services;
private readonly ILogger _logger; private readonly ILogger<RealtimeHub> _logger;
private readonly RealtimeModelSettings _settings;
private RealtimeHubConnection _conn; private RealtimeHubConnection _conn;
public RealtimeHubConnection HubConn => _conn; public RealtimeHubConnection HubConn => _conn;
@ -18,10 +20,14 @@ public class RealtimeHub : IRealtimeHub
private IRealTimeCompletion _completer; private IRealTimeCompletion _completer;
public IRealTimeCompletion Completer => _completer; public IRealTimeCompletion Completer => _completer;
public RealtimeHub(IServiceProvider services, ILogger<RealtimeHub> logger) public RealtimeHub(
IServiceProvider services,
ILogger<RealtimeHub> logger,
RealtimeModelSettings settings)
{ {
_services = services; _services = services;
_logger = logger; _logger = logger;
_settings = settings;
} }
public async Task ConnectToModel( public async Task ConnectToModel(
@ -43,10 +49,10 @@ public class RealtimeHub : IRealtimeHub
routing.Context.SetDialogs(dialogs); routing.Context.SetDialogs(dialogs);
routing.Context.SetMessageId(_conn.ConversationId, Guid.Empty.ToString()); routing.Context.SetMessageId(_conn.ConversationId, Guid.Empty.ToString());
var states = _services.GetRequiredService<IConversationStateService>(); var (provider, model) = GetLlmProviderModel(agent);
var settings = _services.GetRequiredService<RealtimeModelSettings>();
_completer = _services.GetServices<IRealTimeCompletion>().First(x => x.Provider == settings.Provider); _completer = _services.GetServices<IRealTimeCompletion>().First(x => x.Provider == provider);
_completer.SetModelName(model);
_completer.SetOptions(options); _completer.SetOptions(options);
await _completer.Connect( await _completer.Connect(
@ -156,7 +162,7 @@ public class RealtimeHub : IRealtimeHub
}, },
onInterruptionDetected: async () => onInterruptionDetected: async () =>
{ {
if (settings.InterruptResponse) if (_settings.InterruptResponse)
{ {
// Reset states // Reset states
_conn.ResetResponseState(); _conn.ResetResponseState();
@ -179,4 +185,27 @@ public class RealtimeHub : IRealtimeHub
return _conn; return _conn;
} }
private (string, string) GetLlmProviderModel(Agent agent)
{
var provider = agent?.LlmConfig?.Realtime?.Provider;
var model = agent?.LlmConfig?.Realtime?.Model;
if (!string.IsNullOrEmpty(provider) && !string.IsNullOrEmpty(model))
{
return (provider, model);
}
provider = _settings.Provider;
model = _settings.Model;
if (!string.IsNullOrEmpty(provider) && !string.IsNullOrEmpty(model))
{
return (provider, model);
}
provider = "openai";
model = "gpt-realtime";
return (provider, model);
}
} }

View file

@ -18,11 +18,13 @@ public class GoogleRealTimeProvider : IRealTimeCompletion
private string _model = GoogleAIModels.Gemini2FlashLive001; private string _model = GoogleAIModels.Gemini2FlashLive001;
private readonly IServiceProvider _services; private readonly IServiceProvider _services;
private readonly ILogger _logger; private readonly ILogger<GoogleRealTimeProvider> _logger;
private readonly GoogleAiSettings _settings;
private List<string> renderedInstructions = []; private List<string> renderedInstructions = [];
private LlmRealtimeSession _session; private LlmRealtimeSession _session;
private readonly GoogleAiSettings _settings; private RealtimeOptions? _realtimeOptions;
private const string DEFAULT_MIME_TYPE = "audio/pcm;rate=16000"; private const string DEFAULT_MIME_TYPE = "audio/pcm;rate=16000";
private readonly JsonSerializerOptions _jsonOptions = new() private readonly JsonSerializerOptions _jsonOptions = new()
@ -50,12 +52,12 @@ public class GoogleRealTimeProvider : IRealTimeCompletion
public GoogleRealTimeProvider( public GoogleRealTimeProvider(
IServiceProvider services, IServiceProvider services,
GoogleAiSettings settings, ILogger<GoogleRealTimeProvider> logger,
ILogger<GoogleRealTimeProvider> logger) GoogleAiSettings settings)
{ {
_settings = settings;
_services = services; _services = services;
_logger = logger; _logger = logger;
_settings = settings;
} }
public async Task Connect( public async Task Connect(
@ -84,7 +86,7 @@ public class GoogleRealTimeProvider : IRealTimeCompletion
var settingsService = _services.GetRequiredService<ILlmProviderService>(); var settingsService = _services.GetRequiredService<ILlmProviderService>();
var realtimeModelSettings = _services.GetRequiredService<RealtimeModelSettings>(); var realtimeModelSettings = _services.GetRequiredService<RealtimeModelSettings>();
_model = realtimeModelSettings.Model; _model ??= realtimeModelSettings.Model;
var modelSettings = settingsService.GetSetting(Provider, _model); var modelSettings = settingsService.GetSetting(Provider, _model);
Reset(); Reset();
@ -422,7 +424,7 @@ public class GoogleRealTimeProvider : IRealTimeCompletion
public void SetOptions(RealtimeOptions? options) public void SetOptions(RealtimeOptions? options)
{ {
_realtimeOptions = options;
} }
#region Private methods #region Private methods

View file

@ -67,7 +67,7 @@ public class RealTimeCompletionProvider : IRealTimeCompletion
var settingsService = _services.GetRequiredService<ILlmProviderService>(); var settingsService = _services.GetRequiredService<ILlmProviderService>();
var realtimeSettings = _services.GetRequiredService<RealtimeModelSettings>(); var realtimeSettings = _services.GetRequiredService<RealtimeModelSettings>();
_model = realtimeSettings.Model; _model ??= realtimeSettings.Model;
var settings = settingsService.GetSetting(Provider, _model); var settings = settingsService.GetSetting(Provider, _model);
_session = new LlmRealtimeSession(_services, new ChatSessionOptions _session = new LlmRealtimeSession(_services, new ChatSessionOptions