import { describe, expect, it } from 'vitest' import { normalizeModelsDevCatalog } from '../../src/ai/modelCatalog' describe('models.dev catalog normalization', () => { it('normalizes the provider keyed api.json shape', () => { const result = normalizeModelsDevCatalog([ { source: 'https://models.dev/api.json', data: { deepseek: { id: 'deepseek', name: 'DeepSeek', api: 'https://api.deepseek.com/v1', models: { 'deepseek-chat': { id: 'deepseek-chat', name: 'DeepSeek Chat' }, 'deepseek-reasoner': { id: 'deepseek-reasoner', name: 'DeepSeek Reasoner', reasoning: true }, }, }, }, }, ]) expect(result).toHaveLength(1) expect(result[0].baseUrl).toBe('https://api.deepseek.com/v1') expect(result[0].models).toEqual( expect.arrayContaining([expect.objectContaining({ model: 'deepseek-reasoner', capability: 'reasoning' })]) ) }) it('groups a flat models.json shape by provider and tolerates partial documents', () => { const result = normalizeModelsDevCatalog([ { source: 'broken', data: { metadata: { updated: true } } }, { source: 'models', data: { models: { 'vendor/model-a': { id: 'model-a', name: 'Model A', provider: 'vendor' }, 'vendor/model-b': { id: 'model-b', name: 'Model B', provider: 'vendor', reasoning: true }, }, }, }, ]) expect(result).toEqual([ expect.objectContaining({ id: 'vendor', models: expect.arrayContaining([ expect.objectContaining({ model: 'model-a' }), expect.objectContaining({ model: 'model-b', capability: 'reasoning' }), ]), }), ]) }) })