跳转到内容

策略

策略(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.useProvider ID,例如 openai允许或拒绝使用某个 LLM provider。

未来可能会添加更多的策略操作。


匹配规则

resource 字段支持通配符匹配。使用 * 可匹配零个或多个字符,使用 ? 可匹配单个字符。

{
  "$schema": "https://opencode.ai/config.json",
  "experimental": {
    "policies": [
      {
        "effect": "deny",
        "action": "provider.use",
        "resource": "company-*"
      }
    ]
  }
}

这会拒绝 company-uscompany-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_providersenabled_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" }
    ]
  }
}