Creé una aplicación de generación de imágenes usando Next.js y OpenAI API-Dall · E 3 (compatible con CSS CSS)

Creé una aplicación de generación de imágenes usando Next.js y OpenAI API-Dall · E 3 (compatible con CSS CSS)

¿Alguna vez has querido incorporar IA de la generación de imágenes recientemente hablada

En este artículo, le mostraremos cómo crear una aplicación de generación de imágenes simple usando Next.js (enrutador de aplicaciones) , CSS de viento de cola y API de generación de imágenes de OpenAI (Dall · E 3)

aquellos a quienes les resulta una molestia escribir código usted mismo o
desean una plantilla con una interfaz de usuario que funcione rápidamente, también vendemos plantillas en las siguientes plataformas .

¡Las plantillas presentadas en este artículo ya están a la venta!

Esta plantilla de UI de chatbot está disponible para la venta en múltiples plataformas.

La estructura es perfecta para aquellos que quieren probar algo que funcione primero, "Quiero usarla de inmediato sin construir un entorno" o "Quiero verificar todo el código".

También puede consultar otras plantillas de cada una de mi página:

Tabla de contenido

Sobre la tecnología utilizada

Esta aplicación de generación de imágenes se basa en las siguientes tecnologías:

Next.js (configuración del enrutador de aplicaciones)

Un marco basado en React le permite crear páginas unificadas y rutas API. Utilizo una configuración de enrutador de aplicaciones a partir de SRC/APP

CSS de viento de cola

Un marco CSS de utilidad primero que le permite organizar eficientemente sus diseños utilizando clases. Crear rápidamente una interfaz de usuario receptiva y simple

API de OpenAI (generación de imágenes)

Use
de OpenAI /V1/Images/Generations El modelo (por ejemplo, Dall-E-3 ), el tamaño de la imagen, la calidad de la imagen, etc. se puede cambiar de manera flexible usando .env

Rutas API + buscar

El cliente y la comunicación de la API de OpenAI se transmiten en el lado del servidor a través de
/API /imagen en Next.js. El lado del cliente tiene una configuración simple que simplemente publica usando Fetch ("/API/Image")

Crear una tecla API de OpenAI

Esta vez, utilizaremos la API de OpenAI, por lo que necesitaremos crear una tecla API de OpenAI.
Serás redirigido a las teclas API en el tablero de la API de Operai. Seleccione "Crear nueva clave secreta".

Puede seleccionar el proyecto de cualquier forma que desee y seleccionar permisos para adaptarse al modelo que desea usar, o seleccionar todo para generarlo.

Una vez que se complete la creación, se creará una cadena que comienza con "SK-", por lo que la usaremos después de esto.
Tenga cuidado de no dejar ir esta llave.

Construcción ambiental

Primero, prepare un entorno de desarrollo para Next.js.

Creando un proyecto

Crearé un proyecto.
Básicamente, creo que está bien dejar todo en los valores predeterminados, pero está bien siempre que pueda cambiarlo según sea necesario.
(Este proyecto usa CSS Tailwind, por lo que es mejor establecerlo en sí. El valor predeterminado es sí).

$ npx create-next-app@Última imagen-generador-starter --Typescript ✔ ¿Le gustaría usar Eslint? … No / sí ✔ ¿Le gustaría usar CSS de viento de cola? … No / sí ✔ ¿Le gustaría su código dentro de un directorio `src /`? ... no / sí ✔ ¿Le gustaría usar el enrutador de aplicaciones? (Recomendado) ... no / sí ✔ ¿Le gustaría usar Turbopack para 'Next Dev`? ... no / sí ✔ ¿Le gustaría personalizar el alias de importación (`@ /*` por defecto)? ... no / sí creando una nueva aplicación Next.js en / Image-Generator-Starter. Usando NPM. Inicialización del proyecto con plantilla: App -tw Instalación de dependencias: - React - React -Dom - Siguiente instalación de DevDependencies: - TypeScript - @types/node - @tipos/react - @tipos/react - @tipos/react -dom - @tailwindcss/postcss - TailWindcss - Eslint - Eslint -Config -next - @eslint/eslint/eslinTrages, agregó 333333333333333333333333333333333333333I 337 paquetes en 16S 137 Los paquetes buscan Financing Ejecutar `Fondo NPM` para obtener detalles de 0 vulnerabilidades inicializadas un repositorio GIT. ¡Éxito! Creado Generator-Generator Starter AT /Image-Generator-Starter

