🚀 Vercel AI SDK 使用指南:图像生成 (Image Generation)

0 阅读2分钟

在 AI 应用开发中,除了文本对话,图像生成也是一个非常热门的需求。Vercel AI SDK Core 在 v6 版本中提供了标准化的 generateImage 函数,让你能够用统一的 API 调用 DALL-E 3、Google Imagen、Midjourney (via Fal) 等多种顶级图像模型。

本文将带你深入了解如何使用 Vercel AI SDK 进行图像生成,涵盖基础用法、尺寸控制、批量生成以及错误处理。

🛠️ 前置准备

首先,确保你已经安装了 ai SDK 和对应的模型提供商库(这里以 OpenAI 为例):

Bash

npm install ai @ai-sdk/openai

Ensure you have your API key configured (e.g., OPENAI_API_KEY in your .env file).


1. 基础用法:生成第一张图片

generateImage 是核心函数。你只需要指定模型和提示词(prompt),即可获取生成的图像数据。

TypeScript

import { generateImage } from 'ai';
import { openai } from '@ai-sdk/openai';
import fs from 'fs';

async function main() {
  const { image } = await generateImage({
    model: openai.image('dall-e-3'),
    prompt: '一只戴着赛博朋克眼镜的猫,在霓虹灯闪烁的东京街头',
  });

  // image 对象包含 base64 和 uint8Array 两种格式
  console.log('Image generated successfully!');
  
  // 示例:将图片保存到本地
  fs.writeFileSync('cyberpunk-cat.png', image.uint8Array);
}

main().catch(console.error);

✨ 返回值说明

返回的 image 对象非常方便,直接提供了两种常用格式:

  • image.base64: 适合在前端直接展示 (src={data:image/png;base64,${image.base64}}).
  • image.uint8Array: 二进制数据,适合保存文件或上传到对象存储 (S3/R2)。

2. 进阶控制:尺寸与比例

不同的模型对图片规格的要求不同。Vercel AI SDK 提供了 size(固定尺寸)和 aspectRatio(宽高比)两个参数。

指定固定尺寸 (Size)

适用于像 DALL-E 3 这样支持特定分辨率的模型。

TypeScript

const { image } = await generateImage({
  model: openai.image('dall-e-3'),
  prompt: '复古风格的太空海报',
  size: '1024x1792', // 宽x高
});

指定宽高比 (Aspect Ratio)

适用于像 Google Imagen 或一些 Flux 模型,它们更灵活,允许你指定比例。

TypeScript

import { vertex } from '@ai-sdk/google-vertex';

const { image } = await generateImage({
  model: vertex.image('imagen-3.0-generate-001'),
  prompt: '宁静的湖面日出',
  aspectRatio: '16:9', // 常用比例:1:1, 16:9, 4:3 等
});

注意:不要同时使用 sizeaspectRatio,且需要查阅你所用模型的文档以确认它支持哪些规格。


3. 批量生成 (Generating Multiple Images)

想要一次生成多张图片供用户选择?使用 n 参数。SDK 会自动处理并发请求。

TypeScript

const { images } = await generateImage({
  model: openai.image('dall-e-2'), // 注意:DALL-E 3 每次只能生成 1 张,DALL-E 2 支持多张
  prompt: '极简主义风格的咖啡Logo设计',
  n: 4, // 生成 4 张
});

// 遍历保存
images.forEach((img, index) => {
  fs.writeFileSync(`logo-${index}.png`, img.uint8Array);
});

4. 结果确定性 (Seed) & 厂商特定参数

为了在调试时获得可重复的结果,或者调整模型的特定参数(如画质、风格),可以使用 seedproviderOptions

TypeScript

const { image } = await generateImage({
  model: openai.image('dall-e-3'),
  prompt: '未来的飞行汽车',
  seed: 123456, // 相同的种子在相同参数下通常产生相似结果
  providerOptions: {
    openai: { 
      style: 'vivid', // DALL-E 3 特有参数:vivid (生动) 或 natural (自然)
      quality: 'hd'   // DALL-E 3 特有参数:standard 或 hd
    },
  },
});

5. 错误处理 (Error Handling)

调用 AI 接口总会面临失败的风险(如内容审核拦截、服务过载)。SDK 提供了专门的错误类 NoImageGeneratedError

TypeScript

import { generateImage, NoImageGeneratedError } from 'ai';

try {
  await generateImage({ 
    model: openai.image('dall-e-3'), 
    prompt: '涉嫌违规的敏感词提示...' 
  });
} catch (error) {
  if (NoImageGeneratedError.isInstance(error)) {
    console.error('生成失败:', error.message);
    console.error('失败原因:', error.cause);
    console.error('原始响应:', error.responses); // 包含详细的 API 响应头和数据
  } else {
    console.error('未知错误:', error);
  }
}

🎯 总结

Vercel AI SDK 的 generateImage 函数极大地简化了图像模型的接入流程:

  1. 统一 API:切换模型只需改一行代码。
  2. 类型安全:TypeScript 支持完善。
  3. 便捷处理:直接获取 Base64/Buffer,无需手动处理 URL 下载。

现在,你可以尝试将这个功能集成到你的 Next.js 或 Node.js 应用中,为用户提供丰富的视觉体验!