# src/streamlit_app.py import os import sys import asyncio # ─────────────────────────────────────────────────────────────────────────────── # 0) Crear y setear un event loop en este hilo (ScriptRunner.scriptThread) # ─────────────────────────────────────────────────────────────────────────────── loop = asyncio.new_event_loop() asyncio.set_event_loop(loop) # ─────────────────────────────────────────────────────────────────────────────── # 1) Redirigir HOME y StreamlitConfig a /tmp/.streamlit (es escribible en HF Spaces) # ─────────────────────────────────────────────────────────────────────────────── os.environ["HOME"] = "/tmp" os.environ["STREAMLIT_CONFIG_DIR"] = "/tmp/.streamlit" try: os.makedirs("/tmp/.streamlit", exist_ok=True) except Exception: pass # ─────────────────────────────────────────────────────────────────────────────── # 2) Añadir src/ a sys.path para que Python encuentre agent/ y tools/ # ─────────────────────────────────────────────────────────────────────────────── HERE = os.path.dirname(__file__) # debería apuntar a /app/src if HERE not in sys.path: sys.path.insert(0, HERE) # ─────────────────────────────────────────────────────────────────────────────── # 3) Ahora sí importamos Streamlit, el agente y Runner # ─────────────────────────────────────────────────────────────────────────────── import streamlit as st from agent.linkedin_agent import create_agent from agents import Runner # ─────────────────────────────────────────────────────────────────────────────── # 4) Configuración de la página y verificación de la clave de OpenAI # ─────────────────────────────────────────────────────────────────────────────── st.set_page_config(page_title="Buscador de Perfiles LinkedIn", layout="centered") if not os.getenv("OPENAI_API_KEY"): st.error("❌ Por favor define el secret OPENAI_API_KEY en Settings → Secrets de tu Space.") st.stop() # ─────────────────────────────────────────────────────────────────────────────── # 5) Instanciar el agente (solo una vez al inicio) # ─────────────────────────────────────────────────────────────────────────────── agent = create_agent() # ─────────────────────────────────────────────────────────────────────────────── # 6) Interfaz de usuario (chat) en Streamlit # ─────────────────────────────────────────────────────────────────────────────── st.title("🔍 Buscador de Perfiles LinkedIn") st.write("Ingresa la descripción de la oferta de empleo y la cantidad de perfiles que deseas encontrar.") # Inicializar historial en la sesión si aún no existe if "history" not in st.session_state: st.session_state.history = [] # Formulario para recibir la oferta y el número de perfiles with st.form(key="oferta_form", clear_on_submit=False): oferta = st.text_area("📰 Descripción de la oferta de empleo:", height=150) num_perfiles = st.number_input( "🔢 Cantidad de perfiles a buscar:", min_value=1, max_value=20, value=5 ) enviar = st.form_submit_button(label="Enviar al agente") # Cuando el usuario pulsa "Enviar al agente" if enviar and oferta: # Agregar el mensaje del usuario al historial st.session_state.history.append(("usuario", oferta)) # Construir el prompt en el formato que espera el agente prompt = f"Oferta: {oferta}\nNúmero perfiles: {num_perfiles}" # Ejecutar el agente de forma síncrona (ahora existe un event loop) resultado = Runner.run_sync(agent, prompt) respuesta = resultado.final_output # Agregar la respuesta del agente al historial st.session_state.history.append(("agente", respuesta)) # Mostrar el historial tipo “chat” st.markdown("---") st.markdown("### 💬 Historial de Chat") for quien, texto in st.session_state.history: if quien == "usuario": st.markdown(f"**Tú:** {texto}") else: st.markdown(f"**Agente:** {texto}") # Botón para limpiar el historial if st.button("🔄 Limpiar historial"): st.session_state.history = []