Code Reader
首页
帮助
设计文档
首页
帮助
设计文档
  • Provider / Model

Provider / Model

Provider 和 Model 定义了 AI 模型提供商和模型配置。

概述

OpenCode 支持多个 AI 提供商(如 Anthropic、OpenAI、Google 等),每个提供商可以提供多个模型。配置从 models.dev API 加载,也可以使用本地缓存。

定义位置

packages/opencode/src/provider/models.ts:13-77

Model 对象

表示单个 AI 模型的完整配置。

属性名类型必填说明
idstring是模型唯一标识符
namestring是模型显示名称
familystring否模型族(如 "claude-3.5")
release_datestring是发布日期(ISO 8601)
attachmentboolean是是否支持文件附件
reasoningboolean是是否支持推理
temperatureboolean是是否支持温度参数
tool_callboolean是是否支持工具调用
interleavedboolean | object否支持交错内容(reasoning)
costobject否定价信息
cost.inputnumber-输入 Token 价格(每百万)
cost.outputnumber-输出 Token 价格(每百万)
cost.cache_readnumber-缓存读取价格(每百万)
cost.cache_writenumber-缓存写入价格(每百万)
cost.context_over_200kobject-超过 200K 上下文的定价
limitobject是使用限制
limit.contextnumber-上下文窗口大小(Token)
limit.inputnumber-最大输入 Token(可选)
limit.outputnumber-最大输出 Token
modalitiesobject否支持的模态
modalities.inputstring[]-输入模态列表
modalities.outputstring[]-输出模态列表
experimentalboolean否是否为实验性功能
statusstring否状态:alpha/beta/deprecated
optionsRecord<string, any>否提供商特定选项
headersRecord<string, string>否默认请求头
providerobject否提供商信息
provider.npmstring-npm 包名
variantsRecord<string, Record>否模型变体配置

Provider 对象

表示 AI 提供商的配置。

属性名类型必填说明
apistring否API 基础 URL
namestring是提供商名称
envstring[]是需要的环境变量列表
idstring是提供商唯一标识符
npmstring否npm 包名
modelsRecord<string, Model>是提供的模型映射

TypeScript 类型定义

export type Model = {
  id: string
  name: string
  family?: string
  release_date: string
  attachment: boolean
  reasoning: boolean
  temperature: boolean
  tool_call: boolean
  interleaved?:
    | boolean
    | {
        field: "reasoning_content" | "reasoning_details"
      }
  cost?: {
    input: number
    output: number
    cache_read?: number
    cache_write?: number
    context_over_200k?: {
      input: number
      output: number
      cache_read?: number
      cache_write?: number
    }
  }
  limit: {
    context: number
    input?: number
    output: number
  }
  modalities?: {
    input: Array<"text" | "audio" | "image" | "video" | "pdf">
    output: Array<"text" | "audio" | "image" | "video" | "pdf">
  }
  experimental?: boolean
  status?: "alpha" | "beta" | "deprecated"
  options?: Record<string, any>
  headers?: Record<string, string>
  provider?: {
    npm: string
  }
  variants?: Record<string, Record<string, any>>
}

export type Provider = {
  api?: string
  name: string
  env: string[]
  id: string
  npm?: string
  models: Record<string, Model>
}

典型使用场景

1. 获取所有提供商

const providers = await ModelsDev.get()

for (const [providerId, provider] of Object.entries(providers)) {
  console.log(`Provider: ${provider.name}`)
  console.log(`  Models: ${Object.keys(provider.models).length}`)
}

2. 获取特定提供商

const providers = await ModelsDev.get()
const anthropic = providers["anthropic"]

console.log(anthropic.name) // "Anthropic"
console.log(anthropic.models) // 模型映射

3. 查找模型

const providers = await ModelsDev.get()
const anthropic = providers["anthropic"]
const model = anthropic.models["claude-3-5-sonnet"]

console.log(model.name) // "Claude 3.5 Sonnet"
console.log(model.limit.context) // 200000
console.log(model.cost.input) // 3.0 (每百万 Token)

4. 计算成本

const model = anthropic.models["claude-3-5-sonnet"]
const costInfo = model.cost

const inputCost = (inputTokens / 1_000_000) * costInfo.input
const outputCost = (outputTokens / 1_000_000) * costInfo.output
const cacheCost = (cacheReadTokens / 1_000_000) * (costInfo.cache_read || 0)

