mirror of
https://github.com/MindWorkAI/AI-Studio.git
synced 2026-10-17 09:58:00 +00:00
Refactored logging into a unified logging
This commit is contained in:
24 files changed
+416
-224
No files matched your search
@@ -71,10 +71,13 @@ public partial class ProviderDialog : ComponentBase
|
||||
public bool IsEditing { get; init; }
|
||||
|
||||
[Inject]
|
||||
private SettingsManager SettingsManager { get; set; } = null!;
|
||||
private SettingsManager SettingsManager { get; init; } = null!;
|
||||
|
||||
[Inject]
|
||||
private IJSRuntime JsRuntime { get; set; } = null!;
|
||||
private IJSRuntime JsRuntime { get; init; } = null!;
|
||||
|
||||
[Inject]
|
||||
private ILogger<ProviderDialog> Logger { get; init; } = null!;
|
||||
|
||||
private static readonly Dictionary<string, object?> SPELLCHECK_ATTRIBUTES = new();
|
||||
|
||||
@@ -133,7 +136,7 @@ public partial class ProviderDialog : ComponentBase
|
||||
}
|
||||
|
||||
var loadedProviderSettings = this.CreateProviderSettings();
|
||||
var provider = loadedProviderSettings.CreateProvider();
|
||||
var provider = loadedProviderSettings.CreateProvider(this.Logger);
|
||||
if(provider is NoProvider)
|
||||
{
|
||||
await base.OnInitializedAsync();
|
||||
@@ -187,7 +190,7 @@ public partial class ProviderDialog : ComponentBase
|
||||
if (addedProviderSettings.UsedProvider != Providers.SELF_HOSTED)
|
||||
{
|
||||
// We need to instantiate the provider to store the API key:
|
||||
var provider = addedProviderSettings.CreateProvider();
|
||||
var provider = addedProviderSettings.CreateProvider(this.Logger);
|
||||
|
||||
// Store the API key in the OS secure storage:
|
||||
var storeResponse = await this.SettingsManager.SetAPIKey(this.JsRuntime, provider, this.dataAPIKey);
|
||||
@@ -318,7 +321,7 @@ public partial class ProviderDialog : ComponentBase
|
||||
private async Task ReloadModels()
|
||||
{
|
||||
var currentProviderSettings = this.CreateProviderSettings();
|
||||
var provider = currentProviderSettings.CreateProvider();
|
||||
var provider = currentProviderSettings.CreateProvider(this.Logger);
|
||||
if(provider is NoProvider)
|
||||
return;
|
||||
|
||||
|
||||
@@ -11,7 +11,7 @@ namespace AIStudio.Settings;
|
||||
/// <summary>
|
||||
/// The settings manager.
|
||||
/// </summary>
|
||||
public sealed class SettingsManager
|
||||
public sealed class SettingsManager(ILogger<SettingsManager> logger)
|
||||
{
|
||||
private const string SETTINGS_FILENAME = "settings.json";
|
||||
|
||||
@@ -20,6 +20,8 @@ public sealed class SettingsManager
|
||||
WriteIndented = true,
|
||||
Converters = { new JsonStringEnumConverter() },
|
||||
};
|
||||
|
||||
private ILogger<SettingsManager> logger = logger;
|
||||
|
||||
/// <summary>
|
||||
/// The directory where the configuration files are stored.
|
||||
@@ -102,12 +104,18 @@ public sealed class SettingsManager
|
||||
public async Task LoadSettings()
|
||||
{
|
||||
if(!this.IsSetUp)
|
||||
{
|
||||
this.logger.LogWarning("Cannot load settings, because the configuration is not set up yet.");
|
||||
return;
|
||||
|
||||
}
|
||||
|
||||
var settingsPath = Path.Combine(ConfigDirectory!, SETTINGS_FILENAME);
|
||||
if(!File.Exists(settingsPath))
|
||||
{
|
||||
this.logger.LogWarning("Cannot load settings, because the settings file does not exist.");
|
||||
return;
|
||||
|
||||
}
|
||||
|
||||
// We read the `"Version": "V3"` line to determine the version of the settings file:
|
||||
await foreach (var line in File.ReadLinesAsync(settingsPath))
|
||||
{
|
||||
@@ -123,16 +131,16 @@ public sealed class SettingsManager
|
||||
Enum.TryParse(settingsVersionText, out Version settingsVersion);
|
||||
if(settingsVersion is Version.UNKNOWN)
|
||||
{
|
||||
Console.WriteLine("Error: Unknown version of the settings file.");
|
||||
this.logger.LogError("Unknown version of the settings file found.");
|
||||
this.ConfigurationData = new();
|
||||
return;
|
||||
}
|
||||
|
||||
this.ConfigurationData = SettingsMigrations.Migrate(settingsVersion, await File.ReadAllTextAsync(settingsPath), JSON_OPTIONS);
|
||||
this.ConfigurationData = SettingsMigrations.Migrate(this.logger, settingsVersion, await File.ReadAllTextAsync(settingsPath), JSON_OPTIONS);
|
||||
return;
|
||||
}
|
||||
|
||||
Console.WriteLine("Error: Failed to read the version of the settings file.");
|
||||
this.logger.LogError("Failed to read the version of the settings file.");
|
||||
this.ConfigurationData = new();
|
||||
}
|
||||
|
||||
@@ -142,14 +150,22 @@ public sealed class SettingsManager
|
||||
public async Task StoreSettings()
|
||||
{
|
||||
if(!this.IsSetUp)
|
||||
{
|
||||
this.logger.LogWarning("Cannot store settings, because the configuration is not set up yet.");
|
||||
return;
|
||||
|
||||
}
|
||||
|
||||
var settingsPath = Path.Combine(ConfigDirectory!, SETTINGS_FILENAME);
|
||||
if(!Directory.Exists(ConfigDirectory))
|
||||
{
|
||||
this.logger.LogInformation("Creating the configuration directory.");
|
||||
Directory.CreateDirectory(ConfigDirectory!);
|
||||
|
||||
}
|
||||
|
||||
var settingsJson = JsonSerializer.Serialize(this.ConfigurationData, JSON_OPTIONS);
|
||||
await File.WriteAllTextAsync(settingsPath, settingsJson);
|
||||
|
||||
this.logger.LogInformation("Stored the settings to the file system.");
|
||||
}
|
||||
|
||||
public void InjectSpellchecking(Dictionary<string, object?> attributes) => attributes["spellcheck"] = this.ConfigurationData.App.EnableSpellchecking ? "true" : "false";
|
||||
|
||||
@@ -9,7 +9,7 @@ namespace AIStudio.Settings;
|
||||
|
||||
public static class SettingsMigrations
|
||||
{
|
||||
public static Data Migrate(Version previousVersion, string configData, JsonSerializerOptions jsonOptions)
|
||||
public static Data Migrate(ILogger<SettingsManager> logger, Version previousVersion, string configData, JsonSerializerOptions jsonOptions)
|
||||
{
|
||||
switch (previousVersion)
|
||||
{
|
||||
@@ -17,41 +17,41 @@ public static class SettingsMigrations
|
||||
var configV1 = JsonSerializer.Deserialize<DataV1V3>(configData, jsonOptions);
|
||||
if (configV1 is null)
|
||||
{
|
||||
Console.WriteLine("Error: failed to parse the configuration. Using default values.");
|
||||
logger.LogError("Failed to parse the v1 configuration. Using default values.");
|
||||
return new();
|
||||
}
|
||||
|
||||
configV1 = MigrateV1ToV2(configV1);
|
||||
configV1 = MigrateV2ToV3(configV1);
|
||||
return MigrateV3ToV4(configV1);
|
||||
configV1 = MigrateV1ToV2(logger, configV1);
|
||||
configV1 = MigrateV2ToV3(logger, configV1);
|
||||
return MigrateV3ToV4(logger, configV1);
|
||||
|
||||
case Version.V2:
|
||||
var configV2 = JsonSerializer.Deserialize<DataV1V3>(configData, jsonOptions);
|
||||
if (configV2 is null)
|
||||
{
|
||||
Console.WriteLine("Error: failed to parse the configuration. Using default values.");
|
||||
logger.LogError("Failed to parse the v2 configuration. Using default values.");
|
||||
return new();
|
||||
}
|
||||
|
||||
configV2 = MigrateV2ToV3(configV2);
|
||||
return MigrateV3ToV4(configV2);
|
||||
configV2 = MigrateV2ToV3(logger, configV2);
|
||||
return MigrateV3ToV4(logger, configV2);
|
||||
|
||||
case Version.V3:
|
||||
var configV3 = JsonSerializer.Deserialize<DataV1V3>(configData, jsonOptions);
|
||||
if (configV3 is null)
|
||||
{
|
||||
Console.WriteLine("Error: failed to parse the configuration. Using default values.");
|
||||
logger.LogError("Failed to parse the v3 configuration. Using default values.");
|
||||
return new();
|
||||
}
|
||||
|
||||
return MigrateV3ToV4(configV3);
|
||||
return MigrateV3ToV4(logger, configV3);
|
||||
|
||||
default:
|
||||
Console.WriteLine("No configuration migration needed.");
|
||||
logger.LogInformation("No configuration migration is needed.");
|
||||
var configV4 = JsonSerializer.Deserialize<Data>(configData, jsonOptions);
|
||||
if (configV4 is null)
|
||||
{
|
||||
Console.WriteLine("Error: failed to parse the configuration. Using default values.");
|
||||
logger.LogError("Failed to parse the v4 configuration. Using default values.");
|
||||
return new();
|
||||
}
|
||||
|
||||
@@ -59,14 +59,14 @@ public static class SettingsMigrations
|
||||
}
|
||||
}
|
||||
|
||||
private static DataV1V3 MigrateV1ToV2(DataV1V3 previousData)
|
||||
private static DataV1V3 MigrateV1ToV2(ILogger<SettingsManager> logger, DataV1V3 previousData)
|
||||
{
|
||||
//
|
||||
// Summary:
|
||||
// In v1 we had no self-hosted providers. Thus, we had no hostnames.
|
||||
//
|
||||
|
||||
Console.WriteLine("Migrating from v1 to v2...");
|
||||
logger.LogInformation("Migrating from v1 to v2...");
|
||||
return new()
|
||||
{
|
||||
Version = Version.V2,
|
||||
@@ -81,14 +81,14 @@ public static class SettingsMigrations
|
||||
};
|
||||
}
|
||||
|
||||
private static DataV1V3 MigrateV2ToV3(DataV1V3 previousData)
|
||||
private static DataV1V3 MigrateV2ToV3(ILogger<SettingsManager> logger, DataV1V3 previousData)
|
||||
{
|
||||
//
|
||||
// Summary:
|
||||
// In v2, self-hosted providers had no host (LM Studio, llama.cpp, ollama, etc.)
|
||||
//
|
||||
|
||||
Console.WriteLine("Migrating from v2 to v3...");
|
||||
logger.LogInformation("Migrating from v2 to v3...");
|
||||
return new()
|
||||
{
|
||||
Version = Version.V3,
|
||||
@@ -110,14 +110,14 @@ public static class SettingsMigrations
|
||||
};
|
||||
}
|
||||
|
||||
private static Data MigrateV3ToV4(DataV1V3 previousConfig)
|
||||
private static Data MigrateV3ToV4(ILogger<SettingsManager> logger, DataV1V3 previousConfig)
|
||||
{
|
||||
//
|
||||
// Summary:
|
||||
// We grouped the settings into different categories.
|
||||
//
|
||||
|
||||
Console.WriteLine("Migrating from v3 to v4...");
|
||||
logger.LogInformation("Migrating from v3 to v4...");
|
||||
return new()
|
||||
{
|
||||
Version = Version.V4,
|
||||
|
||||
Reference in new issue
Block a user