Si aparece "Success! Se creó el Generador de Imagen-Generator AT /Image-Generator-Starter", la creación del proyecto está completa.
Una vez que haya creado el proyecto, mueva el directorio.

CD Image Generator-Starter

Establecer la tecla API de OpenAI

Cree un .env en la raíz

OPERAI_API_KEY = SK -... OPERAI_MODEL = DALL-E-3 OPERAI_IMAGE_SIZE = 1024X1024 OPERAI_IMAGE_QUALity = Standard

Descripción breve:

  • OPERAI_API_KEY : Clave privada para acceder a la API de generación de imágenes Operai (obtenida de la pantalla de administración de Operai)
  • OpenAI_Model : modelo de generación de imágenes para usar. Actualmente, se especifica Dall-E-3
  • OPERAI_IMAGE_SIZE : el tamaño de la imagen a generar (por ejemplo, 1024x1024 ). Se puede cambiar según sea necesario
  • OPERAI_IMAGE_QUALity : calidad de imagen. Puede elegir estándar o HD HD es de alta calidad pero puede tomar mucho tiempo)

Iniciar el servidor de desarrollo

Ejecutar el siguiente comando iniciará la plantilla:

NPM Run Dev

Implementación de la interfaz de usuario (pantalla de generación de imágenes)

La interfaz de usuario de generación de imágenes se organiza en
SRC/App/Page.tsx La cantidad total del código fuente es el siguiente:

