Capability tables are hand-maintained, so a model gains vision or a wider context only when someone notices and edits the file. This adds a daily sync that fills the gap for models already in the registry. How it decides: - Modalities (vision/pdf/audio/video) belong to the MODEL — every gateway serving glm-5.3-flash serves the same weights — so they are keyed by model id and shared. A majority of sources must declare one, which keeps out lone mis-declarations: minimax-m2.5 (1 of 45), glm-4.7 (1 of 44) and gpt-oss-120b (2 of 76) are text-only despite a reseller claiming vision. - Context/output limits belong to the GATEWAY — each truncates differently (glm-5 ships as 202752/16384 on one host and 204800/131072 on another) — so they are keyed by provider + model and only the matching provider's own numbers are trusted. Both layers are strictly additive and sit BELOW the hand-written tables, which short-circuit first. A capability already true stays true. Mechanics: worker thread (the 4MB parse would block the loop ~20ms), ETag so an unchanged catalog costs one empty request, 60s startup delay, 30min backoff on failure, MODEL_CATALOG_SYNC=off to disable. Only the ~57KB delta is kept; lookups cost ~0.1us via an mtime-guarded cache. capabilities.js is bundled into the browser through useModelCaps, so it cannot import node:fs — the server injects the reader via setCatalogSource() from instrumentation. visionPatterns.js is the last resort: a model nobody has catalogued yet still accepts images when its id says so (qwen3-vl-plus, glm-4.6v, llava), with image-generation and embedding ids excluded. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
15 lines
567 B
JavaScript
15 lines
567 B
JavaScript
export async function register() {
|
|
if (process.env.NEXT_RUNTIME === "nodejs") {
|
|
const { initConsoleLogCapture } = await import("@/lib/consoleLogBuffer");
|
|
initConsoleLogCapture();
|
|
|
|
// Server-only: lets capabilities.js read the synced catalog without pulling
|
|
// node:fs into the dashboard's browser bundle.
|
|
const { installCatalogSource } = await import("open-sse/providers/catalogOverride.js");
|
|
await installCatalogSource();
|
|
|
|
const { startModelCatalogSync } = await import("@/lib/modelCatalog/sync.js");
|
|
startModelCatalogSync();
|
|
}
|
|
}
|