From f4eb78159c48f54837ebff82e60354d999a40344 Mon Sep 17 00:00:00 2001 From: Thorsten Sommer Date: Fri, 20 Feb 2026 15:20:47 +0100 Subject: [PATCH] Using modern C# --- .../AlibabaCloud/ProviderAlibabaCloud.cs | 2 +- .../Provider/Anthropic/ProviderAnthropic.cs | 4 ++-- app/MindWork AI Studio/Provider/BaseProvider.cs | 13 ++++++------- .../Provider/DeepSeek/ProviderDeepSeek.cs | 4 ++-- .../Provider/Fireworks/ProviderFireworks.cs | 4 ++-- .../Provider/GWDG/ProviderGWDG.cs | 4 ++-- .../Provider/Google/ProviderGoogle.cs | 16 ++++++++-------- .../Provider/Groq/ProviderGroq.cs | 4 ++-- .../Provider/Helmholtz/ProviderHelmholtz.cs | 2 +- .../Provider/HuggingFace/ProviderHuggingFace.cs | 4 ++-- app/MindWork AI Studio/Provider/NoProvider.cs | 2 +- .../Provider/OpenAI/ProviderOpenAI.cs | 2 +- .../Provider/OpenRouter/ProviderOpenRouter.cs | 2 +- .../Provider/Perplexity/ProviderPerplexity.cs | 4 ++-- app/MindWork AI Studio/Provider/X/ProviderX.cs | 4 ++-- 15 files changed, 35 insertions(+), 36 deletions(-) diff --git a/app/MindWork AI Studio/Provider/AlibabaCloud/ProviderAlibabaCloud.cs b/app/MindWork AI Studio/Provider/AlibabaCloud/ProviderAlibabaCloud.cs index d39351b2..3535809d 100644 --- a/app/MindWork AI Studio/Provider/AlibabaCloud/ProviderAlibabaCloud.cs +++ b/app/MindWork AI Studio/Provider/AlibabaCloud/ProviderAlibabaCloud.cs @@ -88,7 +88,7 @@ public sealed class ProviderAlibabaCloud() : BaseProvider(LLMProviders.ALIBABA_C } /// - public override async Task>> EmbedTextAsync(Provider.Model embeddingModel, SettingsManager settingsManager, CancellationToken token = default, params List texts) + public override async Task>> EmbedTextAsync(Model embeddingModel, SettingsManager settingsManager, CancellationToken token = default, params List texts) { var requestedSecret = await RUST_SERVICE.GetAPIKey(this, SecretStoreType.EMBEDDING_PROVIDER); return await this.PerformStandardTextEmbeddingRequest(requestedSecret, embeddingModel, token: token, texts: texts); diff --git a/app/MindWork AI Studio/Provider/Anthropic/ProviderAnthropic.cs b/app/MindWork AI Studio/Provider/Anthropic/ProviderAnthropic.cs index 533670ad..5eb8fe2b 100644 --- a/app/MindWork AI Studio/Provider/Anthropic/ProviderAnthropic.cs +++ b/app/MindWork AI Studio/Provider/Anthropic/ProviderAnthropic.cs @@ -115,9 +115,9 @@ public sealed class ProviderAnthropic() : BaseProvider(LLMProviders.ANTHROPIC, " } /// - public override Task>> EmbedTextAsync(Provider.Model embeddingModel, SettingsManager settingsManager, CancellationToken token = default, params List texts) + public override Task>> EmbedTextAsync(Model embeddingModel, SettingsManager settingsManager, CancellationToken token = default, params List texts) { - return Task.FromResult>>(Array.Empty>()); + return Task.FromResult>>([]); } /// diff --git a/app/MindWork AI Studio/Provider/BaseProvider.cs b/app/MindWork AI Studio/Provider/BaseProvider.cs index 49ac2fee..4acefc62 100644 --- a/app/MindWork AI Studio/Provider/BaseProvider.cs +++ b/app/MindWork AI Studio/Provider/BaseProvider.cs @@ -668,8 +668,8 @@ public abstract class BaseProvider : IProvider, ISecretId input = texts, encoding_format = "float" }; + var embeddingRequest = JsonSerializer.Serialize(payload, JSON_SERIALIZER_OPTIONS); - using var request = new HttpRequestMessage(HttpMethod.Post, host.EmbeddingURL()); // Handle the authorization header based on the provider: @@ -685,7 +685,7 @@ public abstract class BaseProvider : IProvider, ISecretId if(!requestedSecret.Success) { this.logger.LogError("No valid API key available for embedding request."); - return Array.Empty>(); + return []; } request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", await requestedSecret.Secret.Decrypt(ENCRYPTION)); @@ -694,34 +694,33 @@ public abstract class BaseProvider : IProvider, ISecretId // Set the content: request.Content = new StringContent(embeddingRequest, Encoding.UTF8, "application/json"); - using var response = await this.httpClient.SendAsync(request, token); var responseBody = response.Content.ReadAsStringAsync(token).Result; if (!response.IsSuccessStatusCode) { this.logger.LogError("Embedding request failed with status code {ResponseStatusCode} and body: '{ResponseBody}'.", response.StatusCode, responseBody); - return Array.Empty>(); + return []; } var embeddingResponse = JsonSerializer.Deserialize(responseBody, JSON_SERIALIZER_OPTIONS); if (embeddingResponse is { Data: not null }) { return embeddingResponse.Data - .Select(d => d.Embedding?.ToArray() ?? Array.Empty()) + .Select(d => d.Embedding?.ToArray() ?? []) .Cast>() .ToArray(); } else { this.logger.LogError("Was not able to deserialize the embedding response."); - return Array.Empty>(); + return []; } } catch (Exception e) { this.logger.LogError("Failed to perform embedding request: '{Message}'.", e.Message); - return Array.Empty>(); + return []; } } diff --git a/app/MindWork AI Studio/Provider/DeepSeek/ProviderDeepSeek.cs b/app/MindWork AI Studio/Provider/DeepSeek/ProviderDeepSeek.cs index ce86ef68..e1ae306a 100644 --- a/app/MindWork AI Studio/Provider/DeepSeek/ProviderDeepSeek.cs +++ b/app/MindWork AI Studio/Provider/DeepSeek/ProviderDeepSeek.cs @@ -88,9 +88,9 @@ public sealed class ProviderDeepSeek() : BaseProvider(LLMProviders.DEEP_SEEK, "h } /// - public override Task>> EmbedTextAsync(Provider.Model embeddingModel, SettingsManager settingsManager, CancellationToken token = default, params List texts) + public override Task>> EmbedTextAsync(Model embeddingModel, SettingsManager settingsManager, CancellationToken token = default, params List texts) { - return Task.FromResult>>(Array.Empty>()); + return Task.FromResult>>([]); } /// diff --git a/app/MindWork AI Studio/Provider/Fireworks/ProviderFireworks.cs b/app/MindWork AI Studio/Provider/Fireworks/ProviderFireworks.cs index cd7a5abd..2254b7ad 100644 --- a/app/MindWork AI Studio/Provider/Fireworks/ProviderFireworks.cs +++ b/app/MindWork AI Studio/Provider/Fireworks/ProviderFireworks.cs @@ -90,9 +90,9 @@ public class ProviderFireworks() : BaseProvider(LLMProviders.FIREWORKS, "https:/ } /// - public override Task>> EmbedTextAsync(Provider.Model embeddingModel, SettingsManager settingsManager, CancellationToken token = default, params List texts) + public override Task>> EmbedTextAsync(Model embeddingModel, SettingsManager settingsManager, CancellationToken token = default, params List texts) { - return Task.FromResult>>(Array.Empty>()); + return Task.FromResult>>([]); } /// diff --git a/app/MindWork AI Studio/Provider/GWDG/ProviderGWDG.cs b/app/MindWork AI Studio/Provider/GWDG/ProviderGWDG.cs index 784faa45..41e19fa9 100644 --- a/app/MindWork AI Studio/Provider/GWDG/ProviderGWDG.cs +++ b/app/MindWork AI Studio/Provider/GWDG/ProviderGWDG.cs @@ -89,9 +89,9 @@ public sealed class ProviderGWDG() : BaseProvider(LLMProviders.GWDG, "https://ch } /// - public override Task>> EmbedTextAsync(Provider.Model embeddingModel, SettingsManager settingsManager, CancellationToken token = default, params List texts) + public override Task>> EmbedTextAsync(Model embeddingModel, SettingsManager settingsManager, CancellationToken token = default, params List texts) { - return Task.FromResult>>(Array.Empty>()); + return Task.FromResult>>([]); } /// diff --git a/app/MindWork AI Studio/Provider/Google/ProviderGoogle.cs b/app/MindWork AI Studio/Provider/Google/ProviderGoogle.cs index d7ab9c86..8a86fcbe 100644 --- a/app/MindWork AI Studio/Provider/Google/ProviderGoogle.cs +++ b/app/MindWork AI Studio/Provider/Google/ProviderGoogle.cs @@ -98,7 +98,7 @@ public class ProviderGoogle() : BaseProvider(LLMProviders.GOOGLE, "https://gener if (string.IsNullOrWhiteSpace(modelName)) { LOGGER.LogError("No model name provided for embedding request."); - return Array.Empty>(); + return []; } if (modelName.StartsWith("models/", StringComparison.OrdinalIgnoreCase)) @@ -107,7 +107,7 @@ public class ProviderGoogle() : BaseProvider(LLMProviders.GOOGLE, "https://gener if (!requestedSecret.Success) { LOGGER.LogError("No valid API key available for embedding request."); - return Array.Empty>(); + return []; } // Prepare the Google Gemini embedding request: @@ -117,10 +117,11 @@ public class ProviderGoogle() : BaseProvider(LLMProviders.GOOGLE, "https://gener { parts = texts.Select(text => new { text }).ToArray() }, + taskType = "SEMANTIC_SIMILARITY" }; + var embeddingRequest = JsonSerializer.Serialize(payload, JSON_SERIALIZER_OPTIONS); - var embedUrl = $"https://generativelanguage.googleapis.com/v1beta/models/{modelName}:embedContent"; using var request = new HttpRequestMessage(HttpMethod.Post, embedUrl); request.Headers.Add("x-goog-api-key", await requestedSecret.Secret.Decrypt(ENCRYPTION)); @@ -134,29 +135,28 @@ public class ProviderGoogle() : BaseProvider(LLMProviders.GOOGLE, "https://gener if (!response.IsSuccessStatusCode) { LOGGER.LogError("Embedding request failed with status code {ResponseStatusCode} and body: '{ResponseBody}'.", response.StatusCode, responseBody); - return Array.Empty>(); + return []; } var embeddingResponse = JsonSerializer.Deserialize(responseBody, JSON_SERIALIZER_OPTIONS); - if (embeddingResponse is { Embedding: not null }) { return embeddingResponse.Embedding - .Select(d => d.Values?.ToArray() ?? Array.Empty()) + .Select(d => d.Values?.ToArray() ?? []) .Cast>() .ToArray(); } else { LOGGER.LogError("Was not able to deserialize the embedding response."); - return Array.Empty>(); + return []; } } catch (Exception e) { LOGGER.LogError("Failed to perform embedding request: '{Message}'.", e.Message); - return Array.Empty>(); + return []; } } diff --git a/app/MindWork AI Studio/Provider/Groq/ProviderGroq.cs b/app/MindWork AI Studio/Provider/Groq/ProviderGroq.cs index 1802150b..8f938667 100644 --- a/app/MindWork AI Studio/Provider/Groq/ProviderGroq.cs +++ b/app/MindWork AI Studio/Provider/Groq/ProviderGroq.cs @@ -89,9 +89,9 @@ public class ProviderGroq() : BaseProvider(LLMProviders.GROQ, "https://api.groq. } /// - public override Task>> EmbedTextAsync(Provider.Model embeddingModel, SettingsManager settingsManager, CancellationToken token = default, params List texts) + public override Task>> EmbedTextAsync(Model embeddingModel, SettingsManager settingsManager, CancellationToken token = default, params List texts) { - return Task.FromResult>>(Array.Empty>()); + return Task.FromResult>>([]); } /// diff --git a/app/MindWork AI Studio/Provider/Helmholtz/ProviderHelmholtz.cs b/app/MindWork AI Studio/Provider/Helmholtz/ProviderHelmholtz.cs index 3df909c0..070597a3 100644 --- a/app/MindWork AI Studio/Provider/Helmholtz/ProviderHelmholtz.cs +++ b/app/MindWork AI Studio/Provider/Helmholtz/ProviderHelmholtz.cs @@ -88,7 +88,7 @@ public sealed class ProviderHelmholtz() : BaseProvider(LLMProviders.HELMHOLTZ, " } /// - public override async Task>> EmbedTextAsync(Provider.Model embeddingModel, SettingsManager settingsManager, CancellationToken token = default, params List texts) + public override async Task>> EmbedTextAsync(Model embeddingModel, SettingsManager settingsManager, CancellationToken token = default, params List texts) { var requestedSecret = await RUST_SERVICE.GetAPIKey(this, SecretStoreType.EMBEDDING_PROVIDER); return await this.PerformStandardTextEmbeddingRequest(requestedSecret, embeddingModel, token: token, texts: texts); diff --git a/app/MindWork AI Studio/Provider/HuggingFace/ProviderHuggingFace.cs b/app/MindWork AI Studio/Provider/HuggingFace/ProviderHuggingFace.cs index 47db58e8..f2e8c380 100644 --- a/app/MindWork AI Studio/Provider/HuggingFace/ProviderHuggingFace.cs +++ b/app/MindWork AI Studio/Provider/HuggingFace/ProviderHuggingFace.cs @@ -93,9 +93,9 @@ public sealed class ProviderHuggingFace : BaseProvider } /// - public override Task>> EmbedTextAsync(Provider.Model embeddingModel, SettingsManager settingsManager, CancellationToken token = default, params List texts) + public override Task>> EmbedTextAsync(Model embeddingModel, SettingsManager settingsManager, CancellationToken token = default, params List texts) { - return Task.FromResult>>(Array.Empty>()); + return Task.FromResult>>([]); } /// diff --git a/app/MindWork AI Studio/Provider/NoProvider.cs b/app/MindWork AI Studio/Provider/NoProvider.cs index cb24e0fa..3fc8459c 100644 --- a/app/MindWork AI Studio/Provider/NoProvider.cs +++ b/app/MindWork AI Studio/Provider/NoProvider.cs @@ -40,7 +40,7 @@ public class NoProvider : IProvider public Task TranscribeAudioAsync(Model transcriptionModel, string audioFilePath, SettingsManager settingsManager, CancellationToken token = default) => Task.FromResult(string.Empty); - public Task>> EmbedTextAsync(Model embeddingModel, SettingsManager settingsManager, CancellationToken token = default, params List texts) => Task.FromResult>>(Array.Empty>()); + public Task>> EmbedTextAsync(Model embeddingModel, SettingsManager settingsManager, CancellationToken token = default, params List texts) => Task.FromResult>>([]); public IReadOnlyCollection GetModelCapabilities(Model model) => [ Capability.NONE ]; diff --git a/app/MindWork AI Studio/Provider/OpenAI/ProviderOpenAI.cs b/app/MindWork AI Studio/Provider/OpenAI/ProviderOpenAI.cs index 90194ed7..e5b6ebfd 100644 --- a/app/MindWork AI Studio/Provider/OpenAI/ProviderOpenAI.cs +++ b/app/MindWork AI Studio/Provider/OpenAI/ProviderOpenAI.cs @@ -226,7 +226,7 @@ public sealed class ProviderOpenAI() : BaseProvider(LLMProviders.OPEN_AI, "https } /// - public override async Task>> EmbedTextAsync(Provider.Model embeddingModel, SettingsManager settingsManager, CancellationToken token = default, params List texts) + public override async Task>> EmbedTextAsync(Model embeddingModel, SettingsManager settingsManager, CancellationToken token = default, params List texts) { var requestedSecret = await RUST_SERVICE.GetAPIKey(this, SecretStoreType.EMBEDDING_PROVIDER); return await this.PerformStandardTextEmbeddingRequest(requestedSecret, embeddingModel, token: token, texts: texts); diff --git a/app/MindWork AI Studio/Provider/OpenRouter/ProviderOpenRouter.cs b/app/MindWork AI Studio/Provider/OpenRouter/ProviderOpenRouter.cs index 444703c5..4995cca9 100644 --- a/app/MindWork AI Studio/Provider/OpenRouter/ProviderOpenRouter.cs +++ b/app/MindWork AI Studio/Provider/OpenRouter/ProviderOpenRouter.cs @@ -96,7 +96,7 @@ public sealed class ProviderOpenRouter() : BaseProvider(LLMProviders.OPEN_ROUTER } /// - public override async Task>> EmbedTextAsync(Provider.Model embeddingModel, SettingsManager settingsManager, CancellationToken token = default, params List texts) + public override async Task>> EmbedTextAsync(Model embeddingModel, SettingsManager settingsManager, CancellationToken token = default, params List texts) { var requestedSecret = await RUST_SERVICE.GetAPIKey(this, SecretStoreType.EMBEDDING_PROVIDER); return await this.PerformStandardTextEmbeddingRequest(requestedSecret, embeddingModel, token: token, texts: texts); diff --git a/app/MindWork AI Studio/Provider/Perplexity/ProviderPerplexity.cs b/app/MindWork AI Studio/Provider/Perplexity/ProviderPerplexity.cs index 804c8334..4c73dc2d 100644 --- a/app/MindWork AI Studio/Provider/Perplexity/ProviderPerplexity.cs +++ b/app/MindWork AI Studio/Provider/Perplexity/ProviderPerplexity.cs @@ -96,9 +96,9 @@ public sealed class ProviderPerplexity() : BaseProvider(LLMProviders.PERPLEXITY, } /// - public override Task>> EmbedTextAsync(Provider.Model embeddingModel, SettingsManager settingsManager, CancellationToken token = default, params List texts) + public override Task>> EmbedTextAsync(Model embeddingModel, SettingsManager settingsManager, CancellationToken token = default, params List texts) { - return Task.FromResult>>(Array.Empty>()); + return Task.FromResult>>([]); } /// diff --git a/app/MindWork AI Studio/Provider/X/ProviderX.cs b/app/MindWork AI Studio/Provider/X/ProviderX.cs index 22abaef0..21d6e2ca 100644 --- a/app/MindWork AI Studio/Provider/X/ProviderX.cs +++ b/app/MindWork AI Studio/Provider/X/ProviderX.cs @@ -89,9 +89,9 @@ public sealed class ProviderX() : BaseProvider(LLMProviders.X, "https://api.x.ai } /// - public override Task>> EmbedTextAsync(Provider.Model embeddingModel, SettingsManager settingsManager, CancellationToken token = default, params List texts) + public override Task>> EmbedTextAsync(Model embeddingModel, SettingsManager settingsManager, CancellationToken token = default, params List texts) { - return Task.FromResult>>(Array.Empty>()); + return Task.FromResult>>([]); } ///