AI Gateway 部署教程:Cloudflare Workers 搭建 AI 聚合网关,统一多模型 API

AI Gateway 部署教程:Cloudflare Workers 搭建 AI 聚合网关,统一多模型 API
luoli前言
ai-gateway 是一个基于 Cloudflare Workers + Hono 框架构建的 AI 提供商 API 聚合网关,实现「一个 API 调用所有模型」的聚合能力。它支持多密钥轮询、健康检测、自动故障转移、密钥自动恢复等高级特性,并内置 OpenCode 免费模型,默认开箱即用。整个项目采用 TypeScript 开发,前端使用 Hono 服务端渲染,管理后台为卡片式 UI,支持移动端。
- 项目地址:https://github.com/yutian81/ai-gateway
- 开源协议:Apache 2.0
- Stars:44+
功能特点
| 功能 | 说明 |
|---|---|
| 🌐 统一 API 接口 | 所有 AI 提供商通过 https://你的域名/v1 访问,兼容 OpenAI 和 Anthropic 协议 |
| 🔑 多密钥轮询 | 每个提供商可配置多个 API Key,随机打乱后轮询使用 |
| 💚 健康检测 | Key 连续 5 次失败后自动降级,5 分钟后冷却并恢复尝试 |
| 🔄 自动故障转移 | 401/403/5xx/网络错误自动跳过,429 速率限制不记为失败 |
| 🆓 OpenCode 免费模型 | 默认集成 4 个免费模型,无需上游 API Key 即可使用 |
| 🪞 OpenCode 镜像回退 | 内置 3 个 OpenCode 公共镜像,官方 API 不可用自动切换 |
| 🛠️ 多提供商管理 | 支持自定义 OpenAI/Anthropic 兼容的 API 提供商 |
| 🔐 代理密钥认证 | 生成 sk_cf_* 格式 API 密钥,支持过期时间和启停管理 |
| 📊 管理后台 | 卡片式 UI,支持移动端,无需前端构建 |
| 🧪 模型连接测试 | 服务端代理测试,避免跨域问题 |
| 🚀 零构建部署 | Hono 服务端渲染,部署后无需额外前端构建步骤 |
技术栈
| 类别 | 技术 | 版本 |
|---|---|---|
| 运行时 | Cloudflare Workers | – |
| 框架 | Hono | ^4.12.27 |
| 数据存储 | Cloudflare Workers KV | – |
| 开发语言 | TypeScript | ^6.0.3 |
| CLI 工具 | Wrangler | ^4.107.0 |
- 兼容日期:
2025-07-01 - 兼容标志:
["nodejs_compat"]
项目结构
1 | ai-gateway/ |
部署方式一:GitHub Actions 自动部署
这是推荐的部署方式,推送到 main 分支后自动构建部署。
1. Fork 项目仓库
访问 ai-gateway 项目,先给项目点个 ⭐,然后点击右上角 Fork,将仓库克隆到你的 GitHub 账号下。
2. 创建 KV 命名空间
- 登录 Cloudflare Dashboard
- 进入 Workers 和 Pages → KV → 创建命名空间
- 输入名称,例如
AI_GATEWAY_KV,点击创建 - 记下 KV namespace ID,备用
3. 配置 GitHub Secrets 和 Variables
在 Fork 的仓库中,进入 Settings → Secrets and variables → Actions:
Secrets(密钥):
| Secret 名称 | 说明 | 必填 |
|---|---|---|
CF_API_TOKEN |
Cloudflare API Token(需 Workers 编辑权限) | ✅ |
CF_ACCOUNT_ID |
Cloudflare 账户 ID | ✅ |
Variables(变量):
| 变量名 | 说明 | 必填 |
|---|---|---|
ADMIN_USERNAME |
管理后台登录用户名 | ✅ |
ADMIN_PASSWORD |
管理后台登录密码 | ✅ |
OPENCODE_MIRRORS_URL |
OpenCode 镜像 URL(多行或逗号分隔,可选) | ❌ |
如何获取 CF_ACCOUNT_ID: 登录 Cloudflare Dashboard,右上角头像下拉菜单中可见,或从 URL 提取:
https://dash.cloudflare.com/ACCOUNT_ID/...
4. 触发部署
在仓库 Actions 页面,找到 Deploy to Cloudflare Workers,点击 Run workflow → Run workflow。
部署流程会自动:
- 检出代码并安装依赖
- 生成包含 KV 绑定和管理员凭据的
wrangler.toml - 执行
npm run build构建 - 通过 Wrangler Action 部署到 Cloudflare Workers
部署成功后,访问 Worker 生成的默认域名(如 ai-gateway.你的用户名.workers.dev),或绑定自定义域名。
部署方式二:Cloudflare Dashboard 手动部署
如果你不习惯用 GitHub Actions,也可以直接在 Cloudflare Dashboard 中手动部署。
1. 创建 Worker
- 登录 Cloudflare Dashboard
- 进入 Workers 和 Pages → 创建 → Workers
- 选择 连接到 Git,授权 GitHub,选择 Fork 的仓库
- 使用默认构建设置,点击 保存并部署
2. 配置环境变量
部署完成后,进入 Worker → 设置 → 变量和机密,添加以下变量:
| 变量名 | 说明 |
|---|---|
ADMIN_USERNAME |
管理后台登录用户名 |
ADMIN_PASSWORD |
管理后台登录密码 |
OPENCODE_MIRRORS_URL |
OpenCode 镜像 URL(多行,可选) |
OPENCODE_MIRRORS_URL 默认值:
1 | https://opencode.ai.cmliussss.net/zen/v1 |
[!NOTE]
三个默认镜像 URL 在部署 workflow 中已内置,手动部署时建议一并配置。
3. 绑定 KV
Cloudflare Dashboard 会自动创建 KV 命名空间。进入 Worker → 设置 → KV 命名空间,确认绑定名称为 KV。如果是手动创建的 KV,需要手动添加绑定。
4. 绑定自定义域名
在 Cloudflare Dashboard 中,为 Worker 添加自定义域名(如 ai.你的域名),然后在 DNS 设置中添加相应的 CNAME 记录。
API 接口
公开接口
| 方法 | 路径 | 鉴权 | 说明 |
|---|---|---|---|
| GET | / |
无需 | 首页,展示所有已启用提供商和模型 |
管理后台接口(Session Cookie 鉴权)
| 方法 | 路径 | 说明 |
|---|---|---|
| GET | /admin/login |
登录页面 |
| POST | /admin/login |
登录提交(用户名明文,密码 SHA-256) |
| GET | /admin/logout |
退出登录(清除 Cookie,跳转首页) |
| GET | /admin |
管理后台(卡片式 UI) |
| GET | /admin/api/status |
系统状态概览 |
| GET | /admin/api/providers |
获取所有提供商列表 |
| POST | /admin/api/providers |
创建新提供商 |
| PUT | /admin/api/providers/:id |
更新提供商 |
| DELETE | /admin/api/providers/:id |
删除提供商 |
| POST | /admin/api/providers/:id/test-model |
测试模型连接 |
| POST | /admin/api/test-key |
测试 API Key 连接(服务端代理,避免 CORS) |
| POST | /admin/api/test-model |
测试模型连接(服务端代理) |
| GET | /admin/api/proxy-keys |
获取代理密钥列表(脱敏展示) |
| POST | /admin/api/proxy-keys |
生成新的代理密钥 |
| PATCH | /admin/api/proxy-keys/:id |
更新密钥(启用/禁用) |
| DELETE | /admin/api/proxy-keys/:id |
删除密钥 |
API 转发接口(Bearer Token 鉴权)
| 方法 | 路径 | 说明 |
|---|---|---|
| GET | /v1/models |
获取所有已启用模型列表 |
| POST | /v1/chat/completions |
OpenAI 兼容聊天补全 |
| POST | /v1/messages |
Anthropic 兼容消息接口 |
| ALL | /v1/* |
透传到任何提供商 API 的子路径 |
模型 ID 格式:providerId/modelId(例如 opencode/deepseek-v4-flash-free)
请求示例:
1 | # 获取模型列表 |
密钥健康系统
ai-gateway 内置了一套完善的密钥健康管理系统:
| 状态 | 条件 | 行为 |
|---|---|---|
| ✅ 健康 | 无连续失败 | Fisher-Yates 随机打乱,优先使用 |
| ⚠️ 不健康 | 有失败但 < 5 次 | 放到队列末尾,低优先级 |
| 🔴 已降级 | 连续 5 次失败 | 进入 5 分钟冷却,冷却后单次尝试 |
失败判定规则:
| 场景 | 是否记录失败 | 处理 |
|---|---|---|
| 401/403/5xx | ✅ 是 | 跳过当前 Key,尝试下一个 |
| 网络错误 | ✅ 是 | 跳过当前 Key,尝试下一个 |
| 429 速率限制 | ❌ 否 | 跳过当前 Key,尝试下一个(不记失败) |
| 仅 1 个 Key | – | 跳过所有健康检测 |
密钥恢复机制:
已降级的 Key 在 5 分钟冷却期后会获得一次重试机会:
- 重试成功 → 恢复权重,回到健康队列
- 重试失败 → 再次进入冷却
OpenCode 自动回退
OpenCode 提供商有特殊的智能回退逻辑:
- 配置了 API Key → 优先尝试官方 API(
https://opencode.ai/zen/v1)+ 用户 Key - 官方 API 失败 → 尝试公共镜像(随机起点,每个最多一次)
- 未配置 API Key → 跳过官方 API,直接尝试公共镜像(使用
Bearer public) - 全部失败 → 返回官方 API 的存储错误响应
模型过滤:OpenCode 仅展示以 -free 结尾的免费模型和 big-pickle 模型。
配置说明
环境变量
| 变量 | 必填 | 说明 |
|---|---|---|
ADMIN_USERNAME |
✅ | 管理后台登录用户名 |
ADMIN_PASSWORD |
✅ | 管理后台登录密码(SHA-256 比较) |
OPENCODE_MIRRORS_URL |
❌ | OpenCode 镜像 URL(多行或逗号分隔) |
默认配置(src/config.ts)
1 | const PROXY_KEY_PREFIX = 'sk_cf_' // 代理密钥前缀 |
默认提供商(自动初始化)
1 | { |
KV 存储键
| KV Key | 类型 | 用途 |
|---|---|---|
providers |
JSON 数组 | 所有提供商配置 |
proxy:keys |
JSON 数组 | 所有代理 API 密钥 |
admin:session:{sessionId} |
JSON | 管理后台 Session(TTL 控制) |
key:health:{providerId} |
JSON 对象 | 每个提供商的密钥健康状态 |
migration:opencode-default:v1 |
字符串 | 迁移标记(防止重复初始化) |
管理后台
管理后台访问路径为 https://你的域名/admin,登录后可以:
提供商管理
- 查看所有提供商(OpenCode、自定义 OpenAI/Anthropic 兼容提供商)
- 添加新提供商(填写 ID、名称、API 地址、API 类型)
- 编辑提供商配置(API Key、模型列表、启用/禁用)
- 删除不再使用的提供商
代理密钥管理
- 生成新的
sk_cf_*格式 API 密钥 - 查看密钥列表(密钥值脱敏展示)
- 启用/禁用特定密钥
- 删除密钥
模型测试
- 测试某个 API Key 是否可以连接
- 测试某个模型是否可以正常调用
- 所有测试通过服务端代理完成,避免跨域问题
本地开发
1 | # 克隆仓库 |
npm 脚本:
| 脚本 | 命令 | 说明 |
|---|---|---|
npm run dev |
wrangler dev |
本地开发服务器 |
npm run build |
wrangler deploy --dry-run |
构建检查(干运行) |
npm run deploy |
wrangler deploy |
部署到 Cloudflare |
设计系统
项目使用 Hono 服务端渲染,设计系统遵循:
| 项目 | 规范 |
|---|---|
| 风格 | 现代极简风、冷静基础设施 UI |
| 主题色 | 钴蓝 oklch(52% 0.205 256) |
| 显示字体 | Space Grotesk(500-600 字重) |
| 正文字体 | Inter(400-600 字重) |
| 等宽字体 | JetBrains Mono(400-600 字重) |
| 响应式断点 | 320px、375px、414px、768px |
| 动画时长 | 交互 160ms,面板 260ms |
| 动效曲线 | cubic-bezier(0.16, 1, 0.3, 1) |
| 布局 | 桌面端侧边导航栏,移动端顶部紧凑导航 |
错误响应格式
1 | { |
错误类型:authentication_error、invalid_request_error、provider_disabled、model_disabled、configuration_error、key_exhausted、proxy_error、server_error、not_found
常见问题
部署后首页空白或报错?
检查 KV 命名空间是否正确绑定。进入 Cloudflare Worker → 设置 → KV 命名空间,确认绑定名称为 KV。
管理后台无法登录?
确认环境变量 ADMIN_USERNAME 和 ADMIN_PASSWORD 已正确设置。密码使用 SHA-256 比较,确保密码没有多余空格。
OpenCode 模型无法调用?
- 检查
OPENCODE_MIRRORS_URL环境变量是否配置 - 确认 Cloudflare 网络可以访问镜像地址
- 检查模型是否处于启用状态
自定义提供商模型 ID 格式?
模型 ID 格式为 providerId/modelId。例如添加了名为 my-api 的提供商,模型 ID 为 gpt-4o,则调用时使用 my-api/gpt-4o。
代理密钥 sk_cf_* 忘记了怎么办?
代理密钥在创建时只显示一次。如果忘记了,可以在管理后台的「代理密钥」页面重新生成一个新的。
不支持哪些部署平台?
不推荐部署到:
- Vercel — SSE 连接会超时
- Netlify — 不支持 SSE 透传
- Render — 冷启动延迟 5-10 秒
如何添加自定义 OpenCode 镜像?
在 GitHub Actions 的 OPENCODE_MIRRORS_URL 变量中追加你的镜像 URL,或使用 Dashboard 手动配置环境变量。








