Bots

La sección Bots del portal es donde puedes gestionar, editar y ejecutar todos tus bots personalizados ya cargados en la plataforma. Es el centro de control principal para la administración de bots existentes.

Vista Principal de Bots

La interfaz principal muestra todos tus bots personalizados organizados en una lista:

Lista principal de bots personalizados

En la vista principal puedes ver:

  • Nombre del bot, su entidad y su categoría

  • Última ejecución: fecha de inicio de la corrida más reciente

  • Próxima ejecución: próximo disparo real calculado entre todas las tareas de Calendario que usan ese bot

  • Indicador de ejecución: un ícono animado marca los bots que están corriendo en este momento, y el estado se actualiza en vivo sin recargar la página

  • Botones de acción para gestionar cada bot: Ejecutar, Editar Bot, Descargar Bot, Calendario (ver sus tareas programadas) y Eliminar Bot

Mientras un bot está corriendo, su botón de ejecutar se transforma en Cancelar ejecución, que detiene la corrida en curso. La cancelación solo es posible una vez que el agente reportó el inicio del proceso.

Fila de un bot en ejecución con el indicador activo y la acción de cancelar

Ejecuciones de cada bot: al expandir una fila se muestra una tabla con las últimas ejecuciones de ese bot (ID, usuario, agente, inicio, fin, estado, indicadores de calendarizado, reintento y cadena). Las corridas en estado Pendiente o Procesando tienen la acción Forzar cierre, pensada para ejecuciones que quedaron colgadas: tras confirmar, la ejecución se cierra y el bot queda libre para nuevas corridas. El detalle de cada corrida se puede ver también en Ejecuciones.

Fila expandida de un bot con su tabla de últimas ejecuciones

Detalle operativo sin salir del listado: al hacer clic en una fila (o en la acción Ver detalle operativo del menú) se abre un panel lateral con la información del bot, sin necesidad de entrar al formulario de edición. El panel muestra:

Panel lateral de detalle operativo de un bot
  • Última ejecución: duración, agente, estado y acceso a Ver logs (o «No posee ejecución» si nunca corrió)

  • Proceso y Responsable asignados

  • Crítico: sí/no

  • Bots previos y Bots posteriores declarados en la información extendida

  • Contingencia, Comentario y Archivos utilizados

Los campos sin datos cargados se muestran como «No posee…». El panel no es modal: se cierra con la X, la tecla Escape o un clic fuera, y al hacer clic en otra fila se actualiza con ese bot sin cerrarse.

Detalles del Bot

Al hacer clic en un bot específico, puedes ver sus detalles completos:

Vista detallada de un bot individual

La vista de detalles incluye:

  • Información general del bot: Nombre del Bot, Entidad, Categoría y Descripción

  • Archivo del bot: el .zip que contiene el código (con botón Seleccionar archivo para reemplazarlo)

  • Archivo: el script principal dentro del ZIP que actúa como punto de entrada

  • Modo de ejecución: Primer plano o Segundo plano

  • Parámetros: tabla de argumentos configurables del bot (ver Configuración de Parámetros)

  • Información extendida: datos operativos y dependencias entre bots (ver Información extendida del bot)

  • Sistema de notificaciones: activa alertas por correo para ese bot; al habilitarlo se elige el estatus que dispara el aviso (Error, Finalizado o Procesando) y los usuarios que lo reciben

Configuración de Parámetros

Los bots pueden tener parámetros personalizados que se envían como argumentos:

Configuración de parámetros del bot

Sistema de parámetros dinámicos

Los parámetros se configuran una vez y luego pueden modificarse en cada ejecución. Se envían al script Python con el formato –argumento valor.

Tipos de parámetros soportados

  • Texto: Para nombres, rutas, descripciones

  • Número: Para cantidades, límites, porcentajes

  • Booleano: Para activar/desactivar funcionalidades

  • Lista: Para múltiples valores del mismo tipo

  • Archivo: Para especificar rutas de archivos

Ejemplo de configuración

Parámetros Configurados
├── archivo_entrada (Texto, Obligatorio)
├── limite_registros (Número, Opcional: 1000)
├── formato_salida (Lista: CSV, JSON, XLSX)
├── debug_mode (Booleano, Opcional: False)
└── fecha_corte (Texto, Opcional)

Información extendida del bot

Al crear o editar un bot, la sección Información extendida permite cargar datos operativos y dependencias entre bots. Todos los campos son opcionales:

