Saltar a contenido

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 fs para 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 state para 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 (audio y file_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.

new GlobalRouter({
    provider,
    restorePreviousCheckpoint: false,
    openai_assistant: {
        functions: []
    }
})
.addFlows([general])
.listen();