Saltar a contenido

Manejo de Mensajes y Respuestas con OpenAI Assistant

Este documento detalla el manejo de mensajes y respuestas mediante el uso de OpenAI Assistant. El código presentado permite procesar diferentes tipos de mensajes (texto, audio, e imágenes) y gestionar respuestas fragmentadas dentro del contexto de un asistente. Además, incorpora un AbortController para manejar interrupciones y garantizar un control efectivo del flujo de ejecución.


Código de Implementación

El siguiente bloque de código ilustra cómo configurar y gestionar una acción personalizada con OpenAI Assistant:

import { Workflow } from "@elimeleth/vct-flow"
import { Assistant } from "@elimeleth/vct-layers"

export default new Workflow("any")
.addAction(async (ctx, methods) => {
    return Assistant.layer({
        invoke_params: {
            extra: {
                additional_instructions: `
                Estas son metadata de la información del cliente con quien interactúas:
                Nombre: ${ctx?.name || "Nombre no asignado aún"}
                Teléfono: ${ctx.from}
                `,
                truncation_strategy: {
                    type: "last_messages",
                    last_messages: 20 // Limita el historial a los últimos 20 mensajes
                }
            }
        },
        functions: {
            send: async (answer, save_metadata) => {
                // Procesa y envía la respuesta al cliente
                let chunks = answer.output.split("\n\n").filter(a => Boolean(a)); // Divide la respuesta en fragmentos
                let body = [...new Set(chunks)] as string[]; // Elimina duplicados

                await methods.send([{
                    body: body,
                    save_metadata
                }]);
            }
        }
    })(ctx, methods);
});

Explicación del Flujo y Funcionalidad

1. Configuración de Parámetros

  • Se define un bloque de instrucciones adicionales que personaliza la interacción del asistente con el cliente.
  • Se utiliza una estrategia de truncamiento (truncation_strategy) para limitar el historial de mensajes a los últimos 20, optimizando el contexto proporcionado al modelo.

2. Función send

  • Propósito : Procesar la respuesta generada por el asistente y enviarla al cliente.
  • Pasos :
  • Divide la respuesta en fragmentos (chunks) usando saltos de línea dobles (\n\n).
  • Filtra los fragmentos vacíos y elimina duplicados para evitar redundancias.
  • Envía los fragmentos procesados como un array al cliente.

3. Gestión del Contexto (ctx)

  • Nombre del Cliente : Si está disponible, se extrae del contexto; de lo contrario, se establece un valor predeterminado ("Nombre no asignado aún").
  • Teléfono del Cliente : Se extrae directamente del campo ctx.from.

4. Truncamiento del Historial

  • Permite limitar la cantidad de mensajes enviados al modelo para mantener un enfoque en las interacciones más recientes, lo que mejora el rendimiento y el costo.

Beneficios de la Implementación

  1. Personalización Dinámica Cada interacción incluye metadatos específicos del cliente, como su nombre y teléfono, para proporcionar un contexto enriquecido.
  2. Optimización del Historial El uso de estrategias de truncamiento garantiza que el modelo trabaje con información relevante y reciente, reduciendo el consumo de recursos.
  3. Manejo de Respuestas Fragmentadas Las respuestas largas se dividen en fragmentos únicos, eliminando redundancias antes de ser enviadas al cliente.
  4. Preparado para Diferentes Tipos de Mensajes La arquitectura está diseñada para manejar texto, audio e imágenes, lo que la hace versátil y adaptable a múltiples escenarios.

Manejo de Errores

El código asegura un manejo robusto de errores mediante:

  • Validaciones del Contexto (ctx) : Se verifica que los datos críticos estén disponibles antes de procesar la respuesta.
  • Registro de Errores : Todos los errores se registran en la consola para facilitar el diagnóstico.

Consideraciones Finales

  • Modularidad : La función send puede extenderse para soportar otros formatos de respuesta o integrarse con otros canales.
  • Monitoreo : Es importante agregar herramientas de monitoreo para evaluar la calidad de las respuestas y optimizar el flujo.
  • Pruebas Exhaustivas : Antes de implementar en producción, prueba la configuración con diferentes volúmenes de datos y escenarios para asegurar un desempeño estable.