中文
文档
策略

Policies

控制 OpenCode 可以使用哪些已配置的资源。

策略(Policies)控制 OpenCode 是否可以对指定资源执行某个操作。此功能为实验性功能,通过 opencode.json 中的 experimental.policies 数组进行配置。

策略与权限是分开的。权限控制会话期间工具可以做什么,而策略控制 OpenCode 是否可以使用某个资源,例如 LLM 提供商。


Configuration

每条策略语句包含三个字段:

  • effect - 取值为 "allow""deny"
  • action - 被控制的操作。
  • resource - 该语句适用的资源 ID 或通配符模式。

例如,拒绝使用 openai 提供商:

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

被策略拒绝的提供商无法用于模型选择或模型使用,即使它拥有凭证或配置正确。


Available Policies

OpenCode 目前支持一种策略操作:

ActionResourceDescription
provider.use提供商 ID,例如 openai允许或拒绝使用某个 LLM 提供商。

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


Matching

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

例如:

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

这将拒绝诸如 company-uscompany-eu 之类的提供商。


Rule Order

当多条语句匹配时,以最后一条匹配的语句为准。建议先写宽泛的规则,再在后面写更具体的例外规则。

例如,仅允许 Anthropic:

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

如果没有策略匹配某个提供商,则默认允许使用该提供商。

策略可以同时设置在全局配置和项目配置中。如果两处的策略都匹配同一个提供商,全局策略的优先级高于项目策略。这可以防止某个仓库重新启用你在全局中已拒绝的提供商。


Provider Lists

在控制提供商访问权限时,请使用策略来代替较旧的 disabled_providersenabled_providers 设置。

要替换 disabled_providers

opencode.json
{
  "experimental": {
    "policies": [
      { "effect": "deny", "action": "provider.use", "resource": "openai" },
      { "effect": "deny", "action": "provider.use", "resource": "google" }
    ]
  }
}

要替换 enabled_providers,先拒绝所有提供商,再允许选定的提供商:

opencode.json
{
  "experimental": {
    "policies": [
      { "effect": "deny", "action": "provider.use", "resource": "*" },
      { "effect": "allow", "action": "provider.use", "resource": "anthropic" },
      { "effect": "allow", "action": "provider.use", "resource": "openai" }
    ]
  }
}