生成图像

Available in Start plan

使用 AI 生成图像,并将其插入到你的文档中。

安装 Image 扩展

@tiptap/extension-image 扩展添加到你的编辑器中。

import Image from '@tiptap/extension-image'
import { Editor } from '@tiptap/core'

const editor = new Editor({
  extensions: [Image],
})

在你的服务器上生成图片

从服务器端路由调用 OpenAI API,这样你的 API 密钥就不会暴露给浏览器。使用类似 gpt-image-2 的图像生成模型。

然后,将生成的图片存储到你应用程序的存储方案中,例如 S3、R2、Supabase Storage,或者你自己的媒体服务。将存储后的图片 URL 返回给客户端。

避免将图片以 base64 形式存储

不建议将生成的图片以 base64 形式存储在文档中,尤其是在协作文档中。Base64 图片会显著增加文档大小,减慢同步速度,并且会让协作更新的处理成本更高。

import OpenAI from 'openai'

const openai = new OpenAI()

export async function POST(request) {
  const { prompt } = await request.json()

  const result = await openai.images.generate({
    model: 'gpt-image-2',
    prompt,
    size: '1024x1024',
  })

  const imageBuffer = Buffer.from(result.data[0].b64_json, 'base64')
  const imageSrc = await uploadImageToStorage(imageBuffer, {
    contentType: 'image/png',
    fileName: `generated-${Date.now()}.png`,
  })

  return Response.json({
    imageSrc,
  })
}

uploadImageToStorage 函数取决于你的应用程序。它应该将图片字节上传到你的存储提供商,并返回编辑器可以渲染的 URL。

插入生成的图片

从客户端调用你的服务器路由,并将返回的图片源传递给 setImage

async function generateAndInsertImage(prompt) {
  const response = await fetch('/api/generate-image', {
    method: 'POST',
    headers: {
      'Content-Type': 'application/json',
    },
    body: JSON.stringify({ prompt }),
  })

  const { imageSrc } = await response.json()

  editor.commands.setImage({ src: imageSrc })
}

在插入图片时,你可以包含额外的属性。查看所有可用选项列表

editor.commands.setImage({
  src: imageSrc,
  alt: prompt,
  title: prompt,
})