diff --git a/app/MindWork AI Studio/Components/ChatComponent.razor.cs b/app/MindWork AI Studio/Components/ChatComponent.razor.cs index 669a5648..4c604753 100644 --- a/app/MindWork AI Studio/Components/ChatComponent.razor.cs +++ b/app/MindWork AI Studio/Components/ChatComponent.razor.cs @@ -879,22 +879,7 @@ public partial class ChatComponent : MSGComponentBase, IAsyncDisposable var chatProfile = this.ChatThread?.SelectedProfile; var chatChatTemplate = this.ChatThread?.SelectedChatTemplate; - switch (this.SettingsManager.ConfigurationData.Chat.LoadingProviderBehavior) - { - default: - case LoadingChatProviderBehavior.USE_CHAT_PROVIDER_IF_AVAILABLE: - this.Provider = this.SettingsManager.GetPreselectedProvider(Tools.Components.CHAT, chatProvider); - break; - - case LoadingChatProviderBehavior.ALWAYS_USE_DEFAULT_CHAT_PROVIDER: - this.Provider = this.SettingsManager.GetPreselectedProvider(Tools.Components.CHAT); - break; - - case LoadingChatProviderBehavior.ALWAYS_USE_LATEST_CHAT_PROVIDER: - if(this.Provider == AIStudio.Settings.Provider.NONE) - this.Provider = this.SettingsManager.GetPreselectedProvider(Tools.Components.CHAT); - break; - } + this.Provider = this.SettingsManager.GetChatProviderForLoadedChat(chatProvider); await this.ProviderChanged.InvokeAsync(this.Provider); diff --git a/app/MindWork AI Studio/Settings/SettingsManager.cs b/app/MindWork AI Studio/Settings/SettingsManager.cs index 50c8c03e..3ec8906c 100644 --- a/app/MindWork AI Studio/Settings/SettingsManager.cs +++ b/app/MindWork AI Studio/Settings/SettingsManager.cs @@ -304,6 +304,43 @@ public sealed class SettingsManager return this.ConfigurationData.Providers.FirstOrDefault(x => x.Id == this.ConfigurationData.App.PreselectedProvider && x.UsedLLMProvider.GetConfidence(this).Level >= minimumLevel) ?? Provider.NONE; } + [SuppressMessage("Usage", "MWAIS0001:Direct access to `Providers` is not allowed")] + public Provider GetChatProviderForLoadedChat(string? chatProviderId = null) + { + var minimumLevel = this.GetMinimumConfidenceLevel(Tools.Components.CHAT); + + bool IsSelectableProvider(Provider provider) => + provider != Provider.NONE + && provider.UsedLLMProvider != LLMProviders.NONE + && provider.UsedLLMProvider.GetConfidence(this).Level >= minimumLevel; + + Provider? FindProviderById(string? providerId) + { + if (string.IsNullOrWhiteSpace(providerId)) + return null; + + var provider = this.ConfigurationData.Providers.FirstOrDefault(x => x.Id == providerId); + return provider is not null && IsSelectableProvider(provider) ? provider : null; + } + + var chatProvider = FindProviderById(chatProviderId); + if (chatProvider is not null) + return chatProvider; + + var defaultChatProvider = this.ConfigurationData.Chat.PreselectOptions + ? FindProviderById(this.ConfigurationData.Chat.PreselectedProvider) + : null; + if (defaultChatProvider is not null) + return defaultChatProvider; + + var defaultAppProvider = FindProviderById(this.ConfigurationData.App.PreselectedProvider); + if (defaultAppProvider is not null) + return defaultAppProvider; + + var selectableProviders = this.ConfigurationData.Providers.Where(IsSelectableProvider).ToList(); + return selectableProviders.Count == 1 ? selectableProviders[0] : Provider.NONE; + } + public Profile GetPreselectedProfile(Tools.Components component) { var preselection = component.GetProfilePreselection(this);