From b69fa215f876b8c3a88eeb39f6ae79a040ae2d53 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Peer=20Sch=C3=BCtt?= <20603780+peerschuett@users.noreply.github.com> Date: Fri, 20 Mar 2026 16:41:25 +0100 Subject: [PATCH] Working on the prototype for PromptOptimizer --- .../AssistantPromptOptimizer.razor | 74 +++++++++------- .../AssistantPromptOptimizer.razor.cs | 86 +++++++++++++------ .../SettingsDialogPromptOptimizer.razor | 29 +++++++ .../SettingsDialogPromptOptimizer.razor.cs | 3 + app/MindWork AI Studio/Pages/Assistants.razor | 2 +- .../Settings/DataModel/Data.cs | 4 +- .../Settings/DataModel/DataPromptOptimizer.cs | 36 ++++++++ .../Tools/ComponentsExtensions.cs | 2 + 8 files changed, 178 insertions(+), 58 deletions(-) create mode 100644 app/MindWork AI Studio/Dialogs/Settings/SettingsDialogPromptOptimizer.razor create mode 100644 app/MindWork AI Studio/Dialogs/Settings/SettingsDialogPromptOptimizer.razor.cs create mode 100644 app/MindWork AI Studio/Settings/DataModel/DataPromptOptimizer.cs diff --git a/app/MindWork AI Studio/Assistants/PromptOptimizer/AssistantPromptOptimizer.razor b/app/MindWork AI Studio/Assistants/PromptOptimizer/AssistantPromptOptimizer.razor index 615266e0..f8e7ed23 100644 --- a/app/MindWork AI Studio/Assistants/PromptOptimizer/AssistantPromptOptimizer.razor +++ b/app/MindWork AI Studio/Assistants/PromptOptimizer/AssistantPromptOptimizer.razor @@ -1,5 +1,5 @@ @attribute [Route(Routes.ASSISTANT_PROMPT_OPTIMIZER)] -@inherits AssistantBaseCore +@inherits AssistantBaseCore + + + + + + @T("Prompt Recommendations") + @if (this.ShowUpdatedPromptGuidelinesIndicator) + { + + + + } + @if (!this.useCustomPromptGuide) { + @T("Use these recommendations, that are based on our own prompt guide, to improve the clarity, directness, and relevance of your prompts. The suggestions are updated based on your latest prompt optimization.") + - + - + - + - + - + - + } @@ -64,7 +98,7 @@ - - - - - diff --git a/app/MindWork AI Studio/Assistants/PromptOptimizer/AssistantPromptOptimizer.razor.cs b/app/MindWork AI Studio/Assistants/PromptOptimizer/AssistantPromptOptimizer.razor.cs index 8b8b0b2f..a9f9c092 100644 --- a/app/MindWork AI Studio/Assistants/PromptOptimizer/AssistantPromptOptimizer.razor.cs +++ b/app/MindWork AI Studio/Assistants/PromptOptimizer/AssistantPromptOptimizer.razor.cs @@ -13,7 +13,7 @@ using Microsoft.Extensions.FileProviders; namespace AIStudio.Assistants.PromptOptimizer; -public partial class AssistantPromptOptimizer : AssistantBaseCore +public partial class AssistantPromptOptimizer : AssistantBaseCore { private static readonly Regex JSON_CODE_FENCE_REGEX = new( pattern: """```(?:json)?\s*(?\{[\s\S]*\})\s*```""", @@ -31,7 +31,7 @@ public partial class AssistantPromptOptimizer : AssistantBaseCore T("Prompt Optimizer"); - protected override string Description => T("Optimize a prompt using your prompt guideline and get targeted recommendations for future versions."); + protected override string Description => T("Optimize a prompt using either the default or your individual prompt guideline and get targeted recommendations for future versions of the prompt."); protected override string SystemPrompt => """ @@ -70,22 +70,37 @@ public partial class AssistantPromptOptimizer : AssistantBaseCore false; + protected override bool MightPreselectValues() + { + if (!this.SettingsManager.ConfigurationData.PromptOptimizer.PreselectOptions) + return false; + + this.selectedTargetLanguage = this.SettingsManager.ConfigurationData.PromptOptimizer.PreselectedTargetLanguage; + this.customTargetLanguage = this.SettingsManager.ConfigurationData.PromptOptimizer.PreselectedOtherLanguage; + this.importantAspects = this.SettingsManager.ConfigurationData.PromptOptimizer.PreselectedImportantAspects; + return true; + } protected override async Task OnInitializedAsync() { this.ResetGuidelineSummaryToDefault(); + this.hasUpdatedDefaultRecommendations = false; var deferredContent = MessageBus.INSTANCE.CheckDeferredMessages(Event.SEND_TO_PROMPT_OPTIMIZER_ASSISTANT).FirstOrDefault(); if (deferredContent is not null) @@ -95,7 +110,7 @@ public partial class AssistantPromptOptimizer : AssistantBaseCore !string.IsNullOrWhiteSpace(this.optimizedPrompt); + private bool ShowUpdatedPromptGuidelinesIndicator => !this.useCustomPromptGuide && this.hasUpdatedDefaultRecommendations; private bool CanPreviewCustomPromptGuide => this.useCustomPromptGuide && this.customPromptGuideFiles.Count > 0; private string CustomPromptGuideFileName => this.customPromptGuideFiles.Count switch { @@ -159,6 +175,7 @@ public partial class AssistantPromptOptimizer : AssistantBaseCore !string.Equals(file.FilePath, this.currentCustomPromptGuidePath, StringComparison.OrdinalIgnoreCase)) ?? files.First(); + var replacedPrevious = !string.IsNullOrWhiteSpace(this.currentCustomPromptGuidePath) && + !string.Equals(this.currentCustomPromptGuidePath, selected.FilePath, StringComparison.OrdinalIgnoreCase); + this.customPromptGuideFiles = [ selected ]; this.currentCustomPromptGuidePath = selected.FilePath; - if (files.Count > 1) + if (files.Count > 1 || replacedPrevious) this.Snackbar.Add(T("Replaced the previously selected custom prompt guide file."), Severity.Info); await this.LoadCustomPromptGuidelineContentAsync(selected); diff --git a/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogPromptOptimizer.razor b/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogPromptOptimizer.razor new file mode 100644 index 00000000..e34028f5 --- /dev/null +++ b/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogPromptOptimizer.razor @@ -0,0 +1,29 @@ +@using AIStudio.Settings +@inherits SettingsDialogBase + + + + + + @T("Assistant: Prompt Optimizer Options") + + + + + + + @if (this.SettingsManager.ConfigurationData.PromptOptimizer.PreselectedTargetLanguage is CommonLanguages.OTHER) + { + + } + + + + + + + + @T("Close") + + + diff --git a/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogPromptOptimizer.razor.cs b/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogPromptOptimizer.razor.cs new file mode 100644 index 00000000..c12ec0c3 --- /dev/null +++ b/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogPromptOptimizer.razor.cs @@ -0,0 +1,3 @@ +namespace AIStudio.Dialogs.Settings; + +public partial class SettingsDialogPromptOptimizer : SettingsDialogBase; diff --git a/app/MindWork AI Studio/Pages/Assistants.razor b/app/MindWork AI Studio/Pages/Assistants.razor index 3a05b19c..dcfb5752 100644 --- a/app/MindWork AI Studio/Pages/Assistants.razor +++ b/app/MindWork AI Studio/Pages/Assistants.razor @@ -27,7 +27,7 @@ - + } diff --git a/app/MindWork AI Studio/Settings/DataModel/Data.cs b/app/MindWork AI Studio/Settings/DataModel/Data.cs index 0013fe92..3bc52668 100644 --- a/app/MindWork AI Studio/Settings/DataModel/Data.cs +++ b/app/MindWork AI Studio/Settings/DataModel/Data.cs @@ -115,6 +115,8 @@ public sealed class Data public DataGrammarSpelling GrammarSpelling { get; init; } = new(); public DataRewriteImprove RewriteImprove { get; init; } = new(); + + public DataPromptOptimizer PromptOptimizer { get; init; } = new(); public DataEMail EMail { get; init; } = new(); @@ -131,4 +133,4 @@ public sealed class Data public DataBiasOfTheDay BiasOfTheDay { get; init; } = new(); public DataI18N I18N { get; init; } = new(); -} \ No newline at end of file +} diff --git a/app/MindWork AI Studio/Settings/DataModel/DataPromptOptimizer.cs b/app/MindWork AI Studio/Settings/DataModel/DataPromptOptimizer.cs new file mode 100644 index 00000000..3495393a --- /dev/null +++ b/app/MindWork AI Studio/Settings/DataModel/DataPromptOptimizer.cs @@ -0,0 +1,36 @@ +using AIStudio.Provider; + +namespace AIStudio.Settings.DataModel; + +public sealed class DataPromptOptimizer +{ + /// + /// Preselect prompt optimizer options? + /// + public bool PreselectOptions { get; set; } + + /// + /// Preselect the target language? + /// + public CommonLanguages PreselectedTargetLanguage { get; set; } = CommonLanguages.AS_IS; + + /// + /// Preselect a custom target language when "Other" is selected? + /// + public string PreselectedOtherLanguage { get; set; } = string.Empty; + + /// + /// Preselect important aspects for the optimization. + /// + public string PreselectedImportantAspects { get; set; } = string.Empty; + + /// + /// The minimum confidence level required for a provider to be considered. + /// + public ConfidenceLevel MinimumProviderConfidence { get; set; } = ConfidenceLevel.NONE; + + /// + /// Preselect a provider? + /// + public string PreselectedProvider { get; set; } = string.Empty; +} diff --git a/app/MindWork AI Studio/Tools/ComponentsExtensions.cs b/app/MindWork AI Studio/Tools/ComponentsExtensions.cs index dfbae19f..45167161 100644 --- a/app/MindWork AI Studio/Tools/ComponentsExtensions.cs +++ b/app/MindWork AI Studio/Tools/ComponentsExtensions.cs @@ -81,6 +81,7 @@ public static class ComponentsExtensions Components.GRAMMAR_SPELLING_ASSISTANT => settingsManager.ConfigurationData.GrammarSpelling.PreselectOptions ? settingsManager.ConfigurationData.GrammarSpelling.MinimumProviderConfidence : default, Components.ICON_FINDER_ASSISTANT => settingsManager.ConfigurationData.IconFinder.PreselectOptions ? settingsManager.ConfigurationData.IconFinder.MinimumProviderConfidence : default, Components.REWRITE_ASSISTANT => settingsManager.ConfigurationData.RewriteImprove.PreselectOptions ? settingsManager.ConfigurationData.RewriteImprove.MinimumProviderConfidence : default, + Components.PROMPT_OPTIMIZER_ASSISTANT => settingsManager.ConfigurationData.PromptOptimizer.PreselectOptions ? settingsManager.ConfigurationData.PromptOptimizer.MinimumProviderConfidence : default, Components.TRANSLATION_ASSISTANT => settingsManager.ConfigurationData.Translation.PreselectOptions ? settingsManager.ConfigurationData.Translation.MinimumProviderConfidence : default, Components.AGENDA_ASSISTANT => settingsManager.ConfigurationData.Agenda.PreselectOptions ? settingsManager.ConfigurationData.Agenda.MinimumProviderConfidence : default, Components.CODING_ASSISTANT => settingsManager.ConfigurationData.Coding.PreselectOptions ? settingsManager.ConfigurationData.Coding.MinimumProviderConfidence : default, @@ -109,6 +110,7 @@ public static class ComponentsExtensions Components.GRAMMAR_SPELLING_ASSISTANT => settingsManager.ConfigurationData.GrammarSpelling.PreselectOptions ? settingsManager.ConfigurationData.Providers.FirstOrDefault(x => x.Id == settingsManager.ConfigurationData.GrammarSpelling.PreselectedProvider) : null, Components.ICON_FINDER_ASSISTANT => settingsManager.ConfigurationData.IconFinder.PreselectOptions ? settingsManager.ConfigurationData.Providers.FirstOrDefault(x => x.Id == settingsManager.ConfigurationData.IconFinder.PreselectedProvider) : null, Components.REWRITE_ASSISTANT => settingsManager.ConfigurationData.RewriteImprove.PreselectOptions ? settingsManager.ConfigurationData.Providers.FirstOrDefault(x => x.Id == settingsManager.ConfigurationData.RewriteImprove.PreselectedProvider) : null, + Components.PROMPT_OPTIMIZER_ASSISTANT => settingsManager.ConfigurationData.PromptOptimizer.PreselectOptions ? settingsManager.ConfigurationData.Providers.FirstOrDefault(x => x.Id == settingsManager.ConfigurationData.PromptOptimizer.PreselectedProvider) : null, Components.TRANSLATION_ASSISTANT => settingsManager.ConfigurationData.Translation.PreselectOptions ? settingsManager.ConfigurationData.Providers.FirstOrDefault(x => x.Id == settingsManager.ConfigurationData.Translation.PreselectedProvider) : null, Components.AGENDA_ASSISTANT => settingsManager.ConfigurationData.Agenda.PreselectOptions ? settingsManager.ConfigurationData.Providers.FirstOrDefault(x => x.Id == settingsManager.ConfigurationData.Agenda.PreselectedProvider) : null, Components.CODING_ASSISTANT => settingsManager.ConfigurationData.Coding.PreselectOptions ? settingsManager.ConfigurationData.Providers.FirstOrDefault(x => x.Id == settingsManager.ConfigurationData.Coding.PreselectedProvider) : null,