diff --git a/packages/opencode/src/cli/cmd/models.ts b/packages/opencode/src/cli/cmd/models.ts index 1ae4ae12ca9..b817a670aa7 100644 --- a/packages/opencode/src/cli/cmd/models.ts +++ b/packages/opencode/src/cli/cmd/models.ts @@ -27,7 +27,7 @@ export const ModelsCommand = cmd({ }, handler: async (args) => { if (args.refresh) { - await ModelsDev.refresh() + await ModelsDev.refresh(true) UI.println(UI.Style.TEXT_SUCCESS_BOLD + "Models cache refreshed" + UI.Style.TEXT_NORMAL) } diff --git a/packages/opencode/src/config/config.ts b/packages/opencode/src/config/config.ts index a4961209055..5d1681ac126 100644 --- a/packages/opencode/src/config/config.ts +++ b/packages/opencode/src/config/config.ts @@ -667,6 +667,10 @@ export namespace Config { chatMaxRetries: z.number().optional().describe("Number of retries for chat completions on failure"), disable_paste_summary: z.boolean().optional(), batch_tool: z.boolean().optional().describe("Enable the batch tool"), + skip_models_fetch: z + .boolean() + .optional() + .describe("Skip automatic fetching of models from models.dev on startup"), }) .optional(), }) diff --git a/packages/opencode/src/provider/models.ts b/packages/opencode/src/provider/models.ts index 676837e1521..b08d5fde460 100644 --- a/packages/opencode/src/provider/models.ts +++ b/packages/opencode/src/provider/models.ts @@ -4,6 +4,7 @@ import path from "path" import z from "zod" import { data } from "./models-macro" with { type: "macro" } import { Installation } from "../installation" +import { Config } from "../config/config" export namespace ModelsDev { const log = Log.create({ service: "models.dev" }) @@ -69,7 +70,10 @@ export namespace ModelsDev { export type Provider = z.infer export async function get() { - refresh() + const config = await Config.get() + if (!config.experimental?.skip_models_fetch) { + refresh() + } const file = Bun.file(filepath) const result = await file.json().catch(() => {}) if (result) return result as Record @@ -77,7 +81,13 @@ export namespace ModelsDev { return JSON.parse(json) as Record } - export async function refresh() { + export async function refresh(force = false) { + const config = await Config.get() + if (!force && config.experimental?.skip_models_fetch) { + log.debug("skipping models.dev fetch due to skip_models_fetch config") + return + } + const file = Bun.file(filepath) log.info("refreshing", { file, @@ -96,4 +106,12 @@ export namespace ModelsDev { } } -setInterval(() => ModelsDev.refresh(), 60 * 1000 * 60).unref() +setInterval( + async () => { + const config = await Config.get() + if (!config.experimental?.skip_models_fetch) { + ModelsDev.refresh() + } + }, + 60 * 1000 * 60, +).unref() diff --git a/packages/sdk/js/src/gen/types.gen.ts b/packages/sdk/js/src/gen/types.gen.ts index d81fda9f846..6f7cfb39a38 100644 --- a/packages/sdk/js/src/gen/types.gen.ts +++ b/packages/sdk/js/src/gen/types.gen.ts @@ -1245,6 +1245,10 @@ export type Config = { * Enable the batch tool */ batch_tool?: boolean + /** + * Skip automatic fetching of models from models.dev on startup + */ + skip_models_fetch?: boolean } }