在 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 等
});
注意:不要同时使用
size和aspectRatio,且需要查阅你所用模型的文档以确认它支持哪些规格。
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) & 厂商特定参数
为了在调试时获得可重复的结果,或者调整模型的特定参数(如画质、风格),可以使用 seed 和 providerOptions。
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 函数极大地简化了图像模型的接入流程:
- 统一 API:切换模型只需改一行代码。
- 类型安全:TypeScript 支持完善。
- 便捷处理:直接获取 Base64/Buffer,无需手动处理 URL 下载。
现在,你可以尝试将这个功能集成到你的 Next.js 或 Node.js 应用中,为用户提供丰富的视觉体验!