Sección información extendida del formulario de bot
  • Proceso: proceso de negocio al que pertenece el bot

  • Responsable: usuario responsable del bot

  • Crítico: marca el bot como crítico para la operación

  • Archivos utilizados: archivos o rutas que el bot usa durante su ejecución

  • Bots previos requeridos: bots que deben haber corrido antes (informativo, para documentar dependencias)

  • Bots posteriores: bots que suelen correr después (informativo; un bot no puede referenciarse a sí mismo)

  • Contingencia: qué hacer si el bot falla

  • Comentarios: notas libres sobre el bot

  • Estatus de bot: estado operativo del bot

Estos campos son descriptivos: no cambian cómo se ejecuta el bot, pero permiten documentar la operativa y navegar las dependencias entre bots.

Ejecución de Bots

Cuando ejecutas un bot, se muestra la interfaz de configuración de parámetros:

Interfaz de ejecución con parámetros configurables

Proceso de ejecución

  1. Selecciona el bot a ejecutar

  2. Configura parámetros según las necesidades de esta ejecución específica

  3. Elige el agente donde se ejecutará (si hay múltiples disponibles)

  4. Confirma la ejecución

Los parámetros configurados se envían al script Python como:

python script_principal.py --archivo_entrada "datos.xlsx" --limite_registros 1000 --formato_salida "CSV" --debug_mode True

Monitoreo en Tiempo Real

Durante la ejecución, puedes monitorear el progreso en tiempo real:

Monitor de ejecución en tiempo real

Información en tiempo real:

  • Indicador de ejecución en la fila del bot mientras está corriendo

  • Estados en vivo en la tabla de ejecuciones expandida (Procesando, Pendiente, Cancelando…) que se actualizan sin recargar

  • Forzar cierre disponible en corridas Pendiente o Procesando que quedaron colgadas

  • Al terminar, el log completo queda disponible para consulta y descarga desde Ejecuciones

Los logs guardan cada print() del script con su timestamp, y se revisan desde el historial de Ejecuciones (vista previa del final del log o descarga del archivo completo).

Historial y Logs Completos

Al finalizar la ejecución, puedes revisar los logs completos:

Historial completo de logs y resultados

En la tabla de ejecuciones de cada bot (fila expandida) la acción de lupa abre el Output del log: una vista previa con el final del log de esa corrida y un botón de descarga.

  • La vista previa muestra solo los últimos caracteres del log; para verlo completo se descarga el archivo .log.

  • El detalle completo de cada corrida (origen, parámetros utilizados, cadena, tiempos) se consulta en Ejecuciones.

  • Los logs se conservan por un tiempo limitado según la política de retención del historial.

Ejemplo de Bot Básico

Estructura del archivo ZIP a cargar:

mi_bot_procesador.zip
│
├── main.py              # ← Script principal configurado en Unimate
├── requirements.txt     # Dependencias necesarias
├── config.json         # Configuración opcional
├── modules/            # Módulos auxiliares
│   ├── __init__.py
│   ├── procesador.py
│   └── utils.py
└── README.md           # Documentación

Ejemplo de main.py con parámetros y logs:

import argparse
import sys
import json
import pandas as pd
from modules.procesador import procesar_datos
from modules.utils import validar_archivo

