☰
用Cloudflare Workers免费搭建AI聚合网关:统一管理多模型API
2026/10/10 19:44:19 网站建设 项目流程

这次我们来看一个很有意思的轻量级项目:用一周时间搓出来的 AI 聚合网关,核心卖点是“一键部署到 Cloudflare,免费上云”。它解决的痛点很直接:当你手上的 AI 服务商越来越多,OpenAI、Anthropic、Google、Groq、国产大模型各有各的 Base URL、密钥体系和模型命名规则,业务端要接哪家就得改哪家,测试脚本、批量任务、内部工具全被上游 API 格式绑死。这个网关把上游全部收口成一个统一入口,对外暴露一套兼容 OpenAI 格式的 API,剩下的路由、鉴权、缓存、失败切换都由网关处理。

先给结论:这类项目适合 AI 应用开发者、自动化脚本作者、团队内部工具负责人。部署平台是 Cloudflare Workers,天然免费额度,不需要自己买服务器;因为有 workers.dev 域名,部署完成就能拿到一个公网 HTTPS 地址;网关本身不参与模型训练,也不保存对话内容,只做请求转发和策略控制。下面我会从核心能力、部署方式、路由配置、接口测试、批量任务、性能观察和排错清单几个维度完整过一遍,你可以边看边对着自己的项目试。

1. 核心能力速览

能力项说明
项目类型云端部署的 AI API 聚合网关,统一接入多家大模型服务商
目标平台Cloudflare Workers / Pages,常见方式为 Workers + KV 组合
部署方式一键部署脚本 / Wrangler CLI / Cloudflare 控制台在线编辑
核心功能OpenAI 兼容接口、上游服务商配置、自动路由、流式响应、结果缓存、失败切换、密钥托管
API 风格对外提供/v1/chat/completions等兼容接口,业务端改动最小
免费额度依赖 Cloudflare Workers 免费计划,个人测试和小流量够用,具体配额以 Cloudflare 官方为准
显存/硬件要求无。网关是纯云端逻辑,不跑本地模型,不需要 GPU
是否支持批量任务支持。网关本身是 HTTP 转发层,可被外部脚本批量调用,配合重试和队列即可
适合场景个人工具、团队内部 AI 中台、自动化脚本统一入口、多服务商比价与容灾
不适合场景大规模生产级高并发、低延迟本地推理、需要长连接私有协议的场景

从材料看,这个项目最大特点是“免费 + 一键 + 白嫖 Cloudflare”,对个人开发者和中小团队非常友好。要注意的是,网关不提供模型算力,你仍然需要各家服务商的 API Key,只是由网关统一管理。

2. 适用场景与使用边界

2.1 适合谁

  • 同时使用多家 AI 服务商,想统一切换和降级策略的开发者。
  • 不想在每个脚本和服务里重复写 API Key、Base URL 和请求头的团队。
  • 想给内部项目做一个轻量 AI 接入层,但不想单独维护一台服务器的团队。
  • 喜欢用 Cloudflare 免费额度解决基础设施问题的技术玩家。

2.2 能解决的问题

  • 统一接口:业务端只认网关的地址,上游换成哪家都不影响业务端。
  • 密钥集中管理:各家 Key 放在 Cloudflare 环境变量或 KV 里,不散落在代码仓库。
  • 失败切换:某家服务商限流或故障时,网关自动换到备用服务商。
  • 缓存降本:命中缓存的重复请求不向上游计费,能明显降低高频调用成本。
  • 可观测性:网关层可以记录请求来源、模型、耗时、状态码,给后续用量分析打底。

2.3 不适合什么

  • 需要极低延迟、本地数据不出内网的企业场景,网关只做转发,不适合私有化推理。
  • 有严格合规要求、不允许请求经过第三方平台的业务。
  • 需要自定义传输协议或双向流式长连接的场景。

2.4 使用边界与合规提醒

聚合网关只改变 API 接入方式,不改变数据归属和内容责任。调用任何模型前,需要确认:

  • 上游服务商是否允许代理转发,是否覆盖存储与训练条款;
  • 请求内容是否包含个人信息、商业秘密或敏感数据,如果有,先做脱敏;
  • 如果使用人脸、声音、版权素材相关的生成模型,必须保证素材来源合法授权;
  • 部署到公共互联网后,网关接口默认就是公开的,必须加上访问鉴权,避免被刷量。

3. 部署前准备与前置条件

我不建议一上来就改代码,先把环境确认清楚,至少能少踩一半的坑。

3.1 需要准备的东西

