Intenté crear un chatbot usando la API Operai [next.js + tailwind CSS]

Intenté crear un chatbot usando la API Operai [next.js + tailwind CSS]

Recientemente, cada vez más personas están utilizando la API de OpenAI para crear sus propios chatbots y asistentes comerciales.
En este artículo, le mostraremos cómo usar Next.js (enrutador de aplicaciones) y CSS de viento de cola

de chat/terminación de OpenAI para habilitar una experiencia de conversación similar a ChatGPT en su navegador, de manera simple.

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 interfaz de usuario de chatbot se construye utilizando 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 Operai (finalizaciones de chat)

Este es un mecanismo para interactuar con los modelos basados en GPT utilizando el /v1/chat/terminal hemos facilitado cambiar entre variables de entorno GPT-4.1-Mini y GPT-3.5-TURBO

Rutas API + buscar

Estoy escribiendo el procesamiento del servidor que transmite entre el navegador y la API de OpenAI utilizando la raíz de la API Next.js ( /API /CHAT para los clientes que usan Fetch ("/API/CHAT")

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@ulty my-chatbot --typescript necesita instalar los siguientes paquetes: create-next-app@15.4.4 ¿Aceptar para continuar? (y) y ✔ ¿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 / my-chatbot. Usando NPM. Inicialización del proyecto con plantilla: App -tw Instalación de dependencias: - React - React -Dom - Siguiente Instalación de DevDependencias: - TypeScript - @tipos/node - @tipos/react - @tipos/react -dom - @tailwindcss/postcss - TailWinDcss - eSlint - Eslint -Config -next - @eslint/eslinTRc. 14S 137 Los paquetes están buscando Financing Ejecutar `Fondo NPM` para detalles de 0 vulnerabilidades inicializadas de un repositorio GIT. ¡Éxito! Creado my-chatbot at /my-chatbot NPM Aviso de NPM Aviso Nuevo versión menor de NPM disponible! 11.0.0 -> 11.5.1 NPM AVISO CHANGELOG: https://github.com/npm/cli/releases/tag/v11.5.1 NPM AVISO PARA ECTUNCIÓN Ejecutar: NPM Install -G NPM@11.5.1 NPM AVISO

Si aparece el "éxito! Creado my-chatbot at /my-chatbot", la creación del proyecto está completa.
Una vez que haya creado el proyecto, mueva el directorio.

CD my-chatbot

Establecer la tecla API de OpenAI

Cree un .env en la raíz

OPERAI_API_KEY = SK -... OPERAI_MODEL = GPT-4.1-MINI SYSTEM_PROMPT = Usted es un asistente útil.

Descripción breve:

  • OPERAI_API_KEY: Clave privada requerida para el acceso a la API de OpenAI (emitida por una cuenta personal)
  • OpenAI_Model: el nombre del modelo a usar. Dependiendo del propósito, GPT-3.5-Turbo , GPT-4.1-Mini , etc.
  • System_Prompt: mensaje inicial que especifica la personalidad y el rol de la IA (efectivo cuando el chat comienza)

Iniciar el servidor de desarrollo

Ejecutar el siguiente comando iniciará la plantilla:

NPM Run Dev

Implementación de la interfaz de usuario (pantalla de chat)

La interfaz de usuario de chat se consolida en
SRC/App/Page.tsx La cantidad total del código fuente es el siguiente:

"Use el cliente"; import {useSestate, useref, useEffect} de "React"; // Interfaz de chat reutilizable utilizando la interfaz de chat reutilizable de OpenAI utilizando la función de exportación de API de OpenAI a la función predeterminada home () {const [input, setInput] = useState (""); const [mensajes, setmessages] = useState <{rol: "usuario" | "asistente"; contenido: string} []> ([]); const [carga, setloading] = useState (falso); const chatendref = useref<HTMLDivElement> (nulo); // Manejar el envío de mensajes a la API // El proceso de enviar un mensaje a la API const sendMessage = async () => {if (! Input.trim ()) return; // Agregar mensaje de usuario al historial de chat // Agregar mensaje de usuario al historial const NewMessages = [... Mensajes, {rol: "Usuario", Content: Input} como const,]; setMessages (NewMessages); setInput (""); setloading (verdadero); // Enviar mensaje a la ruta de la API de backend // Enviar mensaje a la api de backend endpoint const res = await fetch ("/api/chat", {método: "publicar", encabezados: {"content-type": "aplicación/json"}, cuerpo: json.stringify ({mensaje: entrada}),}); const data = await res.json (); // Agregar respuesta de asistente al historial de chat // Agregar respuesta de asistente al historial setMessages ((previo) => [... anterior, {rol: "Asistente", content: data.reply},]); setloading (falso); }; // Desplácese hasta la parte inferior de la vista de chat en la actualización // desplácese a la parte inferior de la vista de chat al actualizar un mensaje useEffect (() => {chatEndref.Current? devolver ( <main className="h-screen flex items-center justify-center bg-gray-100 text-gray-800"><div className="flex flex-col w-full max-w-3xl h-[90vh] border-x border-gray-300 bg-white"> {/ * Encabezado */} {/ * encabezado */}<header className="p-4 border-b text-lg font-semibold"> Chatbot-chatgpt</header> {/ * Visualización de mensajes de chat */} {/ * área de visualización de mensajes de chat */} <div className="flex-1 overflow-y-auto p-6 space-y-4 scrollbar-thin scrollbar-thumb-gray-400 scrollbar-track-gray-100"> {Messages.map ((msg, idx) => ( <div key={idx} className={`flex ${ msg.role === "user" ? "justify-end" : "justify-start" }`} ><div className={`max-w-xl px-4 py-2 rounded-lg text-sm whitespace-pre-wrap ${ msg.role === "user" ? "bg-blue-600 text-white" : "bg-gray-100 text-gray-900" }`} > {msg.content}</div></div> ))} {/ * Indicador de tipificación mientras se carga */} {/ * indicador durante la carga */} {carging && ( <div className="flex justify-start"><div className="bg-gray-100 text-gray-700 px-4 py-2 rounded-lg text-sm animate-pulse"> Pensamiento...</div></div> )}<div ref={chatEndRef} /></div> {/ * Área de entrada */} {/ * campo de entrada */}<footer className="border-t p-4"><div className="flex gap-2"><input value={input} onChange={(e) => setInput (e.target.value)} onKeydown = {(e) => e.key === "Enter" && sendMessage ()} classname = "Flex-Grow P <button onClick={sendMessage} className="bg-blue-600 text-white px-4 py-2 rounded hover:bg-blue-700 transition" >-</button> 2 Border redondeado Enfoque: Outline-Non</div></footer></div></main> ); }

Gestión del estado del mensaje

const [entrada, setInput] = useState (""); const [mensajes, setmessages] = useState <{rol: "usuario" | "asistente"; contenido: string} []> ([]); const [carga, setloading] = useState (falso);

Descripción breve:

  • Entrada: Mantenga el valor de entrada del cuadro de texto
  • Mensajes: historial de chat anterior (conversaciones de usuario y asistente)
  • Carga: si es una respuesta de la API o no

Enviar procesamiento y llamadas de API

const sendmessage = async () => {if (! input.trim ()) return; const NewMessages = [... Mensajes, {rol: "Usuario", Content: Input}]; setMessages (NewMessages); setInput (""); setloading (verdadero); const res = await fetch ("/api/chat", {método: "post", encabezados: {"content-type": "application/json"}, body: json.stringify ({mensaje: entrada}),}); const data = await res.json (); setMessages ((prev) => [... anterior, {rol: "Asistente", content: data.reply}]); setloading (falso); };

Descripción breve:

  • Envíe mensajes a la API al agregar la entrada del usuario al historial
  • Si obtiene una respuesta, agrégala al historial como de asistente

Diseño de la pantalla de chat (formato con viento de cola)

<div className="flex-1 overflow-y-auto p-6 space-y-4">{Messages.map ((msg, idx) => ( <div key={idx} className={`flex ${msg.role === "user" ? "justify-end" : "justify-start"}`}><div className={`max-w-xl px-4 py-2 rounded-lg text-sm whitespace-pre-wrap ${ msg.role === "user" ? "bg-blue-600 text-white" : "bg-gray-100 text-gray-900" }`}> {msg.content}</div></div> ))} {cargando && ( <div className="flex justify-start"><div className="bg-gray-100 text-gray-700 px-4 py-2 rounded-lg text-sm animate-pulse"> Pensamiento...</div></div> )}</div>

Descripción breve:

  • Los mensajes de usuario y asistente se muestran en los lados izquierdo y derecho
  • Al esperar una respuesta, se mostrará "Pensar ..." para crear una sensación de conversación.

Campo de entrada y botón Enviar

<footer className="border-t p-4"><div className="flex gap-2"><input value={input} onChange={(e) => setInput (e.target.value)} onKeydown = {(e) => e.key === "Enter" && sendMessage ()} classname = "Flex-Grow P-2 Border redondeado Enfoque: Outline-None" PlaceHolder = "Escriba su mensaje ..." / <button onClick={sendMessage} className="bg-blue-600 text-white px-4 py-2 rounded hover:bg-blue-700 transition" >></button></div></footer>

Descripción breve:

  • Especificaciones que se pueden enviar usando la entrada o el botón en el teclado
  • Usando CSS Tailwind, hemos creado una forma simple y fácil de leer.

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

La interacción de chat involucra a un cliente que envía una solicitud a
/API /chat luego la transmisión 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/chat/ruta.ts import {nextuCeest, nexTResponse} de "Next/Server"; // Publicar controlador para solicitudes de chat // Post Handler que maneja las solicitudes de chat de exportación de la función Async Post (req: nextuCeest) {const {mensaje} = await req.json (); // llame a la API de OpenAI utilizando la clave secreta del lado del servidor y los parámetros // System_Prompt Define la personalidad, el tono o el comportamiento del asistente. // OpenAI con la clave privada del lado del servidor y los parámetros llaman a la API // System_Prompt especifica la personalidad, el habla y el comportamiento del asistente. const responde = await fetch ("https://api.openai.com/v1/chat/completions", {método: "post", encabezados: {autorización: `bearer $ {process.env.openai_api_key}`, "Content-type": "Aplication/JSon", Body: JSON.STRINGIFIFY ({{Model Process.env.openai_model || const data = await respuesta.json (); // Manejar la respuesta de error de OpenAI // Manejar la respuesta de error de OpenAI // manejar la respuesta de error de OpenAI if (data.error) {console.error (data.error); return nextResponse.json ({Respuesta: "Ocurrió un error. Inténtelo de nuevo más tarde."}, {estado: 500}); } // Return Assistant Responder // return Assistant Respuesta return nextResponse.json ({Respuesta: data.Choices [0] .message.content}); }

Configuración básica de ruta.ts

import {nextuCeest, nexTResponse} de "Next/Server"; Exportar Async Function Post (Req: NEXTREQUEST) {const {Message} = Await Req.json ();

Descripción breve:

  • Rutas API limitadas a postales
  • Recibe el cuerpo del mensaje enviado desde el lado del cliente

Solicitudes de API de OpenAI

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

Descripción breve:

  • Cargue dinámicamente las teclas API , nombres de modelos y indicaciones de las variables de entorno
  • Cree una de mensajes para enviar a un modelo GPT

Procesamiento de respuesta y manejo de errores

if (data.error) {console.error (data.error); return nextResponse.json ({respuesta: "Ocurrió un error"}, {estado: 500}); } return nextResponse.json ({Respuesta: data.Choices [0] .message.content}); }

Descripción breve:

  • Si la API de OpenAI falla, envíe el error a la consola
  • Si obtiene una respuesta correctamente, envíe el mensaje del asistente al cliente como respuesta

[Bonificación] cosas a tener en cuenta

Asegúrese de administrar
con .env para que nunca estén expuestos Si su tecla API se filtra, retire la tecla API del tablero de OpenAI.

El nombre del modelo es una variable de entorno, así que reemplácelo de acuerdo con el propósito.
La cantidad de dinero involucrado varía según el modelo, así que tenga cuidado al seleccionar un modelo.

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:

  • Agregar historia y contexto a las respuestas de API
  • Intente guardar el historial de entrada al almacenamiento local
  • Intente agregar una función para emitir registros de chat a PDF o CSV
  • la lectura del habla y la generación de imágenes pueden ser interesantes

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 .

  • Chat UI con 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

hemos introducido cómo construir
una interfaz de usuario de chatbot simple usando la API Operai y Next.js.

Mirando hacia atrás en los puntos:

  • La API de chat le permite construir chatbots de alta calidad con solo un poco de código
  • Tailwind CSS + Next.js App Router hace que sea fácil expandir y reutilizar
  • El uso de plantillas le permite verificar rápidamente la operación omitiendo la construcción del medio ambiente.

No solo es adecuado como iniciador para el desarrollo y los proyectos personales, sino que también se recomienda como base para agregar características únicas y personalizar la interfaz de usuario.

¡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