DEV Community

Cover image for 🚀 Guía para: Workshop de Introducción a la API de ChatGPT utilizando NestJS/Node.js
Juan Carlos Valderrábano Hernández
Juan Carlos Valderrábano Hernández

Posted on

🚀 Guía para: Workshop de Introducción a la API de ChatGPT utilizando NestJS/Node.js

¡Bienvenidos al Workshop de Introducción a la API de ChatGPT utilizando NestJS/Node.js! En este taller, aprenderemos a integrar la API de ChatGPT en aplicaciones desarrolladas con NestJS o Node.js, explorando desde la configuración inicial hasta la implementación de casos prácticos y avanzados.

📍 Objetivos del Workshop

  1. Comprender la API de ChatGPT: Familiarizarnos con la API de ChatGPT, su estructura de mensajes, y cómo puede ser utilizada en aplicaciones basadas en Node.js y NestJS.
  2. Configuración del Entorno: Preparar un entorno de desarrollo con NestJS/Node.js, incluyendo la instalación de dependencias y configuración de claves API.
  3. Realización de Solicitudes a la API: Aprender a realizar solicitudes a la API de ChatGPT dentro de un proyecto NestJS/Node.js, utilizando ejemplos claros y documentados.
  4. Implementación de Funcionalidades Clave: Desarrollar funcionalidades como análisis de texto, detección de sentimientos y generación de respuestas conversacionales en una API REST.
  5. Aplicación Práctica en Proyectos Reales: Implementar los conceptos aprendidos en un proyecto práctico, creando endpoints que interactúen con la API de ChatGPT.
  6. Documentación y Mejores Prácticas: Explorar cómo documentar adecuadamente el código y seguir las mejores prácticas en el desarrollo de APIs.

📅 Estructura del Taller

1. Introducción y Objetivos

  • Presentación del Taller: Introducción a los objetivos y alcance del taller.
  • Requisitos Previos: Conocimientos básicos de NestJS/Node.js y acceso a la API de OpenAI.

2. Configuración Inicial

2.1 Instalación de Node.js y NestJS

  • Instalación de Node.js: Descarga e instalación de Node.js desde la página oficial.
  • Creación de un Proyecto NestJS: Usar el CLI de NestJS para crear un nuevo proyecto:

     npm i -g @nestjs/cli
     nest new chatgpt-workshop
    
  • Configuración Inicial: Configuración del entorno y estructura del proyecto.

2.2 Instalación de Dependencias

  • Axios: Una biblioteca para realizar solicitudes HTTP:

     npm install axios
    
  • Dotenv: Para manejar variables de entorno de manera segura:

     npm install dotenv
    
  • Configuración de Variables de Entorno: Crear un archivo .env para almacenar la clave API de OpenAI:

     OPENAI_API_KEY=tu_clave_api_aqui
    

3. Primeros Pasos con la API en Node.js/NestJS

3.1 Integración con Axios

  • Configuración de Axios: Crear un servicio en NestJS que utilice Axios para realizar solicitudes a la API de OpenAI.
  • Ejemplo de Código:

     import { Injectable } from '@nestjs/common';
     import axios from 'axios';
    
     @Injectable()
     export class ChatGptService {
       private readonly apiKey = process.env.OPENAI_API_KEY;
       private readonly apiUrl = 'https://api.openai.com/v1/chat/completions';
    
       async sendMessage(messages: Array<{ role: string; content: string }>) {
         const response = await axios.post(
           this.apiUrl,
           {
             model: 'gpt-4',
             messages: messages,
           },
           {
             headers: {
               Authorization: `Bearer ${this.apiKey}`,
               'Content-Type': 'application/json',
             },
           },
         );
    
         return response.data;
       }
     }
    
  • Documentación:

    • apiKey: Clave API obtenida desde el archivo .env.
    • apiUrl: URL base para la API de OpenAI.
    • sendMessage(): Método que envía un array de mensajes a la API de ChatGPT.

3.2 Realización de Solicitudes Básicas

  • Estructura de Mensajes:

    • role: Define el rol del participante en la conversación (system, user, assistant).
    • content: Contenido del mensaje.
    • Ejemplo de Solicitud:
       {
         "model": "gpt-4",
         "messages": [
           {"role": "system", "content": "You are a helpful assistant."},
           {"role": "user", "content": "What is the capital of France?"}
         ]
       }
    
    • Respuesta:
       {
         "id": "chatcmpl-abc123",
         "object": "chat.completion",
         "created": 1689988888,
         "choices": [
           {
             "index": 0,
             "message": {
               "role": "assistant",
               "content": "The capital of France is Paris."
             },
             "finish_reason": "stop"
           }
         ],
         "usage": {
           "prompt_tokens": 13,
           "completion_tokens": 9,
           "total_tokens": 22
         }
       }
    

4. Análisis de Texto y Conversaciones