const totalCost = inputCost + outputCost + cacheCost

5. 检查模型能力

const model = getModel("claude-3-5-sonnet")

if (model.reasoning) {
  console.log("此模型支持推理")
}

if (model.attachment.tool_call) {
  console.log("此模型支持文件输入")
}

if (model.tool_call) {
  console.log("此模型支持工具调用")
}

6. 使用上下文超过 200K 的定价

const model = getModel("claude-3-5-sonnet")
const totalTokens = inputTokens + outputTokens + cacheTokens

const costInfo = totalTokens > 200_000 ? model.cost.context_over_200k : model.cost

const cost = calculateCost(costInfo, tokens)

7. 刷新模型列表

// 从 models.dev API 获取最新数据
await ModelsDev.refresh()

模型数据源

远程 API

默认从 https://models.dev/api.json 获取:

const json = await fetch("https://models.dev/api.json").then((x) => x.text())
return JSON.parse(json) as Record<string, Provider>

本地缓存

缓存到 ~/.opencode/cache/models.json:

const filepath = path.join(Global.Path.cache, "models.json")

// 读取缓存
const cached = await Bun.file(filepath)
  .json()
  .catch(() => {})

// 写入缓存
await Bun.write(filepath, await response.text())

内联数据

如果远程 API 失败,使用内联数据(通过 models-macro 生成)。

模型能力检查

Tool Call 支持

function supportsToolCall(model: Model): boolean {
  return model.tool_call && model.attachment
}

Reasoning 支持

function supportsReasoning(model: Model): boolean {
  return model.reasoning
}

模态支持

function supportsModality(model: Model, inputModality: string, outputModality: string): boolean {
  if (!model.modalities) return false
  return model.modalities.input.includes(inputModality) && model.modalities.output.includes(outputModality)
}

模型变体

某些模型支持变体,如不同的上下文窗口:

const model = providers["anthropic"].models["claude-3-5-sonnet"]

if (model.variants) {
  console.log("Available variants:")
  for (const [variantName, variantConfig] of Object.entries(model.variants)) {
    console.log(`  ${variantName}:`)
    console.log(`    Context: ${variantConfig.limit.context}`)
  }
}

环境变量

Provider 可能需要以下环境变量:

提供商环境变量示例
AnthropicANTHROPIC_API_KEY
OpenAIOPENAI_API_KEY
GoogleGOOGLE_API_KEY
GroqGROQ_API_KEY
TogetherTOGETHER_API_KEY

模型状态

状态说明
alphaAlpha 测试版本
betaBeta 测试版本
(未设置)稳定版本

提供商示例

Anthropic

{
  "name": "Anthropic",
  "id": "anthropic",
  "env": ["ANTHROPIC_API_KEY"],
  "api": "https://api.anthropic.com",
  "models": {
    "claude-3-5-sonnet": {
      "id": "claude-3-5-sonnet",
      "name": "Claude 3.5 Sonnet",
      "limit": {
        "context": 200000,
        "output": 8192
      },
      "cost": {
        "input": 3.0,
        "output": 15.0
      }
    }
  }
}

OpenAI

{
  "name": "OpenAI",
  "id": "openai",
  "env": ["OPENAI_API_KEY"],
  "models": {
    "gpt-4o": {
      "id": "gpt-4o",
      "name": "GPT-4o",
      "limit": {
        "context": 128000,
        "output": 4096
      }
    }
  }
}

定价示例

标准定价

{
  "cost": {
    "input": 3.0, // $3.00 每百万输入 Token
    "output": 15.0, // $15.00 每百万输出 Token
    "cache_read": 0.3, // $0.30 每百万缓存读取
    "cache_write": 3.75 // $3.75 每百万缓存写入
  }
}

超过 200K 上下文定价

{
  "cost": {
    "input": 3.0,
    "output": 15.0
  },
  "context_over_200k": {
    "input": 15.0, // 超过 200K 后输入价格提高
    "output": 75.0, // 超过 200K 后输出价格提高
    "cache_read": 1.5,
    "cache_write": 18.75
  }
}

变更历史

版本变更内容日期
v1初始 Model 架构-
v1.1添加 context_over_200k 定价-
v1.2添加 variants 支持-
v1.3添加 modalities 支持-

相关文档

  • Agent - Agent 配置
  • Session - 会话对象