Repository Public Research preview
1import { readFileSync } from "node:fs";23export const KB = JSON.parse(readFileSync(new URL("../knowledge.json", import.meta.url), "utf8"));4export const MODELS = KB.models;5export const RECOMMENDED = KB.recommended;67/** Resolve an alias or a dated snapshot (gpt-5.4-2026-03-05 → gpt-5.4). Null when never probed. */8export function resolveModel(id) {9 if (typeof id !== "string") return null;10 if (MODELS[id]) return MODELS[id];11 const base = id.replace(/-\d{4}-\d{2}-\d{2}$/, "");12 return MODELS[base] ?? null;13}14export function suggestModels(id) {15 const base = String(id).toLowerCase();16 const ids = Object.keys(MODELS);17 const pre = ids.filter((k) => k.startsWith(base) || base.startsWith(k)).sort((a, b) => b.length - a.length);18 if (pre.length) return pre.slice(0, 3);19 const words = base.split(/[^a-z0-9.]+/).filter(Boolean);20 return ids.map((k) => [k, words.filter((w) => k.includes(w)).length]).filter(([, n]) => n > 1).sort((a, b) => b[1] - a[1]).slice(0, 3).map(([k]) => k);21}22export function modelSummary(m) {23 const p = m.pricing_usd_per_mtok;24 return {25 id: m.id, reasoning_model: m.reasoning_model, context_window: m.context_window, max_output_tokens: m.max_output_tokens, knowledge_cutoff: m.knowledge_cutoff,26 price_usd_per_mtok: p ? { input: p.input, cached_input: p.cached_input, output: p.output, batch_input: p.batch_input, batch_output: p.batch_output } : null,27 effort_levels: m.responses.effort_levels, default_effort_is_none: m.responses.default_effort_is_none,28 sampling_params: m.responses.sampling_params, chat_completions: m.chat_completions.supported ? (m.chat_completions.function_tools === "yes" ? "supported" : m.chat_completions.function_tools === "effort_none_only" ? "supported; function tools only with reasoning_effort none" : "supported; no function tools (use Responses)") : "not supported (Responses only)",29 };30}31