Download app.py from agents-course/First_agent_template: direct link, hf CLI and curl.
- Browser
- Download file 6.5 kB
-
https://huggingface.co/spaces/agents-course/First_agent_template/resolve/refs%2Fpr%2F780/app.py
- Command line
-
hf download hf://spaces/agents-course/First_agent_template@refs/pr/780/app.py
-
curl -L -o app.py https://huggingface.co/spaces/agents-course/First_agent_template/resolve/refs%2Fpr%2F780/app.py
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Á) | |
| # --------------------------------------------------------------------------- | |
| 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." | |
| ) | |
| 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" | |
| ) | |
| 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." | |
| ) | |
| 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}" | |
| 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() |