From 4fd293389e0a00a8796786242dc817b3e43c08e1 Mon Sep 17 00:00:00 2001 From: hart_s3 Date: Thu, 9 Apr 2026 15:24:24 +0200 Subject: [PATCH] Streamline chat provider selection logic. --- .../Assistants/I18N/allTexts.lua | 20 +++++----- .../Components/ChatComponent.razor.cs | 17 +-------- .../Settings/SettingsManager.cs | 37 +++++++++++++++++++ 3 files changed, 48 insertions(+), 26 deletions(-) diff --git a/app/MindWork AI Studio/Assistants/I18N/allTexts.lua b/app/MindWork AI Studio/Assistants/I18N/allTexts.lua index c94b4b7a..4a1214d1 100644 --- a/app/MindWork AI Studio/Assistants/I18N/allTexts.lua +++ b/app/MindWork AI Studio/Assistants/I18N/allTexts.lua @@ -4696,6 +4696,12 @@ UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGSLIDEBUILDER::T13933 -- Preselect aspects for the LLM to focus on when generating slides, such as bullet points or specific topics to emphasize. UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGSLIDEBUILDER::T1528169602"] = "Preselect aspects for the LLM to focus on when generating slides, such as bullet points or specific topics to emphasize." +-- Slide Planner Assistant options are preselected +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGSLIDEBUILDER::T1549358578"] = "Slide Planner Assistant options are preselected" + +-- No Slide Planner Assistant options are preselected +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGSLIDEBUILDER::T1694374279"] = "No Slide Planner Assistant options are preselected" + -- Choose whether the assistant should use the app default profile, no profile, or a specific profile. UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGSLIDEBUILDER::T1766361623"] = "Choose whether the assistant should use the app default profile, no profile, or a specific profile." @@ -4705,9 +4711,6 @@ UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGSLIDEBUILDER::T20146 -- Which audience organizational level should be preselected? UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGSLIDEBUILDER::T216511105"] = "Which audience organizational level should be preselected?" --- Preselect Slide Planner Assistant options? -UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGSLIDEBUILDER::T227645894"] = "Preselect Slide Planner Assistant options?" - -- Preselect a profile UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGSLIDEBUILDER::T2322771068"] = "Preselect a profile" @@ -4724,26 +4727,23 @@ UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGSLIDEBUILDER::T25714 UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGSLIDEBUILDER::T2645589441"] = "Preselect the audience age group" -- Assistant: Slide Planner Assistant Options -UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGSLIDEBUILDER::T3215549988"] = "Assistant: Slide Planner Assistant Options" +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGSLIDEBUILDER::T3226042276"] = "Assistant: Slide Planner Assistant Options" -- Which audience expertise should be preselected? UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGSLIDEBUILDER::T3228597992"] = "Which audience expertise should be preselected?" +-- Preselect Slide Planner Assistant options? +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGSLIDEBUILDER::T339924858"] = "Preselect Slide Planner Assistant options?" + -- Close UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGSLIDEBUILDER::T3448155331"] = "Close" -- Preselect important aspects UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGSLIDEBUILDER::T3705987833"] = "Preselect important aspects" --- No Slide Planner Assistant options are preselected -UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGSLIDEBUILDER::T4214398691"] = "No Slide Planner Assistant options are preselected" - -- Preselect the audience profile UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGSLIDEBUILDER::T861397972"] = "Preselect the audience profile" --- Slide Planner Assistant options are preselected -UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGSLIDEBUILDER::T93124146"] = "Slide Planner Assistant options are preselected" - -- Which audience age group should be preselected? UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGSLIDEBUILDER::T956845877"] = "Which audience age group should be preselected?" diff --git a/app/MindWork AI Studio/Components/ChatComponent.razor.cs b/app/MindWork AI Studio/Components/ChatComponent.razor.cs index f734d620..a11adcc9 100644 --- a/app/MindWork AI Studio/Components/ChatComponent.razor.cs +++ b/app/MindWork AI Studio/Components/ChatComponent.razor.cs @@ -873,22 +873,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);