Cómo guardar logs de mensajes de watsonx Assistant utilizando Webhooks
En los proyectos donde utilizamos watsonx Assistant como asistente conversacional, es crucial contar con un mecanismo para registrar los mensajes intercambiados entre los usuarios y el asistente. Esto permite analizar conversaciones, mejorar respuestas y auditar interacciones. Una forma eficiente de lograrlo es mediante el uso de webhooks, los cuales pueden extender la funcionalidad del asistente y conectarlo con sistemas externos.
En este artículo, explicaré cómo crear un microservicio para guardar logs de los mensajes enviados al asistente utilizando el tipo de webhook Log
. Este microservicio almacenará los datos en una base de datos MongoDB y estará listo para integrarse con watsonx Assistant.
¿Qué son los webhooks en watsonx Assistant?
Un webhook es un mecanismo que permite realizar llamadas desde el asistente hacia un servicio externo durante una conversación. El webhook de tipo Log
es particularmente útil para registrar cada mensaje y respuesta generados en el asistente, sin necesidad de condiciones adicionales.
El flujo típico de un webhook Log
es el siguiente:
- El usuario envía un mensaje al asistente.
- El asistente procesa el mensaje y genera una respuesta.
- El webhook se activa, enviando el mensaje y su respuesta al microservicio configurado.
- El microservicio almacena la información, permitiendo su análisis posterior.
Creando el microservicio para guardar logs
El siguiente código muestra un ejemplo de microservicio desarrollado con FastAPI. Este microservicio se encarga de recibir los mensajes del webhook Log
, validarlos y almacenarlos en una base de datos MongoDB.
Para implementar el microservicio que registra los logs de mensajes del asistente, debemos seguir los siguientes pasos:
Paso 1: Crear el ambiente virtual
Ejecuta los siguientes comandos en tu terminal:
python -m venv venvsource venv/bin/activate
Paso 2: Crear el archivo requirements.txt
Este archivo contendrá las dependencias del proyecto. Crea un archivo llamado requirements.txt
con el siguiente contenido:
fastapi[standard]pymongopydantic-settings
Paso 3: Instalar las dependencias
Ejecuta el siguiente comando para instalar las librerías necesarias:
pip install -r requirements.txt
Con esto, el ambiente virtual estará configurado y las dependencias listas para usar.
Paso 4: Crear el archivo de configuración
Es necesario configurar las credenciales y parámetros de conexión a MongoDB. Para esto, crearemos un archivo llamado config.py
con el siguiente contenido:
from pydantic_settings import BaseSettings
class Settings(BaseSettings): mongo_username: str mongo_password: str mongo_host: str mongo_db: str mongo_auth_source: str mongo_replica_set: str mongo_tls: bool mongo_tls_ca_file: str
class Config: env_file = ".env"
settings = Settings()
Además, debemos crear un archivo .env
en el mismo directorio con las variables de entorno necesarias, como este ejemplo:
mongo_username=tu_usuariomongo_password=tu_contraseñamongo_host=tu_hostmongo_db=tu_base_de_datosmongo_auth_source=adminmongo_replica_set=tu_replicamongo_tls=Truemongo_tls_ca_file=/path/to/ca.pem
Esto permitirá cargar la configuración de manera centralizada y segura.
Paso 5: Crear los modelos de datos
Ahora definiremos los modelos necesarios para validar y estructurar los datos recibidos del webhook. Crea un archivo llamado models.py
con el siguiente contenido:
from pydantic import BaseModel, Fieldfrom typing import Dict, Any, Optional
class Event(BaseModel): name: str
class PayloadResponse(BaseModel): output: Dict[str, Any] internal: Dict[str, Any] user_id: str context: Dict[str, Any]
class Payload(BaseModel): log_id: str request: Dict[str, Any] response: PayloadResponse assistant_id: str request_timestamp: str response_timestamp: str language: str skill_id: str user_id: str environment: str channel: str customer_id: str
class LogMessage(BaseModel): event: Optional[Event] payload: Optional[Payload]
Estos modelos permiten estructurar los datos enviados por watsonx Assistant, garantizando que sean válidos y estén completos antes de ser procesados.
Paso 6: Implementar el microservicio
Con la configuración y los modelos listos, podemos implementar el microservicio. Este se encargará de recibir los logs, validarlos y almacenarlos en MongoDB. Aquí está el código completo del microservicio en main.py
:
from fastapi import FastAPI, HTTPException, statusfrom pymongo import MongoClientfrom pymongo.errors import PyMongoErrorfrom .models import LogMessagefrom .config import settingsfrom datetime import datetime
app = FastAPI()
connection_string = f"mongodb://{settings.mongo_username}:{settings.mongo_password}@{settings.mongo_host}/{settings.mongo_db}?authSource={settings.mongo_auth_source}&replicaSet={settings.mongo_replica_set}"
tls_options = { 'tls': settings.mongo_tls, 'tlsCAFile': settings.mongo_tls_ca_file}
client = MongoClient(connection_string, **tls_options)client.admin.command('ping')
db = client["logs"]
@app.post("/logs/message")async def create_log(log: LogMessage): collection = db["messages"]
if not log.event.name == "message_logged": raise HTTPException( status_code=status.HTTP_400_BAD_REQUEST, detail="El evento enviado no es del tipo message_logged." )
log_dict = log.payload.model_dump() log_dict["received_at"] = datetime.utcnow()
collection.insert_one(log_dict)
return { "status": "success" } except PyMongoError as e: raise HTTPException( status_code=500, detail=f"Error al insertar el log: {str(e)}" ) except Exception as e: raise HTTPException( status_code=500, detail=f"Error inesperado al procesar el log: {str(e)}" )
Integrando el microservicio con Watsonx Assistant
Una vez que el microservicio está configurado y ejecutándose, el siguiente paso es integrarlo con watsonx Assistant mediante el uso de webhooks. Aquí te explico cómo hacerlo paso a paso:
Conclusión
Utilizar webhooks de tipo Log es una excelente estrategia para centralizar y analizar las interacciones entre usuarios y el asistente. Con este enfoque, podrás almacenar de manera segura y eficiente todos los mensajes en una base de datos, habilitando capacidades avanzadas como análisis de datos, auditorías o visualización de métricas.