项目要求
Cloudflare 账号免费注册即可,最好开启二次验证
域名或开发子域workers.dev 默认域名即可,也可以绑定自定义域名
上游服务商 API Key至少准备一家可用的 Key,例如 OpenAI、Anthropic、智谱、DeepSeek 等
Node.js 环境如果使用 Wrangler CLI,建议 Node 18 或更高版本
代码工具建议准备 Git,方便拉取和提交项目代码

3.2 免费计划额度预期

Cloudflare Workers 免费计划有每日请求数、CPU 时间、KV 读写次数等限制,具体数字会随官方政策调整。实际部署时以 Cloudflare 控制台显示的剩余配额为准。个人开发、内部脚本、低频 API 调用基本够用;如果做高并发生产接口,需要评估付费计划。

3.3 安装 Wrangler CLI

# 全局安装 wrangler,具体版本以官方 npm 包为准 npm install -g wrangler # 验证安装 wrangler --version

安装完成后,先登录:

wrangler login

浏览器会弹出 Cloudflare 授权页面,登录并确认授权即可。如果你的网络环境无法直接访问 Cloudflare,请优先检查本地网络和服务连通性,不要在网关项目中配置任何代理相关功能。

4. 一键部署到 Cloudflare

这里给出两种部署方式,按你的习惯选择。

4.1 方式一:通过 Wrangler 命令行部署

假定你已经把项目代码克隆到本地,进入项目根目录,典型的部署流程是:

# 安装项目依赖 npm install # 部署 worker wrangler deploy

部署完成后,终端会输出一个形如https://your-worker.你的子域.workers.dev的地址,这就是网关对外入口。

如果项目里有自定义的wrangler.toml或wrangler.jsonc配置,部署前需要注意name、main、compatibility_date和kv_namespaces是否正确。一个简化配置示例:

name = "ai-gateway" main = "src/index.js" compatibility_date = "2025-01-01" # 如果网关用到缓存,需要绑定 KV namespace # kv_namespaces = [ # { binding = "CACHE_KV", id = "your-kv-namespace-id" } # ] [vars] DEFAULT_MODEL = "gpt-4o-mini"

注意:compatibility_date需要实际可用的日期,KV 绑定需要先创建 namespace,上面的代码只作为通用模板。

4.2 方式二:通过 Cloudflare 控制台在线部署

如果你不想装命令行工具,可以直接在 Cloudflare 控制台创建 Worker:

  1. 打开 Cloudflare Dashboard,进入 Workers 与 Pages。
  2. 点击“创建应用程序”,然后选择“创建 Worker”。
  3. 把网关项目的index.js或主要入口代码粘贴到在线编辑器中。
  4. 在“设置”中添加环境变量,逐个放上游 API Key。
  5. 点击“部署并启用”,系统会自动生成访问地址。

这种方式适合快速验证,但后续要处理多个文件、复杂依赖时,还是建议用 Wrangler。

4.3 创建 KV 缓存空间

如果网关实现里使用缓存,需要先创建一个 KV namespace。

wrangler kv namespace create CACHE_KV

创建完成后,控制台会返回一个id,把它填到wrangler.toml的绑定里,再重新部署。KV 的作用是缓存部分重复请求的响应,减少上游调用。

4.4 校验部署是否成功

部署完成后,直接访问根路径,预期返回一个简单的 JSON 信息,例如{"status":"ok"}或网关名称。如果页面报 404,说明服务入口路径不是根路径,去控制台查看路由配置。

5. 配置上游服务商与路由策略

网关的核心价值不在转发本身,而在策略。

5.1 环境变量里放 Key

不建议把 Key 写在代码里,而是通过环境和 secrets 注入。使用 Wrangler 设置:

wrangler secret put OPENAI_API_KEY wrangler secret put ANTHROPIC_API_KEY wrangler secret put DEEPSEEK_API_KEY

命令运行后会要求输入 Key 内容,保存到 Cloudflare 的加密存储中。这样代码仓库不会出现明文密钥。

5.2 服务商路由规则

一个常见的路由思路是:客户端请求时指定一个provider参数,网关根据该参数把请求转发到对应的 Base URL,并替换模型名。另一种思路是网关维护一套“模型名到服务商”的映射表,客户端只传model,网关查表决定转发到哪家。

例如:

const providers = { openai: { baseUrl: "https://api.openai.com/v1", apiKeyName: "OPENAI_API_KEY", modelMapping: { "gpt-4o-mini": "gpt-4o-mini" } }, deepseek: { baseUrl: "https://api.deepseek.com/v1", apiKeyName: "DEEPSEEK_API_KEY", modelMapping: { "gpt-4o-mini": "deepseek-chat" } } };

