Manejo de Mensajes con Workflow y Delays
Esta guía explica cómo utilizar la clase Workflow de la librería @elimeleth/vct-flow para manejar mensajes, aplicar retrasos (wait) y procesar ráfagas de mensajes de forma eficiente.
Ejemplo 1: Retraso en el Envío de Mensajes
El siguiente código muestra cómo enviar un mensaje con un retraso de 5 segundos utilizando Workflow. Existen dos formas de lograrlo:
Forma Tradicional
import { Workflow } from "@elimeleth/vct-flow";
export default new Workflow("any")
.addAction({ wait: 5000 }, async (ctx, { send }) => {
await send("Me envié luego de 5 segundos");
});
Forma Simplificada
import { Workflow } from "@elimeleth/vct-flow";
export default new Workflow("any")
.addAction("Me envié luego de 5 segundos", { wait: 5000 });
Ambas implementaciones producen el mismo resultado, pero la segunda es más concisa y legible. La propiedad { wait: 5000 } asegura un retraso de 5000 ms (5 segundos) antes de enviar el mensaje.
Ejemplo 2: Procesamiento de Ráfagas de Mensajes
Cuando se necesitan agrupar y procesar múltiples mensajes, podemos usar un Workflow para combinarlos de manera eficiente.
Código de Ejemplo
import { Workflow } from "@elimeleth/vct-flow";
export default new Workflow("any")
.addAction({ wait: 5000 }, async (ctx, { send }) => {
/*
Filtramos los mensajes de tipo evento para evitar procesar mensajes irrelevantes.
Luego, añadimos el nuevo mensaje recibido (`ctx.body`) al conjunto de mensajes previos.
Usamos un `Set` para eliminar duplicados antes de combinar los mensajes en un solo string.
*/
let combinedMessage: string | string[] = ctx.messages.filter(e => !e.includes("_event"));
combinedMessage.push(ctx?.body);
combinedMessage = [...new Set(combinedMessage)].join(" ");
await send(`Estos son todos los mensajes:\n\n${combinedMessage}`);
});
Explicación del Flujo
-
Filtrado de Eventos :
-
Se eliminan los mensajes que contienen
"_event", ya que no son relevantes para el usuario. -
Esto es útil en flujos configurados para escuchar todos los mensajes con el tipo
"any". -
Combinación de Mensajes :
-
El nuevo mensaje recibido (
ctx.body) se agrega a la lista de mensajes existentes (ctx.messages). -
Se utiliza un
Setpara eliminar duplicados, asegurando que cada mensaje aparezca solo una vez. -
Retraso Antes del Envío :
-
El mensaje combinado se envía después de un retraso de 5 segundos, gracias a la opción
{ wait: 5000 }. -
Integración con Layers :
-
Las capas (
layers) como las de OpenAI o Claude en la librería@elimeleth/vct-layersrealizan automáticamente este filtrado y combinación de mensajes, simplificando el manejo en flujos más complejos.
Salida Esperada
Si el usuario envía múltiples mensajes dentro de un flujo configurado con este código, recibirá una respuesta que combina todos los mensajes en una sola cadena, por ejemplo:
Entrada del Usuario:
- "Hola"
- "¿Cómo estás?"
- "¿Puedes ayudarme?"
Respuesta del Sistema (tras 5 segundos):
Estos son todos los mensajes:
Hola ¿Cómo estás? ¿Puedes ayudarme?
Ventajas de Este Enfoque
- Eficiencia : Elimina duplicados y eventos irrelevantes para mantener la respuesta limpia.
- Flexibilidad : Permite configurar delays y manejar múltiples mensajes de forma dinámica.
- Compatibilidad con Layers : Al usar capas como las de OpenAI, muchas tareas como la combinación y filtrado de mensajes ya están preconfiguradas, reduciendo la complejidad del código.