Skip to content

免费 AI Chat / Tools / Fun — Cloudflare 边缘网关

免登录 · 流式聊天 · 工具集合 · 趣味页面(含图片瀑布流)

观者终端
Go back

我用 Cloudflare Worker 搭了一个 Grok + GPT/Codex 多模型 AI 网关

发布于:

起因

故事很俗:某天想同时用 Grok 和 GPT/Codex,但各种套壳与官方入口体验都不理想——要么需要登录、要么广告满天飞、要么访问不稳定。于是想着自己做一个统一入口,让朋友和我打开即用。

最终结果:直接体验 → 我的 AI 多模型终端


整体架构

浏览器(Astro 前端)
       ↓  fetch POST
Cloudflare Worker(安全网关)
       ↓  转发请求
多 Provider 上游(Grok / GPT / Codex)
       ↓  SSE 流式返回
Cloudflare Worker 透传

浏览器实时渲染

没有 VPS,没有 Docker,全跑在 Cloudflare 的边缘节点上,理论上全球任何地方都能毫秒级响应。


挑战一:CORS 的坑

最先遇到的问题:浏览器直接调 API 会被 CORS 拦住,这是标准的浏览器安全机制。

解决方法是让 Worker 做一层网关,替浏览器去调 API,再把结果转发回来,Worker 对浏览器的响应头里加上:

"Access-Control-Allow-Origin": "https://你的域名"

同时做了 Origin 白名单校验,防止别的网站蹭用你的 Worker:

const ALLOWED_ORIGINS = ["https://410666.xyz", "http://localhost:4321"];

if (!ALLOWED_ORIGINS.includes(origin)) {
  return new Response("Forbidden", { status: 403 });
}

挑战二:流式输出(SSE)的透传

Grok API 支持 stream: true,边生成边返回,用户体验很好,但也带来了一个问题:Worker 默认是”等完整响应再返回”,这样流就断了。

关键是直接把 upstream.body 传给 new Response(),不要 await 等待完整内容:

return new Response(upstream.body, {
  headers: {
    "Content-Type": "text/event-stream",
    "Cache-Control": "no-cache",
    "X-Accel-Buffering": "no", // 防止 nginx 层缓冲
  },
});

前端用 ReadableStreamgetReader() 逐 chunk 解析 SSE 格式,最终实现了打字机效果。


挑战三:防刷限流(用 Cloudflare KV)

完全不加限制的话,随便一个脚本就能把额度刷爆。

利用 Cloudflare KV(免费的分布式 Key-Value 数据库)做了一个精确到 IP + 业务类型的每日计数器:

async function checkRateLimit(kv, ip, type, max) {
  const today = new Date().toISOString().split("T")[0];
  const key   = `limit:${ip}:${type}:${today}`;
  const count = parseInt((await kv.get(key)) ?? "0", 10);
  if (count >= max) return false;
  await kv.put(key, String(count + 1), { expirationTtl: 86400 });
  return true;
}

挑战四:防止用户用聊天模式”白嫖”画图

这个有点意思:API 本身是一个 chat 接口,但支持生图能力。如果不加限制,用户在聊天模式直接说”画个猫”,就绕过了画图的限额。

做了两层防御:

第一层(0 成本正则前置过滤): 短促画图指令(<20 字符且匹配画图关键词)直接在 Worker 端返回一个伪造的 SSE 拒绝响应,不消耗任何 API 额度。

第二层(系统提示词注入): 对所有聊天请求,在 messages 里悄悄注入一段系统提示词,要求模型遵守”纯文本助手”身份,拒绝画图并给出友好引导。

注入方式:把提示词贴在用户消息末尾(而不是 system 角色),这样模型不会把它当作”新任务描述”而复述一遍,用户完全感知不到。


前端:Astro + 全屏聊天 UI

前端用的是 AstroPaper 主题框架,在 /chat 路由下写了一个完全独立的全屏对话页面(跟博客主题互不干扰)。

几个值得记录的细节:


部署步骤(极简版)

  1. Clone 一个 Worker 项目,wrangler.toml 配好 namecompatibility_date
  2. npx wrangler kv:namespace create "RATE_LIMITER" 创建 KV,把 id 填回 toml
  3. npx wrangler secret put API_KEY 注入 API Key(不写在代码里)
  4. npx wrangler deploy 发布

前端 Astro 部署到 Cloudflare Pages,Worker 绑定自定义域名,整套跑起来月账单:¥0


近期更新(2026-03)

上线后又补了一波工程化细节,值得单独记一下:

这几个点都不是“花活”,是上线后真实流量下必须补齐的稳定性与一致性工作。


最后

如果你也想折腾一个属于自己的 AI 入口,整体难度不高,主要是 Cloudflare 的生态熟悉起来需要一点时间。有任何问题欢迎留言。

现在就去试试这个 Grok 聊天室


Share this post on:

Previous Post
从网页镜像到手机里的 AI 助手:我用两天做了一个 Android App(Vibe Coding 实践记录)
Next Post
引擎点火:410666.xyz 独立节点上线
🎵