"Use el cliente"; import {useState} de "react"; Importar imagen de "Next/Image"; Exportar función predeterminada home () {// estado para la entrada del usuario (indicador de la imagen) // El indicador de generación de imágenes ingresado por el usuario const [indic, setPrompt] = useState (""); // Estado para almacenar URL de imagen generada // URL de la imagen generada const [imageUrl, setImageUrl] = useState (""); // Estado del indicador de carga // Cargando el indicador const [Carga, Stretloading] = useState (falso); // Estado del mensaje de error // para almacenar mensajes de error const [error, setError] = useState (""); // manejar la solicitud de generación de imágenes // Solicitud de generación de imágenes de procesamiento const GenerateImage = async () => {if (! Proltic.trim ()) return; // Restablecer el estado antes de la solicitud // Inicializar el estado antes de la carga de la solicitud de solicitud (true); setError (""); setImageUrl (""); Pruebe {// Envíe la solicitud a la API interna // Enviar solicitud a API interna (/api/image) const res = await fetch ("/api/image", {método: "publicar", encabezados: {"content-type": "application/json"}, cuerpo: json.stringify ({solicit}),}); const data = await res.json (); if (res.ok && data.imageUrl) {setImageUrl (data.imageUrl); } else {setError (data.Error || "Error al generar la imagen"); }} catch (e) {console.error ("Error:", e); setError ("ocurrió un error inesperado"); } Finalmente {setloading (falso); }}; devolver (<main className="min-h-screen bg-gray-900 text-gray-100 flex items-center justify-center px-4 py-8"><div className="w-full max-w-xl bg-gray-800 rounded-xl shadow-lg p-6 space-y-6"> {/* Título */}<h1 className="text-2xl font-bold text-center text-white"> Generador de imágenes AI</h1> {/ * Strem Enput/Strem Enput de entrada */}<div className="space-y-2"> <label htmlFor="prompt" className="block text-sm font-medium text-gray-300" >Ingrese su mensaje de imagen</label><textarea id="prompt" rows={3} value={prompt} onChange={(e) => setPrompt (e.target.value)} classname = "w-full p-3 redondeado-lg bg-gray-700 borde de borde-gray-600 text-white focus: outline-non-non focus: ring-2 focus: ring-green-400 resize-none" placeholder = "eg a un button de la ciudad futurista en el sol, el arte digital"/> </div> {/ * Botón de genear}/generar}/generar}/generar}/generar botón} onClick = {GenerateImage} Disabled = {Loading} className = "W-Full Py-3 redondeado-LG BG-Green-500 Hover: BG-Green-600-Black-Black-Semibold Diable: Opacity-50 Transición"> {Carga? "Generación ...": "Generar imagen"} </botón> {/ * Mensaje de error/error Pantalla */} {error && (<div classname = "text-400 text-sm text-center"> {error} </div>)} {/ * imagen de imagen/visual H- [512PX] "> <Image src = {imageUrl} alt =" resultado generado "rellena className no optimizado =" redondeado-lg contenimiento de objeto borde de borde-700 "/> </div>)} </div> </main>); }

Gestión del estado del mensaje

const [indic, setPrompt] = useState (""); const [imageUrl, setImageUrl] = useState (""); const [carga, setloading] = useState (falso); const [error, setError] = useState ("");

Descripción breve:

  • Solicitud : Mantiene la descripción de la generación de imágenes (indicador) ingresada por el usuario
  • ImageUrl : mantiene la URL de la imagen generada
  • Carga : indica el estado de esperar la respuesta de la API
  • Error : mantiene los mensajes que se mostrarán cuando ocurre un error

Procesamiento de transmisión de generación de imágenes y llamadas API

const GenerateImage = async () => {if (! Proltic.trim ()) return; setloading (verdadero); setError (""); setImageUrl (""); Pruebe {const res = await fetch ("/api/image", {método: "post", encabezados: {"content-type": "application/json"}, body: json.stringify ({pronto}),}); const data = await res.json (); if (res.ok && data.imageUrl) {setImageUrl (data.imageUrl); } else {setError (data.Error || "Error al generar la imagen"); }} catch (e) {console.error ("Error:", e); setError ("ocurrió un error inesperado"); } Finalmente {setloading (falso); }};

Descripción breve:

  • Envíe la solicitud ingresada /API /Imagen
  • Cuando la imagen se devuelva desde la API de OpenAI, configure la URL y se mostrará en la pantalla.
  • Si se produce un error, se mostrará un mensaje

Formulario de entrada y botones (CSS)

<textarea id="prompt" rows={3} value={prompt} onChange={(e) =>setPrompt (e.target.value)} classname = "w-full p-3 redondeado-lg bg-gris-700 borde de borde-gray-600 text-white focus: outline-non focus: ring-2 focus: ring-green-400 resize-non" shitleper = "eg a gat surfing on waves, arte digital" /> <bootin ongcLick = {{{{{{{{{{{{{{{{{{{} {{{{{{{{{{{{{ className = "W-Full Py-3 redondeado-LG BG-Green-500 Hover: BG-Green-600-Black-Black-Black Font-Semibold Desactivado: Opacidad-50 Transición"> {¿Carga? "Generando ...": "Generar imagen"} </boton>

Descripción breve:

  • Ingrese la descripción de la imagen en el área de texto
  • Haga clic en el botón para iniciar la generación de imágenes ( el botón está deshabilitado mientras se carga
  • Tailwind CSS lo hace simple y fácil de usar

Visualización de imagen, error, visualización de carga

{error && (<div className="text-red-400 text-sm text-center"> {error}</div> )} {imageUrl && ( <div className="mt-4 relative w-full h-[512px]"><Image src={imageUrl} alt="Generated result" layout="fill" className="rounded-lg object-contain border border-gray-700" /></div> )}

Descripción breve:

  • Si hay un error
  • Si se genera una imagen, se mostrará de forma contenida en la pantalla ( optimizada usando Next/Image

Implementación del lado del servidor (integración de API de OpenAI)

El proceso de generación de imágenes es que el cliente envía una solicitud a
/API /imagen luego los relés y las respuestas se devuelven a la API de chat de OpenAI en el servidor.

La cantidad total del código fuente del lado del servidor es el siguiente:

// src/app/api/image/ruta.ts import {nextuCeest, nexTResponse} de "Next/Server"; // Publicar controlador para la generación de imágenes utilizando la API de OpenAI // Generar imágenes utilizando el manejador de la API de OpenAI Post Exportar Función Async Post (Req: NexTequest) {// analice el indicador del cuerpo de solicitud // Obtenga el indicador del cuerpo de solicitud const {indic} = await req.json (); // Validar entrada // verifique si el indicador se especifica si (! Ind) {return nextResponse.json ({error: "Se requiere un indicador"}, {estado: 400}); } try {// Cargue la configuración de las variables de entorno (con valores de respaldo) // Cargue la configuración de las variables de entorno (si no, el valor predeterminado) const modelo = proceso.env.openai_model || "Dall-E-3"; const size = process.env.openai_image_size || "1024x1024"; constante const = process.env.openai_image_quality || "estándar"; // Enviar solicitud al punto final de generación de imágenes de OpenAI // Enviar solicitud a la generación de imágenes de OpenAi Respuesta constante = ALEA FETCH ("https://api.openai.com/v1/images/generations", {método: "post", encabezados: {autorización: `bearer $ {process.env.openai_api_key}`, contento ":", Aplicación/jon. }, cuerpo: json.stringify ({modelo, // eg, "dall-e-3" indicador, // indicador del usuario para el tamaño de la generación de imágenes, // eg, "1024x1024" calidad, // "estándar" o "hd" n: 1, // número de imágenes para generar}),}); const data = await respuesta.json (); // manejar la respuesta de error de la API // qué hacer si se devuelve un error de API si (data.error) {console.error ("error de api openai:", data.error); return nextResponse.json ({error: "Falló de generación de imágenes"}, {estado: 500}); } // Extraiga la URL de imagen generada // Obtenga la URL de la imagen generada const imageUrl = data.data? // Devuelve la URL de la imagen al cliente // Devuelve la URL de la imagen al cliente return nextResponse.json ({imageUrl}); } capt (error) {// manejar errores inesperados del servidor // manejar errores de servidor inesperados console.error ("Error del servidor:", error); return nextResponse.json ({Error: "Error de servidor interno"}, {estado: 500}); }}

Configuración básica de ruta.ts

import {nextuCeest, nexTResponse} de "Next/Server"; Exportar Async Function Post (req: nexTuCeest) {const {pronto} = await req.json ();

Descripción breve:

  • Esta es una ruta API que se limita a post
  • Recibe aviso enviado desde el lado del cliente

Solicitudes de API de OpenAI

const respuesta = await fetch ("https://api.openai.com/v1/images/generations", {método: "post", encabezados: {autorización: `bearer $ {process.env.openai_api_key}`, "Content-type": "Application/JSon",}, Body: JSON.STRINGIFIFY ({Model Process.env.openai_model || const data = await respuesta.json ();

Descripción breve:

  • Carga dinámicamente las teclas API , los nombres de los modelos , los tamaños de imagen y la calidad de la imagen de las variables de entorno
  • la API de generación de imágenes Operai ( /v1/imágenes/generaciones ) y envíe una solicitud de generación de imágenes.
  • N: 1 es la especificación de que "solo se generará una hoja".

Procesamiento de respuesta y manejo de errores

  if (data.error) {console.error (data.error); return nextResponse.json ({error: "Falló de generación de imágenes"}, {estado: 500}); } const imageUrl = data.data? return nexTResponse.json ({imageUrl}); }

Descripción breve:

  • Si la API de OpenAI falla, el error se emite a la consola y devuelve con un error de 500.
  • Si la URL de la imagen se devuelve correctamente, se devolverá al cliente ( ImageUrl ).

[Bonificación] cosas a tener en cuenta

  • Administre
    con .env para que nunca las publique Si se produce el problema, desactívelo o vuelva a emitirlo en la pantalla de gestión de OpenAI
  • El nombre del modelo, el tamaño de la imagen y la calidad de la imagen están diseñados
    para cambiarse dinámicamente con .env Ajuste de acuerdo con el propósito y el costo (por ejemplo, HD es de mayor calidad y mayor costo que el estándar
  • El período de almacenamiento de imágenes y los tiempos de disponibilidad pueden ser limitados , por lo que si es necesario, considere el diseño para realizar el procesamiento de almacenamiento inmediatamente después de la adquisición.

Comprobación de operación

¡Hagamos una verificación rápida de su operación!

Cuando abra "localhost: 3000" en su navegador, aparecerá la siguiente pantalla.

Intenta entrar en "un lindo gato".

Después de esperar un tiempo, ¡se generó y se exhibió una linda imagen de gato!
¡También se muestra sin ningún problema en japonés!

Información sobre ventas de plantillas

La interfaz de usuario de chatbot presentada en este artículo también se vende como una plantilla que puede usarse para fines comerciales

¿Por qué vender plantillas?

Hemos preparado esto para aquellos que están experimentando las siguientes necesidades:

  • "Incluso si sigues los pasos, el entorno no funciona ..."
  • "Solo quiero comenzar con una muestra en movimiento".
  • "Miré mi blog y lo encontré útil, así que me gustaría comprarlo con el objetivo de apoyar y donar".

Incluso aquellos que no están acostumbrados a desarrollar el juego pueden comenzar y probarlo rápidamente con un esfuerzo mínimo

Ejemplos de uso de plantillas (ideas de personalización)

Esta plantilla es perfecta para fines de desarrollo personal y aprendizaje.
Por ejemplo, recomendamos modificar y expandir lo siguiente:

  • Se agregó preprocesador para traducir las indicaciones de entrada en inglés
  • Expandido para permitir descargar y guardar y compartir las imágenes generadas en SNS
  • Función Agregar gestión de historial (indicador más reciente + imagen) localmente
  • Personalice los colores y diseños del tema para hacer sus propias especificaciones
  • Agregue el procesamiento para guardar automáticamente las imágenes en S3, etc. en el lado del servidor

También es una buena práctica probarlo sobre una "base en serie" para los principiantes de programación.

¿Qué está incluido en la plantilla?

contiene
todo el código fuente para el proyecto que presentamos aquí Por lo tanto, no tiene que crear o configurar su propio proyecto desde cero, y puede iniciarlo de inmediato .

  • Implementación de UI usando Next.js (enrutador de aplicaciones)
  • Implementación del lado del servidor con integración de API
  • Estructura de código limpio con comentarios
  • El diseño simple y fácil de mejorar con CSS de viento de cola
  • Archivos de configuración de inicio de Docker ( DockerFile , Docker-Compose.yml )

*Para ejecutar, se requiere un entorno de ejecución básico como Node.js y Docker.

¡Las plantillas presentadas en este artículo ya están a la venta!

Esta plantilla de UI de chatbot está disponible para la venta en múltiples plataformas.

La estructura es perfecta para aquellos que quieren probar algo que funcione primero, "Quiero usarla de inmediato sin construir un entorno" o "Quiero verificar todo el código".

También puede consultar otras plantillas de cada una de mi página:

resumen

Esta vez, presentamos cómo construir aplicación de generación de imágenes utilizando Operai API X Next.js.

Los puntos clave en este artículo son los siguientes:

  • La API de imagen de Openai le permite crear funciones de generación de imágenes con solo un poco de código
  • Next.js App Router + Tailwind CSS hace que sea fácil expandir y personalizar la interfaz de usuario
  • Usando plantillas, omitir la construcción y configuración del medio ambiente y verificar la operación de inmediato.

Esta plantilla es perfecta para
los kits de inicio de prototipos y desarrollo personal También se recomienda para aquellos que desean convertir rápidamente sus ideas en realidad, o para aprender y verificar la API de OpenAI.

¡Comparte si quieres!

Quien escribió este artículo

Este es un blog que comencé a estudiar la seguridad de la información. Como nuevo empleado, sería feliz si pudieras mirar con un corazón amplio.
También está Teech Lab, que es una oportunidad para estudiar diversión de programación, por lo que si está interesado en el desarrollo de software, ¡asegúrese de echar un vistazo!

Tabla de contenido