上面的代码是通用配置示例,实际字段名需要以网关项目源码为准。路由逻辑一般位于 Worker 的fetch处理器中,收到请求后读取 URL 参数或请求体里的字段,决定 target provider。

5.3 失败切换策略

可靠性比较好的网关会做“主服务商 + 备用服务商”。主服务商返回 429、5xx 或网络错误时,自动重新请求备用服务商。实现时要注意:

  • 必须设置上游请求超时时间,不能无限等待;
  • 切换后要记录日志,方便排查;
  • 流式响应过程中如果主链路中断,切换比较麻烦,建议非流式或短流场景先启用。

5.4 统一鉴权

网关暴露到公网后,必须加一层访问控制。最简单的方式是网关自身也校验一个AuthorizationBearer Token:

wrangler secret put GATEWAY_API_KEY

客户端调用时携带网关自己的 Key,而不是上游 Key。网关验证通过后,再替换成上游 Key 去请求目标服务商。

6. 功能测试与效果验证

部署完成后,建议按下面顺序做一轮完整验证,不要直接上业务。

6.1 验证统一入口是否可用

用 curl 发送一个最小编译请求:

curl -s https://your-worker.子域.workers.dev/v1/chat/completions \ -H "Content-Type: application/json" \ -H "Authorization: Bearer 你的网关Key" \ -d '{ "model": "gpt-4o-mini", "messages": [{"role": "user", "content": "你好,请回复:网关连通"}], "stream": false }'

如果返回内容包含choices字段和模型输出,说明统一入口正常,密钥替换也正常。如果返回 401,检查网关 Key 是否正确;如果返回 502,检查上游服务商 Key 或 Base URL 配置。

6.2 验证流式输出

curl -N https://your-worker.子域.workers.dev/v1/chat/completions \ -H "Content-Type: application/json" \ -H "Authorization: Bearer 你的网关Key" \ -d '{ "model": "gpt-4o-mini", "messages": [{"role": "user", "content": "写一个30字的自我介绍"}], "stream": true }'

输出应该是data:开头的 SSE 流,最后有[DONE]。如果使用 Node 或 Python 的官方 OpenAI SDK,只需把base_url指向网关地址,业务代码几乎不用改。

Python 调用示例:

from openai import OpenAI client = OpenAI( api_key="你的网关Key", base_url="https://your-worker.子域.workers.dev/v1" ) resp = client.chat.completions.create( model="gpt-4o-mini", messages=[{"role": "user", "content": "你好"}], stream=True ) for chunk in resp: if chunk.choices[0].delta.content: print(chunk.choices[0].delta.content, end="") print()

注意:模型名要传网关能识别的模型名,具体取决于配置。如果网关本身做模型映射,你需要按你自己的映射表传参。

6.3 验证缓存是否生效

开启缓存后,连续向网关发两次完全相同的请求。第二次请求的响应时间应明显下降,并且 Cloudflare 侧不会产生新的上游计费。判断方式可以看网关日志中是否出现cache hit标识,或者查看响应耗时。

6.4 验证失败切换

临时把主服务商的 Key 改成错误值,再发起请求。预期网关自动切换到备用服务商并返回结果。如果网关直接返回 502,说明切换逻辑没有配通,需要查看日志。

6.5 验证批量并发

用 Python 脚本模拟 10 个并发请求,统一打到网关:

import requests from concurrent.futures import ThreadPoolExecutor url = "https://your-worker.子域.workers.dev/v1/chat/completions" headers = { "Authorization": "Bearer 你的网关Key", "Content-Type": "application/json" } payload = { "model": "gpt-4o-mini", "messages": [{"role": "user", "content": "回复OK"}], "stream": False } def call_one(i): resp = requests.post(url, headers=headers, json=payload, timeout=30) return resp.status_code with ThreadPoolExecutor(max_workers=10) as pool: codes = list(pool.map(call_one, range(10))) print(codes)

这一步重点验证网关鉴权、路由和限流是否正常。出现 429 或 5xx 时,排查 Cloudflare 限流策略和上游服务商配额。

7. 接口 API 与批量任务

7.1 API 语义设计

网关对外接口建议做一层统一规范,至少包括以下请求字段:

字段含义是否必填
model模型名,例如gpt-4o-mini、deepseek-chat是
messages对话消息列表是
temperature采样温度否
max_tokens最大输出长度否
stream是否流式否
provider强制指定服务商否,不传则自动路由

