summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorAiden Cline <[email protected]>2025-11-21 01:24:44 -0600
committerAiden Cline <[email protected]>2025-11-21 01:24:44 -0600
commitfffe20cbe5e2b8a4e10ef3f1e2858f05a06b1246 (patch)
tree082141d005930e00718995623cea457861054bd2
parentf6da3c467bb34f22710f56568548fe2b04ac0291 (diff)
downloadopencode-fffe20cbe5e2b8a4e10ef3f1e2858f05a06b1246.tar.gz
opencode-fffe20cbe5e2b8a4e10ef3f1e2858f05a06b1246.zip
add provider whitelist
-rw-r--r--packages/opencode/src/config/config.ts4
-rw-r--r--packages/opencode/src/provider/provider.ts15
2 files changed, 18 insertions, 1 deletions
diff --git a/packages/opencode/src/config/config.ts b/packages/opencode/src/config/config.ts
index 869469a04..7f1c4d618 100644
--- a/packages/opencode/src/config/config.ts
+++ b/packages/opencode/src/config/config.ts
@@ -480,6 +480,10 @@ export namespace Config {
.describe("@deprecated Use 'share' field instead. Share newly created sessions automatically"),
autoupdate: z.boolean().optional().describe("Automatically update to the latest version"),
disabled_providers: z.array(z.string()).optional().describe("Disable providers that are loaded automatically"),
+ enabled_providers: z
+ .array(z.string())
+ .optional()
+ .describe("When set, ONLY these providers will be enabled. All other providers will be ignored"),
model: z.string().describe("Model to use in the format of provider/model, eg anthropic/claude-2").optional(),
small_model: z
.string()
diff --git a/packages/opencode/src/provider/provider.ts b/packages/opencode/src/provider/provider.ts
index 25f6f4b58..7fbc1b88c 100644
--- a/packages/opencode/src/provider/provider.ts
+++ b/packages/opencode/src/provider/provider.ts
@@ -241,6 +241,15 @@ export namespace Provider {
const config = await Config.get()
const database = await ModelsDev.get()
+ const disabled = new Set(config.disabled_providers ?? [])
+ const enabled = config.enabled_providers ? new Set(config.enabled_providers) : null
+
+ function isProviderAllowed(providerID: string): boolean {
+ if (enabled && !enabled.has(providerID)) return false
+ if (disabled.has(providerID)) return false
+ return true
+ }
+
const providers: {
[providerID: string]: {
source: Source
@@ -369,7 +378,6 @@ export namespace Provider {
database[providerID] = parsed
}
- const disabled = await Config.get().then((cfg) => new Set(cfg.disabled_providers ?? []))
// load env
for (const [providerID, provider] of Object.entries(database)) {
if (disabled.has(providerID)) continue
@@ -447,6 +455,11 @@ export namespace Provider {
}
for (const [providerID, provider] of Object.entries(providers)) {
+ if (!isProviderAllowed(providerID)) {
+ delete providers[providerID]
+ continue
+ }
+
const configProvider = config.provider?.[providerID]
const filteredModels = Object.fromEntries(
Object.entries(provider.info.models)