using BuildFlow.Application.AiModel.Services; using Xunit; namespace BuildFlow.Rag.Tests; /// /// AI 模型目录测试。覆盖主流渠道预设、本地模型类型识别和 Models.dev 目录解析。 /// public class AiModelCatalogTests { [Fact] public void GetProviderPresetsShouldIncludeMainstreamProvidersAndDeepSeek() { var providers = AiModelCatalogNormalizer.GetProviderPresets(); Assert.Contains(providers, p => p.Provider == 3 && p.Key == "deepseek" && p.BaseUrl == "https://api.deepseek.com/v1"); Assert.Contains(providers, p => p.Provider == 4 && p.Key == "anthropic"); Assert.Contains(providers, p => p.Provider == 5 && p.Key == "google"); Assert.Contains(providers, p => p.Provider == 6 && p.Key == "openrouter"); Assert.Contains(providers, p => p.Provider == 1 && p.Key == "lmstudio" && p.BaseUrl == "http://localhost:1234/v1"); } [Theory] [InlineData("text-embedding-3-large", 1)] [InlineData("nomic-embed-text-v1.5", 1)] [InlineData("bge-m3", 1)] [InlineData("qwen2.5-7b-instruct", 0)] [InlineData("deepseek-chat", 0)] public void GuessModelTypeShouldDetectEmbeddingModels(string modelId, int expectedType) { Assert.Equal(expectedType, AiModelCatalogNormalizer.GuessModelType(modelId)); } [Fact] public void ParseModelsDevApiShouldNormalizeProviderModels() { const string json = """ { "deepseek": { "id": "deepseek", "name": "DeepSeek", "api": "https://api.deepseek.com/v1", "models": { "deepseek-chat": { "id": "deepseek-chat", "name": "DeepSeek Chat", "description": "General chat model", "release_date": "2025-01-15", "limit": { "context": 64000, "output": 8000 } }, "deepseek-embedding": { "id": "deepseek-embedding", "name": "DeepSeek Embedding" } } } } """; var result = AiModelCatalogNormalizer.ParseModelsDevApi(json); Assert.Single(result.Providers); Assert.Equal("deepseek", result.Providers[0].Key); Assert.Equal("DeepSeek", result.Providers[0].Label); Assert.Equal("https://api.deepseek.com/v1", result.Providers[0].BaseUrl); Assert.Contains("OpenCode", result.Source); Assert.Equal(2, result.Models.Count); Assert.Contains(result.Models, m => m.ProviderKey == "deepseek" && m.ModelId == "deepseek-chat" && m.ModelType == 0); Assert.Contains(result.Models, m => m.ProviderKey == "deepseek" && m.ModelId == "deepseek-embedding" && m.ModelType == 1); } }