diff --git a/app/MindWork AI Studio/Provider/Google/Model.cs b/app/MindWork AI Studio/Provider/Google/Model.cs deleted file mode 100644 index f1a53282..00000000 --- a/app/MindWork AI Studio/Provider/Google/Model.cs +++ /dev/null @@ -1,3 +0,0 @@ -namespace AIStudio.Provider.Google; - -public readonly record struct Model(string Name, string DisplayName); \ No newline at end of file diff --git a/app/MindWork AI Studio/Provider/Google/ModelsResponse.cs b/app/MindWork AI Studio/Provider/Google/ModelsResponse.cs deleted file mode 100644 index 01cb81f9..00000000 --- a/app/MindWork AI Studio/Provider/Google/ModelsResponse.cs +++ /dev/null @@ -1,7 +0,0 @@ -namespace AIStudio.Provider.Google; - -/// -/// A data model for the response from the model endpoint. -/// -/// -public readonly record struct ModelsResponse(IList Models); \ No newline at end of file diff --git a/app/MindWork AI Studio/Provider/Google/ProviderGoogle.cs b/app/MindWork AI Studio/Provider/Google/ProviderGoogle.cs index eba53dce..9509a32c 100644 --- a/app/MindWork AI Studio/Provider/Google/ProviderGoogle.cs +++ b/app/MindWork AI Studio/Provider/Google/ProviderGoogle.cs @@ -260,6 +260,45 @@ public class ProviderGoogle() : BaseProvider(LLMProviders.GOOGLE, "https://gener private sealed record GoogleEmbeddingResponse { public List? Embedding { get; set; } + try + { + var modelResponse = await response.Content.ReadFromJsonAsync(token); + if (modelResponse == default || modelResponse.Data.Count is 0) + { + LOGGER.LogError("Google model list response did not contain a valid data array."); + return []; + } + + return modelResponse.Data + .Where(model => !string.IsNullOrWhiteSpace(model.Id)) + .Select(model => new Model(this.NormalizeModelId(model.Id), model.DisplayName)) + .ToArray(); + } + catch (Exception e) + { + LOGGER.LogError("Failed to parse Google model list response: '{Message}'.", e.Message); + return []; + } + } + + private bool IsEmbeddingModel(string modelId) + { + return modelId.Contains("embedding", StringComparison.OrdinalIgnoreCase) || + modelId.Contains("embed", StringComparison.OrdinalIgnoreCase); + } + + private Model WithDisplayNameFallback(Model model) + { + return string.IsNullOrWhiteSpace(model.DisplayName) + ? new Model(model.Id, model.Id) + : model; + } + + private string NormalizeModelId(string modelId) + { + return modelId.StartsWith("models/", StringComparison.OrdinalIgnoreCase) + ? modelId["models/".Length..] + : modelId; } private sealed record GoogleEmbedding