diff --git a/app/MindWork AI Studio/Agents/AgentBase.cs b/app/MindWork AI Studio/Agents/AgentBase.cs index 4636908c..dc70992a 100644 --- a/app/MindWork AI Studio/Agents/AgentBase.cs +++ b/app/MindWork AI Studio/Agents/AgentBase.cs @@ -125,6 +125,6 @@ public abstract class AgentBase(ILogger logger, SettingsManager setti // Use the selected provider to get the AI response. // By awaiting this line, we wait for the entire // content to be streamed. - await aiText.CreateFromProviderAsync(this.ProviderSettings.CreateProvider(this.Logger), this.ProviderSettings.Model, lastUserPrompt, thread); + await aiText.CreateFromProviderAsync(this.ProviderSettings.CreateProvider(), this.ProviderSettings.Model, lastUserPrompt, thread); } } \ No newline at end of file diff --git a/app/MindWork AI Studio/Assistants/AssistantBase.razor.cs b/app/MindWork AI Studio/Assistants/AssistantBase.razor.cs index c0d86219..75f91db1 100644 --- a/app/MindWork AI Studio/Assistants/AssistantBase.razor.cs +++ b/app/MindWork AI Studio/Assistants/AssistantBase.razor.cs @@ -270,7 +270,7 @@ public abstract partial class AssistantBase : AssistantLowerBase wher // Use the selected provider to get the AI response. // By awaiting this line, we wait for the entire // content to be streamed. - this.chatThread = await aiText.CreateFromProviderAsync(this.providerSettings.CreateProvider(this.Logger), this.providerSettings.Model, this.lastUserPrompt, this.chatThread, this.cancellationTokenSource!.Token); + this.chatThread = await aiText.CreateFromProviderAsync(this.providerSettings.CreateProvider(), this.providerSettings.Model, this.lastUserPrompt, this.chatThread, this.cancellationTokenSource!.Token); this.isProcessing = false; this.StateHasChanged(); diff --git a/app/MindWork AI Studio/Chat/ChatThread.cs b/app/MindWork AI Studio/Chat/ChatThread.cs index 48ac119a..da01b153 100644 --- a/app/MindWork AI Studio/Chat/ChatThread.cs +++ b/app/MindWork AI Studio/Chat/ChatThread.cs @@ -10,6 +10,8 @@ namespace AIStudio.Chat; /// public sealed record ChatThread { + private static readonly ILogger LOGGER = Program.LOGGER_FACTORY.CreateLogger(); + /// /// The unique identifier of the chat thread. /// @@ -82,9 +84,8 @@ public sealed record ChatThread /// /// The settings manager instance to use. /// The chat thread to prepare the system prompt for. - /// The logger instance to use. /// The prepared system prompt. - public string PrepareSystemPrompt(SettingsManager settingsManager, ChatThread chatThread, ILogger logger) + public string PrepareSystemPrompt(SettingsManager settingsManager, ChatThread chatThread) { // // Use the information from the chat template, if provided. Otherwise, use the default system prompt @@ -121,7 +122,7 @@ public sealed record ChatThread // default system prompt: chatThread = chatThread with { SystemPrompt = systemPromptTextWithChatTemplate }; - logger.LogInformation(logMessage); + LOGGER.LogInformation(logMessage); // // Add augmented data, if available: @@ -139,9 +140,9 @@ public sealed record ChatThread }; if(isAugmentedDataAvailable) - logger.LogInformation("Augmented data is available for the chat thread."); + LOGGER.LogInformation("Augmented data is available for the chat thread."); else - logger.LogInformation("No augmented data is available for the chat thread."); + LOGGER.LogInformation("No augmented data is available for the chat thread."); // @@ -177,7 +178,7 @@ public sealed record ChatThread } } - logger.LogInformation(logMessage); + LOGGER.LogInformation(logMessage); return systemPromptText; } diff --git a/app/MindWork AI Studio/Components/ChatComponent.razor.cs b/app/MindWork AI Studio/Components/ChatComponent.razor.cs index 849127e4..8359e0ee 100644 --- a/app/MindWork AI Studio/Components/ChatComponent.razor.cs +++ b/app/MindWork AI Studio/Components/ChatComponent.razor.cs @@ -528,7 +528,7 @@ public partial class ChatComponent : MSGComponentBase, IAsyncDisposable // Use the selected provider to get the AI response. // By awaiting this line, we wait for the entire // content to be streamed. - this.ChatThread = await aiText.CreateFromProviderAsync(this.Provider.CreateProvider(this.Logger), this.Provider.Model, lastUserPrompt, this.ChatThread, this.cancellationTokenSource.Token); + this.ChatThread = await aiText.CreateFromProviderAsync(this.Provider.CreateProvider(), this.Provider.Model, lastUserPrompt, this.ChatThread, this.cancellationTokenSource.Token); } this.cancellationTokenSource = null; diff --git a/app/MindWork AI Studio/Dialogs/EmbeddingProviderDialog.razor.cs b/app/MindWork AI Studio/Dialogs/EmbeddingProviderDialog.razor.cs index d08ff0a7..d586a213 100644 --- a/app/MindWork AI Studio/Dialogs/EmbeddingProviderDialog.razor.cs +++ b/app/MindWork AI Studio/Dialogs/EmbeddingProviderDialog.razor.cs @@ -69,9 +69,6 @@ public partial class EmbeddingProviderDialog : MSGComponentBase, ISecretId [Parameter] public bool IsEditing { get; init; } - [Inject] - private ILogger Logger { get; init; } = null!; - [Inject] private RustService RustService { get; init; } = null!; @@ -244,7 +241,7 @@ public partial class EmbeddingProviderDialog : MSGComponentBase, ISecretId private async Task ReloadModels() { var currentEmbeddingProviderSettings = this.CreateEmbeddingProviderSettings(); - var provider = currentEmbeddingProviderSettings.CreateProvider(this.Logger); + var provider = currentEmbeddingProviderSettings.CreateProvider(); if(provider is NoProvider) return; diff --git a/app/MindWork AI Studio/Dialogs/PandocDialog.razor.cs b/app/MindWork AI Studio/Dialogs/PandocDialog.razor.cs index 98716f14..d108f669 100644 --- a/app/MindWork AI Studio/Dialogs/PandocDialog.razor.cs +++ b/app/MindWork AI Studio/Dialogs/PandocDialog.razor.cs @@ -33,7 +33,7 @@ public partial class PandocDialog : MSGComponentBase [CascadingParameter] private IMudDialogInstance MudDialog { get; set; } = null!; - private static readonly ILogger LOG = Program.LOGGER_FACTORY.CreateLogger("PandocDialog"); + private static readonly ILogger LOG = Program.LOGGER_FACTORY.CreateLogger(nameof(PandocDialog)); private static readonly string LICENCE_URI = "https://raw.githubusercontent.com/jgm/pandoc/refs/heads/main/COPYING.md"; private static string LATEST_PANDOC_VERSION = string.Empty; diff --git a/app/MindWork AI Studio/Dialogs/ProviderDialog.razor.cs b/app/MindWork AI Studio/Dialogs/ProviderDialog.razor.cs index 62008d86..43a47330 100644 --- a/app/MindWork AI Studio/Dialogs/ProviderDialog.razor.cs +++ b/app/MindWork AI Studio/Dialogs/ProviderDialog.razor.cs @@ -78,9 +78,6 @@ public partial class ProviderDialog : MSGComponentBase, ISecretId [Parameter] public bool IsEditing { get; init; } - [Inject] - private ILogger Logger { get; init; } = null!; - [Inject] private RustService RustService { get; init; } = null!; @@ -253,7 +250,7 @@ public partial class ProviderDialog : MSGComponentBase, ISecretId private async Task ReloadModels() { var currentProviderSettings = this.CreateProviderSettings(); - var provider = currentProviderSettings.CreateProvider(this.Logger); + var provider = currentProviderSettings.CreateProvider(); if(provider is NoProvider) return; diff --git a/app/MindWork AI Studio/Pages/Writer.razor.cs b/app/MindWork AI Studio/Pages/Writer.razor.cs index f9f65db4..9f1dcd26 100644 --- a/app/MindWork AI Studio/Pages/Writer.razor.cs +++ b/app/MindWork AI Studio/Pages/Writer.razor.cs @@ -2,7 +2,6 @@ using AIStudio.Chat; using AIStudio.Components; using AIStudio.Provider; -using Microsoft.AspNetCore.Components; using Microsoft.AspNetCore.Components.Web; using Timer = System.Timers.Timer; @@ -11,9 +10,6 @@ namespace AIStudio.Pages; public partial class Writer : MSGComponentBase { - [Inject] - private ILogger Logger { get; init; } = null!; - private static readonly Dictionary USER_INPUT_ATTRIBUTES = new(); private readonly Timer typeTimer = new(TimeSpan.FromMilliseconds(1_500)); @@ -121,7 +117,7 @@ public partial class Writer : MSGComponentBase this.isStreaming = true; this.StateHasChanged(); - this.chatThread = await aiText.CreateFromProviderAsync(this.providerSettings.CreateProvider(this.Logger), this.providerSettings.Model, lastUserPrompt, this.chatThread); + this.chatThread = await aiText.CreateFromProviderAsync(this.providerSettings.CreateProvider(), this.providerSettings.Model, lastUserPrompt, this.chatThread); this.suggestion = aiText.Text; this.isStreaming = false; diff --git a/app/MindWork AI Studio/Provider/AlibabaCloud/ProviderAlibabaCloud.cs b/app/MindWork AI Studio/Provider/AlibabaCloud/ProviderAlibabaCloud.cs index c04cb0cf..cbf87c65 100644 --- a/app/MindWork AI Studio/Provider/AlibabaCloud/ProviderAlibabaCloud.cs +++ b/app/MindWork AI Studio/Provider/AlibabaCloud/ProviderAlibabaCloud.cs @@ -9,8 +9,9 @@ using AIStudio.Settings; namespace AIStudio.Provider.AlibabaCloud; -public sealed class ProviderAlibabaCloud(ILogger logger) : BaseProvider("https://dashscope-intl.aliyuncs.com/compatible-mode/v1/", logger) +public sealed class ProviderAlibabaCloud() : BaseProvider("https://dashscope-intl.aliyuncs.com/compatible-mode/v1/", LOGGER) { + private static readonly ILogger LOGGER = Program.LOGGER_FACTORY.CreateLogger(); #region Implementation of IProvider @@ -32,7 +33,7 @@ public sealed class ProviderAlibabaCloud(ILogger logger) : BaseProvider("https:/ var systemPrompt = new Message { Role = "system", - Content = chatThread.PrepareSystemPrompt(settingsManager, chatThread, this.logger), + Content = chatThread.PrepareSystemPrompt(settingsManager, chatThread), }; // Prepare the AlibabaCloud HTTP chat request: diff --git a/app/MindWork AI Studio/Provider/Anthropic/ProviderAnthropic.cs b/app/MindWork AI Studio/Provider/Anthropic/ProviderAnthropic.cs index 676a4365..96c9306b 100644 --- a/app/MindWork AI Studio/Provider/Anthropic/ProviderAnthropic.cs +++ b/app/MindWork AI Studio/Provider/Anthropic/ProviderAnthropic.cs @@ -9,8 +9,10 @@ using AIStudio.Settings; namespace AIStudio.Provider.Anthropic; -public sealed class ProviderAnthropic(ILogger logger) : BaseProvider("https://api.anthropic.com/v1/", logger) +public sealed class ProviderAnthropic() : BaseProvider("https://api.anthropic.com/v1/", LOGGER) { + private static readonly ILogger LOGGER = Program.LOGGER_FACTORY.CreateLogger(); + #region Implementation of IProvider public override string Id => LLMProviders.ANTHROPIC.ToName(); @@ -49,7 +51,7 @@ public sealed class ProviderAnthropic(ILogger logger) : BaseProvider("https://ap } }).ToList()], - System = chatThread.PrepareSystemPrompt(settingsManager, chatThread, this.logger), + System = chatThread.PrepareSystemPrompt(settingsManager, chatThread), MaxTokens = 4_096, // Right now, we only support streaming completions: diff --git a/app/MindWork AI Studio/Provider/BaseProvider.cs b/app/MindWork AI Studio/Provider/BaseProvider.cs index 4d41da0b..6a28f832 100644 --- a/app/MindWork AI Studio/Provider/BaseProvider.cs +++ b/app/MindWork AI Studio/Provider/BaseProvider.cs @@ -25,7 +25,7 @@ public abstract class BaseProvider : IProvider, ISecretId /// /// The logger to use. /// - protected readonly ILogger logger; + private readonly ILogger logger; static BaseProvider() { @@ -47,10 +47,10 @@ public abstract class BaseProvider : IProvider, ISecretId /// Constructor for the base provider. /// /// The base URL for the provider. - /// The logger service to use. - protected BaseProvider(string url, ILogger loggerService) + /// The logger to use. + protected BaseProvider(string url, ILogger logger) { - this.logger = loggerService; + this.logger = logger; // Set the base URL: this.httpClient.BaseAddress = new(url); diff --git a/app/MindWork AI Studio/Provider/DeepSeek/ProviderDeepSeek.cs b/app/MindWork AI Studio/Provider/DeepSeek/ProviderDeepSeek.cs index 127fc493..67eac538 100644 --- a/app/MindWork AI Studio/Provider/DeepSeek/ProviderDeepSeek.cs +++ b/app/MindWork AI Studio/Provider/DeepSeek/ProviderDeepSeek.cs @@ -9,8 +9,10 @@ using AIStudio.Settings; namespace AIStudio.Provider.DeepSeek; -public sealed class ProviderDeepSeek(ILogger logger) : BaseProvider("https://api.deepseek.com/", logger) +public sealed class ProviderDeepSeek() : BaseProvider("https://api.deepseek.com/", LOGGER) { + private static readonly ILogger LOGGER = Program.LOGGER_FACTORY.CreateLogger(); + #region Implementation of IProvider /// @@ -31,7 +33,7 @@ public sealed class ProviderDeepSeek(ILogger logger) : BaseProvider("https://api var systemPrompt = new Message { Role = "system", - Content = chatThread.PrepareSystemPrompt(settingsManager, chatThread, this.logger), + Content = chatThread.PrepareSystemPrompt(settingsManager, chatThread), }; // Prepare the DeepSeek HTTP chat request: diff --git a/app/MindWork AI Studio/Provider/Fireworks/ProviderFireworks.cs b/app/MindWork AI Studio/Provider/Fireworks/ProviderFireworks.cs index a2aa95c1..cf66169d 100644 --- a/app/MindWork AI Studio/Provider/Fireworks/ProviderFireworks.cs +++ b/app/MindWork AI Studio/Provider/Fireworks/ProviderFireworks.cs @@ -9,8 +9,10 @@ using AIStudio.Settings; namespace AIStudio.Provider.Fireworks; -public class ProviderFireworks(ILogger logger) : BaseProvider("https://api.fireworks.ai/inference/v1/", logger) +public class ProviderFireworks() : BaseProvider("https://api.fireworks.ai/inference/v1/", LOGGER) { + private static readonly ILogger LOGGER = Program.LOGGER_FACTORY.CreateLogger(); + #region Implementation of IProvider /// @@ -31,7 +33,7 @@ public class ProviderFireworks(ILogger logger) : BaseProvider("https://api.firew var systemPrompt = new Message { Role = "system", - Content = chatThread.PrepareSystemPrompt(settingsManager, chatThread, this.logger), + Content = chatThread.PrepareSystemPrompt(settingsManager, chatThread), }; // Prepare the Fireworks HTTP chat request: diff --git a/app/MindWork AI Studio/Provider/GWDG/ProviderGWDG.cs b/app/MindWork AI Studio/Provider/GWDG/ProviderGWDG.cs index 86a25f89..e497fcf2 100644 --- a/app/MindWork AI Studio/Provider/GWDG/ProviderGWDG.cs +++ b/app/MindWork AI Studio/Provider/GWDG/ProviderGWDG.cs @@ -9,8 +9,10 @@ using AIStudio.Settings; namespace AIStudio.Provider.GWDG; -public sealed class ProviderGWDG(ILogger logger) : BaseProvider("https://chat-ai.academiccloud.de/v1/", logger) +public sealed class ProviderGWDG() : BaseProvider("https://chat-ai.academiccloud.de/v1/", LOGGER) { + private static readonly ILogger LOGGER = Program.LOGGER_FACTORY.CreateLogger(); + #region Implementation of IProvider /// @@ -31,7 +33,7 @@ public sealed class ProviderGWDG(ILogger logger) : BaseProvider("https://chat-ai var systemPrompt = new Message { Role = "system", - Content = chatThread.PrepareSystemPrompt(settingsManager, chatThread, this.logger), + Content = chatThread.PrepareSystemPrompt(settingsManager, chatThread), }; // Prepare the GWDG HTTP chat request: diff --git a/app/MindWork AI Studio/Provider/Google/ProviderGoogle.cs b/app/MindWork AI Studio/Provider/Google/ProviderGoogle.cs index 0322842a..8586baf7 100644 --- a/app/MindWork AI Studio/Provider/Google/ProviderGoogle.cs +++ b/app/MindWork AI Studio/Provider/Google/ProviderGoogle.cs @@ -9,8 +9,10 @@ using AIStudio.Settings; namespace AIStudio.Provider.Google; -public class ProviderGoogle(ILogger logger) : BaseProvider("https://generativelanguage.googleapis.com/v1beta/", logger) +public class ProviderGoogle() : BaseProvider("https://generativelanguage.googleapis.com/v1beta/", LOGGER) { + private static readonly ILogger LOGGER = Program.LOGGER_FACTORY.CreateLogger(); + #region Implementation of IProvider /// @@ -31,7 +33,7 @@ public class ProviderGoogle(ILogger logger) : BaseProvider("https://generativela var systemPrompt = new Message { Role = "system", - Content = chatThread.PrepareSystemPrompt(settingsManager, chatThread, this.logger), + Content = chatThread.PrepareSystemPrompt(settingsManager, chatThread), }; // Prepare the Google HTTP chat request: diff --git a/app/MindWork AI Studio/Provider/Groq/ProviderGroq.cs b/app/MindWork AI Studio/Provider/Groq/ProviderGroq.cs index 62f974c3..88652a15 100644 --- a/app/MindWork AI Studio/Provider/Groq/ProviderGroq.cs +++ b/app/MindWork AI Studio/Provider/Groq/ProviderGroq.cs @@ -9,8 +9,10 @@ using AIStudio.Settings; namespace AIStudio.Provider.Groq; -public class ProviderGroq(ILogger logger) : BaseProvider("https://api.groq.com/openai/v1/", logger) +public class ProviderGroq() : BaseProvider("https://api.groq.com/openai/v1/", LOGGER) { + private static readonly ILogger LOGGER = Program.LOGGER_FACTORY.CreateLogger(); + #region Implementation of IProvider /// @@ -31,7 +33,7 @@ public class ProviderGroq(ILogger logger) : BaseProvider("https://api.groq.com/o var systemPrompt = new Message { Role = "system", - Content = chatThread.PrepareSystemPrompt(settingsManager, chatThread, this.logger), + Content = chatThread.PrepareSystemPrompt(settingsManager, chatThread), }; // Prepare the OpenAI HTTP chat request: diff --git a/app/MindWork AI Studio/Provider/Helmholtz/ProviderHelmholtz.cs b/app/MindWork AI Studio/Provider/Helmholtz/ProviderHelmholtz.cs index 51f9a4c3..acc0daba 100644 --- a/app/MindWork AI Studio/Provider/Helmholtz/ProviderHelmholtz.cs +++ b/app/MindWork AI Studio/Provider/Helmholtz/ProviderHelmholtz.cs @@ -9,8 +9,10 @@ using AIStudio.Settings; namespace AIStudio.Provider.Helmholtz; -public sealed class ProviderHelmholtz(ILogger logger) : BaseProvider("https://api.helmholtz-blablador.fz-juelich.de/v1/", logger) +public sealed class ProviderHelmholtz() : BaseProvider("https://api.helmholtz-blablador.fz-juelich.de/v1/", LOGGER) { + private static readonly ILogger LOGGER = Program.LOGGER_FACTORY.CreateLogger(); + #region Implementation of IProvider /// @@ -31,7 +33,7 @@ public sealed class ProviderHelmholtz(ILogger logger) : BaseProvider("https://ap var systemPrompt = new Message { Role = "system", - Content = chatThread.PrepareSystemPrompt(settingsManager, chatThread, this.logger), + Content = chatThread.PrepareSystemPrompt(settingsManager, chatThread), }; // Prepare the Helmholtz HTTP chat request: diff --git a/app/MindWork AI Studio/Provider/HuggingFace/ProviderHuggingFace.cs b/app/MindWork AI Studio/Provider/HuggingFace/ProviderHuggingFace.cs index 118545ed..12721d78 100644 --- a/app/MindWork AI Studio/Provider/HuggingFace/ProviderHuggingFace.cs +++ b/app/MindWork AI Studio/Provider/HuggingFace/ProviderHuggingFace.cs @@ -11,9 +11,11 @@ namespace AIStudio.Provider.HuggingFace; public sealed class ProviderHuggingFace : BaseProvider { - public ProviderHuggingFace(ILogger logger, HFInferenceProvider hfProvider, Model model) : base($"https://router.huggingface.co/{hfProvider.Endpoints(model)}", logger) + private static readonly ILogger LOGGER = Program.LOGGER_FACTORY.CreateLogger(); + + public ProviderHuggingFace(HFInferenceProvider hfProvider, Model model) : base($"https://router.huggingface.co/{hfProvider.Endpoints(model)}", LOGGER) { - logger.LogInformation($"We use the inferende provider '{hfProvider}'. Thus we use the base URL 'https://router.huggingface.co/{hfProvider.Endpoints(model)}'."); + LOGGER.LogInformation($"We use the inferende provider '{hfProvider}'. Thus we use the base URL 'https://router.huggingface.co/{hfProvider.Endpoints(model)}'."); } #region Implementation of IProvider @@ -36,7 +38,7 @@ public sealed class ProviderHuggingFace : BaseProvider var systemPrompt = new Message { Role = "system", - Content = chatThread.PrepareSystemPrompt(settingsManager, chatThread, this.logger), + Content = chatThread.PrepareSystemPrompt(settingsManager, chatThread), }; // Prepare the HuggingFace HTTP chat request: diff --git a/app/MindWork AI Studio/Provider/LLMProvidersExtensions.cs b/app/MindWork AI Studio/Provider/LLMProvidersExtensions.cs index ad9a8f2f..d095c937 100644 --- a/app/MindWork AI Studio/Provider/LLMProvidersExtensions.cs +++ b/app/MindWork AI Studio/Provider/LLMProvidersExtensions.cs @@ -21,6 +21,8 @@ namespace AIStudio.Provider; public static class LLMProvidersExtensions { + private static readonly ILogger LOGGER = Program.LOGGER_FACTORY.CreateLogger(nameof(LLMProvidersExtensions)); + private static string TB(string fallbackEN) => I18N.I.T(fallbackEN, typeof(LLMProvidersExtensions).Namespace, nameof(LLMProvidersExtensions)); /// @@ -139,54 +141,52 @@ public static class LLMProvidersExtensions /// Creates a new provider instance based on the provider value. /// /// The provider settings. - /// The logger to use. /// The provider instance. - public static IProvider CreateProvider(this AIStudio.Settings.Provider providerSettings, ILogger logger) + public static IProvider CreateProvider(this AIStudio.Settings.Provider providerSettings) { - return providerSettings.UsedLLMProvider.CreateProvider(providerSettings.InstanceName, providerSettings.Host, providerSettings.Hostname, providerSettings.Model, providerSettings.HFInferenceProvider ,logger); + return providerSettings.UsedLLMProvider.CreateProvider(providerSettings.InstanceName, providerSettings.Host, providerSettings.Hostname, providerSettings.Model, providerSettings.HFInferenceProvider); } /// /// Creates a new provider instance based on the embedding provider value. /// /// The embedding provider settings. - /// The logger to use. /// The provider instance. - public static IProvider CreateProvider(this EmbeddingProvider embeddingProviderSettings, ILogger logger) + public static IProvider CreateProvider(this EmbeddingProvider embeddingProviderSettings) { - return embeddingProviderSettings.UsedLLMProvider.CreateProvider(embeddingProviderSettings.Name, embeddingProviderSettings.Host, embeddingProviderSettings.Hostname, embeddingProviderSettings.Model, HFInferenceProvider.NONE,logger); + return embeddingProviderSettings.UsedLLMProvider.CreateProvider(embeddingProviderSettings.Name, embeddingProviderSettings.Host, embeddingProviderSettings.Hostname, embeddingProviderSettings.Model, HFInferenceProvider.NONE); } - private static IProvider CreateProvider(this LLMProviders provider, string instanceName, Host host, string hostname, Model model, HFInferenceProvider inferenceProvider , ILogger logger) + private static IProvider CreateProvider(this LLMProviders provider, string instanceName, Host host, string hostname, Model model, HFInferenceProvider inferenceProvider) { try { return provider switch { - LLMProviders.OPEN_AI => new ProviderOpenAI(logger) { InstanceName = instanceName }, - LLMProviders.ANTHROPIC => new ProviderAnthropic(logger) { InstanceName = instanceName }, - LLMProviders.MISTRAL => new ProviderMistral(logger) { InstanceName = instanceName }, - LLMProviders.GOOGLE => new ProviderGoogle(logger) { InstanceName = instanceName }, - LLMProviders.X => new ProviderX(logger) { InstanceName = instanceName }, - LLMProviders.DEEP_SEEK => new ProviderDeepSeek(logger) { InstanceName = instanceName }, - LLMProviders.ALIBABA_CLOUD => new ProviderAlibabaCloud(logger) { InstanceName = instanceName }, - LLMProviders.PERPLEXITY => new ProviderPerplexity(logger) { InstanceName = instanceName }, + LLMProviders.OPEN_AI => new ProviderOpenAI { InstanceName = instanceName }, + LLMProviders.ANTHROPIC => new ProviderAnthropic { InstanceName = instanceName }, + LLMProviders.MISTRAL => new ProviderMistral { InstanceName = instanceName }, + LLMProviders.GOOGLE => new ProviderGoogle { InstanceName = instanceName }, + LLMProviders.X => new ProviderX { InstanceName = instanceName }, + LLMProviders.DEEP_SEEK => new ProviderDeepSeek { InstanceName = instanceName }, + LLMProviders.ALIBABA_CLOUD => new ProviderAlibabaCloud { InstanceName = instanceName }, + LLMProviders.PERPLEXITY => new ProviderPerplexity { InstanceName = instanceName }, - LLMProviders.GROQ => new ProviderGroq(logger) { InstanceName = instanceName }, - LLMProviders.FIREWORKS => new ProviderFireworks(logger) { InstanceName = instanceName }, - LLMProviders.HUGGINGFACE => new ProviderHuggingFace(logger, inferenceProvider, model) { InstanceName = instanceName }, + LLMProviders.GROQ => new ProviderGroq { InstanceName = instanceName }, + LLMProviders.FIREWORKS => new ProviderFireworks { InstanceName = instanceName }, + LLMProviders.HUGGINGFACE => new ProviderHuggingFace(inferenceProvider, model) { InstanceName = instanceName }, - LLMProviders.SELF_HOSTED => new ProviderSelfHosted(logger, host, hostname) { InstanceName = instanceName }, + LLMProviders.SELF_HOSTED => new ProviderSelfHosted(host, hostname) { InstanceName = instanceName }, - LLMProviders.HELMHOLTZ => new ProviderHelmholtz(logger) { InstanceName = instanceName }, - LLMProviders.GWDG => new ProviderGWDG(logger) { InstanceName = instanceName }, + LLMProviders.HELMHOLTZ => new ProviderHelmholtz { InstanceName = instanceName }, + LLMProviders.GWDG => new ProviderGWDG { InstanceName = instanceName }, _ => new NoProvider(), }; } catch (Exception e) { - logger.LogError($"Failed to create provider: {e.Message}"); + LOGGER.LogError($"Failed to create provider: {e.Message}"); return new NoProvider(); } } diff --git a/app/MindWork AI Studio/Provider/Mistral/ProviderMistral.cs b/app/MindWork AI Studio/Provider/Mistral/ProviderMistral.cs index 2f1ece18..29b34d87 100644 --- a/app/MindWork AI Studio/Provider/Mistral/ProviderMistral.cs +++ b/app/MindWork AI Studio/Provider/Mistral/ProviderMistral.cs @@ -9,8 +9,10 @@ using AIStudio.Settings; namespace AIStudio.Provider.Mistral; -public sealed class ProviderMistral(ILogger logger) : BaseProvider("https://api.mistral.ai/v1/", logger) +public sealed class ProviderMistral() : BaseProvider("https://api.mistral.ai/v1/", LOGGER) { + private static readonly ILogger LOGGER = Program.LOGGER_FACTORY.CreateLogger(); + #region Implementation of IProvider public override string Id => LLMProviders.MISTRAL.ToName(); @@ -29,7 +31,7 @@ public sealed class ProviderMistral(ILogger logger) : BaseProvider("https://api. var systemPrompt = new RegularMessage { Role = "system", - Content = chatThread.PrepareSystemPrompt(settingsManager, chatThread, this.logger), + Content = chatThread.PrepareSystemPrompt(settingsManager, chatThread), }; // Prepare the Mistral HTTP chat request: diff --git a/app/MindWork AI Studio/Provider/OpenAI/ProviderOpenAI.cs b/app/MindWork AI Studio/Provider/OpenAI/ProviderOpenAI.cs index 1aad315b..406c1f53 100644 --- a/app/MindWork AI Studio/Provider/OpenAI/ProviderOpenAI.cs +++ b/app/MindWork AI Studio/Provider/OpenAI/ProviderOpenAI.cs @@ -11,8 +11,10 @@ namespace AIStudio.Provider.OpenAI; /// /// The OpenAI provider. /// -public sealed class ProviderOpenAI(ILogger logger) : BaseProvider("https://api.openai.com/v1/", logger) +public sealed class ProviderOpenAI() : BaseProvider("https://api.openai.com/v1/", LOGGER) { + private static readonly ILogger LOGGER = Program.LOGGER_FACTORY.CreateLogger(); + #region Implementation of IProvider /// @@ -65,13 +67,13 @@ public sealed class ProviderOpenAI(ILogger logger) : BaseProvider("https://api.o // Prepare the request path based on the API we are using: var requestPath = usingResponsesAPI ? "responses" : "chat/completions"; - this.logger.LogInformation("Using the system prompt role '{SystemPromptRole}' and the '{RequestPath}' API for model '{ChatModelId}'.", systemPromptRole, requestPath, chatModel.Id); + LOGGER.LogInformation("Using the system prompt role '{SystemPromptRole}' and the '{RequestPath}' API for model '{ChatModelId}'.", systemPromptRole, requestPath, chatModel.Id); // Prepare the system prompt: var systemPrompt = new Message { Role = systemPromptRole, - Content = chatThread.PrepareSystemPrompt(settingsManager, chatThread, this.logger), + Content = chatThread.PrepareSystemPrompt(settingsManager, chatThread), }; // diff --git a/app/MindWork AI Studio/Provider/Perplexity/ProviderPerplexity.cs b/app/MindWork AI Studio/Provider/Perplexity/ProviderPerplexity.cs index acc7b113..4c65e5f4 100644 --- a/app/MindWork AI Studio/Provider/Perplexity/ProviderPerplexity.cs +++ b/app/MindWork AI Studio/Provider/Perplexity/ProviderPerplexity.cs @@ -9,8 +9,10 @@ using AIStudio.Settings; namespace AIStudio.Provider.Perplexity; -public sealed class ProviderPerplexity(ILogger logger) : BaseProvider("https://api.perplexity.ai/", logger) +public sealed class ProviderPerplexity() : BaseProvider("https://api.perplexity.ai/", LOGGER) { + private static readonly ILogger LOGGER = Program.LOGGER_FACTORY.CreateLogger(); + private static readonly Model[] KNOWN_MODELS = [ new("sonar", "Sonar"), @@ -40,7 +42,7 @@ public sealed class ProviderPerplexity(ILogger logger) : BaseProvider("https://a var systemPrompt = new Message { Role = "system", - Content = chatThread.PrepareSystemPrompt(settingsManager, chatThread, this.logger), + Content = chatThread.PrepareSystemPrompt(settingsManager, chatThread), }; // Prepare the Perplexity HTTP chat request: diff --git a/app/MindWork AI Studio/Provider/SelfHosted/ProviderSelfHosted.cs b/app/MindWork AI Studio/Provider/SelfHosted/ProviderSelfHosted.cs index 2483ce90..df64be6b 100644 --- a/app/MindWork AI Studio/Provider/SelfHosted/ProviderSelfHosted.cs +++ b/app/MindWork AI Studio/Provider/SelfHosted/ProviderSelfHosted.cs @@ -9,8 +9,10 @@ using AIStudio.Settings; namespace AIStudio.Provider.SelfHosted; -public sealed class ProviderSelfHosted(ILogger logger, Host host, string hostname) : BaseProvider($"{hostname}{host.BaseURL()}", logger) +public sealed class ProviderSelfHosted(Host host, string hostname) : BaseProvider($"{hostname}{host.BaseURL()}", LOGGER) { + private static readonly ILogger LOGGER = Program.LOGGER_FACTORY.CreateLogger(); + #region Implementation of IProvider public override string Id => LLMProviders.SELF_HOSTED.ToName(); @@ -27,7 +29,7 @@ public sealed class ProviderSelfHosted(ILogger logger, Host host, string hostnam var systemPrompt = new Message { Role = "system", - Content = chatThread.PrepareSystemPrompt(settingsManager, chatThread, this.logger), + Content = chatThread.PrepareSystemPrompt(settingsManager, chatThread), }; // Prepare the OpenAI HTTP chat request: @@ -108,7 +110,7 @@ public sealed class ProviderSelfHosted(ILogger logger, Host host, string hostnam } catch(Exception e) { - this.logger.LogError($"Failed to load text models from self-hosted provider: {e.Message}"); + LOGGER.LogError($"Failed to load text models from self-hosted provider: {e.Message}"); return []; } } @@ -135,7 +137,7 @@ public sealed class ProviderSelfHosted(ILogger logger, Host host, string hostnam } catch(Exception e) { - this.logger.LogError($"Failed to load text models from self-hosted provider: {e.Message}"); + LOGGER.LogError($"Failed to load text models from self-hosted provider: {e.Message}"); return []; } } diff --git a/app/MindWork AI Studio/Provider/X/ProviderX.cs b/app/MindWork AI Studio/Provider/X/ProviderX.cs index b79a4ec6..d649eecd 100644 --- a/app/MindWork AI Studio/Provider/X/ProviderX.cs +++ b/app/MindWork AI Studio/Provider/X/ProviderX.cs @@ -9,8 +9,10 @@ using AIStudio.Settings; namespace AIStudio.Provider.X; -public sealed class ProviderX(ILogger logger) : BaseProvider("https://api.x.ai/v1/", logger) +public sealed class ProviderX() : BaseProvider("https://api.x.ai/v1/", LOGGER) { + private static readonly ILogger LOGGER = Program.LOGGER_FACTORY.CreateLogger(); + #region Implementation of IProvider /// @@ -31,7 +33,7 @@ public sealed class ProviderX(ILogger logger) : BaseProvider("https://api.x.ai/v var systemPrompt = new Message { Role = "system", - Content = chatThread.PrepareSystemPrompt(settingsManager, chatThread, this.logger), + Content = chatThread.PrepareSystemPrompt(settingsManager, chatThread), }; // Prepare the xAI HTTP chat request: diff --git a/app/MindWork AI Studio/Tools/Pandoc.cs b/app/MindWork AI Studio/Tools/Pandoc.cs index 3c12e618..94384df7 100644 --- a/app/MindWork AI Studio/Tools/Pandoc.cs +++ b/app/MindWork AI Studio/Tools/Pandoc.cs @@ -22,7 +22,7 @@ public static partial class Pandoc private const string DOWNLOAD_URL = "https://github.com/jgm/pandoc/releases/download"; private const string LATEST_URL = "https://github.com/jgm/pandoc/releases/latest"; - private static readonly ILogger LOG = Program.LOGGER_FACTORY.CreateLogger("Pandoc"); + private static readonly ILogger LOG = Program.LOGGER_FACTORY.CreateLogger(nameof(Pandoc)); private static readonly Version MINIMUM_REQUIRED_VERSION = new (3, 7, 0, 2); private static readonly Version FALLBACK_VERSION = new (3, 7, 0, 2);