diff --git a/packages/opencode/src/provider/provider.ts b/packages/opencode/src/provider/provider.ts index 088aa2fd7664..566e906c516f 100644 --- a/packages/opencode/src/provider/provider.ts +++ b/packages/opencode/src/provider/provider.ts @@ -1394,13 +1394,20 @@ export const layer = Layer.effect( // extend database from config for (const [providerID, provider] of configProviders) { const existing = database[providerID] + const providerNpm = provider.npm + const existingModels = existing?.models ?? {} const parsed: Info = { id: ProviderV2.ID.make(providerID), name: provider.name ?? existing?.name ?? providerID, env: provider.env ?? existing?.env ?? [], options: mergeDeep(existing?.options ?? {}, provider.options ?? {}), source: "config", - models: existing?.models ?? {}, + models: providerNpm + ? mapValues(existingModels, (model) => ({ + ...model, + api: { ...model.api, npm: providerNpm }, + })) + : existingModels, } for (const [modelID, model] of Object.entries(provider.models ?? {})) { diff --git a/packages/opencode/test/provider/provider.test.ts b/packages/opencode/test/provider/provider.test.ts index 05d22aec4142..7259c685ece9 100644 --- a/packages/opencode/test/provider/provider.test.ts +++ b/packages/opencode/test/provider/provider.test.ts @@ -123,6 +123,25 @@ it.instance( { config: { provider: { anthropic: { options: { apiKey: "config-api-key" } } } } }, ) +it.instance( + "provider-level npm applies to existing models without model overrides", + Effect.gen(function* () { + const providers = yield* list + const model = providers[ProviderV2.ID.anthropic].models["claude-sonnet-4-20250514"] + expect(model.api.npm).toBe("@ai-sdk/openai-compatible") + }), + { + config: { + provider: { + anthropic: { + npm: "@ai-sdk/openai-compatible", + options: { apiKey: "config-api-key" }, + }, + }, + }, + }, +) + it.instance( "disabled_providers excludes provider", Effect.gen(function* () {