From f4d17fe8504244323c3164850849959ee141201d Mon Sep 17 00:00:00 2001 From: Rohit Agrawal Date: Mon, 4 May 2026 18:05:56 -0400 Subject: [PATCH 1/4] add databricks --- .../models/databricks-claude-haiku-4-5.toml | 2 + .../models/databricks-claude-opus-4-1.toml | 2 + .../models/databricks-claude-opus-4-5.toml | 2 + .../models/databricks-claude-opus-4-6.toml | 2 + .../models/databricks-claude-opus-4-7.toml | 2 + .../models/databricks-claude-sonnet-4-5.toml | 2 + .../models/databricks-claude-sonnet-4-6.toml | 2 + .../models/databricks-claude-sonnet-4.toml | 2 + .../models/databricks-gemini-2-5-flash.toml | 2 + .../models/databricks-gemini-2-5-pro.toml | 2 + .../databricks-gemini-3-1-flash-lite.toml | 2 + .../models/databricks-gemini-3-1-pro.toml | 2 + .../models/databricks-gemini-3-flash.toml | 2 + .../models/databricks-gemini-3-pro.toml | 2 + .../databricks/models/databricks-gpt-5-1.toml | 2 + .../databricks/models/databricks-gpt-5-2.toml | 2 + .../models/databricks-gpt-5-4-mini.toml | 2 + .../models/databricks-gpt-5-4-nano.toml | 2 + .../databricks/models/databricks-gpt-5-4.toml | 2 + .../databricks/models/databricks-gpt-5-5.toml | 2 + .../models/databricks-gpt-5-mini.toml | 2 + .../models/databricks-gpt-5-nano.toml | 2 + .../databricks/models/databricks-gpt-5.toml | 2 + .../models/databricks-gpt-oss-120b.toml | 2 + .../models/databricks-gpt-oss-20b.toml | 2 + providers/databricks/provider.toml | 5 + .../databricks/scripts/generate-databricks.ts | 131 ++++++++++++++++++ 27 files changed, 186 insertions(+) create mode 100644 providers/databricks/models/databricks-claude-haiku-4-5.toml create mode 100644 providers/databricks/models/databricks-claude-opus-4-1.toml create mode 100644 providers/databricks/models/databricks-claude-opus-4-5.toml create mode 100644 providers/databricks/models/databricks-claude-opus-4-6.toml create mode 100644 providers/databricks/models/databricks-claude-opus-4-7.toml create mode 100644 providers/databricks/models/databricks-claude-sonnet-4-5.toml create mode 100644 providers/databricks/models/databricks-claude-sonnet-4-6.toml create mode 100644 providers/databricks/models/databricks-claude-sonnet-4.toml create mode 100644 providers/databricks/models/databricks-gemini-2-5-flash.toml create mode 100644 providers/databricks/models/databricks-gemini-2-5-pro.toml create mode 100644 providers/databricks/models/databricks-gemini-3-1-flash-lite.toml create mode 100644 providers/databricks/models/databricks-gemini-3-1-pro.toml create mode 100644 providers/databricks/models/databricks-gemini-3-flash.toml create mode 100644 providers/databricks/models/databricks-gemini-3-pro.toml create mode 100644 providers/databricks/models/databricks-gpt-5-1.toml create mode 100644 providers/databricks/models/databricks-gpt-5-2.toml create mode 100644 providers/databricks/models/databricks-gpt-5-4-mini.toml create mode 100644 providers/databricks/models/databricks-gpt-5-4-nano.toml create mode 100644 providers/databricks/models/databricks-gpt-5-4.toml create mode 100644 providers/databricks/models/databricks-gpt-5-5.toml create mode 100644 providers/databricks/models/databricks-gpt-5-mini.toml create mode 100644 providers/databricks/models/databricks-gpt-5-nano.toml create mode 100644 providers/databricks/models/databricks-gpt-5.toml create mode 100644 providers/databricks/models/databricks-gpt-oss-120b.toml create mode 100644 providers/databricks/models/databricks-gpt-oss-20b.toml create mode 100644 providers/databricks/provider.toml create mode 100644 providers/databricks/scripts/generate-databricks.ts diff --git a/providers/databricks/models/databricks-claude-haiku-4-5.toml b/providers/databricks/models/databricks-claude-haiku-4-5.toml new file mode 100644 index 000000000..adde30041 --- /dev/null +++ b/providers/databricks/models/databricks-claude-haiku-4-5.toml @@ -0,0 +1,2 @@ +[extends] +from = "anthropic/claude-haiku-4-5" diff --git a/providers/databricks/models/databricks-claude-opus-4-1.toml b/providers/databricks/models/databricks-claude-opus-4-1.toml new file mode 100644 index 000000000..fab528f61 --- /dev/null +++ b/providers/databricks/models/databricks-claude-opus-4-1.toml @@ -0,0 +1,2 @@ +[extends] +from = "anthropic/claude-opus-4-1" diff --git a/providers/databricks/models/databricks-claude-opus-4-5.toml b/providers/databricks/models/databricks-claude-opus-4-5.toml new file mode 100644 index 000000000..bd267554f --- /dev/null +++ b/providers/databricks/models/databricks-claude-opus-4-5.toml @@ -0,0 +1,2 @@ +[extends] +from = "anthropic/claude-opus-4-5" diff --git a/providers/databricks/models/databricks-claude-opus-4-6.toml b/providers/databricks/models/databricks-claude-opus-4-6.toml new file mode 100644 index 000000000..1bcb65466 --- /dev/null +++ b/providers/databricks/models/databricks-claude-opus-4-6.toml @@ -0,0 +1,2 @@ +[extends] +from = "anthropic/claude-opus-4-6" diff --git a/providers/databricks/models/databricks-claude-opus-4-7.toml b/providers/databricks/models/databricks-claude-opus-4-7.toml new file mode 100644 index 000000000..f1fae3e21 --- /dev/null +++ b/providers/databricks/models/databricks-claude-opus-4-7.toml @@ -0,0 +1,2 @@ +[extends] +from = "anthropic/claude-opus-4-7" diff --git a/providers/databricks/models/databricks-claude-sonnet-4-5.toml b/providers/databricks/models/databricks-claude-sonnet-4-5.toml new file mode 100644 index 000000000..024d14ea3 --- /dev/null +++ b/providers/databricks/models/databricks-claude-sonnet-4-5.toml @@ -0,0 +1,2 @@ +[extends] +from = "anthropic/claude-sonnet-4-5" diff --git a/providers/databricks/models/databricks-claude-sonnet-4-6.toml b/providers/databricks/models/databricks-claude-sonnet-4-6.toml new file mode 100644 index 000000000..ed2c5807b --- /dev/null +++ b/providers/databricks/models/databricks-claude-sonnet-4-6.toml @@ -0,0 +1,2 @@ +[extends] +from = "anthropic/claude-sonnet-4-6" diff --git a/providers/databricks/models/databricks-claude-sonnet-4.toml b/providers/databricks/models/databricks-claude-sonnet-4.toml new file mode 100644 index 000000000..e579bb4e5 --- /dev/null +++ b/providers/databricks/models/databricks-claude-sonnet-4.toml @@ -0,0 +1,2 @@ +[extends] +from = "anthropic/claude-sonnet-4-5-20250929" diff --git a/providers/databricks/models/databricks-gemini-2-5-flash.toml b/providers/databricks/models/databricks-gemini-2-5-flash.toml new file mode 100644 index 000000000..da23d56b3 --- /dev/null +++ b/providers/databricks/models/databricks-gemini-2-5-flash.toml @@ -0,0 +1,2 @@ +[extends] +from = "google/gemini-2.5-flash" diff --git a/providers/databricks/models/databricks-gemini-2-5-pro.toml b/providers/databricks/models/databricks-gemini-2-5-pro.toml new file mode 100644 index 000000000..bd908b3a3 --- /dev/null +++ b/providers/databricks/models/databricks-gemini-2-5-pro.toml @@ -0,0 +1,2 @@ +[extends] +from = "google/gemini-2.5-pro" diff --git a/providers/databricks/models/databricks-gemini-3-1-flash-lite.toml b/providers/databricks/models/databricks-gemini-3-1-flash-lite.toml new file mode 100644 index 000000000..2f00e4ee5 --- /dev/null +++ b/providers/databricks/models/databricks-gemini-3-1-flash-lite.toml @@ -0,0 +1,2 @@ +[extends] +from = "google/gemini-3.1-flash-lite-preview" diff --git a/providers/databricks/models/databricks-gemini-3-1-pro.toml b/providers/databricks/models/databricks-gemini-3-1-pro.toml new file mode 100644 index 000000000..92b13a100 --- /dev/null +++ b/providers/databricks/models/databricks-gemini-3-1-pro.toml @@ -0,0 +1,2 @@ +[extends] +from = "google/gemini-3.1-pro-preview-customtools" diff --git a/providers/databricks/models/databricks-gemini-3-flash.toml b/providers/databricks/models/databricks-gemini-3-flash.toml new file mode 100644 index 000000000..5ef45fd0e --- /dev/null +++ b/providers/databricks/models/databricks-gemini-3-flash.toml @@ -0,0 +1,2 @@ +[extends] +from = "google/gemini-3-flash-preview" diff --git a/providers/databricks/models/databricks-gemini-3-pro.toml b/providers/databricks/models/databricks-gemini-3-pro.toml new file mode 100644 index 000000000..a7d2ee905 --- /dev/null +++ b/providers/databricks/models/databricks-gemini-3-pro.toml @@ -0,0 +1,2 @@ +[extends] +from = "google/gemini-3-pro-preview" diff --git a/providers/databricks/models/databricks-gpt-5-1.toml b/providers/databricks/models/databricks-gpt-5-1.toml new file mode 100644 index 000000000..ee179177b --- /dev/null +++ b/providers/databricks/models/databricks-gpt-5-1.toml @@ -0,0 +1,2 @@ +[extends] +from = "openai/gpt-5.1" diff --git a/providers/databricks/models/databricks-gpt-5-2.toml b/providers/databricks/models/databricks-gpt-5-2.toml new file mode 100644 index 000000000..a816a94d9 --- /dev/null +++ b/providers/databricks/models/databricks-gpt-5-2.toml @@ -0,0 +1,2 @@ +[extends] +from = "openai/gpt-5.2" diff --git a/providers/databricks/models/databricks-gpt-5-4-mini.toml b/providers/databricks/models/databricks-gpt-5-4-mini.toml new file mode 100644 index 000000000..5620c9831 --- /dev/null +++ b/providers/databricks/models/databricks-gpt-5-4-mini.toml @@ -0,0 +1,2 @@ +[extends] +from = "openai/gpt-5.4-mini" diff --git a/providers/databricks/models/databricks-gpt-5-4-nano.toml b/providers/databricks/models/databricks-gpt-5-4-nano.toml new file mode 100644 index 000000000..ffd93a3f5 --- /dev/null +++ b/providers/databricks/models/databricks-gpt-5-4-nano.toml @@ -0,0 +1,2 @@ +[extends] +from = "openai/gpt-5.4-nano" diff --git a/providers/databricks/models/databricks-gpt-5-4.toml b/providers/databricks/models/databricks-gpt-5-4.toml new file mode 100644 index 000000000..c7de63530 --- /dev/null +++ b/providers/databricks/models/databricks-gpt-5-4.toml @@ -0,0 +1,2 @@ +[extends] +from = "openai/gpt-5.4" diff --git a/providers/databricks/models/databricks-gpt-5-5.toml b/providers/databricks/models/databricks-gpt-5-5.toml new file mode 100644 index 000000000..8ab9ada46 --- /dev/null +++ b/providers/databricks/models/databricks-gpt-5-5.toml @@ -0,0 +1,2 @@ +[extends] +from = "openai/gpt-5.5" diff --git a/providers/databricks/models/databricks-gpt-5-mini.toml b/providers/databricks/models/databricks-gpt-5-mini.toml new file mode 100644 index 000000000..dddbc0362 --- /dev/null +++ b/providers/databricks/models/databricks-gpt-5-mini.toml @@ -0,0 +1,2 @@ +[extends] +from = "openai/gpt-5-mini" diff --git a/providers/databricks/models/databricks-gpt-5-nano.toml b/providers/databricks/models/databricks-gpt-5-nano.toml new file mode 100644 index 000000000..20aa087fe --- /dev/null +++ b/providers/databricks/models/databricks-gpt-5-nano.toml @@ -0,0 +1,2 @@ +[extends] +from = "openai/gpt-5-nano" diff --git a/providers/databricks/models/databricks-gpt-5.toml b/providers/databricks/models/databricks-gpt-5.toml new file mode 100644 index 000000000..62a7604b4 --- /dev/null +++ b/providers/databricks/models/databricks-gpt-5.toml @@ -0,0 +1,2 @@ +[extends] +from = "openai/gpt-5" diff --git a/providers/databricks/models/databricks-gpt-oss-120b.toml b/providers/databricks/models/databricks-gpt-oss-120b.toml new file mode 100644 index 000000000..1ebdea4d9 --- /dev/null +++ b/providers/databricks/models/databricks-gpt-oss-120b.toml @@ -0,0 +1,2 @@ +[extends] +from = "openrouter/openai/gpt-oss-120b" diff --git a/providers/databricks/models/databricks-gpt-oss-20b.toml b/providers/databricks/models/databricks-gpt-oss-20b.toml new file mode 100644 index 000000000..596c5cd1d --- /dev/null +++ b/providers/databricks/models/databricks-gpt-oss-20b.toml @@ -0,0 +1,2 @@ +[extends] +from = "openrouter/openai/gpt-oss-20b" diff --git a/providers/databricks/provider.toml b/providers/databricks/provider.toml new file mode 100644 index 000000000..f07eaf4ab --- /dev/null +++ b/providers/databricks/provider.toml @@ -0,0 +1,5 @@ +name = "Databricks" +npm = "@ai-sdk/openai-compatible" +api = "https://${DATABRICKS_HOST}/ai-gateway/mlflow/v1" +env = ["DATABRICKS_HOST", "DATABRICKS_TOKEN"] +doc = "https://docs.databricks.com/aws/en/machine-learning/foundation-models/" diff --git a/providers/databricks/scripts/generate-databricks.ts b/providers/databricks/scripts/generate-databricks.ts new file mode 100644 index 000000000..d0de72aa1 --- /dev/null +++ b/providers/databricks/scripts/generate-databricks.ts @@ -0,0 +1,131 @@ +#!/usr/bin/env bun + +/** + * Fetches Databricks ai_gateway_v2 endpoints and generates TOML files + * under providers/databricks/models/. + * + * Usage: + * DATABRICKS_HOST= DATABRICKS_TOKEN= bun run generate-databricks.ts + * bun run generate-databricks.ts --workspace --token [--dump] + */ + +import path from "node:path"; +import { mkdir, writeFile, readdir, rm } from "node:fs/promises"; +import { existsSync } from "node:fs"; + +const args = process.argv.slice(2); +const flag = (name: string) => { const i = args.indexOf(`--${name}`); return i !== -1 ? args[i + 1] : undefined; }; +const DUMP = args.includes("--dump"); + +const host = flag("workspace") ?? process.env.DATABRICKS_HOST; +const token = flag("token") ?? process.env.DATABRICKS_TOKEN; + +if (!host || !token) { + console.error("Usage: DATABRICKS_HOST= DATABRICKS_TOKEN= bun run generate-databricks.ts"); + process.exit(1); +} + +const workspace = host.replace(/^https?:\/\//, "").replace(/\/$/, ""); +const PROVIDERS_DIR = path.join(import.meta.dirname, "..", ".."); + +// --------------------------------------------------------------------------- +// Canonical lookup +// --------------------------------------------------------------------------- + +const PREFIX_TO_PROVIDER: [string, string][] = [ + ["claude-", "anthropic"], + ["gpt-", "openai"], + ["gemini-", "google"], + ["mistral-", "mistral"], + ["mixtral-", "mistral"], +]; + +async function findCanonical(endpointName: string): Promise { + let bare = endpointName.replace(/^databricks-/, ""); + + // GPT OSS: extend from openrouter + if (bare.startsWith("gpt-oss-")) { + const p = path.join(PROVIDERS_DIR, "openrouter", "models", "openai", `${bare}.toml`); + if (existsSync(p)) return `openrouter/openai/${bare}`; + } + + // Meta Llama: "meta-llama-3-3-70b-instruct" → "llama-3.3-70b-instruct" + if (bare.startsWith("meta-llama-") || bare.startsWith("llama-")) { + const llamaId = bare + .replace(/^meta-llama-/, "llama-") + .replace(/^(llama-\d+)-(\d+)-/, "$1.$2-"); + const p = path.join(PROVIDERS_DIR, "llama", "models", `${llamaId}.toml`); + if (existsSync(p)) return `llama/${llamaId}`; + } + + for (const [prefix, provider] of PREFIX_TO_PROVIDER) { + if (!bare.startsWith(prefix)) continue; + const exact = path.join(PROVIDERS_DIR, provider, "models", `${bare}.toml`); + if (existsSync(exact)) return `${provider}/${bare}`; + // Also try with hyphens-as-dots for version numbers (e.g. gpt-5-4 → gpt-5.4) + const dotted = bare.replace(/^((?:[a-z]+-)+\d+)-(\d)/, "$1.$2"); + if (dotted !== bare) { + const dottedExact = path.join(PROVIDERS_DIR, provider, "models", `${dotted}.toml`); + if (existsSync(dottedExact)) return `${provider}/${dotted}`; + } + // Fuzzy: find longest filename that shares a prefix with bare or its dotted form + const files = await readdir(path.join(PROVIDERS_DIR, provider, "models")).catch(() => []); + const candidates = [bare, ...(dotted !== bare ? [dotted] : [])]; + const match = files + .filter(f => f.endsWith(".toml")) + .map(f => f.replace(/\.toml$/, "")) + .filter(id => candidates.some(c => id.startsWith(c) || c.startsWith(id))) + .sort((a, b) => b.length - a.length)[0]; + if (match) return `${provider}/${match}`; + } + + return null; +} + +// --------------------------------------------------------------------------- +// Main +// --------------------------------------------------------------------------- + +const url = `https://${workspace}/api/2.0/serving-endpoints:foundation-models`; +console.log(`Fetching: ${url}`); + +const res = await fetch(url, { headers: { Authorization: `Bearer ${token}` } }); +if (!res.ok) { + console.error(`HTTP ${res.status} ${res.statusText}`); + console.error(await res.text().catch(() => "")); + process.exit(1); +} + +const json = await res.json() as { endpoints: Array<{ name: string; tags?: { key: string; value: string }[]; config?: { served_entities?: Array<{ foundation_model?: { ai_gateway_v2_supported?: boolean; api_types?: string[] } }> } }> }; + +if (DUMP) { console.log(JSON.stringify(json, null, 2)); process.exit(0); } + +const IGNORE_PREFIXES = ["databricks-llama-", "databricks-meta-llama-", "databricks-qwen", "databricks-gemma-"]; + +const endpoints = json.endpoints.filter(e => + !IGNORE_PREFIXES.some(p => e.name.startsWith(p)) && + e.config?.served_entities?.some((se: any) => + se.foundation_model?.ai_gateway_v2_supported === true && + se.foundation_model?.api_types?.includes("mlflow/v1/chat/completions") + ) +); +console.log(`${endpoints.length} ai_gateway_v2 endpoint(s)`); + +const outDir = path.join(PROVIDERS_DIR, "databricks", "models"); +await mkdir(outDir, { recursive: true }); +for (const f of await readdir(outDir)) { + if (f.endsWith(".toml")) await rm(path.join(outDir, f), { force: true }); +} + +let extended = 0, stubbed = 0; +for (const ep of endpoints) { + const canonical = await findCanonical(ep.name); + const toml = canonical + ? `[extends]\nfrom = "${canonical}"\n` + : `# TODO: fill in details for ${ep.name}\nname = "${ep.name}"\n`; + await writeFile(path.join(outDir, `${ep.name}.toml`), toml, "utf8"); + console.log(` ${ep.name} → ${canonical ?? "stub"}`); + if (canonical) extended++; else stubbed++; +} + +console.log(`\nWrote ${endpoints.length} file(s): ${extended} with extends, ${stubbed} stubs`); From 6d5884be4500480cd44a05e9d846578ba85248e1 Mon Sep 17 00:00:00 2001 From: Rohit Agrawal Date: Mon, 4 May 2026 18:30:40 -0400 Subject: [PATCH 2/4] fix: inline gpt-oss model metadata instead of invalid extends path openrouter models in subdirectories can't use extends (schema requires provider/model format); resolve() now inlines the source TOML content directly. Co-Authored-By: Claude Sonnet 4.6 --- .../models/databricks-gpt-oss-120b.toml | 24 +++++++++- .../models/databricks-gpt-oss-20b.toml | 24 +++++++++- .../databricks/scripts/generate-databricks.ts | 46 +++++++++++-------- 3 files changed, 71 insertions(+), 23 deletions(-) diff --git a/providers/databricks/models/databricks-gpt-oss-120b.toml b/providers/databricks/models/databricks-gpt-oss-120b.toml index 1ebdea4d9..62e3695cd 100644 --- a/providers/databricks/models/databricks-gpt-oss-120b.toml +++ b/providers/databricks/models/databricks-gpt-oss-120b.toml @@ -1,2 +1,22 @@ -[extends] -from = "openrouter/openai/gpt-oss-120b" +name = "GPT OSS 120B" +family = "gpt-oss" +release_date = "2025-08-05" +last_updated = "2025-08-05" +attachment = false +reasoning = true +temperature = true +tool_call = true +structured_output = true +open_weights = true + +[cost] +input = 0.072 +output = 0.28 + +[limit] +context = 131_072 +output = 32_768 + +[modalities] +input = ["text"] +output = ["text"] diff --git a/providers/databricks/models/databricks-gpt-oss-20b.toml b/providers/databricks/models/databricks-gpt-oss-20b.toml index 596c5cd1d..916314f7b 100644 --- a/providers/databricks/models/databricks-gpt-oss-20b.toml +++ b/providers/databricks/models/databricks-gpt-oss-20b.toml @@ -1,2 +1,22 @@ -[extends] -from = "openrouter/openai/gpt-oss-20b" +name = "GPT OSS 20B" +family = "gpt-oss" +release_date = "2025-08-05" +last_updated = "2025-08-05" +attachment = false +reasoning = true +temperature = true +tool_call = true +structured_output = true +open_weights = true + +[cost] +input = 0.05 +output = 0.20 + +[limit] +context = 131_072 +output = 32_768 + +[modalities] +input = ["text"] +output = ["text"] diff --git a/providers/databricks/scripts/generate-databricks.ts b/providers/databricks/scripts/generate-databricks.ts index d0de72aa1..3f85f9f00 100644 --- a/providers/databricks/scripts/generate-databricks.ts +++ b/providers/databricks/scripts/generate-databricks.ts @@ -10,7 +10,7 @@ */ import path from "node:path"; -import { mkdir, writeFile, readdir, rm } from "node:fs/promises"; +import { mkdir, writeFile, readFile, readdir, rm } from "node:fs/promises"; import { existsSync } from "node:fs"; const args = process.argv.slice(2); @@ -40,13 +40,16 @@ const PREFIX_TO_PROVIDER: [string, string][] = [ ["mixtral-", "mistral"], ]; -async function findCanonical(endpointName: string): Promise { - let bare = endpointName.replace(/^databricks-/, ""); +type Resolution = { type: "extends"; from: string } | { type: "inline"; content: string } | null; - // GPT OSS: extend from openrouter +async function resolve(endpointName: string): Promise { + const bare = endpointName.replace(/^databricks-/, ""); + + // Models in provider subdirectories can't use extends (schema requires provider/model format), + // so inline their content directly. if (bare.startsWith("gpt-oss-")) { const p = path.join(PROVIDERS_DIR, "openrouter", "models", "openai", `${bare}.toml`); - if (existsSync(p)) return `openrouter/openai/${bare}`; + if (existsSync(p)) return { type: "inline", content: await readFile(p, "utf8") }; } // Meta Llama: "meta-llama-3-3-70b-instruct" → "llama-3.3-70b-instruct" @@ -55,20 +58,18 @@ async function findCanonical(endpointName: string): Promise { .replace(/^meta-llama-/, "llama-") .replace(/^(llama-\d+)-(\d+)-/, "$1.$2-"); const p = path.join(PROVIDERS_DIR, "llama", "models", `${llamaId}.toml`); - if (existsSync(p)) return `llama/${llamaId}`; + if (existsSync(p)) return { type: "extends", from: `llama/${llamaId}` }; } for (const [prefix, provider] of PREFIX_TO_PROVIDER) { if (!bare.startsWith(prefix)) continue; const exact = path.join(PROVIDERS_DIR, provider, "models", `${bare}.toml`); - if (existsSync(exact)) return `${provider}/${bare}`; - // Also try with hyphens-as-dots for version numbers (e.g. gpt-5-4 → gpt-5.4) + if (existsSync(exact)) return { type: "extends", from: `${provider}/${bare}` }; const dotted = bare.replace(/^((?:[a-z]+-)+\d+)-(\d)/, "$1.$2"); if (dotted !== bare) { const dottedExact = path.join(PROVIDERS_DIR, provider, "models", `${dotted}.toml`); - if (existsSync(dottedExact)) return `${provider}/${dotted}`; + if (existsSync(dottedExact)) return { type: "extends", from: `${provider}/${dotted}` }; } - // Fuzzy: find longest filename that shares a prefix with bare or its dotted form const files = await readdir(path.join(PROVIDERS_DIR, provider, "models")).catch(() => []); const candidates = [bare, ...(dotted !== bare ? [dotted] : [])]; const match = files @@ -76,7 +77,7 @@ async function findCanonical(endpointName: string): Promise { .map(f => f.replace(/\.toml$/, "")) .filter(id => candidates.some(c => id.startsWith(c) || c.startsWith(id))) .sort((a, b) => b.length - a.length)[0]; - if (match) return `${provider}/${match}`; + if (match) return { type: "extends", from: `${provider}/${match}` }; } return null; @@ -117,15 +118,22 @@ for (const f of await readdir(outDir)) { if (f.endsWith(".toml")) await rm(path.join(outDir, f), { force: true }); } -let extended = 0, stubbed = 0; +let extended = 0, inlined = 0, stubbed = 0; for (const ep of endpoints) { - const canonical = await findCanonical(ep.name); - const toml = canonical - ? `[extends]\nfrom = "${canonical}"\n` - : `# TODO: fill in details for ${ep.name}\nname = "${ep.name}"\n`; + const resolution = await resolve(ep.name); + let toml: string; + if (resolution?.type === "extends") { + toml = `[extends]\nfrom = "${resolution.from}"\n`; + extended++; + } else if (resolution?.type === "inline") { + toml = resolution.content; + inlined++; + } else { + toml = `# TODO: fill in details for ${ep.name}\nname = "${ep.name}"\n`; + stubbed++; + } await writeFile(path.join(outDir, `${ep.name}.toml`), toml, "utf8"); - console.log(` ${ep.name} → ${canonical ?? "stub"}`); - if (canonical) extended++; else stubbed++; + console.log(` ${ep.name} → ${resolution?.type === "extends" ? resolution.from : resolution?.type ?? "stub"}`); } -console.log(`\nWrote ${endpoints.length} file(s): ${extended} with extends, ${stubbed} stubs`); +console.log(`\nWrote ${endpoints.length} file(s): ${extended} extends, ${inlined} inlined, ${stubbed} stubs`); From ed34d189a3aff85eea02230ea15c22ee3b0fccb5 Mon Sep 17 00:00:00 2001 From: Rohit Agrawal Date: Mon, 4 May 2026 18:56:01 -0400 Subject: [PATCH 3/4] feat: add AI SDK compatibility test to generate script, remove incompatible models Generate script now smoke-tests each model with streamText after writing TOMLs and removes any that return empty responses (incompatible with @ai-sdk/openai-compatible). Removes databricks-gemini-3-pro and databricks-gemini-3-1-pro which return content as array with thoughtSignature that the AI SDK cannot parse. Also adds test-databricks.ts for standalone smoke testing. Co-Authored-By: Claude Sonnet 4.6 --- bun.lock | 307 ++++++++++-------- package.json | 5 +- .../models/databricks-gemini-3-1-pro.toml | 2 - .../models/databricks-gemini-3-pro.toml | 2 - .../databricks/scripts/generate-databricks.ts | 49 ++- .../databricks/scripts/test-databricks.ts | 57 ++++ 6 files changed, 273 insertions(+), 149 deletions(-) delete mode 100644 providers/databricks/models/databricks-gemini-3-1-pro.toml delete mode 100644 providers/databricks/models/databricks-gemini-3-pro.toml create mode 100644 providers/databricks/scripts/test-databricks.ts diff --git a/bun.lock b/bun.lock index 36ce485c6..64ae253a4 100644 --- a/bun.lock +++ b/bun.lock @@ -5,8 +5,11 @@ "": { "name": "models.dev", "dependencies": { + "@ai-sdk/openai-compatible": "^3.0.0-beta.31", "@cloudflare/workers-types": "^4.20260424.1", + "ai": "^7.0.0-beta.111", "sst": "3.17.23", + "zod": "^4", }, }, "packages/core": { @@ -49,288 +52,314 @@ "zod": "3.24.2", }, "packages": { - "@cloudflare/workers-types": ["@cloudflare/workers-types@4.20260424.1", "", {}, "sha512-0DLJ9yEk1KKzPbqop80Gw/P1wkKKzawmipULiJWdBXIBCoMvE0OVWms3IrL/Q/G7tfmPop9yF4XlZ69k9JLYng=="], + "@ai-sdk/gateway": ["@ai-sdk/gateway@4.0.0-beta.62", "https://npm-proxy.dev.databricks.com/@ai-sdk/gateway/-/gateway-4.0.0-beta.62.tgz", { "dependencies": { "@ai-sdk/provider": "4.0.0-beta.12", "@ai-sdk/provider-utils": "5.0.0-beta.26", "@vercel/oidc": "3.2.0" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-gqv1nBV3XVK16NGMO2ea3OAYV2LPYzdIA3xXbF1m6rvPB4O7ZNX22jtQ39YRaVVksxfbj87soYDJ+SHPQBYIaQ=="], - "@modelcontextprotocol/sdk": ["@modelcontextprotocol/sdk@1.6.1", "", { "dependencies": { "content-type": "^1.0.5", "cors": "^2.8.5", "eventsource": "^3.0.2", "express": "^5.0.1", "express-rate-limit": "^7.5.0", "pkce-challenge": "^4.1.0", "raw-body": "^3.0.0", "zod": "^3.23.8", "zod-to-json-schema": "^3.24.1" } }, "sha512-oxzMzYCkZHMntzuyerehK3fV6A2Kwh5BD6CGEJSVDU2QNEhfLOptf2X7esQgaHZXHZY0oHmMsOtIDLP71UJXgA=="], + "@ai-sdk/openai-compatible": ["@ai-sdk/openai-compatible@3.0.0-beta.31", "https://npm-proxy.dev.databricks.com/@ai-sdk/openai-compatible/-/openai-compatible-3.0.0-beta.31.tgz", { "dependencies": { "@ai-sdk/provider": "4.0.0-beta.12", "@ai-sdk/provider-utils": "5.0.0-beta.26" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-PLwhwuzXSCrzWaes1VW0Qfq1XswK3V7IlUJ7JHsD/JqsBdJHouudV97qCV20IUZi95yRXx5pffjWwM3mirMvzg=="], + + "@ai-sdk/provider": ["@ai-sdk/provider@4.0.0-beta.12", "https://npm-proxy.dev.databricks.com/@ai-sdk/provider/-/provider-4.0.0-beta.12.tgz", { "dependencies": { "json-schema": "^0.4.0" } }, "sha512-/lm60YW/8LJEOmRlKf55is8cXn7eAIgTNN2T/nGnFOaVS5GPvGpUfAVezUfvIZ6hLbUeFuaMNEZLhxXQijHNEQ=="], + + "@ai-sdk/provider-utils": ["@ai-sdk/provider-utils@5.0.0-beta.26", "https://npm-proxy.dev.databricks.com/@ai-sdk/provider-utils/-/provider-utils-5.0.0-beta.26.tgz", { "dependencies": { "@ai-sdk/provider": "4.0.0-beta.12", "@standard-schema/spec": "^1.1.0", "@workflow/serde": "4.1.0", "eventsource-parser": "^3.0.6" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-nZAB5bvc4wFQnl6JiS8cLYftEqfnPKV0tZEztpX1y7B3XY4fpSD5ReYWGJWThQM3WFcnCw6jqj5wtcQsRSQ1gg=="], + + "@cloudflare/workers-types": ["@cloudflare/workers-types@4.20260424.1", "https://npm-proxy.dev.databricks.com/@cloudflare/workers-types/-/workers-types-4.20260424.1.tgz", {}, "sha512-0DLJ9yEk1KKzPbqop80Gw/P1wkKKzawmipULiJWdBXIBCoMvE0OVWms3IrL/Q/G7tfmPop9yF4XlZ69k9JLYng=="], + + "@modelcontextprotocol/sdk": ["@modelcontextprotocol/sdk@1.6.1", "https://npm-proxy.dev.databricks.com/@modelcontextprotocol/sdk/-/sdk-1.6.1.tgz", { "dependencies": { "content-type": "^1.0.5", "cors": "^2.8.5", "eventsource": "^3.0.2", "express": "^5.0.1", "express-rate-limit": "^7.5.0", "pkce-challenge": "^4.1.0", "raw-body": "^3.0.0", "zod": "^3.23.8", "zod-to-json-schema": "^3.24.1" } }, "sha512-oxzMzYCkZHMntzuyerehK3fV6A2Kwh5BD6CGEJSVDU2QNEhfLOptf2X7esQgaHZXHZY0oHmMsOtIDLP71UJXgA=="], "@models.dev/function": ["@models.dev/function@workspace:packages/function"], "@models.dev/web": ["@models.dev/web@workspace:packages/web"], - "@tsconfig/bun": ["@tsconfig/bun@1.0.8", "", {}, "sha512-JlJaRaS4hBTypxtFe8WhnwV8blf0R+3yehLk8XuyxUYNx6VXsKCjACSCvOYEFUiqlhlBWxtYCn/zRlOb8BzBQg=="], + "@standard-schema/spec": ["@standard-schema/spec@1.1.0", "https://npm-proxy.dev.databricks.com/@standard-schema/spec/-/spec-1.1.0.tgz", {}, "sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w=="], + + "@tsconfig/bun": ["@tsconfig/bun@1.0.8", "https://npm-proxy.dev.databricks.com/@tsconfig/bun/-/bun-1.0.8.tgz", {}, "sha512-JlJaRaS4hBTypxtFe8WhnwV8blf0R+3yehLk8XuyxUYNx6VXsKCjACSCvOYEFUiqlhlBWxtYCn/zRlOb8BzBQg=="], + + "@types/bun": ["@types/bun@1.3.0", "https://npm-proxy.dev.databricks.com/@types/bun/-/bun-1.3.0.tgz", { "dependencies": { "bun-types": "1.3.0" } }, "sha512-+lAGCYjXjip2qY375xX/scJeVRmZ5cY0wyHYyCYxNcdEXrQ4AOe3gACgd4iQ8ksOslJtW4VNxBJ8llUwc3a6AA=="], + + "@types/node": ["@types/node@22.13.9", "https://npm-proxy.dev.databricks.com/@types/node/-/node-22.13.9.tgz", { "dependencies": { "undici-types": "~6.20.0" } }, "sha512-acBjXdRJ3A6Pb3tqnw9HZmyR3Fiol3aGxRCK1x3d+6CDAMjl7I649wpSd+yNURCjbOUGu9tqtLKnTGxmK6CyGw=="], - "@types/bun": ["@types/bun@1.3.0", "", { "dependencies": { "bun-types": "1.3.0" } }, "sha512-+lAGCYjXjip2qY375xX/scJeVRmZ5cY0wyHYyCYxNcdEXrQ4AOe3gACgd4iQ8ksOslJtW4VNxBJ8llUwc3a6AA=="], + "@types/react": ["@types/react@19.2.2", "https://npm-proxy.dev.databricks.com/@types/react/-/react-19.2.2.tgz", { "dependencies": { "csstype": "^3.0.2" } }, "sha512-6mDvHUFSjyT2B2yeNx2nUgMxh9LtOWvkhIU3uePn2I2oyNymUAX1NIsdgviM4CH+JSrp2D2hsMvJOkxY+0wNRA=="], - "@types/node": ["@types/node@22.13.9", "", { "dependencies": { "undici-types": "~6.20.0" } }, "sha512-acBjXdRJ3A6Pb3tqnw9HZmyR3Fiol3aGxRCK1x3d+6CDAMjl7I649wpSd+yNURCjbOUGu9tqtLKnTGxmK6CyGw=="], + "@vercel/oidc": ["@vercel/oidc@3.2.0", "https://npm-proxy.dev.databricks.com/@vercel/oidc/-/oidc-3.2.0.tgz", {}, "sha512-UycprH3T6n3jH0k44NHMa7pnFHGu/N05MjojYr+Mc6I7obkoLIJujSWwin1pCvdy/eOxrI/l3uDLQsmcrOb4ug=="], - "@types/react": ["@types/react@19.2.2", "", { "dependencies": { "csstype": "^3.0.2" } }, "sha512-6mDvHUFSjyT2B2yeNx2nUgMxh9LtOWvkhIU3uePn2I2oyNymUAX1NIsdgviM4CH+JSrp2D2hsMvJOkxY+0wNRA=="], + "@workflow/serde": ["@workflow/serde@4.1.0", "https://npm-proxy.dev.databricks.com/@workflow/serde/-/serde-4.1.0.tgz", {}, "sha512-pav4F2BoirECWR7Nf1TKt+2eETcBj7jj4cBefQ8VXQCA6NPkaKeLfj/zMgi+3zYV5ZIBT4GuUiphsj0/b9hPQQ=="], - "accepts": ["accepts@2.0.0", "", { "dependencies": { "mime-types": "^3.0.0", "negotiator": "^1.0.0" } }, "sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng=="], + "accepts": ["accepts@2.0.0", "https://npm-proxy.dev.databricks.com/accepts/-/accepts-2.0.0.tgz", { "dependencies": { "mime-types": "^3.0.0", "negotiator": "^1.0.0" } }, "sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng=="], - "available-typed-arrays": ["available-typed-arrays@1.0.7", "", { "dependencies": { "possible-typed-array-names": "^1.0.0" } }, "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ=="], + "ai": ["ai@7.0.0-beta.111", "https://npm-proxy.dev.databricks.com/ai/-/ai-7.0.0-beta.111.tgz", { "dependencies": { "@ai-sdk/gateway": "4.0.0-beta.62", "@ai-sdk/provider": "4.0.0-beta.12", "@ai-sdk/provider-utils": "5.0.0-beta.26" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-dtXAmja2Atwu/0HocfGmMfeuXlFdKmzeFcDup6R621qnKshIRAOLTiABkp/Bs3sXA6yRjJHJzFYlSIF47z/HQQ=="], - "aws-sdk": ["aws-sdk@2.1692.0", "", { "dependencies": { "buffer": "4.9.2", "events": "1.1.1", "ieee754": "1.1.13", "jmespath": "0.16.0", "querystring": "0.2.0", "sax": "1.2.1", "url": "0.10.3", "util": "^0.12.4", "uuid": "8.0.0", "xml2js": "0.6.2" } }, "sha512-x511uiJ/57FIsbgUe5csJ13k3uzu25uWQE+XqfBis/sB0SFoiElJWXRkgEAUh0U6n40eT3ay5Ue4oPkRMu1LYw=="], + "available-typed-arrays": ["available-typed-arrays@1.0.7", "https://npm-proxy.dev.databricks.com/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", { "dependencies": { "possible-typed-array-names": "^1.0.0" } }, "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ=="], - "aws4fetch": ["aws4fetch@1.0.18", "", {}, "sha512-3Cf+YaUl07p24MoQ46rFwulAmiyCwH2+1zw1ZyPAX5OtJ34Hh185DwB8y/qRLb6cYYYtSFJ9pthyLc0MD4e8sQ=="], + "aws-sdk": ["aws-sdk@2.1692.0", "https://npm-proxy.dev.databricks.com/aws-sdk/-/aws-sdk-2.1692.0.tgz", { "dependencies": { "buffer": "4.9.2", "events": "1.1.1", "ieee754": "1.1.13", "jmespath": "0.16.0", "querystring": "0.2.0", "sax": "1.2.1", "url": "0.10.3", "util": "^0.12.4", "uuid": "8.0.0", "xml2js": "0.6.2" } }, "sha512-x511uiJ/57FIsbgUe5csJ13k3uzu25uWQE+XqfBis/sB0SFoiElJWXRkgEAUh0U6n40eT3ay5Ue4oPkRMu1LYw=="], - "base64-js": ["base64-js@1.5.1", "", {}, "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA=="], + "aws4fetch": ["aws4fetch@1.0.18", "https://npm-proxy.dev.databricks.com/aws4fetch/-/aws4fetch-1.0.18.tgz", {}, "sha512-3Cf+YaUl07p24MoQ46rFwulAmiyCwH2+1zw1ZyPAX5OtJ34Hh185DwB8y/qRLb6cYYYtSFJ9pthyLc0MD4e8sQ=="], - "body-parser": ["body-parser@2.2.0", "", { "dependencies": { "bytes": "^3.1.2", "content-type": "^1.0.5", "debug": "^4.4.0", "http-errors": "^2.0.0", "iconv-lite": "^0.6.3", "on-finished": "^2.4.1", "qs": "^6.14.0", "raw-body": "^3.0.0", "type-is": "^2.0.0" } }, "sha512-02qvAaxv8tp7fBa/mw1ga98OGm+eCbqzJOKoRt70sLmfEEi+jyBYVTDGfCL/k06/4EMk/z01gCe7HoCH/f2LTg=="], + "base64-js": ["base64-js@1.5.1", "https://npm-proxy.dev.databricks.com/base64-js/-/base64-js-1.5.1.tgz", {}, "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA=="], - "buffer": ["buffer@4.9.2", "", { "dependencies": { "base64-js": "^1.0.2", "ieee754": "^1.1.4", "isarray": "^1.0.0" } }, "sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg=="], + "body-parser": ["body-parser@2.2.0", "https://npm-proxy.dev.databricks.com/body-parser/-/body-parser-2.2.0.tgz", { "dependencies": { "bytes": "^3.1.2", "content-type": "^1.0.5", "debug": "^4.4.0", "http-errors": "^2.0.0", "iconv-lite": "^0.6.3", "on-finished": "^2.4.1", "qs": "^6.14.0", "raw-body": "^3.0.0", "type-is": "^2.0.0" } }, "sha512-02qvAaxv8tp7fBa/mw1ga98OGm+eCbqzJOKoRt70sLmfEEi+jyBYVTDGfCL/k06/4EMk/z01gCe7HoCH/f2LTg=="], - "bun-types": ["bun-types@1.3.0", "", { "dependencies": { "@types/node": "*" }, "peerDependencies": { "@types/react": "^19" } }, "sha512-u8X0thhx+yJ0KmkxuEo9HAtdfgCBaM/aI9K90VQcQioAmkVp3SG3FkwWGibUFz3WdXAdcsqOcbU40lK7tbHdkQ=="], + "buffer": ["buffer@4.9.2", "https://npm-proxy.dev.databricks.com/buffer/-/buffer-4.9.2.tgz", { "dependencies": { "base64-js": "^1.0.2", "ieee754": "^1.1.4", "isarray": "^1.0.0" } }, "sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg=="], - "bytes": ["bytes@3.1.2", "", {}, "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg=="], + "bun-types": ["bun-types@1.3.0", "https://npm-proxy.dev.databricks.com/bun-types/-/bun-types-1.3.0.tgz", { "dependencies": { "@types/node": "*" }, "peerDependencies": { "@types/react": "^19" } }, "sha512-u8X0thhx+yJ0KmkxuEo9HAtdfgCBaM/aI9K90VQcQioAmkVp3SG3FkwWGibUFz3WdXAdcsqOcbU40lK7tbHdkQ=="], - "call-bind": ["call-bind@1.0.8", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.0", "es-define-property": "^1.0.0", "get-intrinsic": "^1.2.4", "set-function-length": "^1.2.2" } }, "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww=="], + "bytes": ["bytes@3.1.2", "https://npm-proxy.dev.databricks.com/bytes/-/bytes-3.1.2.tgz", {}, "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg=="], - "call-bind-apply-helpers": ["call-bind-apply-helpers@1.0.2", "", { "dependencies": { "es-errors": "^1.3.0", "function-bind": "^1.1.2" } }, "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ=="], + "call-bind": ["call-bind@1.0.8", "https://npm-proxy.dev.databricks.com/call-bind/-/call-bind-1.0.8.tgz", { "dependencies": { "call-bind-apply-helpers": "^1.0.0", "es-define-property": "^1.0.0", "get-intrinsic": "^1.2.4", "set-function-length": "^1.2.2" } }, "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww=="], - "call-bound": ["call-bound@1.0.4", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.2", "get-intrinsic": "^1.3.0" } }, "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg=="], + "call-bind-apply-helpers": ["call-bind-apply-helpers@1.0.2", "https://npm-proxy.dev.databricks.com/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", { "dependencies": { "es-errors": "^1.3.0", "function-bind": "^1.1.2" } }, "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ=="], - "content-disposition": ["content-disposition@1.0.0", "", { "dependencies": { "safe-buffer": "5.2.1" } }, "sha512-Au9nRL8VNUut/XSzbQA38+M78dzP4D+eqg3gfJHMIHHYa3bg067xj1KxMUWj+VULbiZMowKngFFbKczUrNJ1mg=="], + "call-bound": ["call-bound@1.0.4", "https://npm-proxy.dev.databricks.com/call-bound/-/call-bound-1.0.4.tgz", { "dependencies": { "call-bind-apply-helpers": "^1.0.2", "get-intrinsic": "^1.3.0" } }, "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg=="], - "content-type": ["content-type@1.0.5", "", {}, "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA=="], + "content-disposition": ["content-disposition@1.0.0", "https://npm-proxy.dev.databricks.com/content-disposition/-/content-disposition-1.0.0.tgz", { "dependencies": { "safe-buffer": "5.2.1" } }, "sha512-Au9nRL8VNUut/XSzbQA38+M78dzP4D+eqg3gfJHMIHHYa3bg067xj1KxMUWj+VULbiZMowKngFFbKczUrNJ1mg=="], - "cookie": ["cookie@0.7.2", "", {}, "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w=="], + "content-type": ["content-type@1.0.5", "https://npm-proxy.dev.databricks.com/content-type/-/content-type-1.0.5.tgz", {}, "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA=="], - "cookie-signature": ["cookie-signature@1.2.2", "", {}, "sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg=="], + "cookie": ["cookie@0.7.2", "https://npm-proxy.dev.databricks.com/cookie/-/cookie-0.7.2.tgz", {}, "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w=="], - "cors": ["cors@2.8.5", "", { "dependencies": { "object-assign": "^4", "vary": "^1" } }, "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g=="], + "cookie-signature": ["cookie-signature@1.2.2", "https://npm-proxy.dev.databricks.com/cookie-signature/-/cookie-signature-1.2.2.tgz", {}, "sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg=="], - "csstype": ["csstype@3.1.3", "", {}, "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw=="], + "cors": ["cors@2.8.5", "https://npm-proxy.dev.databricks.com/cors/-/cors-2.8.5.tgz", { "dependencies": { "object-assign": "^4", "vary": "^1" } }, "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g=="], - "debug": ["debug@4.4.1", "", { "dependencies": { "ms": "^2.1.3" } }, "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ=="], + "csstype": ["csstype@3.1.3", "https://npm-proxy.dev.databricks.com/csstype/-/csstype-3.1.3.tgz", {}, "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw=="], - "define-data-property": ["define-data-property@1.1.4", "", { "dependencies": { "es-define-property": "^1.0.0", "es-errors": "^1.3.0", "gopd": "^1.0.1" } }, "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A=="], + "debug": ["debug@4.4.1", "https://npm-proxy.dev.databricks.com/debug/-/debug-4.4.1.tgz", { "dependencies": { "ms": "^2.1.3" } }, "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ=="], - "depd": ["depd@2.0.0", "", {}, "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw=="], + "define-data-property": ["define-data-property@1.1.4", "https://npm-proxy.dev.databricks.com/define-data-property/-/define-data-property-1.1.4.tgz", { "dependencies": { "es-define-property": "^1.0.0", "es-errors": "^1.3.0", "gopd": "^1.0.1" } }, "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A=="], - "dunder-proto": ["dunder-proto@1.0.1", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.1", "es-errors": "^1.3.0", "gopd": "^1.2.0" } }, "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A=="], + "depd": ["depd@2.0.0", "https://npm-proxy.dev.databricks.com/depd/-/depd-2.0.0.tgz", {}, "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw=="], - "ee-first": ["ee-first@1.1.1", "", {}, "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow=="], + "dunder-proto": ["dunder-proto@1.0.1", "https://npm-proxy.dev.databricks.com/dunder-proto/-/dunder-proto-1.0.1.tgz", { "dependencies": { "call-bind-apply-helpers": "^1.0.1", "es-errors": "^1.3.0", "gopd": "^1.2.0" } }, "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A=="], - "encodeurl": ["encodeurl@2.0.0", "", {}, "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg=="], + "ee-first": ["ee-first@1.1.1", "https://npm-proxy.dev.databricks.com/ee-first/-/ee-first-1.1.1.tgz", {}, "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow=="], - "es-define-property": ["es-define-property@1.0.1", "", {}, "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g=="], + "encodeurl": ["encodeurl@2.0.0", "https://npm-proxy.dev.databricks.com/encodeurl/-/encodeurl-2.0.0.tgz", {}, "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg=="], - "es-errors": ["es-errors@1.3.0", "", {}, "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw=="], + "es-define-property": ["es-define-property@1.0.1", "https://npm-proxy.dev.databricks.com/es-define-property/-/es-define-property-1.0.1.tgz", {}, "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g=="], - "es-object-atoms": ["es-object-atoms@1.1.1", "", { "dependencies": { "es-errors": "^1.3.0" } }, "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA=="], + "es-errors": ["es-errors@1.3.0", "https://npm-proxy.dev.databricks.com/es-errors/-/es-errors-1.3.0.tgz", {}, "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw=="], - "escape-html": ["escape-html@1.0.3", "", {}, "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow=="], + "es-object-atoms": ["es-object-atoms@1.1.1", "https://npm-proxy.dev.databricks.com/es-object-atoms/-/es-object-atoms-1.1.1.tgz", { "dependencies": { "es-errors": "^1.3.0" } }, "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA=="], - "etag": ["etag@1.8.1", "", {}, "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg=="], + "escape-html": ["escape-html@1.0.3", "https://npm-proxy.dev.databricks.com/escape-html/-/escape-html-1.0.3.tgz", {}, "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow=="], - "events": ["events@1.1.1", "", {}, "sha512-kEcvvCBByWXGnZy6JUlgAp2gBIUjfCAV6P6TgT1/aaQKcmuAEC4OZTV1I4EWQLz2gxZw76atuVyvHhTxvi0Flw=="], + "etag": ["etag@1.8.1", "https://npm-proxy.dev.databricks.com/etag/-/etag-1.8.1.tgz", {}, "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg=="], - "eventsource": ["eventsource@3.0.7", "", { "dependencies": { "eventsource-parser": "^3.0.1" } }, "sha512-CRT1WTyuQoD771GW56XEZFQ/ZoSfWid1alKGDYMmkt2yl8UXrVR4pspqWNEcqKvVIzg6PAltWjxcSSPrboA4iA=="], + "events": ["events@1.1.1", "https://npm-proxy.dev.databricks.com/events/-/events-1.1.1.tgz", {}, "sha512-kEcvvCBByWXGnZy6JUlgAp2gBIUjfCAV6P6TgT1/aaQKcmuAEC4OZTV1I4EWQLz2gxZw76atuVyvHhTxvi0Flw=="], - "eventsource-parser": ["eventsource-parser@3.0.2", "", {}, "sha512-6RxOBZ/cYgd8usLwsEl+EC09Au/9BcmCKYF2/xbml6DNczf7nv0MQb+7BA2F+li6//I+28VNlQR37XfQtcAJuA=="], + "eventsource": ["eventsource@3.0.7", "https://npm-proxy.dev.databricks.com/eventsource/-/eventsource-3.0.7.tgz", { "dependencies": { "eventsource-parser": "^3.0.1" } }, "sha512-CRT1WTyuQoD771GW56XEZFQ/ZoSfWid1alKGDYMmkt2yl8UXrVR4pspqWNEcqKvVIzg6PAltWjxcSSPrboA4iA=="], - "express": ["express@5.1.0", "", { "dependencies": { "accepts": "^2.0.0", "body-parser": "^2.2.0", "content-disposition": "^1.0.0", "content-type": "^1.0.5", "cookie": "^0.7.1", "cookie-signature": "^1.2.1", "debug": "^4.4.0", "encodeurl": "^2.0.0", "escape-html": "^1.0.3", "etag": "^1.8.1", "finalhandler": "^2.1.0", "fresh": "^2.0.0", "http-errors": "^2.0.0", "merge-descriptors": "^2.0.0", "mime-types": "^3.0.0", "on-finished": "^2.4.1", "once": "^1.4.0", "parseurl": "^1.3.3", "proxy-addr": "^2.0.7", "qs": "^6.14.0", "range-parser": "^1.2.1", "router": "^2.2.0", "send": "^1.1.0", "serve-static": "^2.2.0", "statuses": "^2.0.1", "type-is": "^2.0.1", "vary": "^1.1.2" } }, "sha512-DT9ck5YIRU+8GYzzU5kT3eHGA5iL+1Zd0EutOmTE9Dtk+Tvuzd23VBU+ec7HPNSTxXYO55gPV/hq4pSBJDjFpA=="], + "eventsource-parser": ["eventsource-parser@3.0.8", "https://npm-proxy.dev.databricks.com/eventsource-parser/-/eventsource-parser-3.0.8.tgz", {}, "sha512-70QWGkr4snxr0OXLRWsFLeRBIRPuQOvt4s8QYjmUlmlkyTZkRqS7EDVRZtzU3TiyDbXSzaOeF0XUKy8PchzukQ=="], - "express-rate-limit": ["express-rate-limit@7.5.0", "", { "peerDependencies": { "express": "^4.11 || 5 || ^5.0.0-beta.1" } }, "sha512-eB5zbQh5h+VenMPM3fh+nw1YExi5nMr6HUCR62ELSP11huvxm/Uir1H1QEyTkk5QX6A58pX6NmaTMceKZ0Eodg=="], + "express": ["express@5.1.0", "https://npm-proxy.dev.databricks.com/express/-/express-5.1.0.tgz", { "dependencies": { "accepts": "^2.0.0", "body-parser": "^2.2.0", "content-disposition": "^1.0.0", "content-type": "^1.0.5", "cookie": "^0.7.1", "cookie-signature": "^1.2.1", "debug": "^4.4.0", "encodeurl": "^2.0.0", "escape-html": "^1.0.3", "etag": "^1.8.1", "finalhandler": "^2.1.0", "fresh": "^2.0.0", "http-errors": "^2.0.0", "merge-descriptors": "^2.0.0", "mime-types": "^3.0.0", "on-finished": "^2.4.1", "once": "^1.4.0", "parseurl": "^1.3.3", "proxy-addr": "^2.0.7", "qs": "^6.14.0", "range-parser": "^1.2.1", "router": "^2.2.0", "send": "^1.1.0", "serve-static": "^2.2.0", "statuses": "^2.0.1", "type-is": "^2.0.1", "vary": "^1.1.2" } }, "sha512-DT9ck5YIRU+8GYzzU5kT3eHGA5iL+1Zd0EutOmTE9Dtk+Tvuzd23VBU+ec7HPNSTxXYO55gPV/hq4pSBJDjFpA=="], - "finalhandler": ["finalhandler@2.1.0", "", { "dependencies": { "debug": "^4.4.0", "encodeurl": "^2.0.0", "escape-html": "^1.0.3", "on-finished": "^2.4.1", "parseurl": "^1.3.3", "statuses": "^2.0.1" } }, "sha512-/t88Ty3d5JWQbWYgaOGCCYfXRwV1+be02WqYYlL6h0lEiUAMPM8o8qKGO01YIkOHzka2up08wvgYD0mDiI+q3Q=="], + "express-rate-limit": ["express-rate-limit@7.5.0", "https://npm-proxy.dev.databricks.com/express-rate-limit/-/express-rate-limit-7.5.0.tgz", { "peerDependencies": { "express": "^4.11 || 5 || ^5.0.0-beta.1" } }, "sha512-eB5zbQh5h+VenMPM3fh+nw1YExi5nMr6HUCR62ELSP11huvxm/Uir1H1QEyTkk5QX6A58pX6NmaTMceKZ0Eodg=="], - "for-each": ["for-each@0.3.5", "", { "dependencies": { "is-callable": "^1.2.7" } }, "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg=="], + "finalhandler": ["finalhandler@2.1.0", "https://npm-proxy.dev.databricks.com/finalhandler/-/finalhandler-2.1.0.tgz", { "dependencies": { "debug": "^4.4.0", "encodeurl": "^2.0.0", "escape-html": "^1.0.3", "on-finished": "^2.4.1", "parseurl": "^1.3.3", "statuses": "^2.0.1" } }, "sha512-/t88Ty3d5JWQbWYgaOGCCYfXRwV1+be02WqYYlL6h0lEiUAMPM8o8qKGO01YIkOHzka2up08wvgYD0mDiI+q3Q=="], - "forwarded": ["forwarded@0.2.0", "", {}, "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow=="], + "for-each": ["for-each@0.3.5", "https://npm-proxy.dev.databricks.com/for-each/-/for-each-0.3.5.tgz", { "dependencies": { "is-callable": "^1.2.7" } }, "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg=="], - "fresh": ["fresh@2.0.0", "", {}, "sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A=="], + "forwarded": ["forwarded@0.2.0", "https://npm-proxy.dev.databricks.com/forwarded/-/forwarded-0.2.0.tgz", {}, "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow=="], - "function-bind": ["function-bind@1.1.2", "", {}, "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA=="], + "fresh": ["fresh@2.0.0", "https://npm-proxy.dev.databricks.com/fresh/-/fresh-2.0.0.tgz", {}, "sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A=="], - "get-intrinsic": ["get-intrinsic@1.3.0", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.2", "es-define-property": "^1.0.1", "es-errors": "^1.3.0", "es-object-atoms": "^1.1.1", "function-bind": "^1.1.2", "get-proto": "^1.0.1", "gopd": "^1.2.0", "has-symbols": "^1.1.0", "hasown": "^2.0.2", "math-intrinsics": "^1.1.0" } }, "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ=="], + "function-bind": ["function-bind@1.1.2", "https://npm-proxy.dev.databricks.com/function-bind/-/function-bind-1.1.2.tgz", {}, "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA=="], - "get-proto": ["get-proto@1.0.1", "", { "dependencies": { "dunder-proto": "^1.0.1", "es-object-atoms": "^1.0.0" } }, "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g=="], + "get-intrinsic": ["get-intrinsic@1.3.0", "https://npm-proxy.dev.databricks.com/get-intrinsic/-/get-intrinsic-1.3.0.tgz", { "dependencies": { "call-bind-apply-helpers": "^1.0.2", "es-define-property": "^1.0.1", "es-errors": "^1.3.0", "es-object-atoms": "^1.1.1", "function-bind": "^1.1.2", "get-proto": "^1.0.1", "gopd": "^1.2.0", "has-symbols": "^1.1.0", "hasown": "^2.0.2", "math-intrinsics": "^1.1.0" } }, "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ=="], - "gopd": ["gopd@1.2.0", "", {}, "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg=="], + "get-proto": ["get-proto@1.0.1", "https://npm-proxy.dev.databricks.com/get-proto/-/get-proto-1.0.1.tgz", { "dependencies": { "dunder-proto": "^1.0.1", "es-object-atoms": "^1.0.0" } }, "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g=="], - "has-property-descriptors": ["has-property-descriptors@1.0.2", "", { "dependencies": { "es-define-property": "^1.0.0" } }, "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg=="], + "gopd": ["gopd@1.2.0", "https://npm-proxy.dev.databricks.com/gopd/-/gopd-1.2.0.tgz", {}, "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg=="], - "has-symbols": ["has-symbols@1.1.0", "", {}, "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ=="], + "has-property-descriptors": ["has-property-descriptors@1.0.2", "https://npm-proxy.dev.databricks.com/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", { "dependencies": { "es-define-property": "^1.0.0" } }, "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg=="], - "has-tostringtag": ["has-tostringtag@1.0.2", "", { "dependencies": { "has-symbols": "^1.0.3" } }, "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw=="], + "has-symbols": ["has-symbols@1.1.0", "https://npm-proxy.dev.databricks.com/has-symbols/-/has-symbols-1.1.0.tgz", {}, "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ=="], - "hasown": ["hasown@2.0.2", "", { "dependencies": { "function-bind": "^1.1.2" } }, "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ=="], + "has-tostringtag": ["has-tostringtag@1.0.2", "https://npm-proxy.dev.databricks.com/has-tostringtag/-/has-tostringtag-1.0.2.tgz", { "dependencies": { "has-symbols": "^1.0.3" } }, "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw=="], - "hono": ["hono@4.8.0", "", {}, "sha512-NoiHrqJxoe1MYXqW+/0/Q4NCizKj2Ivm4KmX8mOSBtw9UJ7KYaOGKkO7csIwO5UlZpfvVRdcgiMb0GGyjEjtcw=="], + "hasown": ["hasown@2.0.2", "https://npm-proxy.dev.databricks.com/hasown/-/hasown-2.0.2.tgz", { "dependencies": { "function-bind": "^1.1.2" } }, "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ=="], - "http-errors": ["http-errors@2.0.0", "", { "dependencies": { "depd": "2.0.0", "inherits": "2.0.4", "setprototypeof": "1.2.0", "statuses": "2.0.1", "toidentifier": "1.0.1" } }, "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ=="], + "hono": ["hono@4.8.0", "https://npm-proxy.dev.databricks.com/hono/-/hono-4.8.0.tgz", {}, "sha512-NoiHrqJxoe1MYXqW+/0/Q4NCizKj2Ivm4KmX8mOSBtw9UJ7KYaOGKkO7csIwO5UlZpfvVRdcgiMb0GGyjEjtcw=="], - "iconv-lite": ["iconv-lite@0.6.3", "", { "dependencies": { "safer-buffer": ">= 2.1.2 < 3.0.0" } }, "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw=="], + "http-errors": ["http-errors@2.0.0", "https://npm-proxy.dev.databricks.com/http-errors/-/http-errors-2.0.0.tgz", { "dependencies": { "depd": "2.0.0", "inherits": "2.0.4", "setprototypeof": "1.2.0", "statuses": "2.0.1", "toidentifier": "1.0.1" } }, "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ=="], - "ieee754": ["ieee754@1.1.13", "", {}, "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg=="], + "iconv-lite": ["iconv-lite@0.6.3", "https://npm-proxy.dev.databricks.com/iconv-lite/-/iconv-lite-0.6.3.tgz", { "dependencies": { "safer-buffer": ">= 2.1.2 < 3.0.0" } }, "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw=="], - "inherits": ["inherits@2.0.4", "", {}, "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="], + "ieee754": ["ieee754@1.1.13", "https://npm-proxy.dev.databricks.com/ieee754/-/ieee754-1.1.13.tgz", {}, "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg=="], - "ipaddr.js": ["ipaddr.js@1.9.1", "", {}, "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g=="], + "inherits": ["inherits@2.0.4", "https://npm-proxy.dev.databricks.com/inherits/-/inherits-2.0.4.tgz", {}, "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="], - "is-arguments": ["is-arguments@1.2.0", "", { "dependencies": { "call-bound": "^1.0.2", "has-tostringtag": "^1.0.2" } }, "sha512-7bVbi0huj/wrIAOzb8U1aszg9kdi3KN/CyU19CTI7tAoZYEZoL9yCDXpbXN+uPsuWnP02cyug1gleqq+TU+YCA=="], + "ipaddr.js": ["ipaddr.js@1.9.1", "https://npm-proxy.dev.databricks.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz", {}, "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g=="], - "is-callable": ["is-callable@1.2.7", "", {}, "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA=="], + "is-arguments": ["is-arguments@1.2.0", "https://npm-proxy.dev.databricks.com/is-arguments/-/is-arguments-1.2.0.tgz", { "dependencies": { "call-bound": "^1.0.2", "has-tostringtag": "^1.0.2" } }, "sha512-7bVbi0huj/wrIAOzb8U1aszg9kdi3KN/CyU19CTI7tAoZYEZoL9yCDXpbXN+uPsuWnP02cyug1gleqq+TU+YCA=="], - "is-generator-function": ["is-generator-function@1.1.0", "", { "dependencies": { "call-bound": "^1.0.3", "get-proto": "^1.0.0", "has-tostringtag": "^1.0.2", "safe-regex-test": "^1.1.0" } }, "sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ=="], + "is-callable": ["is-callable@1.2.7", "https://npm-proxy.dev.databricks.com/is-callable/-/is-callable-1.2.7.tgz", {}, "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA=="], - "is-promise": ["is-promise@4.0.0", "", {}, "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ=="], + "is-generator-function": ["is-generator-function@1.1.0", "https://npm-proxy.dev.databricks.com/is-generator-function/-/is-generator-function-1.1.0.tgz", { "dependencies": { "call-bound": "^1.0.3", "get-proto": "^1.0.0", "has-tostringtag": "^1.0.2", "safe-regex-test": "^1.1.0" } }, "sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ=="], - "is-regex": ["is-regex@1.2.1", "", { "dependencies": { "call-bound": "^1.0.2", "gopd": "^1.2.0", "has-tostringtag": "^1.0.2", "hasown": "^2.0.2" } }, "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g=="], + "is-promise": ["is-promise@4.0.0", "https://npm-proxy.dev.databricks.com/is-promise/-/is-promise-4.0.0.tgz", {}, "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ=="], - "is-typed-array": ["is-typed-array@1.1.15", "", { "dependencies": { "which-typed-array": "^1.1.16" } }, "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ=="], + "is-regex": ["is-regex@1.2.1", "https://npm-proxy.dev.databricks.com/is-regex/-/is-regex-1.2.1.tgz", { "dependencies": { "call-bound": "^1.0.2", "gopd": "^1.2.0", "has-tostringtag": "^1.0.2", "hasown": "^2.0.2" } }, "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g=="], - "isarray": ["isarray@1.0.0", "", {}, "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ=="], + "is-typed-array": ["is-typed-array@1.1.15", "https://npm-proxy.dev.databricks.com/is-typed-array/-/is-typed-array-1.1.15.tgz", { "dependencies": { "which-typed-array": "^1.1.16" } }, "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ=="], - "jmespath": ["jmespath@0.16.0", "", {}, "sha512-9FzQjJ7MATs1tSpnco1K6ayiYE3figslrXA72G2HQ/n76RzvYlofyi5QM+iX4YRs/pu3yzxlVQSST23+dMDknw=="], + "isarray": ["isarray@1.0.0", "https://npm-proxy.dev.databricks.com/isarray/-/isarray-1.0.0.tgz", {}, "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ=="], - "jose": ["jose@5.2.3", "", {}, "sha512-KUXdbctm1uHVL8BYhnyHkgp3zDX5KW8ZhAKVFEfUbU2P8Alpzjb+48hHvjOdQIyPshoblhzsuqOwEEAbtHVirA=="], + "jmespath": ["jmespath@0.16.0", "https://npm-proxy.dev.databricks.com/jmespath/-/jmespath-0.16.0.tgz", {}, "sha512-9FzQjJ7MATs1tSpnco1K6ayiYE3figslrXA72G2HQ/n76RzvYlofyi5QM+iX4YRs/pu3yzxlVQSST23+dMDknw=="], - "lru-cache": ["lru-cache@6.0.0", "", { "dependencies": { "yallist": "^4.0.0" } }, "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA=="], + "jose": ["jose@5.2.3", "https://npm-proxy.dev.databricks.com/jose/-/jose-5.2.3.tgz", {}, "sha512-KUXdbctm1uHVL8BYhnyHkgp3zDX5KW8ZhAKVFEfUbU2P8Alpzjb+48hHvjOdQIyPshoblhzsuqOwEEAbtHVirA=="], - "math-intrinsics": ["math-intrinsics@1.1.0", "", {}, "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g=="], + "json-schema": ["json-schema@0.4.0", "https://npm-proxy.dev.databricks.com/json-schema/-/json-schema-0.4.0.tgz", {}, "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA=="], - "media-typer": ["media-typer@1.1.0", "", {}, "sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw=="], + "lru-cache": ["lru-cache@6.0.0", "https://npm-proxy.dev.databricks.com/lru-cache/-/lru-cache-6.0.0.tgz", { "dependencies": { "yallist": "^4.0.0" } }, "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA=="], - "merge-descriptors": ["merge-descriptors@2.0.0", "", {}, "sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g=="], + "math-intrinsics": ["math-intrinsics@1.1.0", "https://npm-proxy.dev.databricks.com/math-intrinsics/-/math-intrinsics-1.1.0.tgz", {}, "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g=="], - "mime-db": ["mime-db@1.54.0", "", {}, "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ=="], + "media-typer": ["media-typer@1.1.0", "https://npm-proxy.dev.databricks.com/media-typer/-/media-typer-1.1.0.tgz", {}, "sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw=="], - "mime-types": ["mime-types@3.0.1", "", { "dependencies": { "mime-db": "^1.54.0" } }, "sha512-xRc4oEhT6eaBpU1XF7AjpOFD+xQmXNB5OVKwp4tqCuBpHLS/ZbBDrc07mYTDqVMg6PfxUjjNp85O6Cd2Z/5HWA=="], + "merge-descriptors": ["merge-descriptors@2.0.0", "https://npm-proxy.dev.databricks.com/merge-descriptors/-/merge-descriptors-2.0.0.tgz", {}, "sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g=="], + + "mime-db": ["mime-db@1.54.0", "https://npm-proxy.dev.databricks.com/mime-db/-/mime-db-1.54.0.tgz", {}, "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ=="], + + "mime-types": ["mime-types@3.0.1", "https://npm-proxy.dev.databricks.com/mime-types/-/mime-types-3.0.1.tgz", { "dependencies": { "mime-db": "^1.54.0" } }, "sha512-xRc4oEhT6eaBpU1XF7AjpOFD+xQmXNB5OVKwp4tqCuBpHLS/ZbBDrc07mYTDqVMg6PfxUjjNp85O6Cd2Z/5HWA=="], "models.dev": ["models.dev@workspace:packages/core"], - "ms": ["ms@2.1.3", "", {}, "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="], + "ms": ["ms@2.1.3", "https://npm-proxy.dev.databricks.com/ms/-/ms-2.1.3.tgz", {}, "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="], + + "negotiator": ["negotiator@1.0.0", "https://npm-proxy.dev.databricks.com/negotiator/-/negotiator-1.0.0.tgz", {}, "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg=="], + + "object-assign": ["object-assign@4.1.1", "https://npm-proxy.dev.databricks.com/object-assign/-/object-assign-4.1.1.tgz", {}, "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg=="], + + "object-hash": ["object-hash@2.2.0", "https://npm-proxy.dev.databricks.com/object-hash/-/object-hash-2.2.0.tgz", {}, "sha512-gScRMn0bS5fH+IuwyIFgnh9zBdo4DV+6GhygmWM9HyNJSgS0hScp1f5vjtm7oIIOiT9trXrShAkLFSc2IqKNgw=="], + + "object-inspect": ["object-inspect@1.13.4", "https://npm-proxy.dev.databricks.com/object-inspect/-/object-inspect-1.13.4.tgz", {}, "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew=="], - "negotiator": ["negotiator@1.0.0", "", {}, "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg=="], + "oidc-token-hash": ["oidc-token-hash@5.1.0", "https://npm-proxy.dev.databricks.com/oidc-token-hash/-/oidc-token-hash-5.1.0.tgz", {}, "sha512-y0W+X7Ppo7oZX6eovsRkuzcSM40Bicg2JEJkDJ4irIt1wsYAP5MLSNv+QAogO8xivMffw/9OvV3um1pxXgt1uA=="], - "object-assign": ["object-assign@4.1.1", "", {}, "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg=="], + "on-finished": ["on-finished@2.4.1", "https://npm-proxy.dev.databricks.com/on-finished/-/on-finished-2.4.1.tgz", { "dependencies": { "ee-first": "1.1.1" } }, "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg=="], - "object-hash": ["object-hash@2.2.0", "", {}, "sha512-gScRMn0bS5fH+IuwyIFgnh9zBdo4DV+6GhygmWM9HyNJSgS0hScp1f5vjtm7oIIOiT9trXrShAkLFSc2IqKNgw=="], + "once": ["once@1.4.0", "https://npm-proxy.dev.databricks.com/once/-/once-1.4.0.tgz", { "dependencies": { "wrappy": "1" } }, "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w=="], - "object-inspect": ["object-inspect@1.13.4", "", {}, "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew=="], + "opencontrol": ["opencontrol@0.0.6", "https://npm-proxy.dev.databricks.com/opencontrol/-/opencontrol-0.0.6.tgz", { "dependencies": { "@modelcontextprotocol/sdk": "1.6.1", "@tsconfig/bun": "1.0.7", "hono": "4.7.4", "zod": "3.24.2", "zod-to-json-schema": "3.24.3" }, "bin": { "opencontrol": "bin/index.mjs" } }, "sha512-QeCrpOK5D15QV8kjnGVeD/BHFLwcVr+sn4T6KKmP0WAMs2pww56e4h+eOGHb5iPOufUQXbdbBKi6WV2kk7tefQ=="], - "oidc-token-hash": ["oidc-token-hash@5.1.0", "", {}, "sha512-y0W+X7Ppo7oZX6eovsRkuzcSM40Bicg2JEJkDJ4irIt1wsYAP5MLSNv+QAogO8xivMffw/9OvV3um1pxXgt1uA=="], + "openid-client": ["openid-client@5.6.4", "https://npm-proxy.dev.databricks.com/openid-client/-/openid-client-5.6.4.tgz", { "dependencies": { "jose": "^4.15.4", "lru-cache": "^6.0.0", "object-hash": "^2.2.0", "oidc-token-hash": "^5.0.3" } }, "sha512-T1h3B10BRPKfcObdBklX639tVz+xh34O7GjofqrqiAQdm7eHsQ00ih18x6wuJ/E6FxdtS2u3FmUGPDeEcMwzNA=="], - "on-finished": ["on-finished@2.4.1", "", { "dependencies": { "ee-first": "1.1.1" } }, "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg=="], + "parseurl": ["parseurl@1.3.3", "https://npm-proxy.dev.databricks.com/parseurl/-/parseurl-1.3.3.tgz", {}, "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ=="], - "once": ["once@1.4.0", "", { "dependencies": { "wrappy": "1" } }, "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w=="], + "path-to-regexp": ["path-to-regexp@8.2.0", "https://npm-proxy.dev.databricks.com/path-to-regexp/-/path-to-regexp-8.2.0.tgz", {}, "sha512-TdrF7fW9Rphjq4RjrW0Kp2AW0Ahwu9sRGTkS6bvDi0SCwZlEZYmcfDbEsTz8RVk0EHIS/Vd1bv3JhG+1xZuAyQ=="], - "opencontrol": ["opencontrol@0.0.6", "", { "dependencies": { "@modelcontextprotocol/sdk": "1.6.1", "@tsconfig/bun": "1.0.7", "hono": "4.7.4", "zod": "3.24.2", "zod-to-json-schema": "3.24.3" }, "bin": { "opencontrol": "bin/index.mjs" } }, "sha512-QeCrpOK5D15QV8kjnGVeD/BHFLwcVr+sn4T6KKmP0WAMs2pww56e4h+eOGHb5iPOufUQXbdbBKi6WV2kk7tefQ=="], + "pkce-challenge": ["pkce-challenge@4.1.0", "https://npm-proxy.dev.databricks.com/pkce-challenge/-/pkce-challenge-4.1.0.tgz", {}, "sha512-ZBmhE1C9LcPoH9XZSdwiPtbPHZROwAnMy+kIFQVrnMCxY4Cudlz3gBOpzilgc0jOgRaiT3sIWfpMomW2ar2orQ=="], - "openid-client": ["openid-client@5.6.4", "", { "dependencies": { "jose": "^4.15.4", "lru-cache": "^6.0.0", "object-hash": "^2.2.0", "oidc-token-hash": "^5.0.3" } }, "sha512-T1h3B10BRPKfcObdBklX639tVz+xh34O7GjofqrqiAQdm7eHsQ00ih18x6wuJ/E6FxdtS2u3FmUGPDeEcMwzNA=="], + "possible-typed-array-names": ["possible-typed-array-names@1.1.0", "https://npm-proxy.dev.databricks.com/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz", {}, "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg=="], - "parseurl": ["parseurl@1.3.3", "", {}, "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ=="], + "proxy-addr": ["proxy-addr@2.0.7", "https://npm-proxy.dev.databricks.com/proxy-addr/-/proxy-addr-2.0.7.tgz", { "dependencies": { "forwarded": "0.2.0", "ipaddr.js": "1.9.1" } }, "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg=="], - "path-to-regexp": ["path-to-regexp@8.2.0", "", {}, "sha512-TdrF7fW9Rphjq4RjrW0Kp2AW0Ahwu9sRGTkS6bvDi0SCwZlEZYmcfDbEsTz8RVk0EHIS/Vd1bv3JhG+1xZuAyQ=="], + "punycode": ["punycode@1.3.2", "https://npm-proxy.dev.databricks.com/punycode/-/punycode-1.3.2.tgz", {}, "sha512-RofWgt/7fL5wP1Y7fxE7/EmTLzQVnB0ycyibJ0OOHIlJqTNzglYFxVwETOcIoJqJmpDXJ9xImDv+Fq34F/d4Dw=="], - "pkce-challenge": ["pkce-challenge@4.1.0", "", {}, "sha512-ZBmhE1C9LcPoH9XZSdwiPtbPHZROwAnMy+kIFQVrnMCxY4Cudlz3gBOpzilgc0jOgRaiT3sIWfpMomW2ar2orQ=="], + "qs": ["qs@6.14.0", "https://npm-proxy.dev.databricks.com/qs/-/qs-6.14.0.tgz", { "dependencies": { "side-channel": "^1.1.0" } }, "sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w=="], - "possible-typed-array-names": ["possible-typed-array-names@1.1.0", "", {}, "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg=="], + "querystring": ["querystring@0.2.0", "https://npm-proxy.dev.databricks.com/querystring/-/querystring-0.2.0.tgz", {}, "sha512-X/xY82scca2tau62i9mDyU9K+I+djTMUsvwf7xnUX5GLvVzgJybOJf4Y6o9Zx3oJK/LSXg5tTZBjwzqVPaPO2g=="], - "proxy-addr": ["proxy-addr@2.0.7", "", { "dependencies": { "forwarded": "0.2.0", "ipaddr.js": "1.9.1" } }, "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg=="], + "range-parser": ["range-parser@1.2.1", "https://npm-proxy.dev.databricks.com/range-parser/-/range-parser-1.2.1.tgz", {}, "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg=="], - "punycode": ["punycode@1.3.2", "", {}, "sha512-RofWgt/7fL5wP1Y7fxE7/EmTLzQVnB0ycyibJ0OOHIlJqTNzglYFxVwETOcIoJqJmpDXJ9xImDv+Fq34F/d4Dw=="], + "raw-body": ["raw-body@3.0.0", "https://npm-proxy.dev.databricks.com/raw-body/-/raw-body-3.0.0.tgz", { "dependencies": { "bytes": "3.1.2", "http-errors": "2.0.0", "iconv-lite": "0.6.3", "unpipe": "1.0.0" } }, "sha512-RmkhL8CAyCRPXCE28MMH0z2PNWQBNk2Q09ZdxM9IOOXwxwZbN+qbWaatPkdkWIKL2ZVDImrN/pK5HTRz2PcS4g=="], - "qs": ["qs@6.14.0", "", { "dependencies": { "side-channel": "^1.1.0" } }, "sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w=="], + "remeda": ["remeda@2.33.7", "https://npm-proxy.dev.databricks.com/remeda/-/remeda-2.33.7.tgz", {}, "sha512-cXlyjevWx5AcslOUEETG4o8XYi9UkoCXcJmj7XhPFVbla+ITuOBxv6ijBrmbeg+ZhzmDThkNdO+iXKUfrJep1w=="], - "querystring": ["querystring@0.2.0", "", {}, "sha512-X/xY82scca2tau62i9mDyU9K+I+djTMUsvwf7xnUX5GLvVzgJybOJf4Y6o9Zx3oJK/LSXg5tTZBjwzqVPaPO2g=="], + "router": ["router@2.2.0", "https://npm-proxy.dev.databricks.com/router/-/router-2.2.0.tgz", { "dependencies": { "debug": "^4.4.0", "depd": "^2.0.0", "is-promise": "^4.0.0", "parseurl": "^1.3.3", "path-to-regexp": "^8.0.0" } }, "sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ=="], - "range-parser": ["range-parser@1.2.1", "", {}, "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg=="], + "safe-buffer": ["safe-buffer@5.2.1", "https://npm-proxy.dev.databricks.com/safe-buffer/-/safe-buffer-5.2.1.tgz", {}, "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="], - "raw-body": ["raw-body@3.0.0", "", { "dependencies": { "bytes": "3.1.2", "http-errors": "2.0.0", "iconv-lite": "0.6.3", "unpipe": "1.0.0" } }, "sha512-RmkhL8CAyCRPXCE28MMH0z2PNWQBNk2Q09ZdxM9IOOXwxwZbN+qbWaatPkdkWIKL2ZVDImrN/pK5HTRz2PcS4g=="], + "safe-regex-test": ["safe-regex-test@1.1.0", "https://npm-proxy.dev.databricks.com/safe-regex-test/-/safe-regex-test-1.1.0.tgz", { "dependencies": { "call-bound": "^1.0.2", "es-errors": "^1.3.0", "is-regex": "^1.2.1" } }, "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw=="], - "remeda": ["remeda@2.33.7", "", {}, "sha512-cXlyjevWx5AcslOUEETG4o8XYi9UkoCXcJmj7XhPFVbla+ITuOBxv6ijBrmbeg+ZhzmDThkNdO+iXKUfrJep1w=="], + "safer-buffer": ["safer-buffer@2.1.2", "https://npm-proxy.dev.databricks.com/safer-buffer/-/safer-buffer-2.1.2.tgz", {}, "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="], - "router": ["router@2.2.0", "", { "dependencies": { "debug": "^4.4.0", "depd": "^2.0.0", "is-promise": "^4.0.0", "parseurl": "^1.3.3", "path-to-regexp": "^8.0.0" } }, "sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ=="], + "sax": ["sax@1.2.1", "https://npm-proxy.dev.databricks.com/sax/-/sax-1.2.1.tgz", {}, "sha512-8I2a3LovHTOpm7NV5yOyO8IHqgVsfK4+UuySrXU8YXkSRX7k6hCV9b3HrkKCr3nMpgj+0bmocaJJWpvp1oc7ZA=="], - "safe-buffer": ["safe-buffer@5.2.1", "", {}, "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="], + "send": ["send@1.2.0", "https://npm-proxy.dev.databricks.com/send/-/send-1.2.0.tgz", { "dependencies": { "debug": "^4.3.5", "encodeurl": "^2.0.0", "escape-html": "^1.0.3", "etag": "^1.8.1", "fresh": "^2.0.0", "http-errors": "^2.0.0", "mime-types": "^3.0.1", "ms": "^2.1.3", "on-finished": "^2.4.1", "range-parser": "^1.2.1", "statuses": "^2.0.1" } }, "sha512-uaW0WwXKpL9blXE2o0bRhoL2EGXIrZxQ2ZQ4mgcfoBxdFmQold+qWsD2jLrfZ0trjKL6vOw0j//eAwcALFjKSw=="], - "safe-regex-test": ["safe-regex-test@1.1.0", "", { "dependencies": { "call-bound": "^1.0.2", "es-errors": "^1.3.0", "is-regex": "^1.2.1" } }, "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw=="], + "serve-static": ["serve-static@2.2.0", "https://npm-proxy.dev.databricks.com/serve-static/-/serve-static-2.2.0.tgz", { "dependencies": { "encodeurl": "^2.0.0", "escape-html": "^1.0.3", "parseurl": "^1.3.3", "send": "^1.2.0" } }, "sha512-61g9pCh0Vnh7IutZjtLGGpTA355+OPn2TyDv/6ivP2h/AdAVX9azsoxmg2/M6nZeQZNYBEwIcsne1mJd9oQItQ=="], - "safer-buffer": ["safer-buffer@2.1.2", "", {}, "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="], + "set-function-length": ["set-function-length@1.2.2", "https://npm-proxy.dev.databricks.com/set-function-length/-/set-function-length-1.2.2.tgz", { "dependencies": { "define-data-property": "^1.1.4", "es-errors": "^1.3.0", "function-bind": "^1.1.2", "get-intrinsic": "^1.2.4", "gopd": "^1.0.1", "has-property-descriptors": "^1.0.2" } }, "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg=="], - "sax": ["sax@1.2.1", "", {}, "sha512-8I2a3LovHTOpm7NV5yOyO8IHqgVsfK4+UuySrXU8YXkSRX7k6hCV9b3HrkKCr3nMpgj+0bmocaJJWpvp1oc7ZA=="], + "setprototypeof": ["setprototypeof@1.2.0", "https://npm-proxy.dev.databricks.com/setprototypeof/-/setprototypeof-1.2.0.tgz", {}, "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw=="], - "send": ["send@1.2.0", "", { "dependencies": { "debug": "^4.3.5", "encodeurl": "^2.0.0", "escape-html": "^1.0.3", "etag": "^1.8.1", "fresh": "^2.0.0", "http-errors": "^2.0.0", "mime-types": "^3.0.1", "ms": "^2.1.3", "on-finished": "^2.4.1", "range-parser": "^1.2.1", "statuses": "^2.0.1" } }, "sha512-uaW0WwXKpL9blXE2o0bRhoL2EGXIrZxQ2ZQ4mgcfoBxdFmQold+qWsD2jLrfZ0trjKL6vOw0j//eAwcALFjKSw=="], + "side-channel": ["side-channel@1.1.0", "https://npm-proxy.dev.databricks.com/side-channel/-/side-channel-1.1.0.tgz", { "dependencies": { "es-errors": "^1.3.0", "object-inspect": "^1.13.3", "side-channel-list": "^1.0.0", "side-channel-map": "^1.0.1", "side-channel-weakmap": "^1.0.2" } }, "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw=="], - "serve-static": ["serve-static@2.2.0", "", { "dependencies": { "encodeurl": "^2.0.0", "escape-html": "^1.0.3", "parseurl": "^1.3.3", "send": "^1.2.0" } }, "sha512-61g9pCh0Vnh7IutZjtLGGpTA355+OPn2TyDv/6ivP2h/AdAVX9azsoxmg2/M6nZeQZNYBEwIcsne1mJd9oQItQ=="], + "side-channel-list": ["side-channel-list@1.0.0", "https://npm-proxy.dev.databricks.com/side-channel-list/-/side-channel-list-1.0.0.tgz", { "dependencies": { "es-errors": "^1.3.0", "object-inspect": "^1.13.3" } }, "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA=="], - "set-function-length": ["set-function-length@1.2.2", "", { "dependencies": { "define-data-property": "^1.1.4", "es-errors": "^1.3.0", "function-bind": "^1.1.2", "get-intrinsic": "^1.2.4", "gopd": "^1.0.1", "has-property-descriptors": "^1.0.2" } }, "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg=="], + "side-channel-map": ["side-channel-map@1.0.1", "https://npm-proxy.dev.databricks.com/side-channel-map/-/side-channel-map-1.0.1.tgz", { "dependencies": { "call-bound": "^1.0.2", "es-errors": "^1.3.0", "get-intrinsic": "^1.2.5", "object-inspect": "^1.13.3" } }, "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA=="], - "setprototypeof": ["setprototypeof@1.2.0", "", {}, "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw=="], + "side-channel-weakmap": ["side-channel-weakmap@1.0.2", "https://npm-proxy.dev.databricks.com/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", { "dependencies": { "call-bound": "^1.0.2", "es-errors": "^1.3.0", "get-intrinsic": "^1.2.5", "object-inspect": "^1.13.3", "side-channel-map": "^1.0.1" } }, "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A=="], - "side-channel": ["side-channel@1.1.0", "", { "dependencies": { "es-errors": "^1.3.0", "object-inspect": "^1.13.3", "side-channel-list": "^1.0.0", "side-channel-map": "^1.0.1", "side-channel-weakmap": "^1.0.2" } }, "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw=="], + "sst": ["sst@3.17.23", "https://npm-proxy.dev.databricks.com/sst/-/sst-3.17.23.tgz", { "dependencies": { "aws-sdk": "2.1692.0", "aws4fetch": "1.0.18", "jose": "5.2.3", "opencontrol": "0.0.6", "openid-client": "5.6.4" }, "optionalDependencies": { "sst-darwin-arm64": "3.17.23", "sst-darwin-x64": "3.17.23", "sst-linux-arm64": "3.17.23", "sst-linux-x64": "3.17.23", "sst-linux-x86": "3.17.23", "sst-win32-arm64": "3.17.23", "sst-win32-x64": "3.17.23", "sst-win32-x86": "3.17.23" }, "bin": { "sst": "bin/sst.mjs" } }, "sha512-TwKgUgDnZdc1Swe+bvCNeyO4dQnYz5cTodMpYj3jlXZdK9/KNz0PVxT1f0u5E76i1pmilXrUBL/f7iiMPw4RDg=="], - "side-channel-list": ["side-channel-list@1.0.0", "", { "dependencies": { "es-errors": "^1.3.0", "object-inspect": "^1.13.3" } }, "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA=="], + "sst-darwin-arm64": ["sst-darwin-arm64@3.17.23", "https://npm-proxy.dev.databricks.com/sst-darwin-arm64/-/sst-darwin-arm64-3.17.23.tgz", { "os": "darwin", "cpu": "arm64" }, "sha512-R6kvmF+rUideOoU7KBs2SdvrIupoE+b+Dor/eq9Uo4Dojj7KvYDZI/EDm8sSCbbcx/opiWeyNqKtlnLEdCxE6g=="], - "side-channel-map": ["side-channel-map@1.0.1", "", { "dependencies": { "call-bound": "^1.0.2", "es-errors": "^1.3.0", "get-intrinsic": "^1.2.5", "object-inspect": "^1.13.3" } }, "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA=="], + "sst-darwin-x64": ["sst-darwin-x64@3.17.23", "https://npm-proxy.dev.databricks.com/sst-darwin-x64/-/sst-darwin-x64-3.17.23.tgz", { "os": "darwin", "cpu": "x64" }, "sha512-WW4P1S35iYCifQXxD+sE3wuzcN+LHLpuKMaNoaBqEcWGZnH3IPaDJ7rpLF0arkDAo/z3jZmWWzOCkr0JuqJ8vQ=="], - "side-channel-weakmap": ["side-channel-weakmap@1.0.2", "", { "dependencies": { "call-bound": "^1.0.2", "es-errors": "^1.3.0", "get-intrinsic": "^1.2.5", "object-inspect": "^1.13.3", "side-channel-map": "^1.0.1" } }, "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A=="], + "sst-linux-arm64": ["sst-linux-arm64@3.17.23", "https://npm-proxy.dev.databricks.com/sst-linux-arm64/-/sst-linux-arm64-3.17.23.tgz", { "os": "linux", "cpu": "arm64" }, "sha512-TjtNqgIh7RlAWgPLFCAt0mXvIB+J7WjmRvIRrAdX0mXsndOiBJ/DMOgXSLVsIWHCfPj8MIEot/hWpnJgXgIeag=="], - "sst": ["sst@3.17.23", "", { "dependencies": { "aws-sdk": "2.1692.0", "aws4fetch": "1.0.18", "jose": "5.2.3", "opencontrol": "0.0.6", "openid-client": "5.6.4" }, "optionalDependencies": { "sst-darwin-arm64": "3.17.23", "sst-darwin-x64": "3.17.23", "sst-linux-arm64": "3.17.23", "sst-linux-x64": "3.17.23", "sst-linux-x86": "3.17.23", "sst-win32-arm64": "3.17.23", "sst-win32-x64": "3.17.23", "sst-win32-x86": "3.17.23" }, "bin": { "sst": "bin/sst.mjs" } }, "sha512-TwKgUgDnZdc1Swe+bvCNeyO4dQnYz5cTodMpYj3jlXZdK9/KNz0PVxT1f0u5E76i1pmilXrUBL/f7iiMPw4RDg=="], + "sst-linux-x64": ["sst-linux-x64@3.17.23", "https://npm-proxy.dev.databricks.com/sst-linux-x64/-/sst-linux-x64-3.17.23.tgz", { "os": "linux", "cpu": "x64" }, "sha512-qdqJiEbYfCjZlI3F/TA6eoIU7JXVkEEI/UMILNf2JWhky0KQdCW2Xyz+wb6c0msVJCWdUM/uj+1DaiP2eXvghw=="], - "sst-darwin-arm64": ["sst-darwin-arm64@3.17.23", "", { "os": "darwin", "cpu": "arm64" }, "sha512-R6kvmF+rUideOoU7KBs2SdvrIupoE+b+Dor/eq9Uo4Dojj7KvYDZI/EDm8sSCbbcx/opiWeyNqKtlnLEdCxE6g=="], + "sst-linux-x86": ["sst-linux-x86@3.17.23", "https://npm-proxy.dev.databricks.com/sst-linux-x86/-/sst-linux-x86-3.17.23.tgz", { "os": "linux", "cpu": "none" }, "sha512-aGmUujIvoNlmAABEGsOgfY1rxD9koC6hN8bnTLbDI+oI/u/zjHYh50jsbL0p3TlaHpwF/lxP3xFSuT6IKp+KgA=="], - "sst-darwin-x64": ["sst-darwin-x64@3.17.23", "", { "os": "darwin", "cpu": "x64" }, "sha512-WW4P1S35iYCifQXxD+sE3wuzcN+LHLpuKMaNoaBqEcWGZnH3IPaDJ7rpLF0arkDAo/z3jZmWWzOCkr0JuqJ8vQ=="], + "sst-win32-arm64": ["sst-win32-arm64@3.17.23", "https://npm-proxy.dev.databricks.com/sst-win32-arm64/-/sst-win32-arm64-3.17.23.tgz", { "os": "win32", "cpu": "arm64" }, "sha512-ZxdkGqYDrrZGz98rijDCN+m5yuCcwD6Bc9/6hubLsvdpNlVorUqzpg801Ec97xSK0nIC9g6pNiRyxAcsQQstUg=="], - "sst-linux-arm64": ["sst-linux-arm64@3.17.23", "", { "os": "linux", "cpu": "arm64" }, "sha512-TjtNqgIh7RlAWgPLFCAt0mXvIB+J7WjmRvIRrAdX0mXsndOiBJ/DMOgXSLVsIWHCfPj8MIEot/hWpnJgXgIeag=="], + "sst-win32-x64": ["sst-win32-x64@3.17.23", "https://npm-proxy.dev.databricks.com/sst-win32-x64/-/sst-win32-x64-3.17.23.tgz", { "os": "win32", "cpu": "x64" }, "sha512-yc9cor4MS49Ccy2tQCF1tf6M81yLeSGzGL+gjhUxpVKo2pN3bxl3w70eyU/mTXSEeyAmG9zEfbt6FNu4sy5cUA=="], - "sst-linux-x64": ["sst-linux-x64@3.17.23", "", { "os": "linux", "cpu": "x64" }, "sha512-qdqJiEbYfCjZlI3F/TA6eoIU7JXVkEEI/UMILNf2JWhky0KQdCW2Xyz+wb6c0msVJCWdUM/uj+1DaiP2eXvghw=="], + "sst-win32-x86": ["sst-win32-x86@3.17.23", "https://npm-proxy.dev.databricks.com/sst-win32-x86/-/sst-win32-x86-3.17.23.tgz", { "os": "win32", "cpu": "none" }, "sha512-DIp3s54IpNAfdYjSRt6McvkbEPQDMxUu6RUeRAd2C+FcTJgTloon/ghAPQBaDgu2VoVgymjcJARO/XyfKcCLOQ=="], - "sst-linux-x86": ["sst-linux-x86@3.17.23", "", { "os": "linux", "cpu": "none" }, "sha512-aGmUujIvoNlmAABEGsOgfY1rxD9koC6hN8bnTLbDI+oI/u/zjHYh50jsbL0p3TlaHpwF/lxP3xFSuT6IKp+KgA=="], + "statuses": ["statuses@2.0.2", "https://npm-proxy.dev.databricks.com/statuses/-/statuses-2.0.2.tgz", {}, "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw=="], - "sst-win32-arm64": ["sst-win32-arm64@3.17.23", "", { "os": "win32", "cpu": "arm64" }, "sha512-ZxdkGqYDrrZGz98rijDCN+m5yuCcwD6Bc9/6hubLsvdpNlVorUqzpg801Ec97xSK0nIC9g6pNiRyxAcsQQstUg=="], + "toidentifier": ["toidentifier@1.0.1", "https://npm-proxy.dev.databricks.com/toidentifier/-/toidentifier-1.0.1.tgz", {}, "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA=="], - "sst-win32-x64": ["sst-win32-x64@3.17.23", "", { "os": "win32", "cpu": "x64" }, "sha512-yc9cor4MS49Ccy2tQCF1tf6M81yLeSGzGL+gjhUxpVKo2pN3bxl3w70eyU/mTXSEeyAmG9zEfbt6FNu4sy5cUA=="], + "type-is": ["type-is@2.0.1", "https://npm-proxy.dev.databricks.com/type-is/-/type-is-2.0.1.tgz", { "dependencies": { "content-type": "^1.0.5", "media-typer": "^1.1.0", "mime-types": "^3.0.0" } }, "sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw=="], - "sst-win32-x86": ["sst-win32-x86@3.17.23", "", { "os": "win32", "cpu": "none" }, "sha512-DIp3s54IpNAfdYjSRt6McvkbEPQDMxUu6RUeRAd2C+FcTJgTloon/ghAPQBaDgu2VoVgymjcJARO/XyfKcCLOQ=="], + "undici-types": ["undici-types@6.20.0", "https://npm-proxy.dev.databricks.com/undici-types/-/undici-types-6.20.0.tgz", {}, "sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg=="], - "statuses": ["statuses@2.0.2", "", {}, "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw=="], + "unpipe": ["unpipe@1.0.0", "https://npm-proxy.dev.databricks.com/unpipe/-/unpipe-1.0.0.tgz", {}, "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ=="], - "toidentifier": ["toidentifier@1.0.1", "", {}, "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA=="], + "url": ["url@0.10.3", "https://npm-proxy.dev.databricks.com/url/-/url-0.10.3.tgz", { "dependencies": { "punycode": "1.3.2", "querystring": "0.2.0" } }, "sha512-hzSUW2q06EqL1gKM/a+obYHLIO6ct2hwPuviqTTOcfFVc61UbfJ2Q32+uGL/HCPxKqrdGB5QUwIe7UqlDgwsOQ=="], - "type-is": ["type-is@2.0.1", "", { "dependencies": { "content-type": "^1.0.5", "media-typer": "^1.1.0", "mime-types": "^3.0.0" } }, "sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw=="], + "util": ["util@0.12.5", "https://npm-proxy.dev.databricks.com/util/-/util-0.12.5.tgz", { "dependencies": { "inherits": "^2.0.3", "is-arguments": "^1.0.4", "is-generator-function": "^1.0.7", "is-typed-array": "^1.1.3", "which-typed-array": "^1.1.2" } }, "sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA=="], - "undici-types": ["undici-types@6.20.0", "", {}, "sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg=="], + "uuid": ["uuid@8.0.0", "https://npm-proxy.dev.databricks.com/uuid/-/uuid-8.0.0.tgz", { "bin": { "uuid": "dist/bin/uuid" } }, "sha512-jOXGuXZAWdsTH7eZLtyXMqUb9EcWMGZNbL9YcGBJl4MH4nrxHmZJhEHvyLFrkxo+28uLb/NYRcStH48fnD0Vzw=="], - "unpipe": ["unpipe@1.0.0", "", {}, "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ=="], + "vary": ["vary@1.1.2", "https://npm-proxy.dev.databricks.com/vary/-/vary-1.1.2.tgz", {}, "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg=="], - "url": ["url@0.10.3", "", { "dependencies": { "punycode": "1.3.2", "querystring": "0.2.0" } }, "sha512-hzSUW2q06EqL1gKM/a+obYHLIO6ct2hwPuviqTTOcfFVc61UbfJ2Q32+uGL/HCPxKqrdGB5QUwIe7UqlDgwsOQ=="], + "which-typed-array": ["which-typed-array@1.1.19", "https://npm-proxy.dev.databricks.com/which-typed-array/-/which-typed-array-1.1.19.tgz", { "dependencies": { "available-typed-arrays": "^1.0.7", "call-bind": "^1.0.8", "call-bound": "^1.0.4", "for-each": "^0.3.5", "get-proto": "^1.0.1", "gopd": "^1.2.0", "has-tostringtag": "^1.0.2" } }, "sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw=="], - "util": ["util@0.12.5", "", { "dependencies": { "inherits": "^2.0.3", "is-arguments": "^1.0.4", "is-generator-function": "^1.0.7", "is-typed-array": "^1.1.3", "which-typed-array": "^1.1.2" } }, "sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA=="], + "wrappy": ["wrappy@1.0.2", "https://npm-proxy.dev.databricks.com/wrappy/-/wrappy-1.0.2.tgz", {}, "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ=="], - "uuid": ["uuid@8.0.0", "", { "bin": { "uuid": "dist/bin/uuid" } }, "sha512-jOXGuXZAWdsTH7eZLtyXMqUb9EcWMGZNbL9YcGBJl4MH4nrxHmZJhEHvyLFrkxo+28uLb/NYRcStH48fnD0Vzw=="], + "xml2js": ["xml2js@0.6.2", "https://npm-proxy.dev.databricks.com/xml2js/-/xml2js-0.6.2.tgz", { "dependencies": { "sax": ">=0.6.0", "xmlbuilder": "~11.0.0" } }, "sha512-T4rieHaC1EXcES0Kxxj4JWgaUQHDk+qwHcYOCFHfiwKz7tOVPLq7Hjq9dM1WCMhylqMEfP7hMcOIChvotiZegA=="], - "vary": ["vary@1.1.2", "", {}, "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg=="], + "xmlbuilder": ["xmlbuilder@11.0.1", "https://npm-proxy.dev.databricks.com/xmlbuilder/-/xmlbuilder-11.0.1.tgz", {}, "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA=="], - "which-typed-array": ["which-typed-array@1.1.19", "", { "dependencies": { "available-typed-arrays": "^1.0.7", "call-bind": "^1.0.8", "call-bound": "^1.0.4", "for-each": "^0.3.5", "get-proto": "^1.0.1", "gopd": "^1.2.0", "has-tostringtag": "^1.0.2" } }, "sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw=="], + "yallist": ["yallist@4.0.0", "https://npm-proxy.dev.databricks.com/yallist/-/yallist-4.0.0.tgz", {}, "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="], - "wrappy": ["wrappy@1.0.2", "", {}, "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ=="], + "zod": ["zod@4.3.6", "https://npm-proxy.dev.databricks.com/zod/-/zod-4.3.6.tgz", {}, "sha512-rftlrkhHZOcjDwkGlnUtZZkvaPHCsDATp4pGpuOOMDaTdDDXF91wuVDJoWoPsKX/3YPQ5fHuF3STjcYyKr+Qhg=="], - "xml2js": ["xml2js@0.6.2", "", { "dependencies": { "sax": ">=0.6.0", "xmlbuilder": "~11.0.0" } }, "sha512-T4rieHaC1EXcES0Kxxj4JWgaUQHDk+qwHcYOCFHfiwKz7tOVPLq7Hjq9dM1WCMhylqMEfP7hMcOIChvotiZegA=="], + "zod-to-json-schema": ["zod-to-json-schema@3.24.3", "https://npm-proxy.dev.databricks.com/zod-to-json-schema/-/zod-to-json-schema-3.24.3.tgz", { "peerDependencies": { "zod": "^3.24.1" } }, "sha512-HIAfWdYIt1sssHfYZFCXp4rU1w2r8hVVXYIlmoa0r0gABLs5di3RCqPU5DDROogVz1pAdYBaz7HK5n9pSUNs3A=="], - "xmlbuilder": ["xmlbuilder@11.0.1", "", {}, "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA=="], + "@modelcontextprotocol/sdk/zod": ["zod@3.24.2", "https://npm-proxy.dev.databricks.com/zod/-/zod-3.24.2.tgz", {}, "sha512-lY7CDW43ECgW9u1TcT3IoXHflywfVqDYze4waEz812jR/bZ8FHDsl7pFQoSZTz5N+2NqRXs8GBwnAwo3ZNxqhQ=="], - "yallist": ["yallist@4.0.0", "", {}, "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="], + "@models.dev/function/@cloudflare/workers-types": ["@cloudflare/workers-types@4.20250522.0", "https://npm-proxy.dev.databricks.com/@cloudflare/workers-types/-/workers-types-4.20250522.0.tgz", {}, "sha512-9RIffHobc35JWeddzBguGgPa4wLDr5x5F94+0/qy7LiV6pTBQ/M5qGEN9VA16IDT3EUpYI0WKh6VpcmeVEtVtw=="], - "zod": ["zod@3.24.2", "", {}, "sha512-lY7CDW43ECgW9u1TcT3IoXHflywfVqDYze4waEz812jR/bZ8FHDsl7pFQoSZTz5N+2NqRXs8GBwnAwo3ZNxqhQ=="], + "bun-types/@types/node": ["@types/node@24.0.3", "https://npm-proxy.dev.databricks.com/@types/node/-/node-24.0.3.tgz", { "dependencies": { "undici-types": "~7.8.0" } }, "sha512-R4I/kzCYAdRLzfiCabn9hxWfbuHS573x+r0dJMkkzThEa7pbrcDWK+9zu3e7aBOouf+rQAciqPFMnxwr0aWgKg=="], - "zod-to-json-schema": ["zod-to-json-schema@3.24.3", "", { "peerDependencies": { "zod": "^3.24.1" } }, "sha512-HIAfWdYIt1sssHfYZFCXp4rU1w2r8hVVXYIlmoa0r0gABLs5di3RCqPU5DDROogVz1pAdYBaz7HK5n9pSUNs3A=="], + "eventsource/eventsource-parser": ["eventsource-parser@3.0.2", "https://npm-proxy.dev.databricks.com/eventsource-parser/-/eventsource-parser-3.0.2.tgz", {}, "sha512-6RxOBZ/cYgd8usLwsEl+EC09Au/9BcmCKYF2/xbml6DNczf7nv0MQb+7BA2F+li6//I+28VNlQR37XfQtcAJuA=="], - "@models.dev/function/@cloudflare/workers-types": ["@cloudflare/workers-types@4.20250522.0", "", {}, "sha512-9RIffHobc35JWeddzBguGgPa4wLDr5x5F94+0/qy7LiV6pTBQ/M5qGEN9VA16IDT3EUpYI0WKh6VpcmeVEtVtw=="], + "http-errors/statuses": ["statuses@2.0.1", "https://npm-proxy.dev.databricks.com/statuses/-/statuses-2.0.1.tgz", {}, "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ=="], - "bun-types/@types/node": ["@types/node@24.0.3", "", { "dependencies": { "undici-types": "~7.8.0" } }, "sha512-R4I/kzCYAdRLzfiCabn9hxWfbuHS573x+r0dJMkkzThEa7pbrcDWK+9zu3e7aBOouf+rQAciqPFMnxwr0aWgKg=="], + "models.dev/zod": ["zod@3.24.2", "https://npm-proxy.dev.databricks.com/zod/-/zod-3.24.2.tgz", {}, "sha512-lY7CDW43ECgW9u1TcT3IoXHflywfVqDYze4waEz812jR/bZ8FHDsl7pFQoSZTz5N+2NqRXs8GBwnAwo3ZNxqhQ=="], - "http-errors/statuses": ["statuses@2.0.1", "", {}, "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ=="], + "opencontrol/@tsconfig/bun": ["@tsconfig/bun@1.0.7", "https://npm-proxy.dev.databricks.com/@tsconfig/bun/-/bun-1.0.7.tgz", {}, "sha512-udGrGJBNQdXGVulehc1aWT73wkR9wdaGBtB6yL70RJsqwW/yJhIg6ZbRlPOfIUiFNrnBuYLBi9CSmMKfDC7dvA=="], - "opencontrol/@tsconfig/bun": ["@tsconfig/bun@1.0.7", "", {}, "sha512-udGrGJBNQdXGVulehc1aWT73wkR9wdaGBtB6yL70RJsqwW/yJhIg6ZbRlPOfIUiFNrnBuYLBi9CSmMKfDC7dvA=="], + "opencontrol/hono": ["hono@4.7.4", "https://npm-proxy.dev.databricks.com/hono/-/hono-4.7.4.tgz", {}, "sha512-Pst8FuGqz3L7tFF+u9Pu70eI0xa5S3LPUmrNd5Jm8nTHze9FxLTK9Kaj5g/k4UcwuJSXTP65SyHOPLrffpcAJg=="], - "opencontrol/hono": ["hono@4.7.4", "", {}, "sha512-Pst8FuGqz3L7tFF+u9Pu70eI0xa5S3LPUmrNd5Jm8nTHze9FxLTK9Kaj5g/k4UcwuJSXTP65SyHOPLrffpcAJg=="], + "opencontrol/zod": ["zod@3.24.2", "https://npm-proxy.dev.databricks.com/zod/-/zod-3.24.2.tgz", {}, "sha512-lY7CDW43ECgW9u1TcT3IoXHflywfVqDYze4waEz812jR/bZ8FHDsl7pFQoSZTz5N+2NqRXs8GBwnAwo3ZNxqhQ=="], - "openid-client/jose": ["jose@4.15.9", "", {}, "sha512-1vUQX+IdDMVPj4k8kOxgUqlcK518yluMuGZwqlr44FS1ppZB/5GWh4rZG89erpOBOJjU/OBsnCVFfapsRz6nEA=="], + "openid-client/jose": ["jose@4.15.9", "https://npm-proxy.dev.databricks.com/jose/-/jose-4.15.9.tgz", {}, "sha512-1vUQX+IdDMVPj4k8kOxgUqlcK518yluMuGZwqlr44FS1ppZB/5GWh4rZG89erpOBOJjU/OBsnCVFfapsRz6nEA=="], - "bun-types/@types/node/undici-types": ["undici-types@7.8.0", "", {}, "sha512-9UJ2xGDvQ43tYyVMpuHlsgApydB8ZKfVYTsLDhXkFL/6gfkp+U8xTGdh8pMJv1SpZna0zxG1DwsKZsreLbXBxw=="], + "bun-types/@types/node/undici-types": ["undici-types@7.8.0", "https://npm-proxy.dev.databricks.com/undici-types/-/undici-types-7.8.0.tgz", {}, "sha512-9UJ2xGDvQ43tYyVMpuHlsgApydB8ZKfVYTsLDhXkFL/6gfkp+U8xTGdh8pMJv1SpZna0zxG1DwsKZsreLbXBxw=="], } } diff --git a/package.json b/package.json index 8e2c1ce7f..e28e83f7f 100644 --- a/package.json +++ b/package.json @@ -23,7 +23,10 @@ "wandb:generate": "bun ./packages/core/script/generate-wandb.ts" }, "dependencies": { + "@ai-sdk/openai-compatible": "^3.0.0-beta.31", "@cloudflare/workers-types": "^4.20260424.1", - "sst": "3.17.23" + "ai": "^7.0.0-beta.111", + "sst": "3.17.23", + "zod": "^4" } } diff --git a/providers/databricks/models/databricks-gemini-3-1-pro.toml b/providers/databricks/models/databricks-gemini-3-1-pro.toml deleted file mode 100644 index 92b13a100..000000000 --- a/providers/databricks/models/databricks-gemini-3-1-pro.toml +++ /dev/null @@ -1,2 +0,0 @@ -[extends] -from = "google/gemini-3.1-pro-preview-customtools" diff --git a/providers/databricks/models/databricks-gemini-3-pro.toml b/providers/databricks/models/databricks-gemini-3-pro.toml deleted file mode 100644 index a7d2ee905..000000000 --- a/providers/databricks/models/databricks-gemini-3-pro.toml +++ /dev/null @@ -1,2 +0,0 @@ -[extends] -from = "google/gemini-3-pro-preview" diff --git a/providers/databricks/scripts/generate-databricks.ts b/providers/databricks/scripts/generate-databricks.ts index 3f85f9f00..11b6e3161 100644 --- a/providers/databricks/scripts/generate-databricks.ts +++ b/providers/databricks/scripts/generate-databricks.ts @@ -1,8 +1,9 @@ #!/usr/bin/env bun /** - * Fetches Databricks ai_gateway_v2 endpoints and generates TOML files - * under providers/databricks/models/. + * Fetches Databricks ai_gateway_v2 endpoints, generates TOML files under + * providers/databricks/models/, then smoke-tests each model with the AI SDK + * and removes any that are incompatible with @ai-sdk/openai-compatible. * * Usage: * DATABRICKS_HOST= DATABRICKS_TOKEN= bun run generate-databricks.ts @@ -12,6 +13,8 @@ import path from "node:path"; import { mkdir, writeFile, readFile, readdir, rm } from "node:fs/promises"; import { existsSync } from "node:fs"; +import { createOpenAICompatible } from "@ai-sdk/openai-compatible"; +import { streamText } from "ai"; const args = process.argv.slice(2); const flag = (name: string) => { const i = args.indexOf(`--${name}`); return i !== -1 ? args[i + 1] : undefined; }; @@ -83,6 +86,25 @@ async function resolve(endpointName: string): Promise { return null; } +// --------------------------------------------------------------------------- +// AI SDK compatibility test +// --------------------------------------------------------------------------- + +async function testModel(modelId: string): Promise { + const provider = createOpenAICompatible({ + name: "databricks", + baseURL: `https://${workspace}/ai-gateway/mlflow/v1`, + apiKey: token!, + }); + try { + const result = streamText({ model: provider(modelId), prompt: "Say hello in one word" }); + const text = await result.text; + return text.trim().length > 0; + } catch { + return false; + } +} + // --------------------------------------------------------------------------- // Main // --------------------------------------------------------------------------- @@ -110,7 +132,7 @@ const endpoints = json.endpoints.filter(e => se.foundation_model?.api_types?.includes("mlflow/v1/chat/completions") ) ); -console.log(`${endpoints.length} ai_gateway_v2 endpoint(s)`); +console.log(`${endpoints.length} ai_gateway_v2 endpoint(s)\n`); const outDir = path.join(PROVIDERS_DIR, "databricks", "models"); await mkdir(outDir, { recursive: true }); @@ -118,6 +140,7 @@ for (const f of await readdir(outDir)) { if (f.endsWith(".toml")) await rm(path.join(outDir, f), { force: true }); } +// Write TOMLs let extended = 0, inlined = 0, stubbed = 0; for (const ep of endpoints) { const resolution = await resolve(ep.name); @@ -133,7 +156,23 @@ for (const ep of endpoints) { stubbed++; } await writeFile(path.join(outDir, `${ep.name}.toml`), toml, "utf8"); - console.log(` ${ep.name} → ${resolution?.type === "extends" ? resolution.from : resolution?.type ?? "stub"}`); +} +console.log(`Wrote ${endpoints.length} file(s): ${extended} extends, ${inlined} inlined, ${stubbed} stubs\n`); + +// Test each model with the AI SDK and remove incompatible ones +console.log(`Testing AI SDK compatibility...`); +let kept = 0, removed = 0; +for (const ep of endpoints) { + process.stdout.write(` ${ep.name} → `); + const ok = await testModel(ep.name); + if (ok) { + console.log(`✓`); + kept++; + } else { + console.log(`✗ removed`); + await rm(path.join(outDir, `${ep.name}.toml`), { force: true }); + removed++; + } } -console.log(`\nWrote ${endpoints.length} file(s): ${extended} extends, ${inlined} inlined, ${stubbed} stubs`); +console.log(`\n${kept} models kept, ${removed} removed as incompatible with @ai-sdk/openai-compatible`); diff --git a/providers/databricks/scripts/test-databricks.ts b/providers/databricks/scripts/test-databricks.ts new file mode 100644 index 000000000..8c7e2d0b9 --- /dev/null +++ b/providers/databricks/scripts/test-databricks.ts @@ -0,0 +1,57 @@ +#!/usr/bin/env bun + +/** + * Smoke-tests all Databricks models against the AI Gateway. + * + * Usage: + * DATABRICKS_HOST= DATABRICKS_TOKEN= bun run test-databricks.ts + */ + +import { createOpenAICompatible } from "@ai-sdk/openai-compatible"; +import { streamText } from "ai"; +import { readdir } from "node:fs/promises"; +import path from "node:path"; + +const host = process.env.DATABRICKS_HOST; +const token = process.env.DATABRICKS_TOKEN; + +if (!host || !token) { + console.error("Usage: DATABRICKS_HOST= DATABRICKS_TOKEN= bun run test-databricks.ts"); + process.exit(1); +} + +const databricks = createOpenAICompatible({ + name: "databricks", + baseURL: `https://${host.replace(/^https?:\/\//, "")}/ai-gateway/mlflow/v1`, + apiKey: token, +}); + +const modelsDir = path.join(import.meta.dirname, "..", "models"); +const models = (await readdir(modelsDir)) + .filter(f => f.endsWith(".toml")) + .map(f => f.replace(/\.toml$/, "")); + +console.log(`Testing ${models.length} models...\n`); + +let passed = 0, failed = 0; +for (const modelId of models) { + process.stdout.write(` ${modelId} → `); + try { + const result = streamText({ + model: databricks(modelId), + prompt: "Say hello in one word", + }); + const text = await result.text; + if (!text.trim()) throw new Error("empty response"); + console.log(`✓ "${text.trim()}"`); + passed++; + } catch (e: any) { + console.log(`✗ ${e.message?.slice(0, 100) ?? e}`); + if (e.cause) console.log(` cause: ${JSON.stringify(e.cause)?.slice(0, 200)}`); + if (e.responseBody) console.log(` body: ${String(e.responseBody).slice(0, 200)}`); + failed++; + } +} + +console.log(`\n${passed} passed, ${failed} failed`); +if (failed > 0) process.exit(1); From 14c3fc304cbd6cfab91b54edd76c8d0b59acacaa Mon Sep 17 00:00:00 2001 From: Rohit Agrawal Date: Wed, 6 May 2026 22:07:56 -0400 Subject: [PATCH 4/4] refactor: move databricks generate to packages/core/script following repo conventions Addresses review feedback by removing AI SDK dependencies from package.json and aligning with the Vercel/Helicone/Wandb pattern. - Move generate-databricks.ts to packages/core/script/ - Add databricks:generate to root scripts - Remove smoke test and runtime filtering (catalog should reflect what the upstream API exposes; AI SDK compatibility is a downstream concern) - Add --dry-run and --new-only flags - Merge with existing TOMLs instead of nuking them; warn about orphans - Restore databricks-gemini-3-pro and databricks-gemini-3-1-pro - Drop @ai-sdk/openai-compatible, ai, zod from root dependencies Co-Authored-By: Claude Sonnet 4.6 --- bun.lock | 33 +- package.json | 6 +- packages/core/script/generate-databricks.ts | 287 ++++++++++++++++++ .../models/databricks-gemini-3-1-pro.toml | 2 + .../models/databricks-gemini-3-pro.toml | 2 + .../databricks/scripts/generate-databricks.ts | 178 ----------- .../databricks/scripts/test-databricks.ts | 57 ---- 7 files changed, 295 insertions(+), 270 deletions(-) create mode 100644 packages/core/script/generate-databricks.ts create mode 100644 providers/databricks/models/databricks-gemini-3-1-pro.toml create mode 100644 providers/databricks/models/databricks-gemini-3-pro.toml delete mode 100644 providers/databricks/scripts/generate-databricks.ts delete mode 100644 providers/databricks/scripts/test-databricks.ts diff --git a/bun.lock b/bun.lock index 64ae253a4..581abfa91 100644 --- a/bun.lock +++ b/bun.lock @@ -5,11 +5,8 @@ "": { "name": "models.dev", "dependencies": { - "@ai-sdk/openai-compatible": "^3.0.0-beta.31", "@cloudflare/workers-types": "^4.20260424.1", - "ai": "^7.0.0-beta.111", "sst": "3.17.23", - "zod": "^4", }, }, "packages/core": { @@ -52,14 +49,6 @@ "zod": "3.24.2", }, "packages": { - "@ai-sdk/gateway": ["@ai-sdk/gateway@4.0.0-beta.62", "https://npm-proxy.dev.databricks.com/@ai-sdk/gateway/-/gateway-4.0.0-beta.62.tgz", { "dependencies": { "@ai-sdk/provider": "4.0.0-beta.12", "@ai-sdk/provider-utils": "5.0.0-beta.26", "@vercel/oidc": "3.2.0" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-gqv1nBV3XVK16NGMO2ea3OAYV2LPYzdIA3xXbF1m6rvPB4O7ZNX22jtQ39YRaVVksxfbj87soYDJ+SHPQBYIaQ=="], - - "@ai-sdk/openai-compatible": ["@ai-sdk/openai-compatible@3.0.0-beta.31", "https://npm-proxy.dev.databricks.com/@ai-sdk/openai-compatible/-/openai-compatible-3.0.0-beta.31.tgz", { "dependencies": { "@ai-sdk/provider": "4.0.0-beta.12", "@ai-sdk/provider-utils": "5.0.0-beta.26" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-PLwhwuzXSCrzWaes1VW0Qfq1XswK3V7IlUJ7JHsD/JqsBdJHouudV97qCV20IUZi95yRXx5pffjWwM3mirMvzg=="], - - "@ai-sdk/provider": ["@ai-sdk/provider@4.0.0-beta.12", "https://npm-proxy.dev.databricks.com/@ai-sdk/provider/-/provider-4.0.0-beta.12.tgz", { "dependencies": { "json-schema": "^0.4.0" } }, "sha512-/lm60YW/8LJEOmRlKf55is8cXn7eAIgTNN2T/nGnFOaVS5GPvGpUfAVezUfvIZ6hLbUeFuaMNEZLhxXQijHNEQ=="], - - "@ai-sdk/provider-utils": ["@ai-sdk/provider-utils@5.0.0-beta.26", "https://npm-proxy.dev.databricks.com/@ai-sdk/provider-utils/-/provider-utils-5.0.0-beta.26.tgz", { "dependencies": { "@ai-sdk/provider": "4.0.0-beta.12", "@standard-schema/spec": "^1.1.0", "@workflow/serde": "4.1.0", "eventsource-parser": "^3.0.6" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-nZAB5bvc4wFQnl6JiS8cLYftEqfnPKV0tZEztpX1y7B3XY4fpSD5ReYWGJWThQM3WFcnCw6jqj5wtcQsRSQ1gg=="], - "@cloudflare/workers-types": ["@cloudflare/workers-types@4.20260424.1", "https://npm-proxy.dev.databricks.com/@cloudflare/workers-types/-/workers-types-4.20260424.1.tgz", {}, "sha512-0DLJ9yEk1KKzPbqop80Gw/P1wkKKzawmipULiJWdBXIBCoMvE0OVWms3IrL/Q/G7tfmPop9yF4XlZ69k9JLYng=="], "@modelcontextprotocol/sdk": ["@modelcontextprotocol/sdk@1.6.1", "https://npm-proxy.dev.databricks.com/@modelcontextprotocol/sdk/-/sdk-1.6.1.tgz", { "dependencies": { "content-type": "^1.0.5", "cors": "^2.8.5", "eventsource": "^3.0.2", "express": "^5.0.1", "express-rate-limit": "^7.5.0", "pkce-challenge": "^4.1.0", "raw-body": "^3.0.0", "zod": "^3.23.8", "zod-to-json-schema": "^3.24.1" } }, "sha512-oxzMzYCkZHMntzuyerehK3fV6A2Kwh5BD6CGEJSVDU2QNEhfLOptf2X7esQgaHZXHZY0oHmMsOtIDLP71UJXgA=="], @@ -68,8 +57,6 @@ "@models.dev/web": ["@models.dev/web@workspace:packages/web"], - "@standard-schema/spec": ["@standard-schema/spec@1.1.0", "https://npm-proxy.dev.databricks.com/@standard-schema/spec/-/spec-1.1.0.tgz", {}, "sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w=="], - "@tsconfig/bun": ["@tsconfig/bun@1.0.8", "https://npm-proxy.dev.databricks.com/@tsconfig/bun/-/bun-1.0.8.tgz", {}, "sha512-JlJaRaS4hBTypxtFe8WhnwV8blf0R+3yehLk8XuyxUYNx6VXsKCjACSCvOYEFUiqlhlBWxtYCn/zRlOb8BzBQg=="], "@types/bun": ["@types/bun@1.3.0", "https://npm-proxy.dev.databricks.com/@types/bun/-/bun-1.3.0.tgz", { "dependencies": { "bun-types": "1.3.0" } }, "sha512-+lAGCYjXjip2qY375xX/scJeVRmZ5cY0wyHYyCYxNcdEXrQ4AOe3gACgd4iQ8ksOslJtW4VNxBJ8llUwc3a6AA=="], @@ -78,14 +65,8 @@ "@types/react": ["@types/react@19.2.2", "https://npm-proxy.dev.databricks.com/@types/react/-/react-19.2.2.tgz", { "dependencies": { "csstype": "^3.0.2" } }, "sha512-6mDvHUFSjyT2B2yeNx2nUgMxh9LtOWvkhIU3uePn2I2oyNymUAX1NIsdgviM4CH+JSrp2D2hsMvJOkxY+0wNRA=="], - "@vercel/oidc": ["@vercel/oidc@3.2.0", "https://npm-proxy.dev.databricks.com/@vercel/oidc/-/oidc-3.2.0.tgz", {}, "sha512-UycprH3T6n3jH0k44NHMa7pnFHGu/N05MjojYr+Mc6I7obkoLIJujSWwin1pCvdy/eOxrI/l3uDLQsmcrOb4ug=="], - - "@workflow/serde": ["@workflow/serde@4.1.0", "https://npm-proxy.dev.databricks.com/@workflow/serde/-/serde-4.1.0.tgz", {}, "sha512-pav4F2BoirECWR7Nf1TKt+2eETcBj7jj4cBefQ8VXQCA6NPkaKeLfj/zMgi+3zYV5ZIBT4GuUiphsj0/b9hPQQ=="], - "accepts": ["accepts@2.0.0", "https://npm-proxy.dev.databricks.com/accepts/-/accepts-2.0.0.tgz", { "dependencies": { "mime-types": "^3.0.0", "negotiator": "^1.0.0" } }, "sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng=="], - "ai": ["ai@7.0.0-beta.111", "https://npm-proxy.dev.databricks.com/ai/-/ai-7.0.0-beta.111.tgz", { "dependencies": { "@ai-sdk/gateway": "4.0.0-beta.62", "@ai-sdk/provider": "4.0.0-beta.12", "@ai-sdk/provider-utils": "5.0.0-beta.26" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-dtXAmja2Atwu/0HocfGmMfeuXlFdKmzeFcDup6R621qnKshIRAOLTiABkp/Bs3sXA6yRjJHJzFYlSIF47z/HQQ=="], - "available-typed-arrays": ["available-typed-arrays@1.0.7", "https://npm-proxy.dev.databricks.com/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", { "dependencies": { "possible-typed-array-names": "^1.0.0" } }, "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ=="], "aws-sdk": ["aws-sdk@2.1692.0", "https://npm-proxy.dev.databricks.com/aws-sdk/-/aws-sdk-2.1692.0.tgz", { "dependencies": { "buffer": "4.9.2", "events": "1.1.1", "ieee754": "1.1.13", "jmespath": "0.16.0", "querystring": "0.2.0", "sax": "1.2.1", "url": "0.10.3", "util": "^0.12.4", "uuid": "8.0.0", "xml2js": "0.6.2" } }, "sha512-x511uiJ/57FIsbgUe5csJ13k3uzu25uWQE+XqfBis/sB0SFoiElJWXRkgEAUh0U6n40eT3ay5Ue4oPkRMu1LYw=="], @@ -146,7 +127,7 @@ "eventsource": ["eventsource@3.0.7", "https://npm-proxy.dev.databricks.com/eventsource/-/eventsource-3.0.7.tgz", { "dependencies": { "eventsource-parser": "^3.0.1" } }, "sha512-CRT1WTyuQoD771GW56XEZFQ/ZoSfWid1alKGDYMmkt2yl8UXrVR4pspqWNEcqKvVIzg6PAltWjxcSSPrboA4iA=="], - "eventsource-parser": ["eventsource-parser@3.0.8", "https://npm-proxy.dev.databricks.com/eventsource-parser/-/eventsource-parser-3.0.8.tgz", {}, "sha512-70QWGkr4snxr0OXLRWsFLeRBIRPuQOvt4s8QYjmUlmlkyTZkRqS7EDVRZtzU3TiyDbXSzaOeF0XUKy8PchzukQ=="], + "eventsource-parser": ["eventsource-parser@3.0.2", "https://npm-proxy.dev.databricks.com/eventsource-parser/-/eventsource-parser-3.0.2.tgz", {}, "sha512-6RxOBZ/cYgd8usLwsEl+EC09Au/9BcmCKYF2/xbml6DNczf7nv0MQb+7BA2F+li6//I+28VNlQR37XfQtcAJuA=="], "express": ["express@5.1.0", "https://npm-proxy.dev.databricks.com/express/-/express-5.1.0.tgz", { "dependencies": { "accepts": "^2.0.0", "body-parser": "^2.2.0", "content-disposition": "^1.0.0", "content-type": "^1.0.5", "cookie": "^0.7.1", "cookie-signature": "^1.2.1", "debug": "^4.4.0", "encodeurl": "^2.0.0", "escape-html": "^1.0.3", "etag": "^1.8.1", "finalhandler": "^2.1.0", "fresh": "^2.0.0", "http-errors": "^2.0.0", "merge-descriptors": "^2.0.0", "mime-types": "^3.0.0", "on-finished": "^2.4.1", "once": "^1.4.0", "parseurl": "^1.3.3", "proxy-addr": "^2.0.7", "qs": "^6.14.0", "range-parser": "^1.2.1", "router": "^2.2.0", "send": "^1.1.0", "serve-static": "^2.2.0", "statuses": "^2.0.1", "type-is": "^2.0.1", "vary": "^1.1.2" } }, "sha512-DT9ck5YIRU+8GYzzU5kT3eHGA5iL+1Zd0EutOmTE9Dtk+Tvuzd23VBU+ec7HPNSTxXYO55gPV/hq4pSBJDjFpA=="], @@ -206,8 +187,6 @@ "jose": ["jose@5.2.3", "https://npm-proxy.dev.databricks.com/jose/-/jose-5.2.3.tgz", {}, "sha512-KUXdbctm1uHVL8BYhnyHkgp3zDX5KW8ZhAKVFEfUbU2P8Alpzjb+48hHvjOdQIyPshoblhzsuqOwEEAbtHVirA=="], - "json-schema": ["json-schema@0.4.0", "https://npm-proxy.dev.databricks.com/json-schema/-/json-schema-0.4.0.tgz", {}, "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA=="], - "lru-cache": ["lru-cache@6.0.0", "https://npm-proxy.dev.databricks.com/lru-cache/-/lru-cache-6.0.0.tgz", { "dependencies": { "yallist": "^4.0.0" } }, "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA=="], "math-intrinsics": ["math-intrinsics@1.1.0", "https://npm-proxy.dev.databricks.com/math-intrinsics/-/math-intrinsics-1.1.0.tgz", {}, "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g=="], @@ -336,28 +315,20 @@ "yallist": ["yallist@4.0.0", "https://npm-proxy.dev.databricks.com/yallist/-/yallist-4.0.0.tgz", {}, "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="], - "zod": ["zod@4.3.6", "https://npm-proxy.dev.databricks.com/zod/-/zod-4.3.6.tgz", {}, "sha512-rftlrkhHZOcjDwkGlnUtZZkvaPHCsDATp4pGpuOOMDaTdDDXF91wuVDJoWoPsKX/3YPQ5fHuF3STjcYyKr+Qhg=="], + "zod": ["zod@3.24.2", "https://npm-proxy.dev.databricks.com/zod/-/zod-3.24.2.tgz", {}, "sha512-lY7CDW43ECgW9u1TcT3IoXHflywfVqDYze4waEz812jR/bZ8FHDsl7pFQoSZTz5N+2NqRXs8GBwnAwo3ZNxqhQ=="], "zod-to-json-schema": ["zod-to-json-schema@3.24.3", "https://npm-proxy.dev.databricks.com/zod-to-json-schema/-/zod-to-json-schema-3.24.3.tgz", { "peerDependencies": { "zod": "^3.24.1" } }, "sha512-HIAfWdYIt1sssHfYZFCXp4rU1w2r8hVVXYIlmoa0r0gABLs5di3RCqPU5DDROogVz1pAdYBaz7HK5n9pSUNs3A=="], - "@modelcontextprotocol/sdk/zod": ["zod@3.24.2", "https://npm-proxy.dev.databricks.com/zod/-/zod-3.24.2.tgz", {}, "sha512-lY7CDW43ECgW9u1TcT3IoXHflywfVqDYze4waEz812jR/bZ8FHDsl7pFQoSZTz5N+2NqRXs8GBwnAwo3ZNxqhQ=="], - "@models.dev/function/@cloudflare/workers-types": ["@cloudflare/workers-types@4.20250522.0", "https://npm-proxy.dev.databricks.com/@cloudflare/workers-types/-/workers-types-4.20250522.0.tgz", {}, "sha512-9RIffHobc35JWeddzBguGgPa4wLDr5x5F94+0/qy7LiV6pTBQ/M5qGEN9VA16IDT3EUpYI0WKh6VpcmeVEtVtw=="], "bun-types/@types/node": ["@types/node@24.0.3", "https://npm-proxy.dev.databricks.com/@types/node/-/node-24.0.3.tgz", { "dependencies": { "undici-types": "~7.8.0" } }, "sha512-R4I/kzCYAdRLzfiCabn9hxWfbuHS573x+r0dJMkkzThEa7pbrcDWK+9zu3e7aBOouf+rQAciqPFMnxwr0aWgKg=="], - "eventsource/eventsource-parser": ["eventsource-parser@3.0.2", "https://npm-proxy.dev.databricks.com/eventsource-parser/-/eventsource-parser-3.0.2.tgz", {}, "sha512-6RxOBZ/cYgd8usLwsEl+EC09Au/9BcmCKYF2/xbml6DNczf7nv0MQb+7BA2F+li6//I+28VNlQR37XfQtcAJuA=="], - "http-errors/statuses": ["statuses@2.0.1", "https://npm-proxy.dev.databricks.com/statuses/-/statuses-2.0.1.tgz", {}, "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ=="], - "models.dev/zod": ["zod@3.24.2", "https://npm-proxy.dev.databricks.com/zod/-/zod-3.24.2.tgz", {}, "sha512-lY7CDW43ECgW9u1TcT3IoXHflywfVqDYze4waEz812jR/bZ8FHDsl7pFQoSZTz5N+2NqRXs8GBwnAwo3ZNxqhQ=="], - "opencontrol/@tsconfig/bun": ["@tsconfig/bun@1.0.7", "https://npm-proxy.dev.databricks.com/@tsconfig/bun/-/bun-1.0.7.tgz", {}, "sha512-udGrGJBNQdXGVulehc1aWT73wkR9wdaGBtB6yL70RJsqwW/yJhIg6ZbRlPOfIUiFNrnBuYLBi9CSmMKfDC7dvA=="], "opencontrol/hono": ["hono@4.7.4", "https://npm-proxy.dev.databricks.com/hono/-/hono-4.7.4.tgz", {}, "sha512-Pst8FuGqz3L7tFF+u9Pu70eI0xa5S3LPUmrNd5Jm8nTHze9FxLTK9Kaj5g/k4UcwuJSXTP65SyHOPLrffpcAJg=="], - "opencontrol/zod": ["zod@3.24.2", "https://npm-proxy.dev.databricks.com/zod/-/zod-3.24.2.tgz", {}, "sha512-lY7CDW43ECgW9u1TcT3IoXHflywfVqDYze4waEz812jR/bZ8FHDsl7pFQoSZTz5N+2NqRXs8GBwnAwo3ZNxqhQ=="], - "openid-client/jose": ["jose@4.15.9", "https://npm-proxy.dev.databricks.com/jose/-/jose-4.15.9.tgz", {}, "sha512-1vUQX+IdDMVPj4k8kOxgUqlcK518yluMuGZwqlr44FS1ppZB/5GWh4rZG89erpOBOJjU/OBsnCVFfapsRz6nEA=="], "bun-types/@types/node/undici-types": ["undici-types@7.8.0", "https://npm-proxy.dev.databricks.com/undici-types/-/undici-types-7.8.0.tgz", {}, "sha512-9UJ2xGDvQ43tYyVMpuHlsgApydB8ZKfVYTsLDhXkFL/6gfkp+U8xTGdh8pMJv1SpZna0zxG1DwsKZsreLbXBxw=="], diff --git a/package.json b/package.json index e28e83f7f..2f05d20f9 100644 --- a/package.json +++ b/package.json @@ -17,16 +17,14 @@ "scripts": { "validate": "bun ./packages/core/script/validate.ts", "compare:migrations": "bun ./packages/core/script/compare-model-migrations.ts", + "databricks:generate": "bun ./packages/core/script/generate-databricks.ts", "helicone:generate": "bun ./packages/core/script/generate-helicone.ts", "venice:generate": "bun ./packages/core/script/generate-venice.ts", "vercel:generate": "bun ./packages/core/script/generate-vercel.ts", "wandb:generate": "bun ./packages/core/script/generate-wandb.ts" }, "dependencies": { - "@ai-sdk/openai-compatible": "^3.0.0-beta.31", "@cloudflare/workers-types": "^4.20260424.1", - "ai": "^7.0.0-beta.111", - "sst": "3.17.23", - "zod": "^4" + "sst": "3.17.23" } } diff --git a/packages/core/script/generate-databricks.ts b/packages/core/script/generate-databricks.ts new file mode 100644 index 000000000..8752e023b --- /dev/null +++ b/packages/core/script/generate-databricks.ts @@ -0,0 +1,287 @@ +#!/usr/bin/env bun + +/** + * Generates Databricks model TOML files from the Foundation Model API endpoint. + * + * Each Databricks endpoint exposes a model from another provider (Anthropic, + * OpenAI, Google, etc.), so the generated TOML uses [extends] to inherit + * canonical metadata from that upstream provider's TOML in models.dev. + * + * Usage: + * DATABRICKS_HOST= DATABRICKS_TOKEN= bun run databricks:generate + * bun run databricks:generate --workspace --token + * + * Flags: + * --dry-run: Preview changes without writing files + * --new-only: Only create new models, skip updating existing ones + */ + +import { z } from "zod"; +import path from "node:path"; +import { mkdir, readFile } from "node:fs/promises"; +import { existsSync } from "node:fs"; + +const args = process.argv.slice(2); +const flag = (name: string) => { + const i = args.indexOf(`--${name}`); + return i !== -1 ? args[i + 1] : undefined; +}; +const dryRun = args.includes("--dry-run"); +const newOnly = args.includes("--new-only"); + +const host = flag("workspace") ?? process.env.DATABRICKS_HOST; +const token = flag("token") ?? process.env.DATABRICKS_TOKEN; + +if (!host || !token) { + console.error( + "Usage: DATABRICKS_HOST= DATABRICKS_TOKEN= bun run databricks:generate", + ); + process.exit(1); +} + +const workspace = host.replace(/^https?:\/\//, "").replace(/\/$/, ""); +const PROVIDERS_DIR = path.join(import.meta.dirname, "..", "..", "..", "providers"); +const MODELS_DIR = path.join(PROVIDERS_DIR, "databricks", "models"); + +// --------------------------------------------------------------------------- +// API schemas +// --------------------------------------------------------------------------- + +const FoundationModel = z + .object({ + ai_gateway_v2_supported: z.boolean().optional(), + api_types: z.array(z.string()).optional(), + }) + .passthrough(); + +const ServedEntity = z + .object({ + foundation_model: FoundationModel.optional(), + }) + .passthrough(); + +const Endpoint = z + .object({ + name: z.string(), + config: z + .object({ + served_entities: z.array(ServedEntity).optional(), + }) + .passthrough() + .optional(), + }) + .passthrough(); + +const FoundationModelsResponse = z + .object({ + endpoints: z.array(Endpoint), + }) + .passthrough(); + +// --------------------------------------------------------------------------- +// Canonical resolution: map a Databricks endpoint name to a models.dev entry +// --------------------------------------------------------------------------- + +const PREFIX_TO_PROVIDER: [string, string][] = [ + ["claude-", "anthropic"], + ["gpt-", "openai"], + ["gemini-", "google"], + ["mistral-", "mistral"], + ["mixtral-", "mistral"], +]; + +type Resolution = + | { type: "extends"; from: string } + | { type: "inline"; content: string } + | null; + +async function resolveCanonical(endpointName: string): Promise { + const bare = endpointName.replace(/^databricks-/, ""); + + // Models in provider subdirectories (e.g. openrouter/openai/gpt-oss-*) + // can't use [extends] (schema requires provider/model format), so inline. + if (bare.startsWith("gpt-oss-")) { + const p = path.join(PROVIDERS_DIR, "openrouter", "models", "openai", `${bare}.toml`); + if (existsSync(p)) { + return { type: "inline", content: await readFile(p, "utf8") }; + } + } + + // Meta Llama: "meta-llama-3-3-70b-instruct" → "llama-3.3-70b-instruct" + if (bare.startsWith("meta-llama-") || bare.startsWith("llama-")) { + const llamaId = bare + .replace(/^meta-llama-/, "llama-") + .replace(/^(llama-\d+)-(\d+)-/, "$1.$2-"); + const p = path.join(PROVIDERS_DIR, "llama", "models", `${llamaId}.toml`); + if (existsSync(p)) return { type: "extends", from: `llama/${llamaId}` }; + } + + for (const [prefix, provider] of PREFIX_TO_PROVIDER) { + if (!bare.startsWith(prefix)) continue; + + const exact = path.join(PROVIDERS_DIR, provider, "models", `${bare}.toml`); + if (existsSync(exact)) return { type: "extends", from: `${provider}/${bare}` }; + + // Try with hyphens-as-dots in version (e.g. gpt-5-4 → gpt-5.4) + const dotted = bare.replace(/^((?:[a-z]+-)+\d+)-(\d)/, "$1.$2"); + if (dotted !== bare) { + const dottedExact = path.join(PROVIDERS_DIR, provider, "models", `${dotted}.toml`); + if (existsSync(dottedExact)) return { type: "extends", from: `${provider}/${dotted}` }; + } + + // Fuzzy: longest filename that shares a prefix with bare or its dotted form + const candidates = [bare, ...(dotted !== bare ? [dotted] : [])]; + const files: string[] = []; + try { + for await (const f of new Bun.Glob("*.toml").scan({ + cwd: path.join(PROVIDERS_DIR, provider, "models"), + })) { + files.push(f); + } + } catch { + // provider directory may not exist + } + const match = files + .map((f) => f.replace(/\.toml$/, "")) + .filter((id) => candidates.some((c) => id.startsWith(c) || c.startsWith(id))) + .sort((a, b) => b.length - a.length)[0]; + if (match) return { type: "extends", from: `${provider}/${match}` }; + } + + return null; +} + +function formatToml(resolution: Resolution, endpointName: string): string { + if (resolution?.type === "extends") { + return `[extends]\nfrom = "${resolution.from}"\n`; + } + if (resolution?.type === "inline") { + return resolution.content; + } + return `# TODO: fill in details for ${endpointName}\nname = "${endpointName}"\n`; +} + +// --------------------------------------------------------------------------- +// Main +// --------------------------------------------------------------------------- + +const IGNORE_PREFIXES = [ + "databricks-llama-", + "databricks-meta-llama-", + "databricks-qwen", + "databricks-gemma-", +]; + +async function main() { + console.log( + `${dryRun ? "[DRY RUN] " : ""}${newOnly ? "[NEW ONLY] " : ""}Fetching Databricks foundation-models...`, + ); + + const url = `https://${workspace}/api/2.0/serving-endpoints:foundation-models`; + const res = await fetch(url, { + headers: { Authorization: `Bearer ${token}` }, + }); + if (!res.ok) { + console.error(`Failed to fetch API: ${res.status} ${res.statusText}`); + console.error(await res.text().catch(() => "")); + process.exit(1); + } + + const json = await res.json(); + const parsed = FoundationModelsResponse.safeParse(json); + if (!parsed.success) { + console.error("Invalid API response:", parsed.error.errors); + process.exit(1); + } + + const endpoints = parsed.data.endpoints.filter( + (e) => + !IGNORE_PREFIXES.some((p) => e.name.startsWith(p)) && + e.config?.served_entities?.some( + (se) => + se.foundation_model?.ai_gateway_v2_supported === true && + se.foundation_model?.api_types?.includes("mlflow/v1/chat/completions"), + ), + ); + + const existingFiles = new Set(); + try { + for await (const f of new Bun.Glob("*.toml").scan({ cwd: MODELS_DIR })) { + existingFiles.add(f); + } + } catch { + // directory may not exist yet + } + + console.log( + `Found ${endpoints.length} models in API, ${existingFiles.size} existing files\n`, + ); + + const apiModelIds = new Set(); + let created = 0; + let updated = 0; + let unchanged = 0; + + for (const ep of endpoints) { + const filename = `${ep.name}.toml`; + apiModelIds.add(filename); + const filePath = path.join(MODELS_DIR, filename); + + const resolution = await resolveCanonical(ep.name); + const newContent = formatToml(resolution, ep.name); + const tag = resolution?.type === "extends" ? `extends ${resolution.from}` : resolution?.type ?? "stub"; + + const existed = existsSync(filePath); + if (!existed) { + created++; + if (dryRun) { + console.log(`[DRY RUN] Would create: ${filename} → ${tag}`); + } else { + await mkdir(MODELS_DIR, { recursive: true }); + await Bun.write(filePath, newContent); + console.log(`Created: ${filename} → ${tag}`); + } + continue; + } + + if (newOnly) { + unchanged++; + continue; + } + + const existingContent = await readFile(filePath, "utf8"); + if (existingContent === newContent) { + unchanged++; + continue; + } + + updated++; + if (dryRun) { + console.log(`[DRY RUN] Would update: ${filename} → ${tag}`); + } else { + await Bun.write(filePath, newContent); + console.log(`Updated: ${filename} → ${tag}`); + } + } + + const orphaned: string[] = []; + for (const file of existingFiles) { + if (!apiModelIds.has(file)) { + orphaned.push(file); + console.log(`Warning: Orphaned file (not in API): ${file}`); + } + } + + console.log(""); + if (dryRun) { + console.log( + `Summary: ${created} would be created, ${updated} would be updated, ${unchanged} unchanged, ${orphaned.length} orphaned`, + ); + } else { + console.log( + `Summary: ${created} created, ${updated} updated, ${unchanged} unchanged, ${orphaned.length} orphaned`, + ); + } +} + +await main(); diff --git a/providers/databricks/models/databricks-gemini-3-1-pro.toml b/providers/databricks/models/databricks-gemini-3-1-pro.toml new file mode 100644 index 000000000..92b13a100 --- /dev/null +++ b/providers/databricks/models/databricks-gemini-3-1-pro.toml @@ -0,0 +1,2 @@ +[extends] +from = "google/gemini-3.1-pro-preview-customtools" diff --git a/providers/databricks/models/databricks-gemini-3-pro.toml b/providers/databricks/models/databricks-gemini-3-pro.toml new file mode 100644 index 000000000..a7d2ee905 --- /dev/null +++ b/providers/databricks/models/databricks-gemini-3-pro.toml @@ -0,0 +1,2 @@ +[extends] +from = "google/gemini-3-pro-preview" diff --git a/providers/databricks/scripts/generate-databricks.ts b/providers/databricks/scripts/generate-databricks.ts deleted file mode 100644 index 11b6e3161..000000000 --- a/providers/databricks/scripts/generate-databricks.ts +++ /dev/null @@ -1,178 +0,0 @@ -#!/usr/bin/env bun - -/** - * Fetches Databricks ai_gateway_v2 endpoints, generates TOML files under - * providers/databricks/models/, then smoke-tests each model with the AI SDK - * and removes any that are incompatible with @ai-sdk/openai-compatible. - * - * Usage: - * DATABRICKS_HOST= DATABRICKS_TOKEN= bun run generate-databricks.ts - * bun run generate-databricks.ts --workspace --token [--dump] - */ - -import path from "node:path"; -import { mkdir, writeFile, readFile, readdir, rm } from "node:fs/promises"; -import { existsSync } from "node:fs"; -import { createOpenAICompatible } from "@ai-sdk/openai-compatible"; -import { streamText } from "ai"; - -const args = process.argv.slice(2); -const flag = (name: string) => { const i = args.indexOf(`--${name}`); return i !== -1 ? args[i + 1] : undefined; }; -const DUMP = args.includes("--dump"); - -const host = flag("workspace") ?? process.env.DATABRICKS_HOST; -const token = flag("token") ?? process.env.DATABRICKS_TOKEN; - -if (!host || !token) { - console.error("Usage: DATABRICKS_HOST= DATABRICKS_TOKEN= bun run generate-databricks.ts"); - process.exit(1); -} - -const workspace = host.replace(/^https?:\/\//, "").replace(/\/$/, ""); -const PROVIDERS_DIR = path.join(import.meta.dirname, "..", ".."); - -// --------------------------------------------------------------------------- -// Canonical lookup -// --------------------------------------------------------------------------- - -const PREFIX_TO_PROVIDER: [string, string][] = [ - ["claude-", "anthropic"], - ["gpt-", "openai"], - ["gemini-", "google"], - ["mistral-", "mistral"], - ["mixtral-", "mistral"], -]; - -type Resolution = { type: "extends"; from: string } | { type: "inline"; content: string } | null; - -async function resolve(endpointName: string): Promise { - const bare = endpointName.replace(/^databricks-/, ""); - - // Models in provider subdirectories can't use extends (schema requires provider/model format), - // so inline their content directly. - if (bare.startsWith("gpt-oss-")) { - const p = path.join(PROVIDERS_DIR, "openrouter", "models", "openai", `${bare}.toml`); - if (existsSync(p)) return { type: "inline", content: await readFile(p, "utf8") }; - } - - // Meta Llama: "meta-llama-3-3-70b-instruct" → "llama-3.3-70b-instruct" - if (bare.startsWith("meta-llama-") || bare.startsWith("llama-")) { - const llamaId = bare - .replace(/^meta-llama-/, "llama-") - .replace(/^(llama-\d+)-(\d+)-/, "$1.$2-"); - const p = path.join(PROVIDERS_DIR, "llama", "models", `${llamaId}.toml`); - if (existsSync(p)) return { type: "extends", from: `llama/${llamaId}` }; - } - - for (const [prefix, provider] of PREFIX_TO_PROVIDER) { - if (!bare.startsWith(prefix)) continue; - const exact = path.join(PROVIDERS_DIR, provider, "models", `${bare}.toml`); - if (existsSync(exact)) return { type: "extends", from: `${provider}/${bare}` }; - const dotted = bare.replace(/^((?:[a-z]+-)+\d+)-(\d)/, "$1.$2"); - if (dotted !== bare) { - const dottedExact = path.join(PROVIDERS_DIR, provider, "models", `${dotted}.toml`); - if (existsSync(dottedExact)) return { type: "extends", from: `${provider}/${dotted}` }; - } - const files = await readdir(path.join(PROVIDERS_DIR, provider, "models")).catch(() => []); - const candidates = [bare, ...(dotted !== bare ? [dotted] : [])]; - const match = files - .filter(f => f.endsWith(".toml")) - .map(f => f.replace(/\.toml$/, "")) - .filter(id => candidates.some(c => id.startsWith(c) || c.startsWith(id))) - .sort((a, b) => b.length - a.length)[0]; - if (match) return { type: "extends", from: `${provider}/${match}` }; - } - - return null; -} - -// --------------------------------------------------------------------------- -// AI SDK compatibility test -// --------------------------------------------------------------------------- - -async function testModel(modelId: string): Promise { - const provider = createOpenAICompatible({ - name: "databricks", - baseURL: `https://${workspace}/ai-gateway/mlflow/v1`, - apiKey: token!, - }); - try { - const result = streamText({ model: provider(modelId), prompt: "Say hello in one word" }); - const text = await result.text; - return text.trim().length > 0; - } catch { - return false; - } -} - -// --------------------------------------------------------------------------- -// Main -// --------------------------------------------------------------------------- - -const url = `https://${workspace}/api/2.0/serving-endpoints:foundation-models`; -console.log(`Fetching: ${url}`); - -const res = await fetch(url, { headers: { Authorization: `Bearer ${token}` } }); -if (!res.ok) { - console.error(`HTTP ${res.status} ${res.statusText}`); - console.error(await res.text().catch(() => "")); - process.exit(1); -} - -const json = await res.json() as { endpoints: Array<{ name: string; tags?: { key: string; value: string }[]; config?: { served_entities?: Array<{ foundation_model?: { ai_gateway_v2_supported?: boolean; api_types?: string[] } }> } }> }; - -if (DUMP) { console.log(JSON.stringify(json, null, 2)); process.exit(0); } - -const IGNORE_PREFIXES = ["databricks-llama-", "databricks-meta-llama-", "databricks-qwen", "databricks-gemma-"]; - -const endpoints = json.endpoints.filter(e => - !IGNORE_PREFIXES.some(p => e.name.startsWith(p)) && - e.config?.served_entities?.some((se: any) => - se.foundation_model?.ai_gateway_v2_supported === true && - se.foundation_model?.api_types?.includes("mlflow/v1/chat/completions") - ) -); -console.log(`${endpoints.length} ai_gateway_v2 endpoint(s)\n`); - -const outDir = path.join(PROVIDERS_DIR, "databricks", "models"); -await mkdir(outDir, { recursive: true }); -for (const f of await readdir(outDir)) { - if (f.endsWith(".toml")) await rm(path.join(outDir, f), { force: true }); -} - -// Write TOMLs -let extended = 0, inlined = 0, stubbed = 0; -for (const ep of endpoints) { - const resolution = await resolve(ep.name); - let toml: string; - if (resolution?.type === "extends") { - toml = `[extends]\nfrom = "${resolution.from}"\n`; - extended++; - } else if (resolution?.type === "inline") { - toml = resolution.content; - inlined++; - } else { - toml = `# TODO: fill in details for ${ep.name}\nname = "${ep.name}"\n`; - stubbed++; - } - await writeFile(path.join(outDir, `${ep.name}.toml`), toml, "utf8"); -} -console.log(`Wrote ${endpoints.length} file(s): ${extended} extends, ${inlined} inlined, ${stubbed} stubs\n`); - -// Test each model with the AI SDK and remove incompatible ones -console.log(`Testing AI SDK compatibility...`); -let kept = 0, removed = 0; -for (const ep of endpoints) { - process.stdout.write(` ${ep.name} → `); - const ok = await testModel(ep.name); - if (ok) { - console.log(`✓`); - kept++; - } else { - console.log(`✗ removed`); - await rm(path.join(outDir, `${ep.name}.toml`), { force: true }); - removed++; - } -} - -console.log(`\n${kept} models kept, ${removed} removed as incompatible with @ai-sdk/openai-compatible`); diff --git a/providers/databricks/scripts/test-databricks.ts b/providers/databricks/scripts/test-databricks.ts deleted file mode 100644 index 8c7e2d0b9..000000000 --- a/providers/databricks/scripts/test-databricks.ts +++ /dev/null @@ -1,57 +0,0 @@ -#!/usr/bin/env bun - -/** - * Smoke-tests all Databricks models against the AI Gateway. - * - * Usage: - * DATABRICKS_HOST= DATABRICKS_TOKEN= bun run test-databricks.ts - */ - -import { createOpenAICompatible } from "@ai-sdk/openai-compatible"; -import { streamText } from "ai"; -import { readdir } from "node:fs/promises"; -import path from "node:path"; - -const host = process.env.DATABRICKS_HOST; -const token = process.env.DATABRICKS_TOKEN; - -if (!host || !token) { - console.error("Usage: DATABRICKS_HOST= DATABRICKS_TOKEN= bun run test-databricks.ts"); - process.exit(1); -} - -const databricks = createOpenAICompatible({ - name: "databricks", - baseURL: `https://${host.replace(/^https?:\/\//, "")}/ai-gateway/mlflow/v1`, - apiKey: token, -}); - -const modelsDir = path.join(import.meta.dirname, "..", "models"); -const models = (await readdir(modelsDir)) - .filter(f => f.endsWith(".toml")) - .map(f => f.replace(/\.toml$/, "")); - -console.log(`Testing ${models.length} models...\n`); - -let passed = 0, failed = 0; -for (const modelId of models) { - process.stdout.write(` ${modelId} → `); - try { - const result = streamText({ - model: databricks(modelId), - prompt: "Say hello in one word", - }); - const text = await result.text; - if (!text.trim()) throw new Error("empty response"); - console.log(`✓ "${text.trim()}"`); - passed++; - } catch (e: any) { - console.log(`✗ ${e.message?.slice(0, 100) ?? e}`); - if (e.cause) console.log(` cause: ${JSON.stringify(e.cause)?.slice(0, 200)}`); - if (e.responseBody) console.log(` body: ${String(e.responseBody).slice(0, 200)}`); - failed++; - } -} - -console.log(`\n${passed} passed, ${failed} failed`); -if (failed > 0) process.exit(1);