高额接口费用让人头疼
很多独立开发者在尝试使用大模型时,常被意外的费用吓到。一不小心就可能花掉几十甚至上百美元,导致项目夭折。今天我们来聊聊一个既能省钱又能用上强大模型的方案——Cloudflare Workers AI。

什么是 Workers AI 免费额度
Cloudflare 在全球超过三百个节点上部署了开源大模型,开发者只需要通过简单的接口调用就能使用。平台每天赠送一万个算力单位(称为神经元),对个人项目和小型团队来说基本够用。付费时每千个神经元只要零点零一一美元,相比主流商业接口可以节省六成到九成。
快速开始的三种方式
- 方式一:直接使用 REST 接口
只需要获取账户 ID 和访问令牌,再用 curl 发送 POST 请求即可体验。无需写任何代码,适合快速验证。
curl \ -H "Authorization: Bearer 你的令牌" \ -H "Content-Type: application/json" \ -d '{"messages":[{"role":"system","content":"你是一个友好的助手"},{"role":"user","content":"用一句话介绍一下 Cloudflare Workers AI"}]}' \ https://api.cloudflare.com/client/v4/accounts/你的账户ID/ai/run/@cf/meta/llama-3.1-8b-instruct - 方式二:使用 Wrangler 部署 Worker(推荐)
通过命令行工具创建 Worker 项目,绑定 AI 绑定后写少量代码即可得到一个永久可用的接口。
npm install -g wrangler wrangler login wrangler init my-ai-worker cd my-ai-worker # 编辑 wrangler.toml 添加 [ai] binding = "AI" # 编辑 src/index.js 编写调用代码 wrangler dev # 本地测试 wrangler deploy # 上线
- 方式三:使用 OpenAI 兼容 SDK 进行无缝迁移
如果之前的项目使用 OpenAI 库,只需要改动三行代码:把密钥换成 Cloudflare 令牌,把基础地址换成 Workers AI 地址,把模型名改为对应的开源模型标识。
import OpenAI from 'openai' client = OpenAI(api_key="你的云flar令牌", base_url="https://api.cloudflare.com/client/v4/accounts/你的账户ID/ai/") response = client.chat.completions.create(model="@cf/meta/llama-3.1-8b-instruct", messages=[{"role":"user","content":"你好"}]) print(response.choices[0].message.content)
实际案例:文本摘要、翻译、图片描述
案例一:博客文章自动摘要
后端接收长文本,调用轻量模型生成两句话摘要,控制输出长度以节省算力。
export default {
async fetch(request, env) {
if (request.method !== "POST") { return new Response("仅接受 POST", {status:405}); }
const {text, max_length=200} = await request.json();
if (!text) { return new Response(JSON.stringify({error:"缺少文本"}), {status:400, headers:{"Content-Type":"application/json"}}); }
const aiResp = await env.AI.run("@cf/meta/llama-3.2-3b-instruct", {
messages:[{role:"system",content:`你是一个专业的文本摘要助手。请将用户提供的文章总结在 ${max_length} 个字以内,保留核心观点。`},{role:"user",content:text}],max_tokens:180});
return new Response(JSON.stringify({summary:aiResp.response,original_len:text.length}), {headers:{"Content-Type":"application/json"}});
}}
案例二:多语言翻译服务
使用轻量翻译模型实现中英互传,成本只有传统云翻译的十分之一。
export default {
async fetch(request, env) {
if (request.method !== "POST") { return new Response("仅接受 POST", {status:405}); }
const {text, targetLang="zh"} = await request.json();
if (!text) { return new Response(JSON.stringify({error:"缺少文本"}), {status:400, headers:{"Content-Type":"application/json"}}); }
const aiResp = await env.AI.run("@cf/meta/m2m100-1.2b", {text:text, source_lang:"en", target_lang:targetLang});
return new Response(JSON.stringify({translation:aiResp.translated_text}), {headers:{"Content-Type":"application/json"}});
}}
案例三:图片内容描述(可访问性)
给定图片地址,下载后转为 base64,调用视觉模型得到中文描述。
export default {
async fetch(request, env) {
if (request.method !== "POST") { return new Response("仅接受 POST", {status:405}); }
const {image_url, question="描述这张图片"} = await request.json();
if (!image_url) { return new Response(JSON.stringify({error:"缺少图片地址"}), {status:400, headers:{"Content-Type":"application/json"}}); }
const imgResp = await fetch(image_url);
const imgBuf = await imgResp.arrayBuffer();
const base64 = btoa(String.fromCharCode(...new Uint8Array(imgBuf)));
const aiResp = await env.AI.run("@cf/meta/llama-3.2-11b-vision-instruct", {
messages:[{role:"user",content:[{type:"text",text:question},{type:"image_url",image_url:{url:`data:image/jpeg;base64,${base64}`}}]}],max_tokens:250});
return new Response(JSON.stringify({description:aiResp.response,image_url:image_url}), {headers:{"Content-Type":"application/json"}});
}}
进阶技巧:缓存、流式输出、模型选择
- 使用 KV 做结果缓存
对于重复请求(比如热门文章的摘要),先在 KV 中查找,命中则直接返回,未命中才调用模型并写入缓存。这样可以省掉三成以上的调用次数。
export default { async fetch(request, env) { const body = await request.json(); const cacheKey = JSON.stringify(body.messages); const cached = await env.CACHE.get(cacheKey); if (cached) { return new Response(cached, {headers:{"Content-Type":"application/json"}}); } const result = await env.AI.run("@cf/meta/llama-3.2-3b-instruct", body); const out = JSON.stringify(result); await env.CACHE.put(cacheKey, out, {expirationTtl:3600}); return new Response(out, {headers:{"Content-Type":"application/json"}}); }} - 流式响应让用户见字如面
开启流式后,服务器逐块返回文本,前端通过事件流实时显示,体验类似聊天机器人。
export default { async fetch(request, env) { if (request.method !== "POST") { return new Response("仅接受 POST", {status:405}); } const {prompt} = await request.json(); const stream = await env.AI.run("@cf/meta/llama-3.2-3b-instruct", { messages:[{role:"system",content:"你是一个有用的助手"},{role:"user",content:prompt}],max_tokens:300,stream:true}); return new Response(stream, {headers:{"Content-Type":"text/event-stream","Cache-Control":"no-cache","Connection":"keep-alive"}}); }} - 根据任务难度选择模型
短对话和简单摘要用 3B 参数模型,速度快消耗低;长文本分析或复杂推理时切换到 8B 或 70B 模型,虽然慢一些但质量更高。
function selectModel(task,len) { if (len<200 && task==="chat") return "@cf/meta/llama-3.2-3b-instruct"; if (len>1000 && task==="summary") return "@cf/meta/llama-3.1-8b-instruct"; return "@cf/meta/llama-3.1-70b-instruct"; }
成本对比与省钱示例
假设每篇文章约一千字,生成一百字摘要大约消耗三十个神经元。处理三百篇文章需要九千个神经元,仍在每日一万的免费额度之内。如果使用谷歌云翻译,处理同样的一百万字符需要约二十美元;而用 Workers AI 只有约一美元六五,省了十倍以上。
常见问题解答
- 如何获取 API 令牌?
在 Cloudflare 控制台的个人资料页面选择 API 令牌,使用 Workers AI 模板创建,记得保存好只显示一次的令牌。
- 账户 ID 在哪里?
登录后浏览器地址栏中的一串数字即为账户 ID。
- 免费额度用完后会怎样?
系统会自动切换到付费模式,按每千个神经元零点零一一美元计费。可以在控制台设置使用量提醒,避免意外开销。
- 遇到速率限制怎么办?
大多数模型限制为每分钟三百请求。可在请求间加入延时,或使用队列库如 p-queue 平滑流量。
- 哪些地区可以使用?
全球都可以访问,但大陆可能需要kx网络才能直连。
结尾
如果你也在为高昂的 AI 账单而苦恼,不妨花五分钟注册 Cloudflare 账号,再花十五分钟跑通上面的任意一个示例。说不定这个方案正是你项目需要的省钱神器。欢迎在下方评论区留言,分享你使用 Workers AI 的心得、遇到的坑或还有哪些功能想了解。
评论 (0)