7.2 Provider 注册与解析

模型: claude-opus-4-6 (anthropic/claude-opus-4-6) 生成日期: 2026-02-17


OpenCode 的 Provider 系统不是简单的"配置一个 API Key 就能用"——它需要从多个来源收集信息(环境变量、配置文件、OAuth 认证、Plugin 钩子),经过多层合并和验证,最终构建一个完整的 Provider 注册表。本节将详细分析这个过程。

7.2.1 Provider.Info 数据模型

每个 Provider 的元信息定义如下:

export const Info = z.object({
  id: z.string(),                              // Provider 唯一标识
  name: z.string(),                            // 显示名称
  source: z.enum(["env", "config", "custom", "api"]),  // 注册来源
  env: z.string().array(),                     // 可用的环境变量名列表
  key: z.string().optional(),                  // API Key
  options: z.record(z.string(), z.any()),       // Provider 特定选项
  models: z.record(z.string(), Model),          // 该 Provider 下的所有模型
})

source 字段记录了 Provider 是如何被发现的:

Source
说明

"env"

通过环境变量中的 API Key 发现

"config"

通过 opencode.json 配置文件定义

"custom"

通过 Custom Loader 或 Plugin 自动发现

"api"

通过 opencode auth 命令存储的 API Key

7.2.2 Provider 状态初始化的完整流程

Provider 的初始化使用 Instance.state() 模式,完整流程如下图所示:

步骤 1:加载 models.dev 数据库

OpenCode 使用 models.devarrow-up-right 作为模型元数据的数据源。这是一个集中化的模型信息数据库,包含所有主流 LLM 的能力描述、价格信息、上下文窗口大小等。

ModelsDev.get() 的加载优先级是:

  1. 本地缓存文件(~/.cache/opencode/models.json

  2. 构建时内嵌的快照(models-snapshot

  3. https://models.dev/api.json 在线获取

步骤 3:环境变量发现

每个 Provider 都有一组关联的环境变量名(如 Anthropic 对应 ANTHROPIC_API_KEY)。系统遍历所有已知 Provider,检查对应的环境变量是否存在。如果找到了 API Key,该 Provider 就被自动注册。

这种零配置的发现机制非常优雅——用户只需设置一个环境变量,就能自动启用对应的 Provider,无需在配置文件中显式声明。

步骤 6:Custom Loader

某些 Provider 需要特殊的初始化逻辑,这通过 CUSTOM_LOADERS 实现:

Custom Loader 的返回值包含三个关键字段:

  • autoload:是否自动加载该 Provider(即使没有显式的 API Key)。例如 AWS Bedrock 如果检测到 IAM 配置就自动加载。

  • options:Provider 特定的初始化选项。例如 Anthropic 需要特殊的 beta header。

  • getModel:自定义的模型获取函数。不同 Provider 获取 LanguageModel 实例的方式不同。

步骤 8:过滤与清理

7.2.3 Provider.getLanguage():从配置到 LanguageModel 实例

当 Agent 需要调用 LLM 时,系统通过以下链路获取可用的 LanguageModelV2 实例:

getSDK() 的实现中有一个精巧的缓存机制——使用 xxHash32 对 Provider 配置进行哈希,确保相同配置的 SDK 实例被复用:

7.2.4 自定义 Provider 注册

用户可以在 opencode.json 中注册自定义 Provider:

通过 @ai-sdk/openai-compatible 这个"万能适配器",任何兼容 OpenAI API 格式的 LLM 服务(如 Ollama、LM Studio、vLLM 等)都可以无缝接入 OpenCode。

7.2.5 模型搜索与默认模型选择

OpenCode 提供了模糊搜索和智能默认选择:

模型排序的优先级:

如果用户没有指定默认模型,系统会按照上述优先级自动选择当前可用的最佳模型。


下一节将分析模型元数据系统——OpenCode 如何管理每个模型的能力描述、价格信息和上下文窗口限制。

Last updated