From beb644e086af8368873cbdc192bbedde9226428c Mon Sep 17 00:00:00 2001 From: Bart Broere Date: Sat, 17 Jan 2026 13:19:48 +0100 Subject: [PATCH 1/3] Make the models.dev domain configurable for deployment in offline locations --- packages/opencode/src/provider/models-macro.ts | 3 ++- packages/opencode/src/provider/models.ts | 6 ++++-- packages/opencode/test/preload.ts | 3 ++- packages/ui/vite.config.ts | 5 +++-- 4 files changed, 11 insertions(+), 6 deletions(-) diff --git a/packages/opencode/src/provider/models-macro.ts b/packages/opencode/src/provider/models-macro.ts index 6c8492a7017..4bc3aee4ca1 100644 --- a/packages/opencode/src/provider/models-macro.ts +++ b/packages/opencode/src/provider/models-macro.ts @@ -6,6 +6,7 @@ export async function data() { return await file.text() } } - const json = await fetch("https://models.dev/api.json").then((x) => x.text()) + const url = Bun.env.MODELS_DEV_URL || "https://models.dev" + const json = await fetch(`${url}/api.json`).then((x) => x.text()) return json } diff --git a/packages/opencode/src/provider/models.ts b/packages/opencode/src/provider/models.ts index c5465f9880e..3001a10771b 100644 --- a/packages/opencode/src/provider/models.ts +++ b/packages/opencode/src/provider/models.ts @@ -85,7 +85,8 @@ export namespace ModelsDev { const json = await data() return JSON.parse(json) as Record } - const json = await fetch("https://models.dev/api.json").then((x) => x.text()) + const url = Bun.env.MODELS_DEV_URL || "https://models.dev" + const json = await fetch(`${url}/api.json`).then((x) => x.text()) return JSON.parse(json) as Record } @@ -95,7 +96,8 @@ export namespace ModelsDev { log.info("refreshing", { file, }) - const result = await fetch("https://models.dev/api.json", { + const url = Bun.env.MODELS_DEV_URL || "https://models.dev" + const result = await fetch(`${url}/api.json`, { headers: { "User-Agent": Installation.USER_AGENT, }, diff --git a/packages/opencode/test/preload.ts b/packages/opencode/test/preload.ts index 35b0b6c7642..9fc132b0a92 100644 --- a/packages/opencode/test/preload.ts +++ b/packages/opencode/test/preload.ts @@ -27,7 +27,8 @@ process.env["XDG_STATE_HOME"] = path.join(dir, "state") const cacheDir = path.join(dir, "cache", "opencode") await fs.mkdir(cacheDir, { recursive: true }) await fs.writeFile(path.join(cacheDir, "version"), "14") -const response = await fetch("https://models.dev/api.json") +const url = Bun.env.MODELS_DEV_URL || "https://models.dev" +const response = await fetch(`${url}/api.json`) if (response.ok) { await fs.writeFile(path.join(cacheDir, "models.json"), await response.text()) } diff --git a/packages/ui/vite.config.ts b/packages/ui/vite.config.ts index 0f3630b3a1d..b07a736dc96 100644 --- a/packages/ui/vite.config.ts +++ b/packages/ui/vite.config.ts @@ -45,12 +45,13 @@ function providerIconsPlugin() { } async function fetchProviderIcons() { - const providers = await fetch("https://models.dev/api.json") + const url = process.env.MODELS_DEV_URL || "https://models.dev" + const providers = await fetch(`${url}/api.json`) .then((res) => res.json()) .then((json) => Object.keys(json)) await Promise.all( providers.map((provider) => - fetch(`https://models.dev/logos/${provider}.svg`) + fetch(`${url}/logos/${provider}.svg`) .then((res) => res.text()) .then((svg) => fs.writeFileSync(`./src/assets/icons/provider/${provider}.svg`, svg)), ), From fd69cbfdf552cf23eeb1266f15fe29ad019786e9 Mon Sep 17 00:00:00 2001 From: Bart Broere Date: Tue, 20 Jan 2026 06:23:03 +0100 Subject: [PATCH 2/3] Follow pull request suggestion to set the modelsDevUrl once globally --- packages/opencode/src/global/index.ts | 4 ++++ packages/opencode/src/provider/models-macro.ts | 4 +++- packages/opencode/src/provider/models.ts | 4 ++-- packages/opencode/test/preload.ts | 3 ++- 4 files changed, 11 insertions(+), 4 deletions(-) diff --git a/packages/opencode/src/global/index.ts b/packages/opencode/src/global/index.ts index d3011b41506..9489e2b37ec 100644 --- a/packages/opencode/src/global/index.ts +++ b/packages/opencode/src/global/index.ts @@ -22,6 +22,10 @@ export namespace Global { cache, config, state, + // Allow overriding models.dev URL for offline deployments + get modelsDevUrl() { + return process.env.MODELS_DEV_URL || "https://models.dev" + }, } } diff --git a/packages/opencode/src/provider/models-macro.ts b/packages/opencode/src/provider/models-macro.ts index 4bc3aee4ca1..e8fd353c91d 100644 --- a/packages/opencode/src/provider/models-macro.ts +++ b/packages/opencode/src/provider/models-macro.ts @@ -1,3 +1,5 @@ +import { Global } from "../global" + export async function data() { const path = Bun.env.MODELS_DEV_API_JSON if (path) { @@ -6,7 +8,7 @@ export async function data() { return await file.text() } } - const url = Bun.env.MODELS_DEV_URL || "https://models.dev" + const url = Global.Path.modelsDevUrl const json = await fetch(`${url}/api.json`).then((x) => x.text()) return json } diff --git a/packages/opencode/src/provider/models.ts b/packages/opencode/src/provider/models.ts index 3001a10771b..1f7b7408133 100644 --- a/packages/opencode/src/provider/models.ts +++ b/packages/opencode/src/provider/models.ts @@ -85,7 +85,7 @@ export namespace ModelsDev { const json = await data() return JSON.parse(json) as Record } - const url = Bun.env.MODELS_DEV_URL || "https://models.dev" + const url = Global.Path.modelsDevUrl const json = await fetch(`${url}/api.json`).then((x) => x.text()) return JSON.parse(json) as Record } @@ -96,7 +96,7 @@ export namespace ModelsDev { log.info("refreshing", { file, }) - const url = Bun.env.MODELS_DEV_URL || "https://models.dev" + const url = Global.Path.modelsDevUrl const result = await fetch(`${url}/api.json`, { headers: { "User-Agent": Installation.USER_AGENT, diff --git a/packages/opencode/test/preload.ts b/packages/opencode/test/preload.ts index 9fc132b0a92..819166c94c6 100644 --- a/packages/opencode/test/preload.ts +++ b/packages/opencode/test/preload.ts @@ -5,6 +5,7 @@ import path from "path" import fs from "fs/promises" import fsSync from "fs" import { afterAll } from "bun:test" +const { Global } = await import("../src/global") const dir = path.join(os.tmpdir(), "opencode-test-data-" + process.pid) await fs.mkdir(dir, { recursive: true }) @@ -27,7 +28,7 @@ process.env["XDG_STATE_HOME"] = path.join(dir, "state") const cacheDir = path.join(dir, "cache", "opencode") await fs.mkdir(cacheDir, { recursive: true }) await fs.writeFile(path.join(cacheDir, "version"), "14") -const url = Bun.env.MODELS_DEV_URL || "https://models.dev" +const url = Global.Path.modelsDevUrl const response = await fetch(`${url}/api.json`) if (response.ok) { await fs.writeFile(path.join(cacheDir, "models.json"), await response.text()) From 6b66e6f5dc21b48cc5beecfde81c73b96f1c2cc4 Mon Sep 17 00:00:00 2001 From: Bart Broere Date: Tue, 20 Jan 2026 06:45:35 +0100 Subject: [PATCH 3/3] Rename environment variable to have an OPENCODE prefix, leave global variable's name the same --- packages/opencode/src/global/index.ts | 2 +- packages/ui/vite.config.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/opencode/src/global/index.ts b/packages/opencode/src/global/index.ts index 9489e2b37ec..25595abcddc 100644 --- a/packages/opencode/src/global/index.ts +++ b/packages/opencode/src/global/index.ts @@ -24,7 +24,7 @@ export namespace Global { state, // Allow overriding models.dev URL for offline deployments get modelsDevUrl() { - return process.env.MODELS_DEV_URL || "https://models.dev" + return process.env.OPENCODE_MODELS_URL || "https://models.dev" }, } } diff --git a/packages/ui/vite.config.ts b/packages/ui/vite.config.ts index b07a736dc96..335084bd645 100644 --- a/packages/ui/vite.config.ts +++ b/packages/ui/vite.config.ts @@ -45,7 +45,7 @@ function providerIconsPlugin() { } async function fetchProviderIcons() { - const url = process.env.MODELS_DEV_URL || "https://models.dev" + const url = process.env.OPENCODE_MODELS_URL || "https://models.dev" const providers = await fetch(`${url}/api.json`) .then((res) => res.json()) .then((json) => Object.keys(json))