Advertencia
Debes instalar los siguientes paquetes: pnpm install openai fluent-ffmpeg ffmpeg-static
Multimodal
Esta documentación describe la configuración y ejecución de un flujo de trabajo (workflow) en la biblioteca vaincentflow. Se detalla la configuración de un proveedor de mensajes, el procesamiento de archivos multimedia, y la integración con modelos de lenguaje para procesamiento de voz e imágenes.
Importaciones de Dependencias
Este script importa varias librerías necesarias para la creación y configuración del flujo de trabajo:
- vaincentflow: Importa el enrutador global y el módulo de flujos de trabajo (
Workflow) para configurar la lógica del bot. - Utilidades de Transformación de Audio: Importa funciones auxiliares (
convertOpusToMp3,sendToOpenaiWhisper) para transformar archivos de audio y enviarlos a un modelo de lenguaje. - Proveedores de Mensajes: Importa el proveedor de
BaileysProvider, que conecta con WhatsApp para manejar la recepción y envío de mensajes. - OpenAI API: Importa funciones para interactuar con OpenAI, manejando archivos de imagen y procesamiento de texto.
- Node.js FS: Importa
fspara la manipulación de archivos locales.
import { EVENTS, GlobalRouter, Workflow } from "@elimeleth/vaincentflow";
import { convertOpusToMp3, sendToOpenaiWhisper } from "./utils/transformAudio";
import { BaileysProvider } from "@elimeleth/baileys";
import { get_guests_broadcast_list, send_msg_to_broadcast_list } from "./functions";
import OpenAI, { toFile } from "openai";
import fs from "node:fs";
import composing from "./utils/composing";
Configuración del Proveedor de Mensajes
Se crea una instancia de BaileysProvider para establecer un proveedor de mensajes de WhatsApp. Aquí, useBaileysStore y groupsIgnore están configurados para controlar el almacenamiento de mensajes y la interacción con grupos.
const provider = new BaileysProvider({
name: "mayito",
useBaileysStore: false,
groupsIgnore: true
});
Función Principal main()
La función main configura el flujo de trabajo y el enrutador global. A continuación se describe el flujo de trabajo y el enrutador global con sus configuraciones y acciones correspondientes.
1. Configuración de Workflow general
Se configura un flujo de trabajo llamado general, que responde a eventos como notas de voz y mensajes de imagen. A continuación se describen las acciones dentro del flujo de trabajo.
Acción 1: Procesamiento de Archivos Multimedia
- Descripción : Cuando se recibe un archivo de imagen, el bot envía un mensaje indicando que está procesando la imagen. Posteriormente, utiliza
assistant.files.create()para enviar el archivo al servicio de procesamiento de imágenes. - Almacenamiento : El ID del archivo procesado se almacena en
statepara su uso en acciones futuras.
.addAction(async (ctx, { state, send, extensions: { assistant } }) => {
if (EVENTS.MEDIA.test(ctx.body)) {
await send("Dame un momento para ver la imagen 👁️...");
const data = await assistant.files.create({
file: await toFile(fs.createReadStream(ctx.file_dir_path)),
purpose: "vision",
});
await state.update("file_id", data.id);
}
});
Acción 2: Procesamiento de Notas de Voz
- Descripción : Detecta notas de voz, las convierte a formato MP3 y luego envía el archivo convertido a OpenAI Whisper para transcripción.
- Almacenamiento : Guarda el texto transcrito en el estado.
.addAction(async (ctx, { state, send }) => {
if (EVENTS.VOICE_NOTE.test(ctx.body)) {
await send("Dame un momento para escuchar el audio 👂🏼...");
const path = await convertOpusToMp3(ctx.file_dir_path);
const audio = await sendToOpenaiWhisper(path);
await state.update("audio", audio);
}
});
Acción 3: Integración con OpenAI Assistant y Envío de Respuestas
- Descripción : Reúne los mensajes y archivos almacenados y los envía al modelo de lenguaje de OpenAI. Dependiendo del contenido, el bot determina si responder con texto o imagen.
- Manejo de Estado : Recupera y limpia los datos almacenados (
audioyfile_id), y segmenta la respuesta en partes para enviarlas al usuario.
.addAction(async (ctx, { end, send, state, extensions: { assistant } }) => {
const audio = await state.get<string>("audio");
const file_id = await state.get<string>("file_id");
// Código de manejo de mensajes y procesamiento en assistant...
file_id && await state.delete("file_id");
audio && await state.delete("audio");
});
2. Configuración de GlobalRouter
Finalmente, el enrutador global (GlobalRouter) se configura para manejar las conexiones con el proveedor de mensajes y el asistente de OpenAI. Los flujos de trabajo son añadidos y la escucha de mensajes comienza.