En esta guía, te guiaremos a través del proceso de construcción de un chatbot para WhatsApp utilizando el modelo de lenguaje OpenAI detrás de ChatGPT. Vamos a crear un bot que genere respuestas a los mensajes de WhatApp de forma automática.

Recuerda que si deseas aprender algunas cosas más tenemos curso.

Paso 1: Configuración de un proyecto Node.js e instalación de dependencias


Empecemos por crear un nuevo proyecto Node.js. Introduce los siguientes comandos:

$ mkdir whatsapp-bot
$ cd whatsapp-bot
$ npm init -y

Si quieres aprender más recuerda visitar el siguiente video

Puedes checar la documentación de este video aquí.

A continuación, vamos a instalar las dependencias necesarias. En primer lugar necesitamos instalar el paquete whatsapp-web.js:

$ npm install whatsapp-web.js

Whatsapp-web.js es una librería cliente Node.js que se conecta a través de la aplicación de navegador WhatsApp Web.

Además necesitamos instalar el paquete npm qrcode-terminal usando el siguiente comando:

$ npm install qrcode-terminal

También es necesario instalar el paquete npm openai:

$ npm install openai

Si tu quieres ampliar tus conocimientos recuerda que puedes adquirir el curso en códigoencasa.com

La librería OpenAI Node.js proporciona un cómodo acceso a la API OpenAI desde aplicaciones Node.js. En los siguientes pasos haremos uso de esta biblioteca para implementar nuestra aplicación de chatbot de WhatsApp.

Además necesitamos instalar el paquete dotenv:

$ npm install dotenv --save

Paso 2: Crear Variable de Entorno para la Clave API


Para comenzar con la implementación cree un nuevo archivo llamado index.js y un nuevo archivo .env en la carpeta del proyecto:

$ touch index.js .env

Abre el archivo .env en un editor de texto e inserte la siguiente variable de entorno que contiene la clave API de su cuenta OpenAI:

OPENAI_API_KEY="INSERT YOUR OPENAI API KEY HERE"

Paso 3: Obtener la clave de la API de OpenAI


Para obtener una clave de la API de OpenAI, deberá registrarse para obtener una cuenta gratuita de OpenAI en el sitio web de OpenAI

Para crear una cuenta, haga clic en el botón "Registrarte" en la esquina superior derecha de la página de inicio y siga las instrucciones para crear una nueva cuenta. Una vez que haya creado una cuenta, puede obtener una clave API visitando la sección "API" de la configuración de su cuenta.

En la sección "API", encontrará un botón llamado "Generar clave API". Haz clic en este botón para generar una nueva clave de API, que podrás utilizar para realizar solicitudes a la API de OpenAI desde tu aplicación Node.js. Asegúrate de mantener tu clave API segura y no la compartas con nadie más.

Paso 4: Inicializar whatsapp-web.js Y Escuchar Mensajes


Abramos index.js y comencemos a implementar el chatbot de WhatApp insertando la siguiente sentencia require en la parte superior del archivo:

const { Client } = require('whatsapp-web.js');
const qrcode = require('qrcode-terminal');
const { Configuration, OpenAIApi } = require("openai");
require('dotenv').config()

A continuación, vamos a crear una instancia de Cliente que nos da acceso a la funcionalidad de whatsapp-web.js.

const client = new Client();

A continuación, registraremos las funciones de control de eventos para los eventos qr y ready y nos aseguraremos de que el cliente WhatApp se inicializa correctamente:

client.on('qr', (qr) => {
    qrcode.generate(qr, {small: true});
});

client.on('ready', () => {
    console.log('Client is ready!');
});

client.initialize();

En el manejador de eventos para el evento qr estamos utilizando el método qrcode.generate para enviar el código QR de WhatApp a la línea de comandos. Este código QR debe utilizarse para autenticarse a través de su aplicación móvil WhatApp.

Paso 5: Inicializar y configurar OpenAI


Ahora estamos listos para crear una nueva configuración OpenAI inicializando un objeto Configuration y pasando un objeto al constructor que contiene la propiedad apiKey. El valor que necesita ser asignado a apiKey es la clave de la API OpenAI que podemos leer desde el archivo .envusando process.env.OPENAI_API_KEY.

const configuration = new Configuration({
  apiKey: process.env.OPENAI_API_KEY,
});
const openai = new OpenAIApi(configuration);

Paso 6: Implementar la función runCompletion


A continuación vamos a implementar una función asíncrona runCompletion`:

async function runCompletion (message) {
    const completion = await openai.createCompletion({
        model: "text-davinci-003",
        prompt: message,
        max_tokens: 200,
    });
    return completion.data.choices[0].text;
}

Dentro de esta función estamos usando el método openai.createCompletion para crear una compleción OpenAI.

Un OpenAI Completion es un tipo de modelo de lenguaje que puede generar texto basado en un prompt proporcionado por el usuario. Para especificar nuestra compleción necesitamos pasar un objeto de configuración.

Este objeto de configuración contiene dos propiedades: model y prompt. La propiedad model se utiliza para especificar el modelo de lenguaje OpenAI que debe ser utilizado para generar una respuesta para el texto que estamos asignando a la propiedad prompt.

El modelo de lenguaje text-davinci-003 que se utiliza aquí es el mismo modelo de lenguaje que se utiliza en segundo plano por ChatGPT.

Paso 7: Generar una finalización y responder a los mensajes


A continuación tenemos que escuchar los mensajes entrantes de WhatsApp. Si el mensaje empieza por # estamos activando nuestra función bot. Esto significa que estamos pasando el mensaje (después del signo #) a la función runCompletion y devolviendo el resultado que recibimos de OpenAI:

client.on('message', message => {
    console.log(message.body);

    if(message.body.startsWith("#")) {
        runCompletion(message.body.substring(1)).then(result => message.reply(result));
    }
});

Paso 8: Completar Código y Ejecutar el Bot


A continuación puedes ver de nuevo el código fuente completo del archivo index.js de nuevo:

const { Client } = require('whatsapp-web.js');
const qrcode = require('qrcode-terminal');
const { Configuration, OpenAIApi } = require("openai");
require('dotenv').config()

const client = new Client();

client.on('qr', (qr) => {
    qrcode.generate(qr, {small: true});
});

client.on('ready', () => {
    console.log('Client is ready!');
});

client.initialize();

const configuration = new Configuration({
    apiKey: process.env.OPENAI_API_KEY,
});
const openai = new OpenAIApi(configuration);

client.on('message', message => {
    console.log(message.body);

    if(message.body.startsWith("#")) {
        runCompletion(message.body.substring(1)).then(result => message.reply(result));
    }
});

async function runCompletion (message) {
    const completion = await openai.createCompletion({
        model: "text-davinci-003",
        prompt: message,
        max_tokens: 200,
    });
    return completion.data.choices[0].text;
}

Para ejecutar el programa es necesario introducir el siguiente comando en la línea de comandos:

$ node index.js

La salida en la línea de comandos debería mostrar el código QR correctamente

El código QR puede utilizarse para autenticarse a través de la aplicación móvil de WhatsApp. Después de haber escaneado el código QR debería ver el siguiente mensaje

Ahora el Chatbot está en marcha y listo para recibir mensajes. Utiliza el signo # y escribe la pregunta como mensaje en WhatsApp. A continuación, OpenAI genera la respuesta y la recibe como respuesta al mensaje original de forma automática

Ya está. OpenAI y WhatsApp están perfectamente integrados. El bot de chat de WhatsApp ya está en marcha y responde automáticamente a través de las respuestas de los mensajes de WhatsApp.

Fuente