diff --git a/app/MindWork AI Studio/Provider/OpenRouter/OpenRouterModel.cs b/app/MindWork AI Studio/Provider/OpenRouter/OpenRouterModel.cs new file mode 100644 index 00000000..7cd47a59 --- /dev/null +++ b/app/MindWork AI Studio/Provider/OpenRouter/OpenRouterModel.cs @@ -0,0 +1,8 @@ +namespace AIStudio.Provider.OpenRouter; + +/// +/// A data model for an OpenRouter model from the API. +/// +/// The model's ID. +/// The model's human-readable display name. +public readonly record struct OpenRouterModel(string Id, string? Name); diff --git a/app/MindWork AI Studio/Provider/OpenRouter/OpenRouterModelsResponse.cs b/app/MindWork AI Studio/Provider/OpenRouter/OpenRouterModelsResponse.cs new file mode 100644 index 00000000..0680c4e6 --- /dev/null +++ b/app/MindWork AI Studio/Provider/OpenRouter/OpenRouterModelsResponse.cs @@ -0,0 +1,7 @@ +namespace AIStudio.Provider.OpenRouter; + +/// +/// A data model for the response from the OpenRouter models endpoint. +/// +/// The list of models. +public readonly record struct OpenRouterModelsResponse(IList Data); diff --git a/app/MindWork AI Studio/Provider/OpenRouter/ProviderOpenRouter.cs b/app/MindWork AI Studio/Provider/OpenRouter/ProviderOpenRouter.cs index 4c33f606..e2014adc 100644 --- a/app/MindWork AI Studio/Provider/OpenRouter/ProviderOpenRouter.cs +++ b/app/MindWork AI Studio/Provider/OpenRouter/ProviderOpenRouter.cs @@ -149,17 +149,19 @@ public sealed class ProviderOpenRouter() : BaseProvider("https://openrouter.ai/a if(!response.IsSuccessStatusCode) return []; - var modelResponse = await response.Content.ReadFromJsonAsync(token); + var modelResponse = await response.Content.ReadFromJsonAsync(token); - // Filter out non-text models (image, audio, embedding models) - return modelResponse.Data.Where(n => - !n.Id.Contains("whisper", StringComparison.OrdinalIgnoreCase) && - !n.Id.Contains("dall-e", StringComparison.OrdinalIgnoreCase) && - !n.Id.Contains("tts", StringComparison.OrdinalIgnoreCase) && - !n.Id.Contains("embedding", StringComparison.OrdinalIgnoreCase) && - !n.Id.Contains("moderation", StringComparison.OrdinalIgnoreCase) && - !n.Id.Contains("stable-diffusion", StringComparison.OrdinalIgnoreCase) && - !n.Id.Contains("flux", StringComparison.OrdinalIgnoreCase) && - !n.Id.Contains("midjourney", StringComparison.OrdinalIgnoreCase)); + // Filter out non-text models (image, audio, embedding models) and convert to Model + return modelResponse.Data + .Where(n => + !n.Id.Contains("whisper", StringComparison.OrdinalIgnoreCase) && + !n.Id.Contains("dall-e", StringComparison.OrdinalIgnoreCase) && + !n.Id.Contains("tts", StringComparison.OrdinalIgnoreCase) && + !n.Id.Contains("embedding", StringComparison.OrdinalIgnoreCase) && + !n.Id.Contains("moderation", StringComparison.OrdinalIgnoreCase) && + !n.Id.Contains("stable-diffusion", StringComparison.OrdinalIgnoreCase) && + !n.Id.Contains("flux", StringComparison.OrdinalIgnoreCase) && + !n.Id.Contains("midjourney", StringComparison.OrdinalIgnoreCase)) + .Select(n => new Model(n.Id, n.Name)); } }