4.1 Generación de Respuestas

  • Descripción: Uso de la API para generar respuestas automáticas basadas en la entrada del usuario.
  • Ejemplo de Código:

     import { Controller, Post, Body } from '@nestjs/common';
     import { ChatGptService } from './chatgpt.service';
    
     @Controller('chat')
     export class ChatController {
       constructor(private readonly chatGptService: ChatGptService) {}
    
       @Post('message')
       async sendMessage(@Body('message') message: string) {
         const messages = [{ role: 'user', content: message }];
         const response = await this.chatGptService.sendMessage(messages);
         return response.choices[0].message.content;
       }
     }
    
  • Explicación:

    • ChatController: Define un endpoint POST para enviar mensajes a la API de ChatGPT.
    • sendMessage(): Recibe un mensaje de usuario y lo envía a la API, devolviendo la respuesta generada.

4.2 Manejo del Contexto en Conversaciones

  • Descripción: Mantener el contexto de una conversación mediante la gestión de un historial de mensajes.
  • Ejemplo de Código:

     let chatHistory = [
       { role: 'system', content: 'You are a helpful assistant.' },
     ];
    
     @Post('conversation')
     async continueConversation(@Body('message') message: string) {
       chatHistory.push({ role: 'user', content: message });
       const response = await this.chatGptService.sendMessage(chatHistory);
       chatHistory.push(response.choices[0].message);
       return response.choices[0].message.content;
     }
    
  • Explicación:

    • chatHistory: Un array que almacena el historial de la conversación.
    • continueConversation(): Añade el nuevo mensaje al historial, lo envía a la API y actualiza el historial con la respuesta.

5. Análisis de Sentimientos

5.1 Implementación de Detección de Sentimientos

  • Descripción: Utilizar la API para analizar el tono y los sentimientos en un texto dado.
  • Ejemplo de Código:

     @Post('sentiment')
     async analyzeSentiment(@Body('message') message: string) {
       const messages = [
         { role: 'system', content: 'You are an assistant specialized in sentiment analysis.' },
         { role: 'user', content: message },
       ];
       const response = await this.chatGptService.sendMessage(messages);
       return response.choices[0].message.content;
     }
    
  • Explicación:

    • analyzeSentiment(): Envia un texto a la API con el contexto de análisis de sentimientos y devuelve la interpretación.

6. Aplicación Práctica: Creación de una API REST Completa

6.1 Proyecto de Ejemplo: API RESTful

  • Descripción: Desarrollo de una API RESTful completa en NestJS que integra las funcionalidades de ChatGPT para generación de texto, manejo de conversaciones, y análisis de sentimientos.
  • Endpoints:
    • POST /chat/message: Genera una respuesta simple basada en el input del usuario.
    • POST /chat/conversation: Mantiene el contexto de la conversación para respuestas más complejas.
    • POST /chat/sentiment: Analiza el sentimiento del texto proporcionado.

6.2 Manejo de Errores y Validaciones

  • Descripción: Implementar validaciones y manejo de errores en la API para asegurar la robustez.
  • Ejemplo de Manejo de Errores:

     import { HttpException, HttpStatus } from '@nestjs/common';
    
     async sendMessage(messages: Array<{ role: string; content: string }>) {
       try {
         const response = await axios.post(this.apiUrl, {
           model: 'gpt-4',
           messages: messages,
         }, {
           headers: {
             Authorization: `Bearer ${this.apiKey}`,
             'Content-Type': 'application/json',
           },
         });
    
         return response.data;
       } catch (error) {
         throw new HttpException('Error comunicándose con la API de ChatGPT', HttpStatus.BAD_REQUEST);
       }
     }
    

7. Documentación y Mejores Prácticas

7.1 Documentación de la API

  • Descripción: Documentar la API utilizando Swagger y OpenAPI para facilitar la comprensión y uso por otros desarrolladores.
  • Implementación de Swagger:

     import { DocumentBuilder, SwaggerModule } from '@nestjs/swagger';
    
     const options = new DocumentBuilder()
       .setTitle('ChatGPT API')
       .setDescription('API de ejemplo integrando ChatGPT con NestJS')
       .setVersion('1.0')
       .build();
    
     const document = SwaggerModule.createDocument(app, options);
     SwaggerModule.setup('api', app, document);
    

8. Preguntas y Respuestas

9. Conclusión

🛠️ Recursos Adicionales

Heroku

Simplify your DevOps and maximize your time.

Since 2007, Heroku has been the go-to platform for developers as it monitors uptime, performance, and infrastructure concerns, allowing you to focus on writing code.

Learn More

Top comments (0)

Image of AssemblyAI

Automatic Speech Recognition with AssemblyAI

Experience near-human accuracy, low-latency performance, and advanced Speech AI capabilities with AssemblyAI's Speech-to-Text API. Sign up today and get $50 in API credit. No credit card required.

Try the API

👋 Kindness is contagious

Immerse yourself in a wealth of knowledge with this piece, supported by the inclusive DEV Community—every developer, no matter where they are in their journey, is invited to contribute to our collective wisdom.

A simple “thank you” goes a long way—express your gratitude below in the comments!

Gathering insights enriches our journey on DEV and fortifies our community ties. Did you find this article valuable? Taking a moment to thank the author can have a significant impact.

Okay