File size: 6,499 Bytes
cdac9e1 9b5b26a c19d193 6aae614 9b5b26a cdac9e1 9b5b26a cdac9e1 9b5b26a cdac9e1 9b5b26a cdac9e1 9b5b26a cdac9e1 9b5b26a cdac9e1 9b5b26a cdac9e1 9b5b26a cdac9e1 8c01ffb cdac9e1 8c01ffb 6aae614 cdac9e1 ae7a494 e121372 cdac9e1 13d500a 8c01ffb 861422e cdac9e1 8c01ffb 8fe992b cdac9e1 8c01ffb cdac9e1 861422e 8fe992b 8c01ffb | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 | 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() |