From 1b22b439a706fb1afc73a4c0646eee500d976cdb Mon Sep 17 00:00:00 2001 From: Thorsten Sommer Date: Thu, 24 Apr 2025 12:44:48 +0200 Subject: [PATCH] Improve model selection by refining filters for non-text outputting models --- .../Provider/Google/ProviderGoogle.cs | 2 +- app/MindWork AI Studio/Provider/Groq/ProviderGroq.cs | 5 +++-- .../Provider/Mistral/ProviderMistral.cs | 5 +++-- .../Provider/OpenAI/ProviderOpenAI.cs | 11 ++++++++--- app/MindWork AI Studio/Provider/X/ProviderX.cs | 5 +++-- app/MindWork AI Studio/wwwroot/changelog/v0.9.41.md | 1 + 6 files changed, 19 insertions(+), 10 deletions(-) diff --git a/app/MindWork AI Studio/Provider/Google/ProviderGoogle.cs b/app/MindWork AI Studio/Provider/Google/ProviderGoogle.cs index 942cb245..d4a7dc65 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(ILogger logger) : BaseProvider("https://generativela return []; return modelResponse.Models.Where(model => - model.Name.StartsWith("models/gemini-", StringComparison.InvariantCultureIgnoreCase)) + model.Name.StartsWith("models/gemini-", StringComparison.OrdinalIgnoreCase)) .Select(n => new Provider.Model(n.Name.Replace("models/", string.Empty), n.DisplayName)); } diff --git a/app/MindWork AI Studio/Provider/Groq/ProviderGroq.cs b/app/MindWork AI Studio/Provider/Groq/ProviderGroq.cs index f32a31b5..ddf5c002 100644 --- a/app/MindWork AI Studio/Provider/Groq/ProviderGroq.cs +++ b/app/MindWork AI Studio/Provider/Groq/ProviderGroq.cs @@ -136,7 +136,8 @@ public class ProviderGroq(ILogger logger) : BaseProvider("https://api.groq.com/o var modelResponse = await response.Content.ReadFromJsonAsync(token); return modelResponse.Data.Where(n => - !n.Id.StartsWith("whisper-", StringComparison.InvariantCultureIgnoreCase) && - !n.Id.StartsWith("distil-", StringComparison.InvariantCultureIgnoreCase)); + !n.Id.StartsWith("whisper-", StringComparison.OrdinalIgnoreCase) && + !n.Id.StartsWith("distil-", StringComparison.OrdinalIgnoreCase) && + !n.Id.Contains("-tts", StringComparison.OrdinalIgnoreCase)); } } \ No newline at end of file diff --git a/app/MindWork AI Studio/Provider/Mistral/ProviderMistral.cs b/app/MindWork AI Studio/Provider/Mistral/ProviderMistral.cs index 024f60d3..1039ab45 100644 --- a/app/MindWork AI Studio/Provider/Mistral/ProviderMistral.cs +++ b/app/MindWork AI Studio/Provider/Mistral/ProviderMistral.cs @@ -99,8 +99,9 @@ public sealed class ProviderMistral(ILogger logger) : BaseProvider("https://api. return []; return modelResponse.Data.Where(n => - !n.Id.StartsWith("code", StringComparison.InvariantCulture) && - !n.Id.Contains("embed", StringComparison.InvariantCulture)) + !n.Id.StartsWith("code", StringComparison.OrdinalIgnoreCase) && + !n.Id.Contains("embed", StringComparison.OrdinalIgnoreCase) && + !n.Id.Contains("moderation", StringComparison.OrdinalIgnoreCase)) .Select(n => new Provider.Model(n.Id, null)); } diff --git a/app/MindWork AI Studio/Provider/OpenAI/ProviderOpenAI.cs b/app/MindWork AI Studio/Provider/OpenAI/ProviderOpenAI.cs index b45bb16a..bc70ecb8 100644 --- a/app/MindWork AI Studio/Provider/OpenAI/ProviderOpenAI.cs +++ b/app/MindWork AI Studio/Provider/OpenAI/ProviderOpenAI.cs @@ -120,15 +120,20 @@ public sealed class ProviderOpenAI(ILogger logger) : BaseProvider("https://api.o #pragma warning restore CS1998 // Async method lacks 'await' operators and will run synchronously /// - public override Task> GetTextModels(string? apiKeyProvisional = null, CancellationToken token = default) + public override async Task> GetTextModels(string? apiKeyProvisional = null, CancellationToken token = default) { - return this.LoadModels(["gpt-", "o1-", "o3-", "o4-"], token, apiKeyProvisional); + var models = await this.LoadModels(["gpt-", "o1-", "o3-", "o4-"], token, apiKeyProvisional); + return models.Where(model => !model.Id.Contains("image", StringComparison.OrdinalIgnoreCase) && + !model.Id.Contains("realtime", StringComparison.OrdinalIgnoreCase) && + !model.Id.Contains("audio", StringComparison.OrdinalIgnoreCase) && + !model.Id.Contains("tts", StringComparison.OrdinalIgnoreCase) && + !model.Id.Contains("transcribe", StringComparison.OrdinalIgnoreCase)); } /// public override Task> GetImageModels(string? apiKeyProvisional = null, CancellationToken token = default) { - return this.LoadModels(["dall-e-"], token, apiKeyProvisional); + return this.LoadModels(["dall-e-", "gpt-image"], token, apiKeyProvisional); } /// diff --git a/app/MindWork AI Studio/Provider/X/ProviderX.cs b/app/MindWork AI Studio/Provider/X/ProviderX.cs index a8334c8d..0292a501 100644 --- a/app/MindWork AI Studio/Provider/X/ProviderX.cs +++ b/app/MindWork AI Studio/Provider/X/ProviderX.cs @@ -93,9 +93,10 @@ public sealed class ProviderX(ILogger logger) : BaseProvider("https://api.x.ai/v #pragma warning restore CS1998 // Async method lacks 'await' operators and will run synchronously /// - public override Task> GetTextModels(string? apiKeyProvisional = null, CancellationToken token = default) + public override async Task> GetTextModels(string? apiKeyProvisional = null, CancellationToken token = default) { - return this.LoadModels(["grok-"], token, apiKeyProvisional); + var models = await this.LoadModels(["grok-"], token, apiKeyProvisional); + return models.Where(n => !n.Id.Contains("-image", StringComparison.OrdinalIgnoreCase)); } /// diff --git a/app/MindWork AI Studio/wwwroot/changelog/v0.9.41.md b/app/MindWork AI Studio/wwwroot/changelog/v0.9.41.md index 83a0358e..2e5fb449 100644 --- a/app/MindWork AI Studio/wwwroot/changelog/v0.9.41.md +++ b/app/MindWork AI Studio/wwwroot/changelog/v0.9.41.md @@ -4,4 +4,5 @@ - Improved the hot reloading of the plugin system to prevent overlapping reloads. - Improved the app behavior when the user system was waked up from sleep mode. - Improved the provider dialog with better input handling for API keys and an optimized model selection. +- Improved provider's model selection by filtering added non-text outputting models, which are not supported yet. - Fixed the color for the update notification button to match the color theme. \ No newline at end of file