def main():
    # Configurar argumentos (los que se configuran en Unimate)
    parser = argparse.ArgumentParser(description='Bot Procesador de Datos')

    # Parámetros obligatorios
    parser.add_argument('--archivo_entrada',
                       type=str,
                       required=True,
                       help='Ruta del archivo Excel a procesar')

    # Parámetros opcionales con valores por defecto
    parser.add_argument('--limite_registros',
                       type=int,
                       default=1000,
                       help='Cantidad máxima de registros a procesar')

    parser.add_argument('--formato_salida',
                       type=str,
                       default='CSV',
                       choices=['CSV', 'JSON', 'XLSX'],
                       help='Formato del archivo de salida')

    parser.add_argument('--debug_mode',
                       action='store_true',
                       help='Activar modo debug')

    parser.add_argument('--fecha_corte',
                       type=str,
                       help='Fecha de corte en formato YYYY-MM-DD')

    args = parser.parse_args()

    # Logs iniciales (aparecen en tiempo real en Unimate)
    print("Bot Procesador de Datos iniciado")
    print(f"Archivo de entrada: {args.archivo_entrada}")
    print(f"Límite de registros: {args.limite_registros}")
    print(f"Formato de salida: {args.formato_salida}")

    if args.debug_mode:
        print("Modo DEBUG activado")

    try:
        # Validar archivo de entrada
        print("Validando archivo de entrada...")
        if not validar_archivo(args.archivo_entrada):
            print("ERROR: Archivo no válido o no encontrado")
            sys.exit(1)

        # Cargar datos
        print("Cargando datos...")
        df = pd.read_excel(args.archivo_entrada)
        total_registros = len(df)
        print(f"Cargados {total_registros} registros")

        # Aplicar límite si es necesario
        if total_registros > args.limite_registros:
            df = df.head(args.limite_registros)
            print(f" Aplicando límite: procesando {args.limite_registros} de {total_registros}")

        # Filtrar por fecha si se especifica
        if args.fecha_corte:
            print(f"Aplicando filtro de fecha: {args.fecha_corte}")
            # Lógica de filtrado aquí

        # Procesar datos
        print("Iniciando procesamiento...")
        resultado = procesar_datos(df, debug=args.debug_mode)

        # Progreso cada 10% (opcional)
        for i in range(0, len(df), len(df)//10):
            porcentaje = int((i/len(df)) * 100)
            print(f"Progreso: {porcentaje}%")

        print("Guardando resultado...")

        # Generar archivo de salida según formato
        nombre_salida = f"resultado_{args.formato_salida.lower()}"

        if args.formato_salida == 'CSV':
            resultado.to_csv(f"{nombre_salida}.csv", index=False)
        elif args.formato_salida == 'JSON':
            resultado.to_json(f"{nombre_salida}.json", orient='records')
        elif args.formato_salida == 'XLSX':
            resultado.to_excel(f"{nombre_salida}.xlsx", index=False)

        print(f"Proceso completado exitosamente")
        print(f"Archivo generado: {nombre_salida}.{args.formato_salida.lower()}")
        print(f"Total de registros procesados: {len(resultado)}")

    except Exception as e:
        print(f" ERROR durante el procesamiento: {str(e)}")
        if args.debug_mode:
            import traceback
            print("Traceback completo:")
            traceback.print_exc()
        sys.exit(1)

if __name__ == "__main__":
    main()

requirements.txt del ejemplo:

pandas>=1.3.0
openpyxl>=3.0.9
argparse

Cómo funciona Unimate

  1. Cargas el ZIP a través de «Nuevo Bot»

  2. Especificas main.py como script principal

  3. Configuras parámetros en la interfaz web: - archivo_entrada (obligatorio, tipo texto) - limite_registros (opcional, tipo número, valor por defecto: 1000) - formato_salida (opcional, lista de opciones: CSV, JSON, XLSX) - debug_mode (opcional, tipo booleano) - fecha_corte (opcional, tipo texto)

  4. Al ejecutar, Unimate llama:

python main.py --archivo_entrada "datos.xlsx" --limite_registros 500 --formato_salida "JSON" --debug_mode
  1. Los `print()` del script se guardan en el log al cual se podrá acceder desde Ejecuciones

  2. Los archivos generados se pueden descargar desde la interfaz

  3. Los logs completos quedan guardados para consultas posteriores

Estados

  • Finalizado: El bot se ejecutó exitosamente y generó un log completo con los prints y mensajes de consola de Python.

  • Procesando: El bot se está ejecutando actualmente; su estado se actualiza en vivo en el listado.

  • Pendiente / Cancelando / Cancelado / Omitida: estados de cola y cancelación gestionados por el calendario y las políticas de instancias (ver Ejecuciones).

  • Con errores: El bot terminó con errores y el log contiene mensajes de error y traceback obtenido de la consola.

Mejores Prácticas para Bots

Estructura de Código

  • Usa argparse para manejar parámetros

  • Incluye print() informativos para el monitoreo, no necesitas usar librerias especificas de logs.

  • Maneja excepciones apropiadamente

  • Valida parámetros de entrada

  • Incluye requirements.txt completo

Logging Efectivo

  • Incluye timestamps si es necesario

  • Reporta progreso en procesos largos

  • Diferencia entre información, warnings y errores

  • Incluye detalles de archivos generados

Rendimiento

  • Valida datos antes de procesamiento pesado

  • Usa límites configurables para datasets grandes

  • Limpia recursos (archivos temporales, conexiones)

  • Optimiza operaciones repetitivas

  • Maneja memoria eficientemente para archivos grandes