ocra

模型供应商

ocra 能用哪些模型供应商、各自需要什么,以及如何接入你自己的端点。

ocra 通过 OpenCode 运行审查员,所以 OpenCode 目录里的供应商都可以用,只有少数需要从 npm 下载代码的除外。在模型链里把模型写成 provider/model(见配置)。运行时只会拿到模型链里出现的那些供应商的凭据。

OpenCode 目录中的供应商

供应商模型示例需要设置实测过
Gemini APIgoogle/gemini-3.5-flashGEMINI_API_KEY(或 GOOGLE_API_KEY、GOOGLE_GENERATIVE_AI_API_KEY)是
Vertex AIgoogle-vertex/gemini-3.5-flashGOOGLE_VERTEX_PROJECT、GOOGLE_VERTEX_LOCATION=global,以及应用默认凭据或 GOOGLE_APPLICATION_CREDENTIALS是,也包括在 GitHub Actions 里通过工作负载身份联合免密钥使用
Anthropicanthropic/<model>ANTHROPIC_API_KEY否
OpenAIopenai/<model>OPENAI_API_KEY否
Amazon Bedrockamazon-bedrock/<model>AWS_REGION 和 AWS 凭据:AWS_ACCESS_KEY_ID 与 AWS_SECRET_ACCESS_KEY(加上 AWS_SESSION_TOKEN)、AWS_PROFILE,或 AWS_BEARER_TOKEN_BEDROCK否
Azure OpenAIazure/<deployment>AZURE_API_KEY、AZURE_RESOURCE_NAME否
DeepSeek、OpenRouter、Groq、Mistral、xAI 以及目录里的其他供应商deepseek/<model>供应商的密钥,比如 DEEPSEEK_API_KEY;ocra 不认识的 id 会拿到以它开头的所有变量,比如 GROQ_否

"否"的意思是:ocra 会把变量传给这个供应商,其余由 OpenCode 处理,但还没有任何审查实际经过它运行过。如果出了问题,请提 issue。模型 id 以 OpenCode 的目录 models.dev 为准。

需要从 npm 下载代码的供应商

OpenCode 自带了与目录里几乎所有供应商通信的代码。只有少数几个,它会在第一次用到其模型时从 npm 下载这部分代码,而 ocra 不允许在审查过程中下载任何东西。在 2026-09-29 的目录里,它们是 aihubmix、cloudflare-ai-gateway、merge-gateway、qvac、salad-cloud、sap-ai-core 和 watsonx。这些供应商的模型会立即失败,报错 "Failed to initialize provider"。如果这类服务提供兼容 OpenAI API 的端点,可以把它声明为你自己的端点。

你自己的端点

自建的服务(vLLM、Ollama、LM Studio)或者兼容 OpenAI API 的公司网关,在 .ocra/config.json 里声明:

{
  "models": {
    "standard": "gateway/qwen3-coder",
    "light": "gateway/qwen3-small",
    "top": "gateway/qwen3-max"
  },
  "providers": {
    "gateway": {
      "type": "openai-compatible",
      "baseUrl": "https://llm.example.com/v1",
      "apiKeyEnv": "GATEWAY_API_KEY",
      "models": {
        "qwen3-coder": { "input": 0.5, "output": 2, "cachedInput": 0.1 },
        "qwen3-small": { "input": 0.1, "output": 0.4 },
        "qwen3-max": { "input": 2, "output": 8 }
      }
    }
  }
}
  • id(gateway)由你自己取:小写字母、数字和连字符。请选一个 OpenCode 目录里没有的 id,因为声明的供应商会在这次运行中替换同名的已知供应商。
  • baseUrl 必须是 https,或者本机上的普通 http:localhost、127.0.0.1 或 ::1。比如 Ollama 用 http://127.0.0.1:11434/v1。地址里不能有 { 或 },OpenCode 会把它们替换成变量或文件内容。
  • apiKeyEnv 是保存密钥的环境变量的名字。密钥本身从不写进文件,运行时也只拿到这一个变量。平台令牌和云凭据的名字(以 GITHUB_、GITLAB_、CI_、AWS_、AZURE_ 等开头)会被拒绝。不需要密钥的服务可以省略。
  • effort(可选)说明这个端点怎样接收 direct 运行时发送的推理强度:openai 发送 reasoning_effort(默认值,OpenAI、Gemini API 的 OpenAI 兼容端点和 OpenRouter 都接受),openrouter 发送 reasoning: { effort }。
  • 每个模型都要有价格,单位是每百万 token 多少美元:input、output,以及可选的 cachedInput。ocra 用它们计算报告里的花费和 --max-cost-usd。价格可以写 0,适合跑在你自己硬件上的服务;这时运行会警告该模型没有定价,花费上限也不会计入它。
  • 通过 extends 引用的共享配置也可以声明供应商,但必须用 #sha256= 固定内容:不固定的话,提供这个文件的人就能把你的代码发到他选的端点。声明了供应商却没有固定的共享文件会被忽略,并给出警告,警告里写着检查过文件之后要加的固定值。仓库里同 id 的声明优先。审查 PR 和 Merge Request 时,供应商和其他配置一样来自 base 提交。

