Просмотр исходного кода

feat: whitelist/blacklist config options for provider (#3416)

Co-authored-by: Aiden Cline <[email protected]>
geril07 3 месяцев назад
Родитель
Сommit
c0d9f21c0f
2 измененных файлов с 15 добавлено и 1 удалено
  1. 2 0
      packages/opencode/src/config/config.ts
  2. 13 1
      packages/opencode/src/provider/provider.ts

+ 2 - 0
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({

+ 13 - 1
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) {