diff --git a/packages/opencode/src/config/config.ts b/packages/opencode/src/config/config.ts index f5b402e36..869469a04 100644 --- a/packages/opencode/src/config/config.ts +++ b/packages/opencode/src/config/config.ts @@ -511,6 +511,8 @@ export namespace Config { z.string(), ModelsDev.Provider.partial() .extend({ + whitelist: z.array(z.string()).optional(), + blacklist: z.array(z.string()).optional(), models: z.record(z.string(), ModelsDev.Model.partial()).optional(), options: z .object({ diff --git a/packages/opencode/src/provider/provider.ts b/packages/opencode/src/provider/provider.ts index 228c855aa..25f6f4b58 100644 --- a/packages/opencode/src/provider/provider.ts +++ b/packages/opencode/src/provider/provider.ts @@ -365,6 +365,7 @@ export namespace Provider { } parsed.models[modelID] = parsedModel } + database[providerID] = parsed } @@ -446,6 +447,7 @@ export namespace Provider { } for (const [providerID, provider] of Object.entries(providers)) { + const configProvider = config.provider?.[providerID] const filteredModels = Object.fromEntries( Object.entries(provider.info.models) // Filter out blacklisted models @@ -458,8 +460,18 @@ export namespace Provider { ([, model]) => ((!model.experimental && model.status !== "alpha") || Flag.OPENCODE_ENABLE_EXPERIMENTAL_MODELS) && model.status !== "deprecated", - ), + ) + // Filter by provider's whitelist/blacklist from config + .filter(([modelID]) => { + if (!configProvider) return true + + return ( + (!configProvider.blacklist || !configProvider.blacklist.includes(modelID)) && + (!configProvider.whitelist || configProvider.whitelist.includes(modelID)) + ) + }), ) + provider.info.models = filteredModels if (Object.keys(provider.info.models).length === 0) {