免费 AI 图片生成 + 辨识 API:Cloudflare Workers AI 实战

不到 50 行代码,写出两个 API:一个 AI 生图、一个 AI 辨识图片。两个都跑在 Cloudflare Workers 免费方案上,不用租 GPU、不用 API key。本文带你从 0 建专案、写路由、本地测试到部署上线,最后让 AI 互相 PK,看它能不能认出自己画的东西。

一、建专案 + 设定 AI binding

开始之前你只需要两个东西:Cloudflare 帐号跟 Node.js。Cloudflare 帐号去官网注册,免费的,不用绑信用卡。Node.js 一行指令就能安装。

先确认 Node 版本:

Bash
node --version

看到 v22.x.x 之类的版本号就 OK 了。接着建专案:

Bash
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

专案建好了,切进去:

Bash
cd ai-image

接下来打开 wrangler.jsonc,加上 AI 的 binding。binding 就是帮你的程式接一条线到 Cloudflare 的 AI,不用装 SDK、不用设 API key,加一段设定就通了。

找到 compatibility_flags 那段,在它的 closing bracket 后面加一个逗号,然后贴上这段:

JSON
"ai": {
  "binding": "AI"
}

注意:就是在 compatibility_flags 那个中括号 ] 后面补一个逗号,然后贴上 ai binding。下面那些注解不用动,不影响。

二、AI 生图 API

做完这一步你就有自己的 AI 生图 API 了。丢一段英文描述进去,它就吐一张图出来。

打开 src/index.ts,原本的 Hello World 全部砍掉,换成这段:

TypeScript
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。

本地跑起来

Bash
npx wrangler dev

第一次跑会叫你登入 Cloudflare,浏览器跳出来点 Allow 就好。看到 localhost:8787 ready 就成功了。

打开浏览器,在网址后面加 prompt 参数:

URL
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 改成这样:

TypeScript
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 生一张图存到本地:

Bash
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:

Bash
curl -X POST http://localhost:8787/describe --data-binary @test.png

terminal 会回一段 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」,连卤蛋跟蔬菜都认得出来。

四、部署上线

一行指令搞定:

Bash
npx wrangler deploy

terminal 会跑出部署过程,最后给你一个 .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 生图 APIGET /generate?prompt=…SDXL Lightning
AI 图片辨识 APIPOST /describe(body 放图片)LLaVA 1.5

code 不到 50 行,全部跑在免费方案上。你可以拿来接到自己网站、做 LINE Bot、串自动化流程,或者就纯玩。

现在换你了,关掉这篇文章,打开 terminal 跑 npm create cloudflare@latest -- ai-image,10 分钟做出你自己的 AI 图片 API。

Y
YAHA学堂 发布于 2026年4月25日

专注 AI 工具与开发效率的技术频道,用最简单的方式讲最实用的技术。