这项功能已经在 CI 里用真实的 OpenCode 二进制文件对一个模拟的 OpenAI 兼容服务测试过:密钥发往该去的地方,价格被计入,而且不需要访问网络上的其他地址。对真实服务的运行已经在 OpenRouter 上完成(下文的免费模型,2026-10-02):密钥送达、工具调用正常、价格按 0 计入。

OpenRouter 上的免费模型

免费提供的模型,比如 OpenRouter 上的匿名预览模型,用法和任何 OpenAI 兼容端点一样:声明端点,把该模型的价格写成 0(模型 id 按 OpenRouter 列出的写),然后以 <端点 id>/<模型 id> 的形式引用:

{
  "models": {
    "top": "router/stealth/space-bunny-alpha",
    "standard": "router/stealth/space-bunny-alpha",
    "light": "router/stealth/space-bunny-alpha"
  },
  "providers": {
    "router": {
      "type": "openai-compatible",
      "baseUrl": "https://openrouter.ai/api/v1",
      "apiKeyEnv": "OPENROUTER_API_KEY",
      "models": { "stealth/space-bunny-alpha": { "input": 0, "output": 0 } }
    }
  }
}
  • 价格 0 按字面理解:运行会警告这个模型的 token 不计入 --max-cost-usd,报告的花费是 $0,这正是预览期的价格;token 数照常报告。
  • 把这个文件放在被审查仓库之外,审查带着 --no-repo-config 运行时用 --config 传入,评测工具就是这么用的。
  • 评测的判定模型也可以用同一个端点:JUDGE_API_KEY、JUDGE_BASE_URL=https://openrouter.ai/api/v1、JUDGE_MODEL=stealth/space-bunny-alpha。
  • 预览就是预览:模型、限额和价格随时可能变,匿名模型也不说明它保留什么。拿它做评测,别拿它审查必须保密的代码。

模型 id 是 OpenRouter 的 API 示例在 2026-10-02 给出的(stealth/space-bunny-alpha);预览模型可能变动,请到模型页面核对。声明端点这条路不需要 OpenCode 的价格目录;目录形式的 openrouter/<模型> 需要能访问目录且模型在目录里,否则立刻失败。自 2026-10-02 起,已有审查这样经过 OpenRouter 运行。

选择运行时

有两个运行时可以运行审查员,由配置里的 runtime 选择:

运行时会访问适用场景
opencode(默认)OpenCode 目录里的所有供应商和你声明的端点,外加价格目录 models.opencode.ai你的模型是 Gemini、Vertex AI、Anthropic、Bedrock 或目录里的其他供应商
direct只访问 providers 下声明的端点,不访问网络上的其他任何地址模型链里的每个模型都在声明的端点上,而且你希望除此之外什么都不访问

两者跑的是同一套审查:同样的工具、同样的步数上限、同样的模型链回退、同样的价格。direct 运行时会拒绝写了未声明供应商的模型链,并在发出任何请求之前说明。经过代理时它和 ocra 的其他部分一样读取 HTTP_PROXY、HTTPS_PROXY 和 NO_PROXY。质量页上的数字是通过 opencode 测得的;direct 运行时通过同一套一致性测试,但还没有在黄金用例集上评测过。

opencode 运行时是 CLI 的可选依赖,默认会安装。使用 direct 时,可以不装它,少约 165 MB:见不装 OpenCode,以及 GitHub Action 的输入 opencode: false。

还会访问哪些网络地址

除模型供应商之外,OpenCode 启动时还会从 models.opencode.ai 拉取价格目录。启动时它还会尝试从 npm 安装它自己的插件包,并在模型需要时安装它没有自带的供应商代码;ocra 把这两种安装都指向本机上一个立即拒绝的 registry。除声明的端点之外所有地址都被拒绝时,审查依然正常(已测试)。在屏蔽外网的环境里,价格目录拉取失败,OpenCode 会使用它自带的目录;不在该目录里的模型没有价格,这时运行会警告它的调用没有计入。

在 GitHub 上编辑

本页目录