TurismoparalaVida's picture
Update app.py
cdac9e1 verified
Raw History Blame
6.5 kB
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()