Ctrl K
ComunidadGuías…

scripts/generate-model-metadata.ts

Rama main · réplica de lectura del repositorio original.

Archivo original ↗Preguntar a KiBot
import { readFile, writeFile } from 'node:fs/promises'
import path from 'node:path'

const API_URL = 'https://models.dev/api.json'
const SNAPSHOT_PROVIDERS = ['anthropic', 'google', 'openai', 'vercel', 'xai']
interface ModelsDevModel {
  id?: string
  limit?: {
    context?: number
    input?: number
    output?: number
  }
}

interface ModelsDevProvider {
  models?: Record<string, ModelsDevModel>
}

interface ModelLimit {
  context: number
  output: number
  input?: number
}

type ModelsDevData = Record<string, ModelsDevProvider>
type ModelMetadata = Record<string, Record<string, ModelLimit>>

function getArgument(name: string): string | undefined {
  const index = process.argv.indexOf(name)
  if (index === -1) return undefined

  const value = process.argv[index + 1]
  if (!value || value.startsWith('--')) {
    throw new Error(`${name} requires a value`)
  }

  return value
}

async function readSource(source?: string): Promise<ModelsDevData> {
  if (source) {
    return JSON.parse(await readFile(source, 'utf8'))
  }

  const response = await fetch(API_URL)
  if (!response.ok) {
    throw new Error(`Failed to fetch ${API_URL}: ${response.status}`)
  }

  return response.json()
}

function createSnapshot(data: ModelsDevData): ModelMetadata {
  return Object.fromEntries(
    SNAPSHOT_PROVIDERS.map(providerId => {
      const models = data[providerId]?.models
      if (!models) {
        throw new Error(`Missing provider in models.dev data: ${providerId}`)
      }

      const limits = Object.values(models)
        .filter(
          (
            model
          ): model is ModelsDevModel & {
            id: string
            limit: { context: number; output: number; input?: number }
          } =>
            typeof model.id === 'string' &&
            typeof model.limit?.context === 'number' &&
            typeof model.limit.output === 'number'
        )
        .sort((a, b) => (a.id < b.id ? -1 : a.id > b.id ? 1 : 0))
        .map(model => [
          model.id,
          {
            context: model.limit.context,
            ...(typeof model.limit.input === 'number'
              ? { input: model.limit.input }
              : {}),
            output: model.limit.output
          }
        ])

      return [providerId, Object.fromEntries(limits)]
    })
  )
}

async function main(): Promise<void> {
  const root = process.cwd()
  const source = getArgument('--source')
  const data = await readSource(source)
  const snapshot = createSnapshot(data)
  const outputPath = path.join(root, 'lib/config/model-metadata.json')

  await writeFile(outputPath, `${JSON.stringify(snapshot, null, 2)}\n`)
}

await main()