65 lines
2.1 KiB
JavaScript
Executable File
65 lines
2.1 KiB
JavaScript
Executable File
#!/usr/bin/env node
|
|
import { writeFile } from "node:fs/promises"
|
|
import os from "node:os"
|
|
import path from "node:path"
|
|
|
|
const basePath = path.resolve("ee/apps/inference/src/models/base.json")
|
|
|
|
function readFlag(name) {
|
|
const index = process.argv.indexOf(name)
|
|
if (index === -1) return null
|
|
return process.argv[index + 1] ?? null
|
|
}
|
|
|
|
function normalize(value) {
|
|
return String(value).toLowerCase().replace(/[^a-z0-9]+/g, "")
|
|
}
|
|
|
|
function terms(value) {
|
|
return String(value)
|
|
.toLowerCase()
|
|
.split(/[^a-z0-9.]+/)
|
|
.map((term) => normalize(term))
|
|
.filter(Boolean)
|
|
}
|
|
|
|
function scoreModel(query, id, model) {
|
|
const compactQuery = normalize(query)
|
|
const haystack = normalize(`${id} ${model.name ?? ""} ${model.family ?? ""}`)
|
|
const queryTerms = terms(query)
|
|
if (!compactQuery) return 0
|
|
if (id === query || model.id === query) return 1_000
|
|
if (haystack.includes(compactQuery)) return 200 + compactQuery.length
|
|
|
|
return queryTerms.reduce((score, term) => score + (haystack.includes(term) ? 20 + term.length : 0), 0)
|
|
}
|
|
|
|
const query = readFlag("--query")
|
|
const outPath = readFlag("--out") ?? path.join(os.tmpdir(), `openwork-openrouter-models-${Date.now()}.json`)
|
|
const base = JSON.parse(await import("node:fs/promises").then((fs) => fs.readFile(basePath, "utf8")))
|
|
const sourceModels = base?.openrouter?.models
|
|
|
|
if (!sourceModels || typeof sourceModels !== "object" || Array.isArray(sourceModels)) {
|
|
throw new Error(`${basePath} did not contain openrouter.models`)
|
|
}
|
|
|
|
const entries = Object.entries(sourceModels)
|
|
const selectedEntries = query
|
|
? entries
|
|
.map(([id, model]) => ({ id, model, score: scoreModel(query, id, model) }))
|
|
.filter((entry) => entry.score > 0)
|
|
.sort((left, right) => right.score - left.score || left.id.localeCompare(right.id))
|
|
.slice(0, 25)
|
|
.map((entry) => [entry.id, entry.model])
|
|
: entries
|
|
|
|
const models = Object.fromEntries(selectedEntries)
|
|
await writeFile(outPath, `${JSON.stringify(models, null, 2)}\n`)
|
|
|
|
console.log(`wrote ${selectedEntries.length} model(s) to ${outPath}`)
|
|
if (query) {
|
|
for (const [id, model] of selectedEntries.slice(0, 10)) {
|
|
console.log(`${id}\t${model.name ?? ""}`)
|
|
}
|
|
}
|