import { describe, it, expect, vi } from "vitest"; import { createOpenAICompatibleModels, type OpenAICompatibleProvider, } from "./create-openai-compatiable"; // Mock the @ai-sdk/openai-compatible module vi.mock("@ai-sdk/openai-compatible", () => ({ createOpenAICompatible: vi.fn(() => vi.fn((apiName: string) => ({ apiName })), ), })); describe("createOpenAICompatibleModels", () => { it("should return empty providers and unsupportedModels when config is empty", () => { const result = createOpenAICompatibleModels([]); expect(result.providers).toEqual({}); expect(result.unsupportedModels.size).toBe(0); }); it("should return empty providers and unsupportedModels when config is undefined", () => { const result = createOpenAICompatibleModels(undefined as any); expect(result.providers).toEqual({}); expect(result.unsupportedModels.size).toBe(0); }); it("should create providers and models correctly", () => { const mockConfig: OpenAICompatibleProvider[] = [ { provider: "test-provider", apiKey: "TEST_API_KEY", baseUrl: "https://api.test.com/v1", models: [ { apiName: "test-model-1", uiName: "Test Model 1", supportsTools: true, }, { apiName: "test-model-2", uiName: "Test Model 2", supportsTools: false, }, ], }, ]; const result = createOpenAICompatibleModels(mockConfig); expect(result.providers).toHaveProperty("test-provider"); expect(result.providers["test-provider"]).toHaveProperty("Test Model 1"); expect(result.providers["test-provider"]).toHaveProperty("Test Model 2"); expect(result.unsupportedModels.size).toBe(1); }); it("should handle multiple providers", () => { const mockConfig: OpenAICompatibleProvider[] = [ { provider: "provider-1", apiKey: "API_KEY_1", baseUrl: "https://api1.test.com/v1", models: [ { apiName: "model-1", uiName: "Model 1", supportsTools: true, }, ], }, { provider: "provider-2", apiKey: "API_KEY_2", baseUrl: "https://api2.test.com/v1", models: [ { apiName: "model-2", uiName: "Model 2", supportsTools: false, }, ], }, ]; const result = createOpenAICompatibleModels(mockConfig); expect(result.providers).toHaveProperty("provider-1"); expect(result.providers).toHaveProperty("provider-2"); expect(result.providers["provider-1"]).toHaveProperty("Model 1"); expect(result.providers["provider-2"]).toHaveProperty("Model 2"); expect(result.unsupportedModels.size).toBe(1); }); it("should track unsupported models correctly", () => { const mockConfig: OpenAICompatibleProvider[] = [ { provider: "test-provider", apiKey: "TEST_API_KEY", baseUrl: "https://api.test.com/v1", models: [ { apiName: "supported-model", uiName: "Supported Model", supportsTools: true, }, { apiName: "unsupported-model-1", uiName: "Unsupported Model 1", supportsTools: false, }, { apiName: "unsupported-model-2", uiName: "Unsupported Model 2", supportsTools: false, }, ], }, ]; const result = createOpenAICompatibleModels(mockConfig); expect(result.providers["test-provider"]).toHaveProperty("Supported Model"); expect(result.providers["test-provider"]).toHaveProperty( "Unsupported Model 1", ); expect(result.providers["test-provider"]).toHaveProperty( "Unsupported Model 2", ); expect(result.unsupportedModels.size).toBe(2); }); it("should handle Azure OpenAI models with apiVersion parameter", () => { const mockConfig: OpenAICompatibleProvider[] = [ { provider: "Azure OpenAI", apiKey: "azure-key", baseUrl: "https://test.openai.azure.com/openai/deployments/", models: [ { apiName: "gpt-4o", uiName: "GPT-4o (Azure)", supportsTools: true, apiVersion: "2025-01-01-preview", }, { apiName: "gpt-35-turbo", uiName: "GPT-3.5 Turbo (Azure)", supportsTools: true, // Changed to true to avoid unsupported models apiVersion: "2024-02-01", }, ], }, ]; const result = createOpenAICompatibleModels(mockConfig); expect(result.providers).toHaveProperty("Azure OpenAI"); expect(result.providers["Azure OpenAI"]).toHaveProperty("GPT-4o (Azure)"); expect(result.providers["Azure OpenAI"]).toHaveProperty( "GPT-3.5 Turbo (Azure)", ); expect(result.unsupportedModels.size).toBe(0); }); it("should validate apiVersion is optional for non-Azure providers", () => { const mockConfig: OpenAICompatibleProvider[] = [ { provider: "OpenAI", apiKey: "openai-key", baseUrl: "https://api.openai.com/v1", models: [ { apiName: "gpt-4", uiName: "GPT-4", supportsTools: true, // No apiVersion - should still work }, ], }, ]; const result = createOpenAICompatibleModels(mockConfig); expect(result.providers).toHaveProperty("OpenAI"); expect(result.providers["OpenAI"]).toHaveProperty("GPT-4"); expect(result.unsupportedModels.size).toBe(0); }); });