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));
}
}