AI-Studio/app/MindWork AI Studio/Settings/SettingsMigrations.cs

322 lines
14 KiB
C#
Raw Normal View History

2024-08-05 19:12:52 +00:00
using System.Text.Json;
using AIStudio.Settings.DataModel;
2024-08-05 19:12:52 +00:00
using AIStudio.Settings.DataModel.PreviousModels;
2024-07-16 08:28:13 +00:00
using Host = AIStudio.Provider.SelfHosted.Host;
namespace AIStudio.Settings;
public static class SettingsMigrations
{
2024-09-01 18:10:03 +00:00
public static Data Migrate(ILogger<SettingsManager> logger, Version previousVersion, string configData, JsonSerializerOptions jsonOptions)
{
2024-08-05 19:12:52 +00:00
switch (previousVersion)
{
case Version.V1:
2024-08-05 19:12:52 +00:00
var configV1 = JsonSerializer.Deserialize<DataV1V3>(configData, jsonOptions);
if (configV1 is null)
{
2024-09-01 18:10:03 +00:00
logger.LogError("Failed to parse the v1 configuration. Using default values.");
2024-08-05 19:12:52 +00:00
return new();
}
2024-09-01 18:10:03 +00:00
configV1 = MigrateV1ToV2(logger, configV1);
configV1 = MigrateV2ToV3(logger, configV1);
var configV14 = MigrateV3ToV4(logger, configV1);
var configV15 = MigrateV4ToV5(logger, configV14);
return MigrateV5ToV6(logger, configV15);
2024-07-16 08:28:13 +00:00
case Version.V2:
2024-08-05 19:12:52 +00:00
var configV2 = JsonSerializer.Deserialize<DataV1V3>(configData, jsonOptions);
if (configV2 is null)
{
2024-09-01 18:10:03 +00:00
logger.LogError("Failed to parse the v2 configuration. Using default values.");
2024-08-05 19:12:52 +00:00
return new();
}
2024-09-01 18:10:03 +00:00
configV2 = MigrateV2ToV3(logger, configV2);
var configV24 = MigrateV3ToV4(logger, configV2);
var configV25 = MigrateV4ToV5(logger, configV24);
return MigrateV5ToV6(logger, configV25);
2024-08-05 19:12:52 +00:00
case Version.V3:
var configV3 = JsonSerializer.Deserialize<DataV1V3>(configData, jsonOptions);
if (configV3 is null)
{
2024-09-01 18:10:03 +00:00
logger.LogError("Failed to parse the v3 configuration. Using default values.");
2024-08-05 19:12:52 +00:00
return new();
}
var configV34 = MigrateV3ToV4(logger, configV3);
var configV35 = MigrateV4ToV5(logger, configV34);
return MigrateV5ToV6(logger, configV35);
case Version.V4:
var configV4 = JsonSerializer.Deserialize<DataV4>(configData, jsonOptions);
if (configV4 is null)
{
logger.LogError("Failed to parse the v4 configuration. Using default values.");
return new();
}
var configV45 = MigrateV4ToV5(logger, configV4);
return MigrateV5ToV6(logger, configV45);
case Version.V5:
var configV5 = JsonSerializer.Deserialize<DataV5>(configData, jsonOptions);
if (configV5 is null)
{
logger.LogError("Failed to parse the v5 configuration. Using default values.");
return new();
}
return MigrateV5ToV6(logger, configV5);
2024-08-05 19:12:52 +00:00
default:
2024-09-01 18:10:03 +00:00
logger.LogInformation("No configuration migration is needed.");
var configV6 = JsonSerializer.Deserialize<Data>(configData, jsonOptions);
if (configV6 is null)
2024-08-05 19:12:52 +00:00
{
logger.LogError("Failed to parse the v6 configuration. Using default values.");
2024-08-05 19:12:52 +00:00
return new();
}
return configV6;
}
}
2024-09-01 18:10:03 +00:00
private static DataV1V3 MigrateV1ToV2(ILogger<SettingsManager> logger, DataV1V3 previousData)
{
//
// Summary:
// In v1 we had no self-hosted providers. Thus, we had no hostnames.
//
2024-09-01 18:10:03 +00:00
logger.LogInformation("Migrating from v1 to v2...");
return new()
{
Version = Version.V2,
2025-02-25 18:58:17 +00:00
Providers = previousData.Providers.Select(provider => provider with { IsSelfHosted = false, Hostname = string.Empty }).ToList(),
EnableSpellchecking = previousData.EnableSpellchecking,
IsSavingEnergy = previousData.IsSavingEnergy,
NextProviderNum = previousData.NextProviderNum,
ShortcutSendBehavior = previousData.ShortcutSendBehavior,
UpdateInterval = previousData.UpdateInterval,
};
}
2024-09-01 18:10:03 +00:00
private static DataV1V3 MigrateV2ToV3(ILogger<SettingsManager> logger, DataV1V3 previousData)
2024-07-16 08:28:13 +00:00
{
//
// Summary:
// In v2, self-hosted providers had no host (LM Studio, llama.cpp, ollama, etc.)
//
2024-09-01 18:10:03 +00:00
logger.LogInformation("Migrating from v2 to v3...");
2024-07-16 08:28:13 +00:00
return new()
{
Version = Version.V3,
Providers = previousData.Providers.Select(provider =>
{
if(provider.IsSelfHosted)
return provider with { Host = Host.LM_STUDIO };
2024-07-16 08:28:13 +00:00
return provider with { Host = Host.NONE };
}).ToList(),
EnableSpellchecking = previousData.EnableSpellchecking,
IsSavingEnergy = previousData.IsSavingEnergy,
NextProviderNum = previousData.NextProviderNum,
ShortcutSendBehavior = previousData.ShortcutSendBehavior,
UpdateInterval = previousData.UpdateInterval,
2024-07-16 08:28:13 +00:00
WorkspaceStorageBehavior = previousData.WorkspaceStorageBehavior,
WorkspaceStorageTemporaryMaintenancePolicy = previousData.WorkspaceStorageTemporaryMaintenancePolicy,
};
}
2024-08-05 19:12:52 +00:00
private static DataV4 MigrateV3ToV4(ILogger<SettingsManager> logger, DataV1V3 previousConfig)
2024-08-05 19:12:52 +00:00
{
//
// Summary:
// We grouped the settings into different categories.
//
2024-09-01 18:10:03 +00:00
logger.LogInformation("Migrating from v3 to v4...");
2024-08-05 19:12:52 +00:00
return new()
{
Version = Version.V4,
Providers = previousConfig.Providers,
NextProviderNum = previousConfig.NextProviderNum,
App = new(x => x.App)
2024-08-05 19:12:52 +00:00
{
EnableSpellchecking = previousConfig.EnableSpellchecking,
IsSavingEnergy = previousConfig.IsSavingEnergy,
UpdateInterval = previousConfig.UpdateInterval,
2024-08-05 19:12:52 +00:00
NavigationBehavior = previousConfig.NavigationBehavior,
},
2024-08-05 19:12:52 +00:00
Chat = new()
{
ShortcutSendBehavior = previousConfig.ShortcutSendBehavior,
PreselectOptions = previousConfig.PreselectChatOptions,
PreselectedProvider = previousConfig.PreselectedChatProvider,
},
2024-08-05 19:12:52 +00:00
Workspace = new()
{
StorageBehavior = previousConfig.WorkspaceStorageBehavior,
StorageTemporaryMaintenancePolicy = previousConfig.WorkspaceStorageTemporaryMaintenancePolicy,
},
2024-08-05 19:12:52 +00:00
IconFinder = new()
{
PreselectOptions = previousConfig.PreselectIconOptions,
PreselectedProvider = previousConfig.PreselectedIconProvider,
PreselectedSource = previousConfig.PreselectedIconSource,
},
2024-08-05 19:12:52 +00:00
Translation = new()
{
PreselectLiveTranslation = previousConfig.PreselectLiveTranslation,
DebounceIntervalMilliseconds = previousConfig.LiveTranslationDebounceIntervalMilliseconds,
PreselectOptions = previousConfig.PreselectTranslationOptions,
PreselectedProvider = previousConfig.PreselectedTranslationProvider,
PreselectedTargetLanguage = previousConfig.PreselectedTranslationTargetLanguage,
PreselectOtherLanguage = previousConfig.PreselectTranslationOtherLanguage,
HideWebContentReader = previousConfig.HideWebContentReaderForTranslation,
PreselectContentCleanerAgent = previousConfig.PreselectContentCleanerAgentForTranslation,
PreselectWebContentReader = previousConfig.PreselectWebContentReaderForTranslation,
},
2024-08-05 19:12:52 +00:00
Coding = new()
{
PreselectOptions = previousConfig.PreselectCodingOptions,
PreselectedProvider = previousConfig.PreselectedCodingProvider,
PreselectedProgrammingLanguage = previousConfig.PreselectedCodingLanguage,
PreselectedOtherProgrammingLanguage = previousConfig.PreselectedCodingOtherLanguage,
PreselectCompilerMessages = previousConfig.PreselectCodingCompilerMessages,
},
2024-08-05 19:12:52 +00:00
TextSummarizer = new()
{
PreselectOptions = previousConfig.PreselectTextSummarizerOptions,
PreselectedComplexity = previousConfig.PreselectedTextSummarizerComplexity,
PreselectedProvider = previousConfig.PreselectedTextSummarizerProvider,
PreselectedTargetLanguage = previousConfig.PreselectedTextSummarizerTargetLanguage,
PreselectedOtherLanguage = previousConfig.PreselectedTextSummarizerOtherLanguage,
PreselectedExpertInField = previousConfig.PreselectedTextSummarizerExpertInField,
HideWebContentReader = previousConfig.HideWebContentReaderForTextSummarizer,
PreselectContentCleanerAgent = previousConfig.PreselectContentCleanerAgentForTextSummarizer,
PreselectWebContentReader = previousConfig.PreselectWebContentReaderForTextSummarizer,
},
2024-08-05 19:12:52 +00:00
TextContentCleaner = new()
{
PreselectAgentOptions = previousConfig.PreselectAgentTextContentCleanerOptions,
PreselectedAgentProvider = previousConfig.PreselectedAgentTextContentCleanerProvider,
},
};
}
private static DataV5 MigrateV4ToV5(ILogger<SettingsManager> logger, DataV4 previousConfig)
{
//
// Summary:
// We renamed the LLM provider enum.
//
logger.LogInformation("Migrating from v4 to v5...");
return new()
{
Version = Version.V5,
Providers = previousConfig.Providers.MigrateFromV4ToV5(),
LLMProviders = previousConfig.LLMProviders,
Profiles = previousConfig.Profiles,
NextProviderNum = previousConfig.NextProviderNum,
NextProfileNum = previousConfig.NextProfileNum,
App = previousConfig.App,
Chat = previousConfig.Chat,
Workspace = previousConfig.Workspace,
IconFinder = previousConfig.IconFinder,
Translation = previousConfig.Translation,
Coding = previousConfig.Coding,
TextSummarizer = previousConfig.TextSummarizer,
TextContentCleaner = previousConfig.TextContentCleaner,
Agenda = previousConfig.Agenda,
GrammarSpelling = previousConfig.GrammarSpelling,
RewriteImprove = previousConfig.RewriteImprove,
EMail = previousConfig.EMail,
LegalCheck = previousConfig.LegalCheck,
Synonyms = previousConfig.Synonyms,
MyTasks = previousConfig.MyTasks,
};
}
private static Data MigrateV5ToV6(ILogger<SettingsManager> logger, DataV5 previousConfig)
{
//
// Summary:
// We moved confidence settings out of LLM provider settings.
//
logger.LogInformation("Migrating from v5 to v6...");
return new()
{
Version = Version.V6,
Providers = previousConfig.Providers,
Confidence = new(x => x.Confidence)
{
EnforceGlobalMinimumConfidence = previousConfig.LLMProviders.EnforceGlobalMinimumConfidence,
GlobalMinimumConfidence = previousConfig.LLMProviders.GlobalMinimumConfidence,
ShowProviderConfidence = previousConfig.LLMProviders.ShowProviderConfidence,
ConfidenceScheme = previousConfig.LLMProviders.ConfidenceScheme,
CustomConfidenceScheme = previousConfig.LLMProviders.CustomConfidenceScheme,
},
EmbeddingProviders = previousConfig.EmbeddingProviders,
TranscriptionProviders = previousConfig.TranscriptionProviders,
DataSources = previousConfig.DataSources,
Profiles = previousConfig.Profiles,
ChatTemplates = previousConfig.ChatTemplates,
EnabledPlugins = previousConfig.EnabledPlugins,
ManagedEditableDefaults = previousConfig.ManagedEditableDefaults,
AssistantPluginAudits = previousConfig.AssistantPluginAudits,
NextProviderNum = previousConfig.NextProviderNum,
NextEmbeddingNum = previousConfig.NextEmbeddingNum,
NextTranscriptionNum = previousConfig.NextTranscriptionNum,
NextDataSourceNum = previousConfig.NextDataSourceNum,
NextProfileNum = previousConfig.NextProfileNum,
NextChatTemplateNum = previousConfig.NextChatTemplateNum,
NextDocumentAnalysisPolicyNum = previousConfig.NextDocumentAnalysisPolicyNum,
App = previousConfig.App,
Chat = previousConfig.Chat,
Workspace = previousConfig.Workspace,
IconFinder = previousConfig.IconFinder,
Translation = previousConfig.Translation,
Coding = previousConfig.Coding,
ERI = previousConfig.ERI,
DocumentAnalysis = previousConfig.DocumentAnalysis,
MandatoryInformation = previousConfig.MandatoryInformation,
TextSummarizer = previousConfig.TextSummarizer,
TextContentCleaner = previousConfig.TextContentCleaner,
AgentDataSourceSelection = previousConfig.AgentDataSourceSelection,
AgentRetrievalContextValidation = previousConfig.AgentRetrievalContextValidation,
AssistantPluginAudit = previousConfig.AssistantPluginAudit,
Agenda = previousConfig.Agenda,
GrammarSpelling = previousConfig.GrammarSpelling,
RewriteImprove = previousConfig.RewriteImprove,
PromptOptimizer = previousConfig.PromptOptimizer,
EMail = previousConfig.EMail,
SlideBuilder = previousConfig.SlideBuilder,
LegalCheck = previousConfig.LegalCheck,
Synonyms = previousConfig.Synonyms,
MyTasks = previousConfig.MyTasks,
JobPostings = previousConfig.JobPostings,
BiasOfTheDay = previousConfig.BiasOfTheDay,
I18N = previousConfig.I18N,
};
}
}