import { describe, expect, it } from 'vitest' import { AI_PROVIDER_FAMILY_META, AI_PROVIDER_FAMILY_ORDER, AI_PROVIDER_PRESETS, createProviderFromPreset, presetsByFamily, resolveProviderFamily, } from '../../src/ai/providerPresets' describe('AI provider presets grouping', () => { it('matches the expected UI group order', () => { expect(AI_PROVIDER_FAMILY_ORDER).toEqual([ 'openai_compatible', 'standalone', 'plan', 'local', 'custom', ]) expect(AI_PROVIDER_FAMILY_META.openai_compatible.label).toBe('OpenAI compatible') expect(AI_PROVIDER_FAMILY_META.plan.label).toBe('Subscription plans') expect(AI_PROVIDER_FAMILY_META.local.label).toBe('Self-hosted') expect(AI_PROVIDER_FAMILY_META.custom.label).toBe('Custom') }) it('lists OpenAI-compatible payg presets', () => { expect(presetsByFamily('openai_compatible').map((item) => item.name)).toEqual([ 'DeepSeek', 'OpenAI', 'Qwen', 'Kimi', 'Xiaomi MiMo', 'MiniMax', ]) }) it('lists Anthropic and Google Gemini after the separator group', () => { expect(presetsByFamily('standalone').map((item) => item.name)).toEqual([ 'Anthropic', 'Google Gemini', ]) }) it('lists Plan presets as GLM / MiniMax / Kimi', () => { expect(presetsByFamily('plan').map((item) => item.name)).toEqual(['GLM', 'MiniMax', 'Kimi']) expect(createProviderFromPreset('glm').defaultModelId).toBe('glm-5.2-plan') expect(createProviderFromPreset('minimax-plan').defaultModelId).toBe('MiniMax-M3-plan') expect(createProviderFromPreset('kimi-plan').defaultModelId).toBe('kimi-k3-plan') expect(createProviderFromPreset('zai').presetId).toBe('glm') }) it('defaults DeepSeek to V4 Pro / Flash', () => { const deepseek = createProviderFromPreset('deepseek') expect(deepseek.defaultModelId).toBe('deepseek-v4-pro') expect(deepseek.models.map((item) => item.model)).toEqual(['deepseek-v4-pro', 'deepseek-v4-flash']) }) it('uses current frontier model IDs from official catalogs', () => { expect(createProviderFromPreset('openai').models.map((item) => item.model)).toEqual([ 'gpt-5.6-sol', 'gpt-5.6-terra', 'gpt-5.6-luna', 'gpt-5.5', ]) expect(createProviderFromPreset('anthropic').defaultModelId).toBe('claude-opus-5') expect(createProviderFromPreset('google').defaultModelId).toBe('gemini-3.1-pro-preview') expect(createProviderFromPreset('qwen').defaultModelId).toBe('qwen3.8-max') expect(createProviderFromPreset('kimi').defaultModelId).toBe('kimi-k3') }) it('lists local and custom at the bottom', () => { expect(presetsByFamily('local').map((item) => item.name)).toEqual(['Ollama', 'VLLM']) expect(presetsByFamily('custom').map((item) => item.name)).toEqual(['Custom']) expect(createProviderFromPreset('custom').family).toBe('custom') }) it('resolves legacy zhipu/zai to plan family', () => { expect( resolveProviderFamily({ presetId: 'zai', protocol: 'openai-chat', authStyle: 'bearer', baseUrl: 'https://api.z.ai/api/paas/v4', }) ).toBe('plan') expect(AI_PROVIDER_PRESETS.some((item) => item.id === 'mimo')).toBe(true) }) })