diff --git a/packages/opencode/src/config/config.ts b/packages/opencode/src/config/config.ts index a91c91cf0a0..c7dbef12a20 100644 --- a/packages/opencode/src/config/config.ts +++ b/packages/opencode/src/config/config.ts @@ -959,6 +959,10 @@ export namespace Config { .array(z.string()) .optional() .describe("Tools that should only be available to primary agents."), + skip_models_refresh: z + .boolean() + .optional() + .describe("Skip automatic fetching of model information from models.dev on startup and timer"), continue_loop_on_deny: z.boolean().optional().describe("Continue the agent loop when a tool call is denied"), mcp_timeout: z .number() diff --git a/packages/opencode/src/provider/models.ts b/packages/opencode/src/provider/models.ts index 796dcb7c238..52971606edf 100644 --- a/packages/opencode/src/provider/models.ts +++ b/packages/opencode/src/provider/models.ts @@ -4,11 +4,13 @@ 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" import { Flag } from "../flag/flag" export namespace ModelsDev { const log = Log.create({ service: "models.dev" }) const filepath = path.join(Global.Path.cache, "models.json") + let timerSetup = false export const Model = z.object({ id: z.string(), @@ -76,7 +78,20 @@ export namespace ModelsDev { export type Provider = z.infer export async function get() { - refresh() + const globalConfig = await Config.global() + + // Setup timer and immediate refresh only if not skipping refresh + if (!globalConfig.experimental?.skip_models_refresh) { + // Setup timer only once + if (!timerSetup) { + timerSetup = true + setInterval(() => ModelsDev.refresh(), 60 * 1000 * 60).unref() + } + + // Trigger immediate refresh + refresh() + } + const file = Bun.file(filepath) const result = await file.json().catch(() => {}) if (result) return result as Record @@ -103,5 +118,3 @@ export namespace ModelsDev { if (result && result.ok) await Bun.write(file, await result.text()) } } - -setInterval(() => 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 32f33f66219..8cf77f50b7f 100644 --- a/packages/sdk/js/src/gen/types.gen.ts +++ b/packages/sdk/js/src/gen/types.gen.ts @@ -1369,6 +1369,10 @@ export type Config = { * Tools that should only be available to primary agents. */ primary_tools?: Array + /** + * Skip automatic fetching of model information from models.dev on startup and timer + */ + skip_models_refresh?: boolean } } diff --git a/packages/sdk/js/src/v2/gen/types.gen.ts b/packages/sdk/js/src/v2/gen/types.gen.ts index fb3be8208ac..7a7961e84bd 100644 --- a/packages/sdk/js/src/v2/gen/types.gen.ts +++ b/packages/sdk/js/src/v2/gen/types.gen.ts @@ -1671,6 +1671,10 @@ export type Config = { * Tools that should only be available to primary agents. */ primary_tools?: Array + /** + * Skip automatic fetching of model information from models.dev on startup and timer + */ + skip_models_refresh?: boolean /** * Continue the agent loop when a tool call is denied */