ByteNoteByteNote

字节笔记本

2026年8月29日

models.dev 接入 Cloudflare AI Gateway

API中转
¥120

models.dev 是一份开源的 AI 模型目录:模型规格、价格、能力、各家提供商都能在这儿查。最近它把 Cloudflare AI Gateway 接成了一家正式 provider,编码代理(比如 OpenCode)可以直接按 cloudflare-ai-gateway/... 选模型,请求统一走 Cloudflare,顺带拿上日志、缓存、限流和统一计费。

下面按「目录里有什么 → 网关怎么配 → 在 OpenCode 里怎么用」写一遍。

models.dev 和 AI Gateway 各自干什么

models.dev 维护的是「模型元数据」:某模型上下文多长、多少钱、支不支持工具调用、在哪些提供商上能跑。数据以 TOML 存在 GitHub,站点与 JSON API 都从这儿生成。

Cloudflare AI Gateway 是一层代理:你的应用只打一个 Cloudflare 入口,后面可以接到 OpenAI、Anthropic、Workers AI 等。好处是观测、缓存、限流、回退,以及 Unified Billing(用 Cloudflare 预付余额,不必每家单独塞一把 key)。

两边合在一起的意思是:目录里有一套 cloudflare-ai-gateway 的模型清单,客户端按这份清单选模型,实际推理再走 AI Gateway。

目录里的 cloudflare-ai-gateway 怎么来的

anomalyco/models.dev 仓库里有 providers/cloudflare-ai-gateway/。生成脚本会拉 Cloudflare 的实时模型目录(ai/catalog/models),再对照本地 curation.toml 写出 TOML。

要点:

  • 只管第三方透传模型(Anthropic、OpenAI、Google、xAI 等经 Gateway 转发的那些)。Cloudflare 自家 Workers AI(@cf/...)单独放在 cloudflare-workers-ai,故意不混进这一家。
  • 价格、上下文长度等尽量从 Cloudflare catalog 自动推导;名字和描述继承 models.dev 的 canonical base_model,避免被 Cloudflare 自己的营销文案覆盖。
  • 个别能力(比如某些原生格式提供商的 reasoning_options、是否真支持 structured output)还要靠 curation.toml 手工补,因为 schema 里写「支持」不等于线上真能用。

本地重新生成大致是:

bash
CLOUDFLARE_API_TOKEN=xxx CLOUDFLARE_ACCOUNT_ID=xxx bun run cloudflare-ai-gateway:generate

--check 可以在 CI 里确认已提交的 TOML 没落后于线上 catalog。

provider.toml 里声明了连接所需环境变量和文档入口,大致包括:

toml
name = "Cloudflare AI Gateway"
env = ["CLOUDFLARE_API_TOKEN", "CLOUDFLARE_ACCOUNT_ID", "CLOUDFLARE_GATEWAY_ID"]
doc = "https://developers.cloudflare.com/ai-gateway/"

先在 Cloudflare 建好 Gateway

  1. 登录 Cloudflare Dashboard,记下 Account ID
  2. 建一把 API Token,权限至少包含 AI Gateway - ReadAI Gateway - Edit;若还要 Workers AI,再加 Workers AI - Read
  3. 打开 AI → AI Gateway,创建一个 Gateway,记下 Gateway ID(名字,最长 64 字符)。Workers AI 计费可选 Standard(账期末结算)或 Unified(从 AI Gateway 预付余额扣)。

上游鉴权常见三种:

  • Unified Billing:用 Cloudflare 预付余额,支持的第三方模型也可以不塞各家原始 key。
  • BYOK:把各家 API Key 存进 Cloudflare,运行时由 Gateway 带上。
  • 请求头直传:照旧在请求里带 Authorization: Bearer <provider-key>

用 OpenAI 兼容接口打一枪(账号级 Unified API 示例):

bash
curl -X POST "https://api.cloudflare.com/client/v4/accounts/$CLOUDFLARE_ACCOUNT_ID/ai/v1/chat/completions" \
  --header "Authorization: Bearer $CLOUDFLARE_API_TOKEN" \
  --header "Content-Type: application/json" \
  --data '{
    "model": "openai/gpt-4.1-mini",
    "messages": [{"role": "user", "content": "What is Cloudflare?"}]
  }'

也可以走经典的 Gateway URL:

txt
https://gateway.ai.cloudflare.com/v1/{account_id}/{gateway_id}/{provider}

OpenAI、Anthropic、Google AI Studio、Workers AI、Bedrock、Azure OpenAI 等都有对应路径。compat 层常见形态是:

txt
https://gateway.ai.cloudflare.com/v1/{ACCOUNT_ID}/{GATEWAY_ID}/compat/

在 OpenCode 里接上

OpenCode 用 AI SDK + models.dev 拉提供商列表。Cloudflare AI Gateway 已在官方 Providers 文档里。

交互式配置:

/connect

Cloudflare AI Gateway,依次填 Account ID、Gateway ID、API Token。然后:

/models

也能用环境变量(适合 CI / 服务器):

bash
export CLOUDFLARE_ACCOUNT_ID=your-32-character-account-id
export CLOUDFLARE_GATEWAY_ID=your-gateway-id
export CLOUDFLARE_API_TOKEN=your-api-token

opencode.json 里可以显式挂模型:

json
{
  "$schema": "https://opencode.ai/config.json",
  "provider": {
    "cloudflare-ai-gateway": {
      "models": {
        "openai/gpt-4o": {},
        "anthropic/claude-sonnet-4": {}
      }
    }
  }
}

跑任务时模型 ID 形如:

bash
opencode run --model "cloudflare-ai-gateway/openai/gpt-4o" "explain what opencode does"
opencode run --model "cloudflare-ai-gateway/anthropic/claude-sonnet-4-5" "write a hello world in rust"

Workers AI 那条线请走 cloudflare-workers-ai provider,不要和 Gateway 透传混用。

和「直接打各家 API」差在哪

做法你要管什么额外能力
直连 OpenAI / Anthropic 等每家一把 key、各自的日志与限流无统一观测
只经 AI GatewayCloudflare 账号 + Gateway(+ 可选 BYOK)缓存、限流、回退、统一账单
models.dev 标成 provider客户端自动知道有哪些模型、怎么标价编码代理 /models 里能直接选

适合:多模型切换频繁、想把日志和限流收口到一处、或者想用 Unified Billing 少管几把 key 的团队。不适合:只要打一家、已经有成熟直连链路、又不想多一跳延迟的场景。

注意几件事

  • Workers AI ≠ AI Gateway 透传。 models.dev 把它们拆成两个 provider,选错会鉴权失败或模型列表对不上。
  • catalog 会变。 新模型上线后,目录要靠生成脚本(或上游合并)更新;本地 fork 记得定期 generate --check
  • reasoning / structured output 对部分原生格式提供商仍靠人工 curation,别把 schema 广告当成保证。
  • 自定义上游(不在 Cloudflare 原生列表里的 API)走 Custom Providers,Unified compat 与 provider-specific 路径写法不同,见 Custom Providers 文档

相关链接

分享: