这次我们来看一个很省钱的玩法:在 Cloudflare 的免费额度上部署一个 AI 聚合网关。所谓聚合网关,就是把多家模型服务商的接口收拢到一个统一入口后面,上层客户端只需要按 OpenAI 兼容格式发请求,网关负责选模型、带密钥、转发、限流和记日志。重点是:不用买服务器,不需要本地 GPU,整个项目跑在 Cloudflare 的边缘节点上,日常自用基本不会产生托管费用。
先说结论:这类项目适合想统一管理多个 AI API、又不打算维护 VPS 的开发者。文章会直接从项目能力、部署方式、环境变量配置、接口测试、批量调用、免费额度观察几个维度讲清楚,最后给出一套问题排查清单。如果你准备在 Cloudflare 上搭一个轻量 AI 网关,这篇可以直接收藏照着做。
1. 核心能力速览
AI 聚合网关不是模型本身,而是一个 API 转发层。它把不同服务商之间的协议差异屏蔽掉,对外暴露一套统一的Chat Completions接口。从项目标题看,这个网关的核心价值是“一键部署 + 免费云上运行”,下面把这类项目的能力整理成一张表。
| 能力项 | 说明 |
|---|---|
| 项目类型 | 云上 AI API 聚合网关 |
| 部署平台 | Cloudflare Workers / Pages Functions |
| 免费额度 | Workers 免费计划有每日请求量、CPU 时间等限制,具体以官方最新额度为准 |
| 统一协议 | OpenAI 兼容的 Chat Completions 接口 |
| 主要功能 | 多模型路由、API Key 管理、请求转发、限流、日志 |
| 是否需要本地服务器 | 不需要 |
| 是否需要本地 GPU | 不需要,网关只做转发,不跑模型推理 |
| 是否支持 API 调用 | 是,暴露 REST/JSON 接口 |
| 是否支持批量任务 | 客户端可并发调用,部分网关也会提供批量转发能力 |
| 成本 | 网关托管基本免费,模型 API 调用费用按上游服务商计费 |
| 适合场景 | 个人自用、团队内部统一 API、开发调试、工具链接入 |
如果和本地部署的模型做对比,这个方案最大的区别是:模型推理仍然发生在 OpenAI、Anthropic、Gemini 等上游服务商那里,网关只负责把请求转过去。所以它“免费”的部分是 Cloudflare 这个中间托管层,不是模型调用本身。
2. 适用场景与使用边界
2.1 适合谁
先说适合的人。如果你手里同时开了好几家模型服务商的 API,平时在脚本、聊天工具、IDE 插件里来回改 base_url 切换模型,那一个聚合网关会明显省事。它把多个 Key 统一成一套网关 Key,模型切换变成请求参数里的一个字段,路由规则由网关统一处理。
团队内部也适合。不用把每个成员的模型服务商密钥都暴露出去,管理员在网关层给成员分配独立 Key,同时可以限制模型范围、做调用量统计和请求日志。这样即使有人不小心泄露了 Key,吊销和控制范围也更容易。
2.2 不适合谁
如果只是偶尔调一两次 API,直接用官方接口就够了,没必要多套一层网关。如果对延迟极度敏感、需要毫秒级响应,中间多一层转发会带来额外网络开销。如果需要处理私有敏感数据且数据不能出本地,那也不该用云上网关,更应该选择本地部署模型方案。
2.3 合规与安全边界
使用这类项目时,必须遵守各模型服务商的 API 条款,不能把网关用作绕过鉴权、违规转售或批量滥用服务的通道。网关本身是一个技术工具,但部署到公网后如果没有任何鉴权,任何人扫描到你的 workers.dev 域名,都可能直接消耗你的上游 API 额度。这一点后面会在最佳实践里重点强调。
另外,如果网关会记录请求日志,日志内容可能包含用户输入和模型输出。建议启用日志脱敏,不记录完整消息内容,尤其不能记录密钥。涉及个人信息、隐私数据时,要评估云上转发的合规风险。任何公开发布的 API 网关,都应该开启严格鉴权和限流。
3. 部署前置条件与 Cloudflare 账号准备
整个部署不需要高配电脑,也不需要本地 GPU。由于项目是运行在 Cloudflare 边缘节点上的,本地环境只要能跑 Node.js 和 Wrangler CLI 就够了。
3.1 需要准备的东西
| 前置条件 | 说明 |
|---|---|
| Cloudflare 账号 | 需要注册并完成邮箱验证 |
| Node.js | 建议使用 18 或更高版本 |
| npm | Node.js 自带 |
| Wrangler CLI | Cloudflare 官方命令行工具 |
| Git | 用于拉取项目仓库 |
| 上游模型服务商密钥 | OpenAI、Anthropic、Gemini 等至少一个 API Key |
| 可选域名 | 如果不使用自定义域名,可以用 workers.dev 免费子域名 |
检查本地环境可以执行以下命令:
node -v npm -v git --version wrangler --version如果提示wrangler找不到,先全局安装:
npm install -g wrangler3.2 Cloudflare Workers 免费额度怎么看
Cloudflare Workers 免费计划包含一定数量的每日请求次数和 CPU 时间,具体数值会随官方政策调整。部署前建议去 Cloudflare 官方文档确认最新免费额度,重点看三个指标:每日请求数上限、单请求 CPU 时间上限、每分钟请求数限制。
另外还要注意,Workers 免费部署在workers.dev子域名上,不需要额外付费。如果后续想绑定自己的域名,才需要拥有一个域名并完成 DNS 配置。如果项目还用到 KV、D1 或 R2 来存储缓存和日志,这些资源各自有独立的免费额度,也需要在后续观察用量时分开看。
4. 一键部署到 Cloudflare Workers
这里以通用 AI 聚合网关项目为例。你可以准备一个自建仓库,也可以使用 GitHub 上现成的模板仓库。下面给出两种常见的部署方式,实际命令需要按你拉取的项目目录和配置调整。
4.1 方式一:Cloudflare Dashboard 模板部署
如果你的项目提供了一键部署按钮,或者配套了 GitHub 模板仓库,可以直接走 Dashboard 部署流程。
操作步骤:
- 把模板仓库 Fork 到自己的 GitHub 账号。
- 登录 Cloudflare Dashboard。
- 进入 Workers & Pages 页面。
- 选择 Create Application。
- 选择 Pages,并连接你的 GitHub 账号。
- 选择 Fork 出来的仓库。
- 按项目 README 填写构建命令和输出目录,例如:
npm install npm run build- 点击部署,完成后会得到一个
项目名.pages.dev域名。
这种方式适合图形化操作,部署过程中不需要在本地执行命令行。缺点是如果构建脚本有误,需要在 Dashboard 的构建日志里排查。
4.2 方式二:Wrangler 命令行部署
如果你已经在本地拉取了项目,并且项目本身是一个 Worker 应用,更推荐用 Wrangler CLI 部署。
# 拉取项目,注意替换为实际仓库地址 git clone <你的AI聚合网关仓库地址> cd <进入项目目录> # 安装依赖 npm install # 登录 Cloudflare wrangler login # 部署到 Workers wrangler deploy部署成功后,命令行会输出一个形如https://你的项目.workers.dev的域名。这个域名就是网关入口。
如果项目根目录下存在wrangler.toml或wrangler.jsonc,部署前先检查里面的main、route、vars配置是否与你想要的行为一致。
4.3 配置环境变量与上游厂商密钥
部署完成后,最重要的一步是配置模型服务商密钥。大多数聚合网关项目会通过环境变量获取上游密钥,配置方式有两种。
本地开发时,可以在项目根目录创建.dev.vars文件,Wrangler 默认会加载它:
# .dev.vars 示例,具体变量名按项目 README 调整 OPENAI_API_KEY=sk-你的OpenAI密钥 ANTHROPIC_API_KEY=sk-ant-你的Anthropic密钥 GEMINI_API_KEY=你的Gemini密钥 GATEWAY_ADMIN_KEY=你的网关管理员密钥 DEFAULT_PROVIDER=openai DEFAULT_MODEL=你的默认模型名注意:.dev.vars不应该提交到 Git 仓库。建议把它加入.gitignore,避免密钥泄露到公开仓库。
云端部署时,用 Wrangler 命令行写入 Secret:
wrangler secret put OPENAI_API_KEY wrangler secret put ANTHROPIC_API_KEY wrangler secret put GATEWAY_ADMIN_KEY命令执行后会在终端交互式要求输入值。Secret 变量不会直接暴露在 Dashboard 页面上,比明文写在代码里更安全。
部分项目还会通过 JSON 配置或 Dashboard 的 Settings > Variables 页面配置模型路由规则。如果项目带路由配置,常见结构类似这样:
{ "routes": [ { "prefix": "gpt", "provider": "openai", "model": "你的OpenAI模型名" }, { "prefix": "claude", "provider": "anthropic", "model": "你的Anthropic模型名" } ] }这种路由配置不是所有项目都一样,实际字段名需要以你部署的项目 README 为准。
5. 功能测试与效果验证
部署完成不代表立刻可用,建议按下面顺序逐项测试。
5.1 健康检查
如果项目实现了健康检查接口,先用GET /health确认服务是否正常:
curl -s https://你的项目.workers.dev/health预期响应是一个 JSON,内容可能包含状态、版本号、运行时间等信息。HTTP 200 表示服务在线。如果响应 404,说明项目没有实现健康检查接口,可以直接跳到下一项。
5.2 模型列表接口
多数 OpenAI 兼容网关会实现/v1/models,用来查询当前可用的模型列表:
curl -s https://你的项目.workers.dev/v1/models \ -H "Authorization: Bearer 你的网关密钥"如果返回 JSON 里有data数组,数组元素包含id字段,说明模型列表接口正常。
5.3 Chat Completions 调用测试
这是最核心的测试,直接验证网关是否能转发请求到上游模型服务商:
curl -s https://你的项目.workers.dev/v1/chat/completions \ -H "Content-Type: application/json" \ -H "Authorization: Bearer 你的网关密钥" \ -d '{ "model": "你配置的默认模型名", "messages": [ {"role": "system", "content": "你是一个测试助手"}, {"role": "user", "content": "请用一句话回复:网关转发是否正常"} ] }'这里model字段要替换成你在环境变量或路由配置里实际使用的模型名,例如某个 OpenAI 模型名。判断成功的标准:
- HTTP 状态码为 200。
- 返回 JSON 中包含
choices数组。 choices[0].message.content有正常文本内容。- 返回 JSON 中包含
usage字段,记录 token 消耗。
如果 HTTP 401,说明网关鉴权失败,优先检查GATEWAY_ADMIN_KEY或网关子 Key 是否配置正确。如果 HTTP 502 或 504,说明上游模型请求超时或失败,需要查看服务商密钥和上游服务状态。
5.4 OpenAI SDK 接入测试
很多 AI 工具支持自定义接口地址。如果你用的是 Python,可以用 OpenAI SDK 直接指向网关:
from openai import OpenAI client = OpenAI( api_key="你的网关密钥", base_url="https://你的项目.workers.dev/v1" ) resp = client.chat.completions.create( model="你配置的默认模型名", messages=[{"role": "user", "content": "你好,请简单介绍一下你自己"}], temperature=0.7 ) print(resp.choices[0].message.content)只要这一步跑通,意味着 Cursor、LobeChat、NextChat 等支持自定义 base_url 的工具也可以接入这个网关。
6. 接口 API 与批量任务实践
6.1 网关 API 结构
AI 聚合网关对外主要暴露两类接口:
- 管理类:创建网关子 Key、查询调用记录、修改路由规则。
- 转发类:OpenAI 兼容的
/v1/chat/completions、/v1/embeddings等。
转发类接口通常占日常调用的大部分。管理类接口是否存在、路径如何设计,取决于项目实现,部署后先读 README 确认。
如果你只是做自用,不需要每个成员单独建 Key,用管理员 Key 直接调转发接口即可。如果是团队场景,建议让每个成员使用独立子 Key,方便在异常流量出现时快速定位和吊销。
6.2 Python 并发批量请求
网关本身是一个 HTTP 中间层,没有“本地批量按钮”。批量任务的常见做法是客户端并发调用。下面是一个用aiohttp并发测试网关的示例:
import asyncio import aiohttp GATEWAY_URL = "https://你的项目.workers.dev/v1/chat/completions" GATEWAY_KEY = "你的网关密钥" MODEL_NAME = "你配置的默认模型名" async def call_chat(session, prompt): payload = { "model": MODEL_NAME, "messages": [{"role": "user", "content": prompt}], "temperature": 0.5, } headers = {"Authorization": f"Bearer {GATEWAY_KEY}"} try: async with session.post(GATEWAY_URL, json=payload, headers=headers, timeout=60) as resp: data = await resp.json() return resp.status, data except Exception as exc: return 500, str(exc) async def main(): prompts = [f"第 {i} 个测试问题:你是一个测试网关的助手" for i in range(5)] async with aiohttp.ClientSession() as session: tasks = [call_chat(session, prompt) for prompt in prompts] results = await asyncio.gather(*tasks) for status, data in results: print(status, data if isinstance(data, str) else data.get("choices", [])[0]["message"]["content"][:50]) if __name__ == "__main__": asyncio.run(main())运行前需要安装依赖:
pip install aiohttp这是一个通用模板,URL、密钥、模型名都要按实际网关替换。并发数量不要一上来就拉满,建议从 3 到 5 起步,观察网关和上游服务商的响应情况。
6.3 失败重试与降级
批量任务中常见的失败原因是上游限流。当请求量过大时,模型服务商会返回 429 或 5xx。一个简单的带退避重试模板:
import time def call_with_retry(fn, retries=3, base_delay=1): last_exc = None for attempt in range(retries): try: return fn() except Exception as exc: last_exc = exc delay = base_delay * (2 ** attempt) print(f"第 {attempt + 1} 次调用失败:{exc},{delay} 秒后重试") time.sleep(delay) raise last_exc在业务侧加这个工具函数,比在网关层无限重试更安全。重试逻辑要设置最大次数,避免雪崩。
7. 资源占用与 Cloudflare 免费额度观察
由于是云上部署,不需要关注显存和内存,但需要关注 Cloudflare 免费额度的消耗情况。
7.1 在哪里查看用量
登录 Cloudflare Dashboard,进入 Workers & Pages,找到你的项目,点击 Analytics 或 Metrics,可以看到:
- 请求次数
- 错误率
- CPU 时间消耗
- 带宽使用
- KV / D1 / R2 的读写量(如果项目使用)
建议部署后的前三天每天看一眼,确认自己的使用量级,避免突然跑到免费额度上限。
7.2 影响免费额度的因素
影响免费额度消耗的主要因素有三个:
第一,请求次数。每发一次 Chat Completions 调用,网关产生一次请求。日常自用完全够用,但如果把网关接入定时任务、批量脚本,请求量会快速上升。
第二,CPU 时间。Workers 免费计划对每个请求的 CPU 执行时间有限制。网关转发本身很轻量,主要消耗来自上游响应等待和请求体解析。如果上游模型响应很慢,Worker 的 CPU 时间消耗也可能增加。
第三,KV / D1 / R2 读写。如果网关开启了日志存储、缓存功能,每次写入都会消耗对应产品的免费额度。日志量大的时候,KV 写入是容易被忽略的消耗点。
7.3 本地调试与日志
本地开发时,使用 Wrangler 启动本地服务:
wrangler dev默认监听http://127.0.0.1:8787。本地调试可以直接在浏览器或 curl 里访问,不用每次部署到云端验证。
查看云端实时日志可以用:
wrangler tailwrangler tail会输出请求日志、错误堆栈和自定义日志,排查线上问题非常有用。如果遇到部署后服务异常,先跑这条命令看实时日志,再决定查环境变量还是路由配置。
8. 常见问题与排查方法
网关部署到 Cloudflare 后,大部分问题集中在部署、鉴权、超时和配额这几个方面。下面是常见排查表:
| 问题现象 | 可能原因 | 排查方式 | 解决方案 |
|---|---|---|---|
wrangler deploy提示未登录 | 本地没有完成 Cloudflare 认证 | 运行wrangler login | 用浏览器完成授权后重新部署 |
| 部署成功但访问域名总是 404 | Worker 入口路径或路由配置不对 | 查看wrangler.toml中的main和routes配置 | 确认入口文件路径正确,访问路径带上/v1/... |
| 调用接口返回 401 | 网关密钥未配置或密钥名不一致 | 检查 Secret 变量是否设置,再检查请求头 Bearer 值 | 重新wrangler secret put对应密钥,确认请求头正确 |
| 上游返回 400 | 传输的模型名不存在或请求体格式不对 | 查看网关日志中转发到上游的请求参数 | 改成实际存在的模型名,检查 messages 格式 |
| 上游返回 429 | 模型服务商限流 | 查看网关日志和上游服务商控制台 | 降低并发,增加退避重试,必要时升级上游套餐 |
| 网关返回 504 | 上游响应过慢,Worker 执行超时 | 用wrangler tail查看超时日志 | 在网关层设置上游超时时间,换更快模型 |
| 浏览器调用时报 CORS 错误 | Worker 没有返回跨域响应头 | 检查 Worker 响应是否有Access-Control-Allow-Origin | 在响应头中加入跨域配置,限制为允许的来源 |
| 日志里没有请求记录 | 没有开启日志功能,或没有使用 tail | 确认部署环境是否配置日志存储 | 使用wrangler tail查看实时日志 |
| 每天到某个时间点后请求失败 | 免费额度用尽 | 进入 Dashboard Analytics 查看配额消耗 | 减少调用量、加缓存,或考虑升级付费计划 |
| 网关部署后无法访问 workers.dev 域名 | 域名状态异常或 Worker 还没生效 | 等待几秒,检查 Dashboard 项目状态 | 重新部署,必要时换一个项目名 |
9. 最佳实践与使用建议
9.1 密钥管理是第一位
就算只是自用,也强烈建议在网关上配置管理员密钥。部署到公网后,*.workers.dev域名可能被扫描器访问。如果没有鉴权,对方可以直接通过你的网关调用上游模型,造成费用损失。
正确的做法是:
- 网关密钥用 Secret 配置,不写进代码仓库。
- 生产环境不用
.dev.vars,只用wrangler secret put。 - 子 Key 只分配必要权限,不用全部用管理员 Key。
- 发现异常流量时,及时吊销对应 Key。
9.2 日志要脱敏
AI 网关的日志价值很大,但风险也不小。日志如果包含请求体,意味着用户输入和模型输出都会被记录。建议只在调试阶段开启完整请求日志,正常运行时关闭或脱敏。永远不要在上游请求头里打印服务商密钥。
9.3 批量任务控制并发
从自用转而接入批量脚本时,是最容易把配额刷爆的时刻。批量任务建议:
- 控制并发数,从 1 到 3 开始逐步增加。
- 增加失败重试和最大等待时间。
- 记录每次请求的响应状态和 token 消耗。
- 设置每日请求预算,达到阈值后自动暂停任务。
9.4 合理利用缓存
如果网关支持缓存,相同的请求可以回缓存,不用每次打到上游。对于固定的提示词、常用场景说明,缓存能显著减少请求量和响应时间。缓存策略需要谨慎:结果不稳定的生成任务不建议开缓存,否则用户会拿到重复结果。
9.5 定期观察用量后再决定是否升级
免费额度是这套方案的核心吸引力,但它只适合中低流量场景。部署后建议每周看一次 Analytics,如果请求量长期接近上限,再考虑升级到付费计划。不要一开始就上付费计划,先跑一两周看看实际消耗。
9.6 内容合规与授权
如果网关被用于内容生成,生成结果需要人工复核后再对外发布。涉及人脸、声音、版权素材或敏感数据的场景,要确保有合法授权,并遵守相关法律法规。AI 聚合网关只是技术中间层,使用责任仍然在使用者自身。
10. 总结与下一步
这个项目最值得尝试的地方,是把 AI 聚合网关注册到 Cloudflare 免费额度上,几乎零运维成本地解决多模型管理问题。部署完成后,最先验证三件事:网关鉴权是否生效、模型路由是否正确、超时重试是否有效。最容易踩的坑就是没配密钥就把服务暴露到公网,导致上游额度被扫描流量刷掉。
下一步可以根据实际使用情况继续扩展:接入 KV 缓存降低请求量,配置自定义域名让调用地址更稳定,或者用定时任务跑日志统计,观察每个上游服务商的真实调用成本。如果只是日常自用和团队内部调试,这套 Cloudflare 部署方案已经足够稳定,关键是先把密钥和限流这两道安全防线补上。