import { mkdir, writeFile, rename } from 'node:fs/promises' import { createHash } from 'node:crypto' import { resolve, join } from 'node:path' const directory = resolve('resources/model-metadata') const source = 'https://models.dev/api.json' const response = await fetch(source, { signal: AbortSignal.timeout(30000), redirect: 'error' }) if (!response.ok) throw Error(`models.dev HTTP ${response.status}`) const data = Buffer.from(await response.arrayBuffer()) if (data.length > 24 * 1024 * 1024) throw Error('Model catalog exceeds 24MiB') const parsed = JSON.parse(data) const providers = Object.values(parsed) if (providers.length < 3 || !providers.every(p => p && typeof p.models === 'object')) throw Error('Invalid model catalog') const sha256 = createHash('sha256').update(data).digest('hex') const revisionResponse = await fetch('https://api.github.com/repos/anomalyco/models.dev/commits/dev', { signal: AbortSignal.timeout(15000) }) const revision = revisionResponse.ok ? (await revisionResponse.json()).sha : undefined const licenseResponse = await fetch('https://raw.githubusercontent.com/anomalyco/models.dev/dev/LICENSE', { signal: AbortSignal.timeout(15000) }) if (!licenseResponse.ok) throw Error('Unable to retrieve upstream license') await mkdir(directory, { recursive: true }) await writeFile(join(directory, 'models.dev.json.tmp'), data) await rename(join(directory, 'models.dev.json.tmp'), join(directory, 'models.dev.json')) const manifest = { source, repository: 'https://github.com/anomalyco/models.dev', repositoryRevisionAtFetch: revision, fetchedAt: new Date().toISOString(), sha256, bytes: data.length, providers: providers.length, models: providers.reduce((total, p) => total + Object.keys(p.models).length, 0) } await writeFile(join(directory, 'manifest.json'), JSON.stringify(manifest, null, 2) + '\n') await writeFile(join(directory, 'LICENSE'), await licenseResponse.text()) console.log(JSON.stringify(manifest))