from smolagents import CodeAgent, DuckDuckGoSearchTool, HfApiModel, load_tool, tool import datetime import pytz import yaml from tools.final_answer import FinalAnswerTool from Gradio_UI import GradioUI # --------------------------------------------------------------------------- # HERRAMIENTAS PERSONALIZADAS (TURISMO Y EVENTOS EN ZIPAQUIRÁ) # --------------------------------------------------------------------------- @tool def calculate_event_space(asistentes: int, tipo_montaje: str = "auditorio") -> str: """Calcula el espacio recomendado en metros cuadrados y el aforo ideal para eventos o pasadías corporativos. Args: asistentes: Número total de personas/asistentes. tipo_montaje: Estilo del montaje ('auditorio', 'banquete', 'escuela' o 'aire_libre'). """ factores_m2 = { "auditorio": 1.2, "banquete": 2.0, "escuela": 1.8, "aire_libre": 2.5 } factor = factores_m2.get(tipo_montaje.lower(), 1.5) area_requerida = asistentes * factor return ( f"--- CÁLCULO DE ESPACIO PARA EVENTOS ---\n" f"• Asistentes: {asistentes} personas\n" f"• Estilo de montaje: {tipo_montaje.capitalize()}\n" f"• Área mínima recomendada: {area_requerida:.1f} m²\n" f"• Recomendación local: Para grupos de {asistentes} personas, los salones y espacios al aire libre de Zipaquirá se adaptan perfectamente." ) @tool def create_event_proposal(nombre_empresa: str, asistentes: int, duracion_dias: int = 1, incluir_catedral: bool = True) -> str: """Genera una propuesta inicial de presupuesto y paquete corporativo/turístico para un grupo en Zipaquirá. Args: nombre_empresa: Nombre de la empresa o grupo organizador. asistentes: Número de asistentes. duracion_dias: Duración de la estancia o evento en días. incluir_catedral: Si se debe incluir el recorrido guiado en la Catedral de Sal. """ costo_base_persona_dia = 90000 # Alimentación, espacio y logística local costo_catedral = 60000 if incluir_catedral else 0 costo_por_persona = (costo_base_persona_dia * duracion_dias) + costo_catedral total_estimado = costo_por_persona * asistentes return ( f"--- PROPUESTA TURÍSTICA Y DE EVENTOS: {nombre_empresa.upper()} ---\n" f"• Participantes: {asistentes}\n" f"• Duración: {duracion_dias} día(s)\n" f"• Incluye Catedral de Sal: {'Sí' if incluir_catedral else 'No'}\n" f"• Tarifa por persona estimada: ${costo_por_persona:,} COP\n" f"---------------------------------------------------\n" f"PRESUPUESTO TOTAL ESTIMADO: ${total_estimado:,} COP" ) @tool def create_event_agenda(titulo_evento: str, hora_inicio: str = "08:00") -> str: """Genera una agenda cronológica sugerida para un pasadía corporativo/turístico en Zipaquirá. Args: titulo_evento: Título o propósito del pasadía/evento. hora_inicio: Hora de inicio en formato HH:MM (ejemplo: '08:00'). """ return ( f"--- AGENDA SUGERIDA: {titulo_evento} ---\n" f"• {hora_inicio} - Llegada a Zipaquirá y Coffe Break de bienvenida (productos artesanales).\n" f"• 09:30 - Recorrido guiado por la Catedral de Sal (Experiencia de origen y patrimonio).\n" f"• 12:30 - Almuerzo gastronómico local en el centro histórico.\n" f"• 14:30 - Actividad de integración / Team Building temático.\n" f"• 16:30 - Cierre del evento, recorrido por la Plaza Mayor y retorno." ) @tool def recommend_team_building(objetivo: str, entorno: str = "mixto") -> str: """Recomienda actividades de integración y turismo con propósito de acuerdo con el objetivo del equipo. Args: objetivo: Meta del equipo ('liderazgo', 'trabajo_en_equipo', 'bienestar', 'comunicacion'). entorno: Preferencia del espacio ('interior', 'al_aire_libre' o 'mixto'). """ recomendaciones = { "liderazgo": "Desafío Minero en Zipaquirá: Dinámicas de orientación y toma de decisiones en rutas históricas.", "trabajo_en_equipo": "Taller de Alfarería y Escultura en Sal: Creación colectiva de símbolos con artesanos locales.", "bienestar": "Caminata de conexión ambiental por los senderos ecológicos y pausa activa con gastronomía consciente.", "comunicacion": "Rally de Pistas en el Centro Histórico de Zipaquirá: Descubriendo la historia a través del trabajo coordinado." } actividad = recomendaciones.get(objetivo.lower(), "Experiencia integradora en la Plaza Mayor y talleres artísticos comunitarios.") return f"Recomendación para objetivo ({objetivo}) en entorno ({entorno}):\n👉 {actividad}" @tool def get_current_time_in_timezone(timezone: str) -> str: """Obtiene la hora local actual en una zona horaria específica. Args: timezone: Zona horaria en formato válido (ejemplo: 'America/Bogota'). """ try: tz = pytz.timezone(timezone) local_time = datetime.datetime.now(tz).strftime("%Y-%m-%d %H:%M:%S") return f"La hora local actual en {timezone} es: {local_time}" except Exception as e: return f"Error al obtener la hora para '{timezone}': {str(e)}" # --------------------------------------------------------------------------- # CONFIGURACIÓN E INSTANCIACIÓN # --------------------------------------------------------------------------- final_answer = FinalAnswerTool() search_tool = DuckDuckGoSearchTool() model = HfApiModel( max_tokens=2096, temperature=0.5, model_id='Qwen/Qwen2.5-Coder-32B-Instruct', custom_role_conversions=None, ) with open("prompts.yaml", 'r') as stream: prompt_templates = yaml.safe_load(stream) # Agente unificado con la estructura solicitada agent = CodeAgent( model=model, tools=[ final_answer, search_tool, create_event_proposal, calculate_event_space, create_event_agenda, recommend_team_building, get_current_time_in_timezone ], max_steps=8, verbosity_level=2, grammar=None, planning_interval=None, name="AgenteEventosYTurismoZipaquira", description="Agente especializado en cotizar, planificar espacios, diseñar agendas y recomendar actividades de integración para eventos de Turismo para la Vida en Zipaquirá.", prompt_templates=prompt_templates ) GradioUI(agent).launch()