refactor: Migrate bot core and modules from talia_bot to bot directory, update start_bot.sh and Dockerfile, and modify README.md.

This commit is contained in:
Marco Gallegos
2025-12-21 18:00:31 -06:00
parent 6e1a2f0102
commit 13141d6ed3
38 changed files with 112 additions and 86 deletions

View File

@@ -8,8 +8,8 @@ WORKDIR /talia_bot
COPY requirements.txt .
RUN pip install -r requirements.txt
# Copy app code
COPY talia_bot/ .
# Copy the package contents
COPY bot bot
# Run the bot
CMD ["python", "main.py"]
# Run the bot via the package entrypoint
CMD ["python", "-m", "bot.main"]

View File

@@ -8,11 +8,11 @@ Talia es un **Middleware de Inteligencia Artificial** diseñado para orquestar o
El bot opera como un agente que sigue un ciclo de **Recepción -> Identificación -> Enrutamiento -> Ejecución**.
1. **Recepción de Mensajes**: `main.py` actúa como el punto de entrada que recibe todos los inputs (texto, botones, comandos, documentos) desde Telegram.
1. **Recepción de Mensajes**: `bot/main.py` actúa como el punto de entrada que recibe todos los inputs (texto, botones, comandos, documentos) desde Telegram.
2. **Identificación de Usuario**: Al recibir un mensaje, el módulo `identity.py` consulta la base de datos (`users.db`) para obtener el rol del usuario (`admin`, `crew`, `client`).
3. **Enrutamiento de Acciones**:
* **Si el usuario está en una conversación activa**, el `flow_engine.py` toma el control y procesa la respuesta según la definición del flujo JSON correspondiente.
* **Si el usuario no está en una conversación**, el sistema le muestra un menú de botones. Estos menús se generan dinámicamente a partir de los archivos de flujo en `talia_bot/data/flows/` que tienen una clave `"trigger_button"`.
* **Si el usuario no está en una conversación**, el sistema le muestra un menú de botones. Estos menús se generan dinámicamente a partir de los archivos de flujo en `bot/data/flows/` que tienen una clave `"trigger_button"`.
4. **Ejecución de Módulos**: Dependiendo de la acción, se invocan módulos específicos para interactuar con APIs externas:
* `sales_rag.py` para generar respuestas de ventas con IA.
* `printer.py` para enviar correos de impresión.
@@ -116,9 +116,9 @@ GOOGLE_SERVICE_ACCOUNT_FILE=./google_key.json
* **Base de Datos**: La base de datos `users.db` se creará automáticamente si no existe. Para asignar roles, debes agregar manualmente los Telegram IDs en la tabla `users`.
* **Credenciales de Google**: Coloca tu archivo de credenciales de la cuenta de servicio de Google Cloud en el directorio raíz del proyecto y renómbralo a `google_key.json`. **El archivo `.gitignore` ya está configurado para ignorar este archivo y proteger tus claves.**
* **Flujos de Conversación**: Para modificar o añadir flujos, edita los archivos JSON en `talia_bot/data/flows/`.
* **Flujos de Conversación**: Para modificar o añadir flujos, edita los archivos JSON en `bot/data/flows/`.
Asegúrate de tener los archivos y directorios base en `talia_bot/data/`:
Asegúrate de tener los archivos y directorios base en `bot/data/`:
* `servicios.json`: Catálogo de servicios para el RAG de ventas.
* `credentials.json`: Credenciales de Google Cloud.
* `users.db`: Base de datos SQLite que almacena los roles de los usuarios.
@@ -136,28 +136,37 @@ talia_bot/
├── Dockerfile # Define el contenedor de la aplicación
├── docker-compose.yml # Orquesta el servicio del bot
├── google_key.json # (Local) Credenciales de Google Cloud
├── plan_de_pruebas.md # Casos de prueba documentados
├── README.md # Documentación principal
├── requirements.txt # Dependencias de Python
├── talia_bot/
│ ├── main.py # Entry Point y dispatcher principal
├── db.py # Gestión de la base de datos SQLite
├── config.py # Carga de variables de entorno
├── modules/
│ │ ├── flow_engine.py # Motor de flujos de conversación (lee los JSON)
│ │ ├── identity.py # Lógica de Roles y Permisos
│ │ ├── llm_engine.py # Cliente OpenAI/Gemini
│ │ ├── vikunja.py # API Manager para Tareas
│ ├── calendar.py # Google Calendar Logic & Rules
│ ├── printer.py # SMTP/IMAP Loop
── sales_rag.py # Lógica de Ventas y Servicios
── data/
├── flows/ # Directorio con los flujos de conversación en JSON
├── servicios.json # Base de conocimiento para ventas
├── credentials.json # Credenciales de Google
── users.db # Base de datos de usuarios
├── .env.example # Plantilla de variables de entorno
├── requirements.txt # Dependencias
├── Dockerfile # Configuración del contenedor
└── docker-compose.yml # Orquestador de Docker
├── start_bot.sh # Script para iniciar el bot en desarrollo
└── bot/
├── __init__.py # Inicializador de paquete
├── main.py # Entry point y dispatcher principal
├── db.py # Gestión de la base de datos SQLite
├── config.py # Carga de variables de entorno
├── scheduler.py # Tareas programadas y resúmenes diarios
├── webhook_client.py # Webhooks externos (n8n, etc.)
├── modules/
│ ├── flow_engine.py # Motor de flujos de conversación
│ ├── identity.py # Lógica de Roles y Permisos
── llm_engine.py # Cliente OpenAI/Gemini
── vikunja.py # API Manager para tareas
├── calendar.py # Google Calendar Logic & Rules
├── agenda.py # Agendas y solicitudes
├── printer.py # SMTP/IMAP Loop
── sales_rag.py # Lógica de Ventas y Servicios
│ ├── debug.py # Herramientas de diagnóstico
│ ├── onboarding.py # Menús y onboarding inicial
│ ├── citas.py # Solicitudes de citas
│ ├── nfc_tag.py # Wizard NFC
│ ├── aprobaciones.py # Aprobaciones y rechazos
│ └── equipo.py # Equipo y estado de solicitudes
└── data/
├── flows/ # Directorio con los flujos de conversación JSON
├── servicios.json # Base de conocimiento para ventas
├── credentials.json # Credenciales de Google
└── users.db # Base de datos de usuarios
```
---

2
bot/__init__.py Normal file
View File

@@ -0,0 +1,2 @@
# bot/__init__.py
# Package initializer for the bot application.

View File

@@ -1,4 +1,4 @@
# talia_bot/config.py
# bot/config.py
# This file loads all environment variables and bot configurations.
# Environment variables are stored securely outside the code (e.g., in a .env file).

View File

@@ -1,4 +1,4 @@
# talia_bot/db.py
# bot/db.py
# This module will handle the database connection and operations.
import sqlite3

View File

@@ -1,8 +1,10 @@
# talia_bot/main.py
# bot/main.py
# Este es el archivo principal del bot. Aquí se inicia todo y se configuran los comandos.
import logging
import asyncio
import sys
from pathlib import Path
from telegram import Update, InlineKeyboardButton, InlineKeyboardMarkup
from telegram.ext import (
Application,
@@ -15,27 +17,34 @@ from telegram.ext import (
TypeHandler,
)
# Ensure package imports work even if the file is executed directly
if __package__ is None:
current_dir = Path(__file__).resolve().parent
project_root = current_dir.parent
if str(project_root) not in sys.path:
sys.path.insert(0, str(project_root))
# Importamos las configuraciones y herramientas que creamos en otros archivos
from talia_bot.config import TELEGRAM_BOT_TOKEN
from talia_bot.modules.identity import get_user_role
from talia_bot.modules.onboarding import handle_start as onboarding_handle_start
from talia_bot.modules.onboarding import get_admin_secondary_menu
from talia_bot.modules.agenda import get_agenda
from talia_bot.modules.citas import request_appointment
from talia_bot.modules.equipo import (
from bot.config import TELEGRAM_BOT_TOKEN
from bot.modules.identity import get_user_role
from bot.modules.onboarding import handle_start as onboarding_handle_start
from bot.modules.onboarding import get_admin_secondary_menu
from bot.modules.agenda import get_agenda
from bot.modules.citas import request_appointment
from bot.modules.equipo import (
view_requests_status,
)
from talia_bot.modules.aprobaciones import view_pending, handle_approval_action
from talia_bot.modules.admin import get_system_status
from bot.modules.aprobaciones import view_pending, handle_approval_action
from bot.modules.admin import get_system_status
import os
from talia_bot.modules.debug import print_handler
from talia_bot.modules.vikunja import vikunja_conv_handler, get_projects_list, get_tasks_list
from talia_bot.modules.printer import send_file_to_printer, check_print_status
from talia_bot.db import setup_database
from talia_bot.modules.flow_engine import FlowEngine
from talia_bot.modules.llm_engine import transcribe_audio
from bot.modules.debug import print_handler
from bot.modules.vikunja import vikunja_conv_handler, get_projects_list, get_tasks_list
from bot.modules.printer import send_file_to_printer, check_print_status
from bot.db import setup_database
from bot.modules.flow_engine import FlowEngine
from bot.modules.llm_engine import transcribe_audio
from talia_bot.scheduler import schedule_daily_summary
from bot.scheduler import schedule_daily_summary
# Configuramos el sistema de logs para ver mensajes de estado en la consola
logging.basicConfig(

View File

@@ -1,11 +1,11 @@
# talia_bot/modules/agenda.py
# bot/modules/agenda.py
# Este módulo se encarga de manejar las peticiones relacionadas con la agenda.
# Permite obtener y mostrar las actividades programadas para el día.
import datetime
import logging
from talia_bot.modules.calendar import get_events
from talia_bot.config import WORK_GOOGLE_CALENDAR_ID, PERSONAL_GOOGLE_CALENDAR_ID
from bot.modules.calendar import get_events
from bot.config import WORK_GOOGLE_CALENDAR_ID, PERSONAL_GOOGLE_CALENDAR_ID
logger = logging.getLogger(__name__)

View File

@@ -7,7 +7,7 @@ import logging
from google.oauth2 import service_account
from googleapiclient.discovery import build
from googleapiclient.errors import HttpError
from talia_bot.config import GOOGLE_SERVICE_ACCOUNT_FILE, WORK_GOOGLE_CALENDAR_ID
from bot.config import GOOGLE_SERVICE_ACCOUNT_FILE, WORK_GOOGLE_CALENDAR_ID
logger = logging.getLogger(__name__)

View File

@@ -2,7 +2,7 @@
# Este módulo maneja la programación de citas para los clientes.
# Permite a los usuarios obtener un enlace para agendar una reunión.
from talia_bot.config import CALENDLY_LINK
from bot.config import CALENDLY_LINK
def request_appointment():
"""

View File

@@ -1,11 +1,16 @@
# talia_bot/modules/debug.py
# bot/modules/debug.py
# Este módulo permite a los administradores imprimir los detalles de configuración del bot.
# Es una herramienta útil para depuración (debugging).
from telegram import Update
from telegram.ext import ContextTypes
from talia_bot.modules.identity import is_admin
from talia_bot.config import TIMEZONE, CALENDAR_ID, N8N_WEBHOOK_URL
from bot.modules.identity import is_admin
from bot.config import (
TIMEZONE,
WORK_GOOGLE_CALENDAR_ID,
PERSONAL_GOOGLE_CALENDAR_ID,
N8N_WEBHOOK_URL,
)
async def print_handler(update: Update, context: ContextTypes.DEFAULT_TYPE) -> None:
"""
@@ -21,8 +26,9 @@ async def print_handler(update: Update, context: ContextTypes.DEFAULT_TYPE) -> N
config_details = (
f"**Detalles de Configuración**\n"
f"Zona Horaria: `{TIMEZONE}`\n"
f"ID de Calendario: `{CALENDAR_ID}`\n"
f"URL Webhook n8n: `{N8N_WEBHOOK_URL}`\n"
f"Calendario Trabajo: `{WORK_GOOGLE_CALENDAR_ID or 'No definido'}`\n"
f"Calendario Personal: `{PERSONAL_GOOGLE_CALENDAR_ID or 'No definido'}`\n"
f"URL Webhook n8n: `{N8N_WEBHOOK_URL or 'No definido'}`\n"
)
await update.message.reply_text(config_details, parse_mode='Markdown')
else:

View File

@@ -1,10 +1,10 @@
# talia_bot/modules/flow_engine.py
# bot/modules/flow_engine.py
import json
import logging
import os
from talia_bot.db import get_db_connection
from talia_bot.modules.sales_rag import generate_sales_pitch
from talia_bot.modules.nfc_tag import generate_nfc_tag
from bot.db import get_db_connection
from bot.modules.sales_rag import generate_sales_pitch
from bot.modules.nfc_tag import generate_nfc_tag
logger = logging.getLogger(__name__)
@@ -14,7 +14,7 @@ class FlowEngine:
def _load_flows(self):
"""Loads all individual flow JSON files from the flows directory."""
# flows_dir = 'talia_bot/data/flows' # OLD
# flows_dir = 'bot/data/flows' # OLD
base_dir = os.path.dirname(os.path.abspath(__file__))
flows_dir = os.path.join(base_dir, '..', 'data', 'flows')

View File

@@ -1,9 +1,9 @@
# talia_bot/modules/identity.py
# bot/modules/identity.py
# Este script maneja los roles y permisos de los usuarios.
import logging
from talia_bot.db import get_db_connection
from talia_bot.config import ADMIN_ID
from bot.db import get_db_connection
from bot.config import ADMIN_ID
logger = logging.getLogger(__name__)

View File

@@ -1,8 +1,8 @@
# talia_bot/modules/llm_engine.py
# bot/modules/llm_engine.py
# Este script se encarga de la comunicación con la inteligencia artificial de OpenAI.
import openai
from talia_bot.config import OPENAI_API_KEY, OPENAI_MODEL
from bot.config import OPENAI_API_KEY, OPENAI_MODEL
def get_smart_response(prompt):
"""

View File

@@ -1,4 +1,4 @@
# talia_bot/modules/nfc_tag.py
# bot/modules/nfc_tag.py
# This module contains the logic for generating NFC tags.
import base64

View File

@@ -1,4 +1,4 @@
# talia_bot/modules/onboarding.py
# bot/modules/onboarding.py
# Este módulo maneja la primera interacción con el usuario (el comando /start).
# Se encarga de mostrar un menú diferente según quién sea el usuario (admin, crew o cliente).

View File

@@ -1,4 +1,4 @@
# talia_bot/modules/printer.py
# bot/modules/printer.py
# This module will contain the SMTP/IMAP loop for the remote printing service.
import smtplib
@@ -10,7 +10,7 @@ from email.mime.text import MIMEText
from email.mime.base import MIMEBase
from email import encoders
from talia_bot.config import (
from bot.config import (
SMTP_SERVER,
SMTP_PORT,
SMTP_USER,
@@ -20,7 +20,7 @@ from talia_bot.config import (
IMAP_PASS,
PRINTER_EMAIL,
)
from talia_bot.modules.identity import is_admin
from bot.modules.identity import is_admin
logger = logging.getLogger(__name__)

View File

@@ -1,16 +1,16 @@
# talia_bot/modules/sales_rag.py
# bot/modules/sales_rag.py
# This module will contain the sales RAG flow for new clients.
import json
import logging
from talia_bot.modules.llm_engine import get_smart_response
from bot.modules.llm_engine import get_smart_response
logger = logging.getLogger(__name__)
def load_services_data():
"""Loads the services data from the JSON file."""
try:
with open("talia_bot/data/services.json", "r", encoding="utf-8") as f:
with open("bot/data/services.json", "r", encoding="utf-8") as f:
return json.load(f)
except FileNotFoundError:
logger.error("El archivo services.json no fue encontrado.")

View File

@@ -13,8 +13,8 @@ from telegram.ext import (
ContextTypes,
)
from talia_bot.config import VIKUNJA_API_URL, VIKUNJA_API_TOKEN
from talia_bot.modules.identity import is_admin
from bot.config import VIKUNJA_API_URL, VIKUNJA_API_TOKEN
from bot.modules.identity import is_admin
# Configuración del logger
logger = logging.getLogger(__name__)

View File

@@ -9,8 +9,8 @@ from datetime import time
from telegram.ext import ContextTypes
import pytz
from talia_bot.config import ADMIN_ID, TIMEZONE, DAILY_SUMMARY_TIME
from talia_bot.modules.agenda import get_agenda
from bot.config import ADMIN_ID, TIMEZONE, DAILY_SUMMARY_TIME
from bot.modules.agenda import get_agenda
# Configuramos el registro de eventos (logging) para ver qué pasa en la consola
logger = logging.getLogger(__name__)

View File

@@ -3,7 +3,7 @@
# En este caso, se comunica con n8n.
import requests
from talia_bot.config import N8N_WEBHOOK_URL, N8N_TEST_WEBHOOK_URL
from bot.config import N8N_WEBHOOK_URL, N8N_TEST_WEBHOOK_URL
def send_webhook(event_data):
"""

View File

@@ -4,8 +4,8 @@
# Get the directory of the script
DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
# Set PYTHONPATH to include the parent directory
export PYTHONPATH="$PYTHONPATH:$DIR/.."
# Ensure the project root is on PYTHONPATH so absolute imports resolve
export PYTHONPATH="$DIR:${PYTHONPATH}"
# Run the bot
python3 "$DIR/talia_bot/main.py"
# Run the bot using the package entrypoint
python3 -m bot.main