diff --git a/app/MindWork AI Studio/Assistants/Agenda/AssistantAgenda.razor.cs b/app/MindWork AI Studio/Assistants/Agenda/AssistantAgenda.razor.cs index 6d955286..74104434 100644 --- a/app/MindWork AI Studio/Assistants/Agenda/AssistantAgenda.razor.cs +++ b/app/MindWork AI Studio/Assistants/Agenda/AssistantAgenda.razor.cs @@ -6,6 +6,8 @@ namespace AIStudio.Assistants.Agenda; public partial class AssistantAgenda : AssistantBaseCore { + protected override Tools.Components Component => Tools.Components.AGENDA_ASSISTANT; + protected override string Title => "Agenda Planner"; protected override string Description => @@ -158,7 +160,6 @@ public partial class AssistantAgenda : AssistantBaseCore this.durationBreaks = this.SettingsManager.ConfigurationData.Agenda.PreselectBreakTime; this.activeParticipation = this.SettingsManager.ConfigurationData.Agenda.PreselectActiveParticipation; this.numberParticipants = this.SettingsManager.ConfigurationData.Agenda.PreselectNumberParticipants; - this.providerSettings = this.SettingsManager.ConfigurationData.Providers.FirstOrDefault(x => x.Id == this.SettingsManager.ConfigurationData.Agenda.PreselectedProvider); return true; } @@ -194,7 +195,6 @@ public partial class AssistantAgenda : AssistantBaseCore protected override async Task OnInitializedAsync() { - this.MightPreselectValues(); var deferredContent = MessageBus.INSTANCE.CheckDeferredMessages(Event.SEND_TO_AGENDA_ASSISTANT).FirstOrDefault(); if (deferredContent is not null) this.inputContent = deferredContent; diff --git a/app/MindWork AI Studio/Assistants/AssistantBase.razor.cs b/app/MindWork AI Studio/Assistants/AssistantBase.razor.cs index a038ebec..9608b1cc 100644 --- a/app/MindWork AI Studio/Assistants/AssistantBase.razor.cs +++ b/app/MindWork AI Studio/Assistants/AssistantBase.razor.cs @@ -40,6 +40,8 @@ public abstract partial class AssistantBase : ComponentBase protected abstract string SystemPrompt { get; } + protected abstract Tools.Components Component { get; } + protected virtual Func Result2Copy => () => this.resultingContentBlock is null ? string.Empty : this.resultingContentBlock.Content switch { ContentText textBlock => textBlock.Text, @@ -73,6 +75,13 @@ public abstract partial class AssistantBase : ComponentBase #region Overrides of ComponentBase + protected override async Task OnInitializedAsync() + { + this.MightPreselectValues(); + this.providerSettings = this.SettingsManager.GetPreselectedProvider(this.Component); + await base.OnInitializedAsync(); + } + protected override async Task OnParametersSetAsync() { // Configure the spellchecking for the user input: @@ -214,6 +223,7 @@ public abstract partial class AssistantBase : ComponentBase await this.JsRuntime.ClearDiv(AFTER_RESULT_DIV_ID); this.ResetFrom(); + this.providerSettings = this.SettingsManager.GetPreselectedProvider(this.Component); this.inputIsValid = false; this.inputIssues = []; diff --git a/app/MindWork AI Studio/Assistants/Coding/AssistantCoding.razor.cs b/app/MindWork AI Studio/Assistants/Coding/AssistantCoding.razor.cs index fb47f16a..8a307e22 100644 --- a/app/MindWork AI Studio/Assistants/Coding/AssistantCoding.razor.cs +++ b/app/MindWork AI Studio/Assistants/Coding/AssistantCoding.razor.cs @@ -4,6 +4,8 @@ namespace AIStudio.Assistants.Coding; public partial class AssistantCoding : AssistantBaseCore { + protected override Tools.Components Component => Tools.Components.CODING_ASSISTANT; + protected override string Title => "Coding Assistant"; protected override string Description => @@ -48,7 +50,6 @@ public partial class AssistantCoding : AssistantBaseCore if (this.SettingsManager.ConfigurationData.Coding.PreselectOptions) { this.provideCompilerMessages = this.SettingsManager.ConfigurationData.Coding.PreselectCompilerMessages; - this.providerSettings = this.SettingsManager.ConfigurationData.Providers.FirstOrDefault(x => x.Id == this.SettingsManager.ConfigurationData.Coding.PreselectedProvider); return true; } @@ -64,7 +65,6 @@ public partial class AssistantCoding : AssistantBaseCore protected override async Task OnInitializedAsync() { - this.MightPreselectValues(); var deferredContent = MessageBus.INSTANCE.CheckDeferredMessages(Event.SEND_TO_CODING_ASSISTANT).FirstOrDefault(); if (deferredContent is not null) this.questions = deferredContent; diff --git a/app/MindWork AI Studio/Assistants/EMail/AssistantEMail.razor.cs b/app/MindWork AI Studio/Assistants/EMail/AssistantEMail.razor.cs index 22a402fd..5e987d0c 100644 --- a/app/MindWork AI Studio/Assistants/EMail/AssistantEMail.razor.cs +++ b/app/MindWork AI Studio/Assistants/EMail/AssistantEMail.razor.cs @@ -6,6 +6,8 @@ namespace AIStudio.Assistants.EMail; public partial class AssistantEMail : AssistantBaseCore { + protected override Tools.Components Component => Tools.Components.EMAIL_ASSISTANT; + protected override string Title => "E-Mail"; protected override string Description => @@ -59,7 +61,6 @@ public partial class AssistantEMail : AssistantBaseCore this.selectedWritingStyle = this.SettingsManager.ConfigurationData.EMail.PreselectedWritingStyle; this.selectedTargetLanguage = this.SettingsManager.ConfigurationData.EMail.PreselectedTargetLanguage; this.customTargetLanguage = this.SettingsManager.ConfigurationData.EMail.PreselectOtherLanguage; - this.providerSettings = this.SettingsManager.ConfigurationData.Providers.FirstOrDefault(x => x.Id == this.SettingsManager.ConfigurationData.EMail.PreselectedProvider); return true; } @@ -88,7 +89,6 @@ public partial class AssistantEMail : AssistantBaseCore protected override async Task OnInitializedAsync() { - this.MightPreselectValues(); var deferredContent = MessageBus.INSTANCE.CheckDeferredMessages(Event.SEND_TO_EMAIL_ASSISTANT).FirstOrDefault(); if (deferredContent is not null) this.inputBulletPoints = deferredContent; diff --git a/app/MindWork AI Studio/Assistants/GrammarSpelling/AssistantGrammarSpelling.razor.cs b/app/MindWork AI Studio/Assistants/GrammarSpelling/AssistantGrammarSpelling.razor.cs index 3b6c75ff..f0dd044f 100644 --- a/app/MindWork AI Studio/Assistants/GrammarSpelling/AssistantGrammarSpelling.razor.cs +++ b/app/MindWork AI Studio/Assistants/GrammarSpelling/AssistantGrammarSpelling.razor.cs @@ -4,6 +4,8 @@ namespace AIStudio.Assistants.GrammarSpelling; public partial class AssistantGrammarSpelling : AssistantBaseCore { + protected override Tools.Components Component => Tools.Components.GRAMMAR_SPELLING_ASSISTANT; + protected override string Title => "Grammar & Spelling Checker"; protected override string Description => @@ -59,7 +61,6 @@ public partial class AssistantGrammarSpelling : AssistantBaseCore { this.selectedTargetLanguage = this.SettingsManager.ConfigurationData.GrammarSpelling.PreselectedTargetLanguage; this.customTargetLanguage = this.SettingsManager.ConfigurationData.GrammarSpelling.PreselectedOtherLanguage; - this.providerSettings = this.SettingsManager.ConfigurationData.Providers.FirstOrDefault(x => x.Id == this.SettingsManager.ConfigurationData.GrammarSpelling.PreselectedProvider); return true; } @@ -70,7 +71,6 @@ public partial class AssistantGrammarSpelling : AssistantBaseCore protected override async Task OnInitializedAsync() { - this.MightPreselectValues(); var deferredContent = MessageBus.INSTANCE.CheckDeferredMessages(Event.SEND_TO_GRAMMAR_SPELLING_ASSISTANT).FirstOrDefault(); if (deferredContent is not null) this.inputText = deferredContent; diff --git a/app/MindWork AI Studio/Assistants/IconFinder/AssistantIconFinder.razor.cs b/app/MindWork AI Studio/Assistants/IconFinder/AssistantIconFinder.razor.cs index ff5c866f..8c85d8bf 100644 --- a/app/MindWork AI Studio/Assistants/IconFinder/AssistantIconFinder.razor.cs +++ b/app/MindWork AI Studio/Assistants/IconFinder/AssistantIconFinder.razor.cs @@ -2,8 +2,7 @@ namespace AIStudio.Assistants.IconFinder; public partial class AssistantIconFinder : AssistantBaseCore { - private string inputContext = string.Empty; - private IconSources selectedIconSource; + protected override Tools.Components Component => Tools.Components.ICON_FINDER_ASSISTANT; protected override string Title => "Icon Finder"; @@ -48,18 +47,19 @@ public partial class AssistantIconFinder : AssistantBaseCore if (this.SettingsManager.ConfigurationData.IconFinder.PreselectOptions) { this.selectedIconSource = this.SettingsManager.ConfigurationData.IconFinder.PreselectedSource; - this.providerSettings = this.SettingsManager.ConfigurationData.Providers.FirstOrDefault(x => x.Id == this.SettingsManager.ConfigurationData.IconFinder.PreselectedProvider); return true; } return false; } + private string inputContext = string.Empty; + private IconSources selectedIconSource; + #region Overrides of ComponentBase protected override async Task OnInitializedAsync() { - this.MightPreselectValues(); var deferredContent = MessageBus.INSTANCE.CheckDeferredMessages(Event.SEND_TO_ICON_FINDER_ASSISTANT).FirstOrDefault(); if (deferredContent is not null) this.inputContext = deferredContent; diff --git a/app/MindWork AI Studio/Assistants/LegalCheck/AssistantLegalCheck.razor.cs b/app/MindWork AI Studio/Assistants/LegalCheck/AssistantLegalCheck.razor.cs index fd3bd418..2f3062f6 100644 --- a/app/MindWork AI Studio/Assistants/LegalCheck/AssistantLegalCheck.razor.cs +++ b/app/MindWork AI Studio/Assistants/LegalCheck/AssistantLegalCheck.razor.cs @@ -2,6 +2,8 @@ namespace AIStudio.Assistants.LegalCheck; public partial class AssistantLegalCheck : AssistantBaseCore { + protected override Tools.Components Component => Tools.Components.LEGAL_CHECK_ASSISTANT; + protected override string Title => "Legal Check"; protected override string Description => @@ -35,17 +37,8 @@ public partial class AssistantLegalCheck : AssistantBaseCore this.MightPreselectValues(); } - protected override bool MightPreselectValues() - { - if (this.SettingsManager.ConfigurationData.LegalCheck.PreselectOptions) - { - this.providerSettings = this.SettingsManager.ConfigurationData.Providers.FirstOrDefault(x => x.Id == this.SettingsManager.ConfigurationData.LegalCheck.PreselectedProvider); - return true; - } - - return false; - } - + protected override bool MightPreselectValues() => false; + private bool isAgentRunning; private string inputLegalDocument = string.Empty; private string inputQuestions = string.Empty; @@ -54,7 +47,6 @@ public partial class AssistantLegalCheck : AssistantBaseCore protected override async Task OnInitializedAsync() { - this.MightPreselectValues(); var deferredContent = MessageBus.INSTANCE.CheckDeferredMessages(Event.SEND_TO_LEGAL_CHECK_ASSISTANT).FirstOrDefault(); if (deferredContent is not null) this.inputQuestions = deferredContent; diff --git a/app/MindWork AI Studio/Assistants/RewriteImprove/AssistantRewriteImprove.razor.cs b/app/MindWork AI Studio/Assistants/RewriteImprove/AssistantRewriteImprove.razor.cs index b8695000..a7ada742 100644 --- a/app/MindWork AI Studio/Assistants/RewriteImprove/AssistantRewriteImprove.razor.cs +++ b/app/MindWork AI Studio/Assistants/RewriteImprove/AssistantRewriteImprove.razor.cs @@ -4,6 +4,8 @@ namespace AIStudio.Assistants.RewriteImprove; public partial class AssistantRewriteImprove : AssistantBaseCore { + protected override Tools.Components Component => Tools.Components.REWRITE_ASSISTANT; + protected override string Title => "Rewrite & Improve Text"; protected override string Description => @@ -62,7 +64,6 @@ public partial class AssistantRewriteImprove : AssistantBaseCore { this.selectedTargetLanguage = this.SettingsManager.ConfigurationData.RewriteImprove.PreselectedTargetLanguage; this.customTargetLanguage = this.SettingsManager.ConfigurationData.RewriteImprove.PreselectedOtherLanguage; - this.providerSettings = this.SettingsManager.ConfigurationData.Providers.FirstOrDefault(x => x.Id == this.SettingsManager.ConfigurationData.RewriteImprove.PreselectedProvider); this.selectedWritingStyle = this.SettingsManager.ConfigurationData.RewriteImprove.PreselectedWritingStyle; this.selectedSentenceStructure = this.SettingsManager.ConfigurationData.RewriteImprove.PreselectedSentenceStructure; return true; @@ -75,7 +76,6 @@ public partial class AssistantRewriteImprove : AssistantBaseCore protected override async Task OnInitializedAsync() { - this.MightPreselectValues(); var deferredContent = MessageBus.INSTANCE.CheckDeferredMessages(Event.SEND_TO_REWRITE_ASSISTANT).FirstOrDefault(); if (deferredContent is not null) this.inputText = deferredContent; diff --git a/app/MindWork AI Studio/Assistants/TextSummarizer/AssistantTextSummarizer.razor.cs b/app/MindWork AI Studio/Assistants/TextSummarizer/AssistantTextSummarizer.razor.cs index 6d0f1977..4196efc1 100644 --- a/app/MindWork AI Studio/Assistants/TextSummarizer/AssistantTextSummarizer.razor.cs +++ b/app/MindWork AI Studio/Assistants/TextSummarizer/AssistantTextSummarizer.razor.cs @@ -4,6 +4,8 @@ namespace AIStudio.Assistants.TextSummarizer; public partial class AssistantTextSummarizer : AssistantBaseCore { + protected override Tools.Components Component => Tools.Components.TEXT_SUMMARIZER_ASSISTANT; + protected override string Title => "Text Summarizer"; protected override string Description => @@ -56,7 +58,6 @@ public partial class AssistantTextSummarizer : AssistantBaseCore this.customTargetLanguage = this.SettingsManager.ConfigurationData.TextSummarizer.PreselectedOtherLanguage; this.selectedComplexity = this.SettingsManager.ConfigurationData.TextSummarizer.PreselectedComplexity; this.expertInField = this.SettingsManager.ConfigurationData.TextSummarizer.PreselectedExpertInField; - this.providerSettings = this.SettingsManager.ConfigurationData.Providers.FirstOrDefault(x => x.Id == this.SettingsManager.ConfigurationData.TextSummarizer.PreselectedProvider); return true; } @@ -74,7 +75,6 @@ public partial class AssistantTextSummarizer : AssistantBaseCore protected override async Task OnInitializedAsync() { - this.MightPreselectValues(); var deferredContent = MessageBus.INSTANCE.CheckDeferredMessages(Event.SEND_TO_TEXT_SUMMARIZER_ASSISTANT).FirstOrDefault(); if (deferredContent is not null) this.inputText = deferredContent; diff --git a/app/MindWork AI Studio/Assistants/Translation/AssistantTranslation.razor.cs b/app/MindWork AI Studio/Assistants/Translation/AssistantTranslation.razor.cs index f9df32ce..e894842d 100644 --- a/app/MindWork AI Studio/Assistants/Translation/AssistantTranslation.razor.cs +++ b/app/MindWork AI Studio/Assistants/Translation/AssistantTranslation.razor.cs @@ -4,6 +4,8 @@ namespace AIStudio.Assistants.Translation; public partial class AssistantTranslation : AssistantBaseCore { + protected override Tools.Components Component => Tools.Components.TRANSLATION_ASSISTANT; + protected override string Title => "Translation"; protected override string Description => @@ -51,7 +53,6 @@ public partial class AssistantTranslation : AssistantBaseCore this.liveTranslation = this.SettingsManager.ConfigurationData.Translation.PreselectLiveTranslation; this.selectedTargetLanguage = this.SettingsManager.ConfigurationData.Translation.PreselectedTargetLanguage; this.customTargetLanguage = this.SettingsManager.ConfigurationData.Translation.PreselectOtherLanguage; - this.providerSettings = this.SettingsManager.ConfigurationData.Providers.FirstOrDefault(x => x.Id == this.SettingsManager.ConfigurationData.Translation.PreselectedProvider); return true; } @@ -69,7 +70,6 @@ public partial class AssistantTranslation : AssistantBaseCore protected override async Task OnInitializedAsync() { - this.MightPreselectValues(); var deferredContent = MessageBus.INSTANCE.CheckDeferredMessages(Event.SEND_TO_TRANSLATION_ASSISTANT).FirstOrDefault(); if (deferredContent is not null) this.inputText = deferredContent; diff --git a/app/MindWork AI Studio/Components/ConfigurationProviderSelection.razor b/app/MindWork AI Studio/Components/ConfigurationProviderSelection.razor index 45e64119..2dc5bf8e 100644 --- a/app/MindWork AI Studio/Components/ConfigurationProviderSelection.razor +++ b/app/MindWork AI Studio/Components/ConfigurationProviderSelection.razor @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/app/MindWork AI Studio/Components/ConfigurationProviderSelection.razor.cs b/app/MindWork AI Studio/Components/ConfigurationProviderSelection.razor.cs index 5c0ca716..87889b02 100644 --- a/app/MindWork AI Studio/Components/ConfigurationProviderSelection.razor.cs +++ b/app/MindWork AI Studio/Components/ConfigurationProviderSelection.razor.cs @@ -21,6 +21,9 @@ public partial class ConfigurationProviderSelection : ComponentBase, IMessageBus [Parameter] public Func Disabled { get; set; } = () => false; + [Parameter] + public Func HelpText { get; set; } = () => "Select a provider that is preselected."; + [Inject] private SettingsManager SettingsManager { get; init; } = null!; diff --git a/app/MindWork AI Studio/Pages/Chat.razor.cs b/app/MindWork AI Studio/Pages/Chat.razor.cs index e277c79c..de06016c 100644 --- a/app/MindWork AI Studio/Pages/Chat.razor.cs +++ b/app/MindWork AI Studio/Pages/Chat.razor.cs @@ -59,11 +59,7 @@ public partial class Chat : MSGComponentBase, IAsyncDisposable // Configure the spellchecking for the user input: this.SettingsManager.InjectSpellchecking(USER_INPUT_ATTRIBUTES); - if (this.SettingsManager.ConfigurationData.Chat.PreselectOptions) - { - this.providerSettings = this.SettingsManager.ConfigurationData.Providers.FirstOrDefault(x => x.Id == this.SettingsManager.ConfigurationData.Chat.PreselectedProvider); - } - + this.providerSettings = this.SettingsManager.GetPreselectedProvider(Tools.Components.CHAT); var deferredContent = MessageBus.INSTANCE.CheckDeferredMessages(Event.SEND_TO_CHAT).FirstOrDefault(); if (deferredContent is not null) { diff --git a/app/MindWork AI Studio/Pages/Settings.razor b/app/MindWork AI Studio/Pages/Settings.razor index e7c94ddd..4bac33ea 100644 --- a/app/MindWork AI Studio/Pages/Settings.razor +++ b/app/MindWork AI Studio/Pages/Settings.razor @@ -73,6 +73,7 @@ + diff --git a/app/MindWork AI Studio/Settings/DataModel/DataApp.cs b/app/MindWork AI Studio/Settings/DataModel/DataApp.cs index 8860f10c..55b9e93f 100644 --- a/app/MindWork AI Studio/Settings/DataModel/DataApp.cs +++ b/app/MindWork AI Studio/Settings/DataModel/DataApp.cs @@ -22,4 +22,9 @@ public sealed class DataApp /// The navigation behavior. /// public NavBehavior NavigationBehavior { get; set; } = NavBehavior.NEVER_EXPAND_USE_TOOLTIPS; + + /// + /// Should we preselect a provider for the entire app? + /// + public string PreselectedProvider { get; set; } = string.Empty; } \ No newline at end of file diff --git a/app/MindWork AI Studio/Settings/SettingsManager.cs b/app/MindWork AI Studio/Settings/SettingsManager.cs index 5f647460..a965b377 100644 --- a/app/MindWork AI Studio/Settings/SettingsManager.cs +++ b/app/MindWork AI Studio/Settings/SettingsManager.cs @@ -110,4 +110,31 @@ public sealed class SettingsManager(ILogger logger) } public void InjectSpellchecking(Dictionary attributes) => attributes["spellcheck"] = this.ConfigurationData.App.EnableSpellchecking ? "true" : "false"; + + public Provider GetPreselectedProvider(Tools.Components component) + { + if(this.ConfigurationData.Providers.Count == 1) + return this.ConfigurationData.Providers[0]; + + var preselection = component switch + { + Tools.Components.CHAT => this.ConfigurationData.Chat.PreselectOptions ? this.ConfigurationData.Providers.FirstOrDefault(x => x.Id == this.ConfigurationData.Chat.PreselectedProvider) : default, + Tools.Components.GRAMMAR_SPELLING_ASSISTANT => this.ConfigurationData.GrammarSpelling.PreselectOptions ? this.ConfigurationData.Providers.FirstOrDefault(x => x.Id == this.ConfigurationData.GrammarSpelling.PreselectedProvider) : default, + Tools.Components.ICON_FINDER_ASSISTANT => this.ConfigurationData.IconFinder.PreselectOptions ? this.ConfigurationData.Providers.FirstOrDefault(x => x.Id == this.ConfigurationData.IconFinder.PreselectedProvider) : default, + Tools.Components.REWRITE_ASSISTANT => this.ConfigurationData.RewriteImprove.PreselectOptions ? this.ConfigurationData.Providers.FirstOrDefault(x => x.Id == this.ConfigurationData.RewriteImprove.PreselectedProvider) : default, + Tools.Components.TRANSLATION_ASSISTANT => this.ConfigurationData.Translation.PreselectOptions ? this.ConfigurationData.Providers.FirstOrDefault(x => x.Id == this.ConfigurationData.Translation.PreselectedProvider) : default, + Tools.Components.AGENDA_ASSISTANT => this.ConfigurationData.Agenda.PreselectOptions ? this.ConfigurationData.Providers.FirstOrDefault(x => x.Id == this.ConfigurationData.Agenda.PreselectedProvider) : default, + Tools.Components.CODING_ASSISTANT => this.ConfigurationData.Coding.PreselectOptions ? this.ConfigurationData.Providers.FirstOrDefault(x => x.Id == this.ConfigurationData.Coding.PreselectedProvider) : default, + Tools.Components.TEXT_SUMMARIZER_ASSISTANT => this.ConfigurationData.TextSummarizer.PreselectOptions ? this.ConfigurationData.Providers.FirstOrDefault(x => x.Id == this.ConfigurationData.TextSummarizer.PreselectedProvider) : default, + Tools.Components.EMAIL_ASSISTANT => this.ConfigurationData.EMail.PreselectOptions ? this.ConfigurationData.Providers.FirstOrDefault(x => x.Id == this.ConfigurationData.EMail.PreselectedProvider) : default, + Tools.Components.LEGAL_CHECK_ASSISTANT => this.ConfigurationData.LegalCheck.PreselectOptions ? this.ConfigurationData.Providers.FirstOrDefault(x => x.Id == this.ConfigurationData.LegalCheck.PreselectedProvider) : default, + + _ => default, + }; + + if (preselection != default) + return preselection; + + return this.ConfigurationData.Providers.FirstOrDefault(x => x.Id == this.ConfigurationData.App.PreselectedProvider); + } } \ No newline at end of file diff --git a/app/MindWork AI Studio/wwwroot/changelog/v0.9.1.md b/app/MindWork AI Studio/wwwroot/changelog/v0.9.1.md new file mode 100644 index 00000000..38a72c03 --- /dev/null +++ b/app/MindWork AI Studio/wwwroot/changelog/v0.9.1.md @@ -0,0 +1,4 @@ +# v0.9.1, build 176 +- Added app option to specify a default provider for the entire app. +- Improved provider selection: when there is only one provider available, it is now preselected everywhere. +- Fixed preselection of e-mail assistant options: under some circumstances, the e-mail assistant options were not preselected correctly. \ No newline at end of file