Files

87 lines
2.6 KiB
TypeScript

import type { CodeGenProvider, Providers } from './utils/types'
import { writeFile } from 'node:fs/promises'
import { codeGenCreate, codeGenIndex, codeGenTypes } from './utils/code-gen'
import { extraProviders } from './utils/extra'
import { overrides } from './utils/overrides'
import { SUFFIX, toCodeGenProvider } from './utils/process'
const manualProviderKeys = [
'anthropic',
'azure',
'openrouter',
'togetherai',
'cloudflare-workers-ai',
]
const providers = await fetch('https://models.dev/api.json')
.then(async res => res.json() as Promise<Providers>)
.then(ps => Object.values(ps))
.then(providers => providers
.map(provider => ({
...provider,
...overrides[provider.id],
}))
.toSorted((a, b) => a.id.localeCompare(b.id)),
)
const [autoProviders, manualProviders] = providers
.filter(({ api, env }) => api != null && !api.includes('${') && env.some(e => SUFFIX.some(s => e.endsWith(s))))
.map(toCodeGenProvider)
.reduce(([auto, manual], provider) => {
if (manualProviderKeys.includes(provider.id))
manual.push(provider)
else
auto.push(provider)
return [auto, manual]
}, [[], []] as [CodeGenProvider[], CodeGenProvider[]])
const forceManualProviders = providers
.filter(p => p.api == null && manualProviderKeys.includes(p.id))
.map(toCodeGenProvider)
manualProviders.push(...forceManualProviders)
autoProviders.push(...extraProviders)
const create = [
[
'/* eslint-disable perfectionist/sort-union-types */',
'/* eslint-disable sonarjs/no-identical-functions */',
].join('\n'),
'import { createChatProvider, createEmbedProvider, createImageProvider, createModelProvider, createSpeechProvider, createTranscriptionProvider, merge } from \'../utils\'',
...autoProviders.map(codeGenCreate),
].join('\n\n')
await writeFile('./src/generated/create.ts', `${create}\n`, { encoding: 'utf8' })
const creates = autoProviders
.filter(p => p.apiKey != null)
.map(codeGenIndex)
const imp = creates.map(({ im }) => im)
const exp = creates.map(({ ex }) => ex)
const index = [
'/* eslint-disable perfectionist/sort-named-imports */',
'import process from \'node:process\'',
[
'import {',
imp.map(str => ` ${str},`).join('\n'),
'} from \'./create\'',
].join('\n'),
...exp,
].join('\n\n')
await writeFile('./src/generated/index.ts', `${index}\n`, { encoding: 'utf8' })
const types = [
'/* eslint-disable perfectionist/sort-modules */',
'/* eslint-disable perfectionist/sort-union-types */',
...manualProviders.map(codeGenTypes),
]
.join('\n\n')
await writeFile('./src/generated/types.ts', `${types}\n`, { encoding: 'utf8' })