图片生成
RavenSaaS 使用 ai-sdk 作为基础库,结合自定义的 Provider,支持了市面上主流的图片生成模型。
使用 OpenAI 的图片模型
使用 OpenAI 的 dall-e-3 模型生成图片:
需要先在 OpenAI Platform 充值,并创建 API Key。
其他平替平台例如 ChatBox,也是可以的,只需要修改OPENAI_BASE_URL和OPENAI_API_KEY即可。
1. 设置环境变量
.env.development
1OPENAI_BASE_URL = "https://api.openai.com/v1"
2OPENAI_API_KEY = "sk-xxx"
2. 生成图片
providerOptions.openai 支持的参数,参考 OpenAI Image Generation 接口文档
app/api/demo/gen-image/route.ts
1import { experimental_generateImage as generateImage } from "ai";
2import { openai } from "@ai-sdk/openai";
3
4const prompt = "a beautiful girl running with 2 cats";
5const model = "dall-e-3";
6
7const imageModel = openai.image(model);
8const providerOptions = {
9 openai: {
10 quality: "hd",
11 style: "natural",
12 },
13};
14
15const { images, warnings } = await generateImage({
16 model: imageModel,
17 prompt: prompt,
18 n: 1,
19 providerOptions,
20});
3. 预览效果

使用 Replicate 上的图片模型
需要先在 Replicate 上绑定信用卡,并创建 API Token。
1. 设置环境变量
.env.development
1REPLICATE_API_TOKEN = "r8_xxx"
2. 生成图片
在 Replicate 模型广场 选择一个图片生成模型,复制模型名称。
providerOptions.replicate 支持的参数,参考选择模型的 API 文档
app/api/demo/gen-image/route.ts
1import { experimental_generateImage as generateImage } from "ai";
2import { replicate } from "@ai-sdk/replicate";
3
4const prompt = "a beautiful girl running with 2 cats";
5const model = "black-forest-labs/flux-1.1-pro";
6
7const imageModel = replicate.image(model);
8const providerOptions = {
9 replicate: {
10 output_quality: 90,
11 },
12};
13
14const { images, warnings } = await generateImage({
15 model: imageModel,
16 prompt: prompt,
17 n: 1,
18 providerOptions,
19});
3. 预览效果

使用 Kling AI 的图片模型
需要先在 Kling AI 充值 Image Generation API,并 创建 API Key。
1. 设置环境变量
.env.development
1KLING_ACCESS_KEY = "xxx"
2KLING_SECRET_KEY = "xxx"
2. 生成图片
注意
这里使用的是 RavenSaaS 自定义的 Provider:import '{ kling }' from "@/aisdk/kling";,跟 @ai-sdk 下的 Provider 导入路径有差异。
providerOptions.kling 支持的参数,参考 Kling Image Generation API 文档
app/api/demo/gen-image/route.ts
1import { experimental_generateImage as generateImage } from "ai";
2import { kling } from "@/aisdk/kling";
3
4const prompt = "a beautiful girl running with 2 cats";
5const model = "kling-v1";
6
7const imageModel = kling.image(model);
8const providerOptions = {
9 kling: {},
10};
11
12const { images, warnings } = await generateImage({
13 model: imageModel,
14 prompt: prompt,
15 n: 1,
16 providerOptions,
17});
保存图片到本地文件
通过 generateImage 生成的图片,是 base64 编码的字符串数组。
你可以参考下面的代码,将图片内容保存到本地文件。
app/api/gen-image/route.ts
1const { images, warnings } = await generateImage({
2 model: imageModel,
3 prompt: prompt,
4 n: 1,
5 providerOptions,
6});
7
8if (warnings.length > 0) {
9 console.log("gen images warnings:", provider, warnings);
10 return respErr("gen images failed");
11}
12
13const batch = getUuid();
14
15const processedImages = await Promise.all(
16 images.map(async (image, index) => {
17 const fileName = `${provider}_image_${batch}_${index}.png`;
18 const filePath = path.join(process.cwd(), ".tmp", fileName);
19
20 const buffer = Buffer.from(image.base64, "base64");
21 await writeFile(filePath, buffer);
22
23 return {
24 provider,
25 fileName,
26 filePath,
27 };
28 })
29);