返回格式建议与 OpenAI 保持一致,这样现有 SDK 直接可用。

7.2 批量任务设计

网关本质是 HTTP 服务,不内置任务队列,但完全可以作为批量任务的目标端。批量任务通常是这样做的:

  1. 准备一批 prompt 文件,例如 JSON 数组,每条包含id和content。
  2. 用脚本逐条或分批调用网关接口。
  3. 收集结果并写入本地文件或数据库。
  4. 对失败的请求做重试。

Python 批量脚本示例:

import json import time import requests url = "https://your-worker.子域.workers.dev/v1/chat/completions" headers = { "Authorization": "Bearer 你的网关Key", "Content-Type": "application/json" } with open("tasks.json", "r", encoding="utf-8") as f: tasks = json.load(f) results = [] for task in tasks: payload = { "model": "gpt-4o-mini", "messages": [{"role": "user", "content": task["content"]}], "stream": False } try: resp = requests.post(url, headers=headers, json=payload, timeout=60) if resp.status_code == 200: data = resp.json() answer = data["choices"][0]["message"]["content"] results.append({ "id": task["id"], "content": task["content"], "answer": answer, "status": "ok" }) else: results.append({ "id": task["id"], "status": "failed", "error": resp.text }) except Exception as e: results.append({ "id": task["id"], "status": "exception", "error": str(e) }) # 温和限速,避免触发上游限制 time.sleep(0.5) with open("results.json", "w", encoding="utf-8") as f: json.dump(results, f, ensure_ascii=False, indent=2)

批量任务最容易遇到两个问题:一个是上游限流,导致大量 429;另一个是单条请求超时,导致整个脚本卡住。建议批量任务里加入重试、限速和断点续跑能力。

7.3 读取流式响应做批处理

如果模型本身只支持流式,批量脚本需要解析 SSE 流。可以逐行读取,找到data: [DONE]作为结束标志。这种方式内存占用更低,但代码会复杂一些。

8. 资源占用与性能观察

这部分是很多人关心的重点,但注意,Cloudflare Workers 是 Serverless 平台,不存在传统意义上的显存、内存常驻占用。你能观察到的指标主要是请求数量、CPU 时间、KV 读写次数和网络耗时。

8.1 观察出口

登录 Cloudflare 控制台,进入对应 Worker 的分析页面,可以看到:

  • 请求总数
  • 成功率和错误码分布
  • 请求耗时分布
  • 上游调用次数(如果网关代码中有上报逻辑)
  • 每日额度消耗

8.2 影响性能的关键点

  • 上游响应时间:网关本身转发很快,瓶颈基本在上游模型响应。
  • 缓存命中率:命中率高,网关 CPU 时间和 KV 读取量都更低,请求耗时也更短。
  • 流式 vs 非流式:流式响应能更快返回首字,但对网关的代码逻辑要求更严格。
  • 请求体大小:大 prompt 会增加请求转发耗时,Cloudflare 对请求体大小也有限制,超大文本要做拆分。
  • 并发策略:Workers 可以并发处理请求,但上游服务商有速率限制,网关层需要内置令牌桶或失败回退。

8.3 降低资源消耗的建议

  • 开启缓存,对同 prompt 重复请求直接返回。
  • 为不同业务拆多个入口路径,避免一个 Worker 被占满配额。
  • 错误响应不要做大量字符串拼接,减少 CPU 时间消耗。
  • 日志输出控制在业务关键节点,避免每条请求都写很多结构化日志。

8.4 比较不同上游服务商

如果你把多家服务商接入同一个网关,可以做一个简单的“耗时对照表”:

providermodel是否流式返回耗时状态码备注
providerAmodel-a否2.3s200稳定
providerBmodel-b否4.1s200偏慢
providerCmodel-c否失败429配额不足

这个过程只是网关接入能力的验证,不作为模型效果排序依据。

9. 常见问题与排查方法

