From 95cf0af22d89deb3831cd65a8d60bdfbf78d4f79 Mon Sep 17 00:00:00 2001 From: Thorsten Sommer Date: Tue, 3 Dec 2024 21:00:39 +0100 Subject: [PATCH] Added a feature-level preview configuration --- .../Layout/MainLayout.razor.cs | 5 ++- app/MindWork AI Studio/Pages/Settings.razor | 14 +++++- .../Pages/Settings.razor.cs | 11 +++++ .../Settings/ConfigurationSelectData.cs | 6 +++ .../Settings/DataModel/DataApp.cs | 5 +++ .../DataModel/PreviewFeatureExtensions.cs | 14 ++++++ .../Settings/DataModel/PreviewFeatures.cs | 11 +++++ .../DataModel/PreviewVisibilityExtensions.cs | 45 +++++++++++++++++++ .../Settings/SettingsManager.cs | 8 ++++ .../wwwroot/changelog/v0.9.22.md | 2 +- 10 files changed, 116 insertions(+), 5 deletions(-) create mode 100644 app/MindWork AI Studio/Settings/DataModel/PreviewFeatureExtensions.cs create mode 100644 app/MindWork AI Studio/Settings/DataModel/PreviewFeatures.cs create mode 100644 app/MindWork AI Studio/Settings/DataModel/PreviewVisibilityExtensions.cs diff --git a/app/MindWork AI Studio/Layout/MainLayout.razor.cs b/app/MindWork AI Studio/Layout/MainLayout.razor.cs index 2e4bdf08..e18afe1d 100644 --- a/app/MindWork AI Studio/Layout/MainLayout.razor.cs +++ b/app/MindWork AI Studio/Layout/MainLayout.razor.cs @@ -104,7 +104,8 @@ public partial class MainLayout : LayoutComponentBase, IMessageBusReceiver, IDis private void LoadNavItems() { var palette = this.ColorTheme.GetCurrentPalette(this.SettingsManager); - if (this.SettingsManager.ConfigurationData.App.PreviewVisibility < PreviewVisibility.EXPERIMENTAL) + var isWriterModePreviewEnabled = PreviewFeatures.PRE_WRITER_MODE_2024.IsEnabled(this.SettingsManager); + if (!isWriterModePreviewEnabled) { this.navItems = new List { @@ -116,7 +117,7 @@ public partial class MainLayout : LayoutComponentBase, IMessageBusReceiver, IDis new("Settings", Icons.Material.Filled.Settings, palette.DarkLighten, palette.GrayLight, Routes.SETTINGS, false), }; } - else if (this.SettingsManager.ConfigurationData.App.PreviewVisibility >= PreviewVisibility.EXPERIMENTAL) + else { this.navItems = new List { diff --git a/app/MindWork AI Studio/Pages/Settings.razor b/app/MindWork AI Studio/Pages/Settings.razor index 52d27e59..1dcae9ec 100644 --- a/app/MindWork AI Studio/Pages/Settings.razor +++ b/app/MindWork AI Studio/Pages/Settings.razor @@ -131,7 +131,7 @@ - @if (this.SettingsManager.ConfigurationData.App.PreviewVisibility >= PreviewVisibility.PROTOTYPE) + @if (PreviewFeatures.PRE_RAG_2024.IsEnabled(this.SettingsManager)) { @@ -253,7 +253,17 @@ - + + + @if(this.SettingsManager.ConfigurationData.App.PreviewVisibility > PreviewVisibility.NONE) + { + var availablePreviewFeatures = ConfigurationSelectDataFactory.GetPreviewFeaturesData(this.SettingsManager).ToList(); + if (availablePreviewFeatures.Count > 0) + { + + } + } + diff --git a/app/MindWork AI Studio/Pages/Settings.razor.cs b/app/MindWork AI Studio/Pages/Settings.razor.cs index a59859b3..25f4acc0 100644 --- a/app/MindWork AI Studio/Pages/Settings.razor.cs +++ b/app/MindWork AI Studio/Pages/Settings.razor.cs @@ -1,6 +1,7 @@ using AIStudio.Dialogs; using AIStudio.Provider; using AIStudio.Settings; +using AIStudio.Settings.DataModel; using Microsoft.AspNetCore.Components; @@ -42,6 +43,16 @@ public partial class Settings : ComponentBase, IMessageBusReceiver, IDisposable #endregion + #region Preview-feature related + + private void UpdatePreviewFeatures(PreviewVisibility previewVisibility) + { + this.SettingsManager.ConfigurationData.App.PreviewVisibility = previewVisibility; + this.SettingsManager.ConfigurationData.App.EnabledPreviewFeatures = previewVisibility.FilterPreviewFeatures(this.SettingsManager.ConfigurationData.App.EnabledPreviewFeatures); + } + + #endregion + #region Provider related private async Task AddLLMProvider() diff --git a/app/MindWork AI Studio/Settings/ConfigurationSelectData.cs b/app/MindWork AI Studio/Settings/ConfigurationSelectData.cs index b5a6912a..3f6ec933 100644 --- a/app/MindWork AI Studio/Settings/ConfigurationSelectData.cs +++ b/app/MindWork AI Studio/Settings/ConfigurationSelectData.cs @@ -88,6 +88,12 @@ public static class ConfigurationSelectDataFactory yield return new("Show also experimental features: these are experimental; expect bugs, missing features, many changes", PreviewVisibility.EXPERIMENTAL); } + public static IEnumerable> GetPreviewFeaturesData(SettingsManager settingsManager) + { + foreach (var source in settingsManager.ConfigurationData.App.PreviewVisibility.GetPreviewFeatures()) + yield return new(source.GetPreviewDescription(), source); + } + public static IEnumerable> GetNavBehaviorData() { yield return new("Navigation expands on mouse hover", NavBehavior.EXPAND_ON_HOVER); diff --git a/app/MindWork AI Studio/Settings/DataModel/DataApp.cs b/app/MindWork AI Studio/Settings/DataModel/DataApp.cs index 7740cd69..7e89404a 100644 --- a/app/MindWork AI Studio/Settings/DataModel/DataApp.cs +++ b/app/MindWork AI Studio/Settings/DataModel/DataApp.cs @@ -32,6 +32,11 @@ public sealed class DataApp /// The visibility setting for previews features. /// public PreviewVisibility PreviewVisibility { get; set; } = PreviewVisibility.NONE; + + /// + /// The enabled preview features. + /// + public HashSet EnabledPreviewFeatures { get; set; } = new(); /// /// Should we preselect a provider for the entire app? diff --git a/app/MindWork AI Studio/Settings/DataModel/PreviewFeatureExtensions.cs b/app/MindWork AI Studio/Settings/DataModel/PreviewFeatureExtensions.cs new file mode 100644 index 00000000..a6e6cf0e --- /dev/null +++ b/app/MindWork AI Studio/Settings/DataModel/PreviewFeatureExtensions.cs @@ -0,0 +1,14 @@ +namespace AIStudio.Settings.DataModel; + +public static class PreviewFeatureExtensions +{ + public static string GetPreviewDescription(this PreviewFeatures feature) => feature switch + { + PreviewFeatures.PRE_WRITER_MODE_2024 => "Writer Mode: Experiments about how to write long texts using AI", + PreviewFeatures.PRE_RAG_2024 => "RAG: Preview of our RAG implementation where you can refer your files or integrate enterprise data within your company", + + _ => "Unknown preview feature" + }; + + public static bool IsEnabled(this PreviewFeatures feature, SettingsManager settingsManager) => settingsManager.ConfigurationData.App.EnabledPreviewFeatures.Contains(feature); +} \ No newline at end of file diff --git a/app/MindWork AI Studio/Settings/DataModel/PreviewFeatures.cs b/app/MindWork AI Studio/Settings/DataModel/PreviewFeatures.cs new file mode 100644 index 00000000..825e8037 --- /dev/null +++ b/app/MindWork AI Studio/Settings/DataModel/PreviewFeatures.cs @@ -0,0 +1,11 @@ +namespace AIStudio.Settings.DataModel; + +public enum PreviewFeatures +{ + // + // Important: Never delete any enum value from this list. + // We must be able to deserialize old settings files that may contain these values. + // + PRE_WRITER_MODE_2024, + PRE_RAG_2024, +} \ No newline at end of file diff --git a/app/MindWork AI Studio/Settings/DataModel/PreviewVisibilityExtensions.cs b/app/MindWork AI Studio/Settings/DataModel/PreviewVisibilityExtensions.cs new file mode 100644 index 00000000..f80939f6 --- /dev/null +++ b/app/MindWork AI Studio/Settings/DataModel/PreviewVisibilityExtensions.cs @@ -0,0 +1,45 @@ +namespace AIStudio.Settings.DataModel; + +public static class PreviewVisibilityExtensions +{ + public static IList GetPreviewFeatures(this PreviewVisibility visibility) + { + var features = new List(); + if (visibility >= PreviewVisibility.RELEASE_CANDIDATE) + { + } + + if (visibility >= PreviewVisibility.BETA) + { + } + + if (visibility >= PreviewVisibility.ALPHA) + { + } + + if (visibility >= PreviewVisibility.PROTOTYPE) + { + features.Add(PreviewFeatures.PRE_RAG_2024); + } + + if (visibility >= PreviewVisibility.EXPERIMENTAL) + { + features.Add(PreviewFeatures.PRE_WRITER_MODE_2024); + } + + return features; + } + + public static HashSet FilterPreviewFeatures(this PreviewVisibility visibility, HashSet enabledFeatures) + { + var filteredFeatures = new HashSet(); + var previewFeatures = visibility.GetPreviewFeatures(); + foreach (var feature in enabledFeatures) + { + if (previewFeatures.Contains(feature)) + filteredFeatures.Add(feature); + } + + return filteredFeatures; + } +} \ 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 ca07e955..de1aebec 100644 --- a/app/MindWork AI Studio/Settings/SettingsManager.cs +++ b/app/MindWork AI Studio/Settings/SettingsManager.cs @@ -84,6 +84,14 @@ public sealed class SettingsManager(ILogger logger) } this.ConfigurationData = SettingsMigrations.Migrate(this.logger, settingsVersion, await File.ReadAllTextAsync(settingsPath), JSON_OPTIONS); + + // + // We filter the enabled preview features based on the preview visibility. + // This is necessary when the app starts up: some preview features may have + // been disabled or released from the last time the app was started. + // + this.ConfigurationData.App.EnabledPreviewFeatures = this.ConfigurationData.App.PreviewVisibility.FilterPreviewFeatures(this.ConfigurationData.App.EnabledPreviewFeatures); + return; } diff --git a/app/MindWork AI Studio/wwwroot/changelog/v0.9.22.md b/app/MindWork AI Studio/wwwroot/changelog/v0.9.22.md index e13d3f58..2120b7a7 100644 --- a/app/MindWork AI Studio/wwwroot/changelog/v0.9.22.md +++ b/app/MindWork AI Studio/wwwroot/changelog/v0.9.22.md @@ -1,5 +1,5 @@ # v0.9.22, build 197 (2024-1x-xx xx:xx UTC) - Added the possibility to configure preview feature visibility in the app settings. This is useful for users who want to test new features before they are officially released. -- Added the possibility to configure embedding providers in the app settings. Embeddings are necessary in order to integrate local data and files. +- Added the possibility to configure embedding providers in the app settings as a prototype preview feature. Embeddings are necessary in order to integrate local data and files. - Added the writer mode as an experimental preview feature. This feature is just an experiment as we explore how to implement long text support in AI Studio. - Improved self-hosted LLM provider configuration by filtering embedding models. \ No newline at end of file