不到 50 行代码,写出两个 API:一个 AI 生图、一个 AI 辨识图片。两个都跑在 Cloudflare Workers 免费方案上,不用租 GPU、不用 API key。本文带你从 0 建专案、写路由、本地测试到部署上线,最后让 AI 互相 PK,看它能不能认出自己画的东西。
一、建专案 + 设定 AI binding
开始之前你只需要两个东西:Cloudflare 帐号跟 Node.js。Cloudflare 帐号去官网注册,免费的,不用绑信用卡。Node.js 一行指令就能安装。
先确认 Node 版本:
node --version看到 v22.x.x 之类的版本号就 OK 了。接着建专案:
npm create cloudflare@latest -- ai-image它会跑出互动式选单,跟着选:
| 问题 | 选择 |
|---|---|
| What would you like to start with? | Hello World example |
| Which template would you like to use? | Worker only(最上面那个,下面 Durable Objects、Workflow 都不用管) |
| Which language do you want to use? | TypeScript |
| Do you want to add an AGENTS.md file? | 选哪个都行(这是给 AI coding 工具看的说明档,跟今天的内容无关) |
| Do you want to use git? | Yes |
| Do you want to deploy? | No |
专案建好了,切进去:
cd ai-image接下来打开 wrangler.jsonc,加上 AI 的 binding。binding 就是帮你的程式接一条线到 Cloudflare 的 AI,不用装 SDK、不用设 API key,加一段设定就通了。
找到 compatibility_flags 那段,在它的 closing bracket 后面加一个逗号,然后贴上这段:
"ai": {
"binding": "AI"
}注意:就是在 compatibility_flags 那个中括号 ] 后面补一个逗号,然后贴上 ai binding。下面那些注解不用动,不影响。
二、AI 生图 API
做完这一步你就有自己的 AI 生图 API 了。丢一段英文描述进去,它就吐一张图出来。
打开 src/index.ts,原本的 Hello World 全部砍掉,换成这段:
export interface Env {
AI: Ai;
}
export default {
async fetch(request, env): Promise<Response> {
const url = new URL(request.url);
const prompt = url.searchParams.get("prompt");
if (!prompt) {
return new Response("请在网址加上 ?prompt=你的描述", {
status: 400,
});
}
const response = await env.AI.run(
"@cf/bytedance/stable-diffusion-xl-lightning",
{ prompt }
);
return new Response(response, {
headers: { "Content-Type": "image/png" },
});
},
} satisfies ExportedHandler<Env>;这段 code 在做什么?很简单。它从网址抓一个叫 prompt 的参数,丢给 Stable Diffusion XL Lightning 这个 model,然后把生出来的图片直接回传。
为什么选 SDXL Lightning?
这边用的是 ByteDance 的 SDXL Lightning。原因有两个:
| 优势 | 说明 |
|---|---|
| 免费 | 现在 beta 阶段,pricing 写 $0.00 per step,完全不用钱 |
| 速度快 | 大概 3-4 秒就能生一张 1024px 的图 |
如果你没带 prompt 参数,它就回一个提示讯息叫你补。这种小细节很重要,不然等等你打错网址,就会看到一堆看不懂的 error。
本地跑起来
npx wrangler dev第一次跑会叫你登入 Cloudflare,浏览器跳出来点 Allow 就好。看到 localhost:8787 ready 就成功了。
打开浏览器,在网址后面加 prompt 参数:
http://localhost:8787?prompt=a+cat+wearing+sunglasses+on+the+beach等几秒,一张戴墨镜的猫咪在沙滩上的图就跑出来了。换个 prompt 试试 a+futuristic+city+at+sunset+cyberpunk+style,赛博庞克风的未来城市夕阳图也能直接生。
提醒:因为 AI model 跑在 Cloudflare 那边不是在你电脑上,所以要等个几秒才会回来。但生出来的图品质其实蛮 OK 的。整个 API 的 code 就十几行,而且完全免费,你有自己的 API endpoint,想接到哪就接到哪。
三、AI 图片辨识 API
接下来这个功能比生图更实用:你丢一张照片进去,AI 用一整段话告诉你里面有什么。等等我们要拿它来考 AI,看它能不能认出自己画的东西。
在同一个专案里加第二个功能。打开 src/index.ts,把 code 改成这样:
export interface Env {
AI: Ai;
}
export default {
async fetch(request, env): Promise<Response> {
const url = new URL(request.url);
const path = url.pathname;
// 路由:/generate 生图,/describe 辨识
if (path === "/generate") {
return handleGenerate(url, env);
}
if (path === "/describe") {
return handleDescribe(request, env);
}
return new Response(
"AI Image API\n" +
"GET /generate?prompt=描述 → 生成图片\n" +
"POST /describe → 辨识图片(body 放图片)",
{ status: 200 }
);
},
} satisfies ExportedHandler<Env>;
async function handleGenerate(
url: URL,
env: Env
): Promise<Response> {
const prompt = url.searchParams.get("prompt");
if (!prompt) {
return new Response("请加上 ?prompt=你的描述", {
status: 400,
});
}
const image = await env.AI.run(
"@cf/bytedance/stable-diffusion-xl-lightning",
{ prompt }
);
return new Response(image, {
headers: { "Content-Type": "image/png" },
});
}
async function handleDescribe(
request: Request,
env: Env
): Promise<Response> {
const blob = await request.arrayBuffer();
const imageArray = [...new Uint8Array(blob)];
const response = await env.AI.run(
"@cf/llava-hf/llava-1.5-7b-hf",
{
image: imageArray,
prompt: "Describe this image in detail",
max_tokens: 512,
}
);
return Response.json(response);
}code 变长了一点,但其实就做了一件事:加了路由。
- 打
/generate:生图,跟刚刚一样 - 打
/describe:辨识图片
LLaVA 模型有多猛
辨识用的是 LLaVA 这个 model,它厉害的地方是不只告诉你「这是一只猫」,它会用一整段话去描述图片里的东西。「一只戴着墨镜的橘猫坐在沙滩上,背景是蓝色的海」,这种 level。
图片怎么传进去?你用 POST request 把图片档案放在 body 里面,code 会把它转成一串数字丢给 AI。听起来复杂,但用 curl 一行指令就搞定。
实战:让 AI 辨识自己画的图
先用生图 API 生一张图存到本地:
curl -s -o test.png "http://localhost:8787/generate?prompt=a+red+sports+car+on+a+highway"curl 这个指令是在 terminal 里发 request 用的,Mac 跟 Linux 都有内建,Windows 的话 PowerShell 也有。-s 是安静模式不显示进度,-o 是存档。图存好后,把它丢给辨识 API:
curl -X POST http://localhost:8787/describe --data-binary @test.pngterminal 会回一段 JSON,description 栏位会写:「a red sports car driving on a highway with mountains in the background」。它不只认出是一台红色跑车,连公路跟背景的山都讲出来了。
实测:故意丢一些奇怪的图给它,像是一碗拉面的照片,它会回「a bowl of ramen noodles with eggs and vegetables in a dark broth」,连卤蛋跟蔬菜都认得出来。
四、部署上线
一行指令搞定:
npx wrangler deployterminal 会跑出部署过程,最后给你一个 .workers.dev 的网址,格式像 https://ai-image.你的子网域.workers.dev。这个子网域是你注册 Cloudflare 帐号时自动分配的,在 dashboard 的 Workers 页面可以看到。
打开这个网址加上 /generate?prompt=a+panda+eating+bamboo,公开的,全世界都能连。你朋友在美国打这个网址也能生图。
免费额度够用吗?
| 项目 | 免费额度 | 超过后 |
|---|---|---|
| Workers AI | 每天 10,000 个 neurons | 每 1,000 个 neurons $0.011 |
| SDXL Lightning 生图 | beta 阶段完全不算钱 | — |
| LLaVA 辨识 | 一次约几个 neurons | — |
个人用完全够,就算超过了,几乎可以忽略。在 Cloudflare dashboard 的 Workers AI 用量页面可以看到 neurons 用量和 free tier 额度。
五、总结
今天用 Cloudflare Workers AI 做了两个东西:
| 功能 | 路由 | 使用模型 |
|---|---|---|
| AI 生图 API | GET /generate?prompt=… | SDXL Lightning |
| AI 图片辨识 API | POST /describe(body 放图片) | LLaVA 1.5 |
code 不到 50 行,全部跑在免费方案上。你可以拿来接到自己网站、做 LINE Bot、串自动化流程,或者就纯玩。
现在换你了,关掉这篇文章,打开 terminal 跑 npm create cloudflare@latest -- ai-image,10 分钟做出你自己的 AI 图片 API。