问题现象可能原因排查方式解决方案
部署后访问返回 404Worker 路由路径不对或入口代码未导出 fetch 处理器打开控制台测试 / 观察日志确认主文件正确绑定fetch事件
请求返回 401网关 Key 错误或未配置检查Authorization请求头重新设置GATEWAY_API_KEY
请求返回 502上游 Base URL、Key 或模型名错误查看 Worker 日志中上游错误信息核对服务商文档,替换正确配置
上游返回 429触发服务商限流查看响应头X-RateLimit-*做请求限速、缓存、降级到备用服务商
流式输出中断上游流被切断或网关未处理 SSE检查网络稳定性,确认代码支持stream=true分批重试或改用非流式
缓存不生效KV 未绑定、请求体含随机参数或缓存键设计错误查看绑定配置和缓存日志修正缓存键,只对稳定字段做哈希
批量脚本中途失败单条请求超时或上游配额耗尽查看脚本日志,记录失败位置加入断点续跑、重试、记录已完成 ID
配额消耗过快缓存未生效、并发过高或日志过于频繁控制台查看请求分布开启缓存、控制并发、精简日志
自定义域名访问失败DNS、路由规则或证书问题检查域名解析和 Worker Routes在控制台绑定自定义域名并等证书生效
代码更新后未生效部署流程未完成或缓存了旧版本重新wrangler deploy,清理版本缓存使用新版本部署并观察版本 ID
其他服务商请求格式兼容问题各家 API 的字段差异导致参数冲突对比服务商文档与网关源码在网关层做参数归一化

排查时最有效的办法是打开 Cloudflare Worker 的实时日志,看每次请求转发到哪家、返回的状态码以及报错内容。日志里定位不到的问题,再考虑是否混淆传参、模型映射错误或公网连通性问题。

10. 最佳实践与使用建议

10.1 从最小配置开始

第一次部署只接一家服务商,先用最简配置把链路跑通。确认统一入口、鉴权、基础对话都没问题后,再加第二家、加缓存、加失败切换。不要一开始就把所有模型堆上去,否则出问题时很难定位是哪一步。

10.2 密钥分离

网关 Key、管理人员 Key、各上游 Key 要分开管理。上游 Key 放在 Cloudflare secrets 中,不要出现在代码仓库、日志、前端页面或抓包工具中。

10.3 缓存键要稳定

缓存命中率取决于缓存键的设计。推荐对以下内容做哈希:

  • 模型名
  • 温度等核心采样参数
  • 归一化后的 messages 内容

不要把时间戳、随机数、请求 ID 放入缓存键,否则缓存形同虚设。

10.4 批量任务要三件套:日志、重试、断点

  • 日志:每条任务记录 id、请求时间、响应时间、状态码、错误消息。
  • 重试:遇到 429、5xx、超时才重试,不重试 4xx 校验错误。
  • 断点:记录已完成 id,再次运行脚本时跳过已完成任务。

10.5 网关鉴权要尽早做

你的网关部署到公网,很容易被扫描器打。即使只是内部工具,也要加上全局鉴权。更稳妥的做法是:网关只响应携带正确Authorization的请求,其它请求直接返回 401。生产环境还可以加 IP 白名单、地区限制或自定义访问规则,但纯免费计划下人力和规则配置能力有限,先保住密钥安全。

10.6 合规与内容审核

聚合网关简化的是技术接入,不是责任转移。如果业务要面向外部用户开放,建议在网关层增加关键词过滤、输入长度限制、输出内容复核等逻辑。涉及人脸、声音、版权素材等场景,必须在上游服务商允许的范围内使用,并取得所有必要授权。

11. 总结与下一步

这个项目最值得尝试的点,是用 Cloudflare Workers 的免费额度搭出一个标准的 AI 接入层。不用买服务器,不用管运维,不用为每家 AI 服务商写一套独立请求代码,一个统一入口就能把路由、缓存、失败切换、密钥管理都收进来。

如果你准备自己动手,我建议按这个顺序跑:

  1. 注册 Cloudflare 账号,创建 Worker。
  2. 只接一家服务商,用 curl 验证非流式和流式请求。
  3. 接第二家服务商,配置模型映射和失败切换。
  4. 加 KV 缓存,对比两次相同请求的耗时。
  5. 写一个 Python 批量脚本,验证多请求场景。
  6. 最后把网关 Key 换掉,去掉测试配置,再上业务。

最容易踩的坑基本集中在三类:上游服务商配置错误导致 502、缓存键设计不合理导致配额浪费、网关公网部署后没有加鉴权被刷。前两个坑多看看 Worker 日志就能解决,最后一个坑必须在部署早期规避。

网关这类项目后续还可以扩展的方向很多:比如接入更多国产大模型服务商、增加按量计费统计、加 Web 管理面板、做用量报表、给不同团队分配不同网关 Key、对接私有知识库等。对个人开发者来说,先用免费额度把链路跑熟,比一开始追求复杂生产架构更有价值。建议收藏备用,等你有多个 AI 服务商要接的时候,回来把这套逻辑搭起来。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询