策略
策略(Policies)控制 OpenCode 是否可以对指定的资源执行某项操作。此功能为实验性功能,通过 opencode.json 中的 experimental.policies 数组进行配置。
策略与 权限(permissions) 是分开的。权限控制的是会话期间工具可以做什么,而策略控制的是 OpenCode 是否可以使用某个资源(例如 LLM provider)。
配置
每条策略声明包含三个字段:
effect— 值为"allow"或"deny"。action— 被控制的操作。resource— 适用于该声明的资源 ID 或通配符模式。
例如,拒绝使用 openai provider:
{
"$schema": "https://opencode.ai/config.json",
"experimental": {
"policies": [
{
"effect": "deny",
"action": "provider.use",
"resource": "openai"
}
]
}
}
被策略拒绝的 provider 即使已配置凭证或配置正确,也无法用于选择或使用模型。
可用的策略
OpenCode 目前支持以下一种策略操作:
| 操作 | 资源 | 描述 |
|---|---|---|
provider.use | Provider ID,例如 openai | 允许或拒绝使用某个 LLM provider。 |
未来可能会添加更多的策略操作。
匹配规则
resource 字段支持通配符匹配。使用 * 可匹配零个或多个字符,使用 ? 可匹配单个字符。
{
"$schema": "https://opencode.ai/config.json",
"experimental": {
"policies": [
{
"effect": "deny",
"action": "provider.use",
"resource": "company-*"
}
]
}
}
这会拒绝 company-us、company-eu 等 provider。
规则顺序
当多条声明同时匹配时,最后一条匹配的声明生效。请将宽泛的规则放在前面,更具体的例外规则放在后面。
例如,仅允许使用 Anthropic:
{
"$schema": "https://opencode.ai/config.json",
"experimental": {
"policies": [
{
"effect": "deny",
"action": "provider.use",
"resource": "*"
},
{
"effect": "allow",
"action": "provider.use",
"resource": "anthropic"
}
]
}
}
如果没有策略匹配到某个 provider,则默认允许使用该 provider。
你可以在全局配置和项目配置中同时设置策略。如果两个位置中的策略匹配到相同的 provider,则全局策略的优先级高于项目策略。这样可以防止某个仓库重新启用你在全局中拒绝的 provider。
Provider 列表
在控制 provider 访问时,请使用策略而非旧的 disabled_providers 和 enabled_providers 设置。
要替换 disabled_providers:
{
"experimental": {
"policies": [
{ "effect": "deny", "action": "provider.use", "resource": "openai" },
{ "effect": "deny", "action": "provider.use", "resource": "google" }
]
}
}
要替换 enabled_providers,请先拒绝所有 provider,然后允许所选的 provider:
{
"experimental": {
"policies": [
{ "effect": "deny", "action": "provider.use", "resource": "*" },
{ "effect": "allow", "action": "provider.use", "resource": "anthropic" },
{ "effect": "allow", "action": "provider.use", "resource": "openai" }
]
}
}