From ca8f450ef2f41d30d75e9a7801ff4dbe153c1c21 Mon Sep 17 00:00:00 2001 From: Br1an67 <932039080@qq.com> Date: Mon, 2 Mar 2026 01:58:02 +0800 Subject: [PATCH] fix(provider): await models.dev refresh before computing provider state The provider state initialization could use a stale bundled snapshot when the background models.dev refresh hadn't completed yet. This caused ProviderModelNotFoundError for models that exist in models.dev but not in the snapshot. Track the initial refresh promise via startRefresh() and await it in ensureFresh() before computing provider state. If the refresh fails or was never started, ensureFresh() is a no-op. --- packages/opencode/src/provider/models.ts | 13 ++++++++++++- packages/opencode/src/provider/provider.ts | 1 + 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/packages/opencode/src/provider/models.ts b/packages/opencode/src/provider/models.ts index bae33178467..4a54b006add 100644 --- a/packages/opencode/src/provider/models.ts +++ b/packages/opencode/src/provider/models.ts @@ -103,6 +103,8 @@ export namespace ModelsDev { return result as Record } + let refreshing: Promise | undefined + export async function refresh() { const result = await fetch(`${url()}/api.json`, { headers: { @@ -119,10 +121,19 @@ export namespace ModelsDev { ModelsDev.Data.reset() } } + + export function startRefresh() { + refreshing = refresh() + return refreshing + } + + export async function ensureFresh() { + if (refreshing) await refreshing.catch(() => {}) + } } if (!Flag.OPENCODE_DISABLE_MODELS_FETCH && !process.argv.includes("--get-yargs-completions")) { - ModelsDev.refresh() + ModelsDev.startRefresh() setInterval( async () => { await ModelsDev.refresh() diff --git a/packages/opencode/src/provider/provider.ts b/packages/opencode/src/provider/provider.ts index 022ec316795..9e3962efc18 100644 --- a/packages/opencode/src/provider/provider.ts +++ b/packages/opencode/src/provider/provider.ts @@ -757,6 +757,7 @@ export namespace Provider { const state = Instance.state(async () => { using _ = log.time("state") const config = await Config.get() + await ModelsDev.ensureFresh() const modelsDev = await ModelsDev.get() const database = mapValues(modelsDev, fromModelsDevProvider)