File size: 5,631 Bytes
3f27060
f051775
3f27060
 
 
 
8969868
87c3c1c
f03efc2
913ab65
3ca564b
3f27060
 
 
 
4c2a59e
3f27060
3ca564b
8969868
 
 
 
f4accca
6165204
 
3ca564b
 
6165204
3ca564b
 
 
 
 
 
6165204
8969868
 
 
87c3c1c
8969868
 
 
 
 
 
6165204
3ca564b
6165204
3ca564b
 
8969868
3ca564b
8969868
3ca564b
8969868
 
 
 
 
3ca564b
8969868
 
3ca564b
 
 
 
 
8969868
3ca564b
8969868
 
10af3d7
6165204
8969868
 
3ca564b
 
8969868
3ca564b
6165204
3ca564b
8969868
 
 
 
 
3ca564b
6165204
87c3c1c
3ca564b
 
6165204
8969868
3ca564b
10af3d7
3ca564b
 
10af3d7
8969868
 
 
6165204
7939a0c
8969868
 
 
 
 
 
 
 
 
 
 
 
3f27060
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
import os
import gradio as gr
import requests
import pandas as pd
from huggingface_hub import login
from dotenv import load_dotenv
import time
from agent import Agente



# Cargar variables de entorno
load_dotenv()

# Constantes
API_BASE_URL = "https://agents-course-unit4-scoring.hf.space"

def execute_agent_operations(profile: gr.OAuthProfile | None):
    """
    Obtiene preguntas, ejecuta el agente y envía respuestas.
    """
    # Obtener el ID de espacio
    space_id = os.getenv("MY_SPACE_ID")

    if profile:
        username = f"{profile.username}"
        print(f"Usuario conectado: {username}")
    else:
        print("No has iniciado sesión.")
        return "Inicia sesión en Hugging Face.", None

    questions_url = f"{API_BASE_URL}/questions"
    attachments_url = f"{API_BASE_URL}/files/"
    submit_url = f"{API_BASE_URL}/submit"

    try:
        print("Iniciando Agente...")
        # Aquí puedes instanciar tu agente como se define en agent.py
        agente = Agente() 
    except Exception as e:
        print(f"Error al inicializar agente: {e}")
        return f"Error al inicializar el agente: {e}", None

    # Obtener las preguntas
    print(f"Obteniendo preguntas de: {questions_url}")
    try:
        response = requests.get(questions_url, timeout=15)
        response.raise_for_status()
        questions = response.json()
        if not questions:
            print("La lista de preguntas está vacía.")
            return "No se encontraron preguntas.", None
        print(f"Se obtuvieron {len(questions)} preguntas.")
        
        # Aquí agregamos el retraso entre cada solicitud para evitar el error 429
        for i, q in enumerate(questions):
            if i > 0:  # Para no esperar después de la primera solicitud
                time.sleep(2)  # Espera de 2 segundos entre cada consulta
            
            file_name = q.get("file_name", "")
            task_id = q.get("task_id")
            if file_name and task_id:
                try:
                    att_response = requests.get(f"{attachments_url}{task_id}", timeout=15)
                    att_response.raise_for_status()
                    q["attachment_b64"] = att_response.text
                except Exception as e:
                    print(f"Error al obtener archivo adjunto para la tarea {task_id}: {e}")
                    q["attachment_b64"] = None
    except requests.exceptions.RequestException as e:
        print(f"Error al obtener preguntas: {e}")
        return f"Error al obtener preguntas: {e}", None

    # Ejecutar el agente
    print(f"Ejecutando agente en {len(questions)} preguntas...")
    results_log = []
    answers_payload = []
    
    for item in questions:
        task_id = item.get("task_id")
        question_text = item.get("question", "")
        attachment_b64 = item.get("attachment_b64", "")
        if attachment_b64:
            question_text = f"{question_text}\n\n[ATTACHMENT:]\n{attachment_b64}"
        if not task_id or not question_text:
            print(f"Saltando tarea con información incompleta: {item}")
            continue
        try:
            submitted_answer = agente.procesar_pregunta(question_text)  # Aquí llamarías a tu agente para obtener la respuesta
            answers_payload.append({"task_id": task_id, "submitted_answer": submitted_answer})
            results_log.append({"Task ID": task_id, "Question": question_text, "Submitted Answer": submitted_answer})
        except Exception as e:
            print(f"Error al procesar la tarea {task_id}: {e}")
            results_log.append({"Task ID": task_id, "Question": question_text, "Submitted Answer": f"ERROR: {e}"})

    if not answers_payload:
        return "El agente no produjo respuestas.", pd.DataFrame(results_log)

    submission_data = {"username": username.strip(), "agent_code": f"https://huggingface.co/spaces/{space_id}", "answers": answers_payload}
    status_update = f"Enviando respuestas para el usuario '{username}'..."
    print(status_update)

    try:
        response = requests.post(submit_url, json=submission_data, timeout=60)
        response.raise_for_status()
        result_data = response.json()
        final_status = f"¡Envío exitoso!\nPuntuación: {result_data.get('score', 'N/A')}"
        print("Envío exitoso.")
        results_df = pd.DataFrame(results_log)
        return final_status, results_df
    except requests.exceptions.RequestException as e:
        error_message = f"Error al enviar: {e}"
        print(error_message)
        results_df = pd.DataFrame(results_log)
        return error_message, results_df


# Interfaz Gradio
with gr.Blocks() as demo:
    gr.Markdown("# Evaluador de Agente Básico")
    gr.Markdown("""
    **Instrucciones:**

    1. Modifica el código para ajustar el agente a tus necesidades.
    2. Inicia sesión en Hugging Face.
    3. Haz clic en 'Ejecutar Evaluación y Enviar Respuestas' para procesar las preguntas.

    --- 
    **Avisos:**
    Este espacio está diseñado para ser subóptimo con el fin de incentivar la personalización del código.
    """)

    gr.LoginButton()

    run_button = gr.Button("Ejecutar Evaluación y Enviar Respuestas")

    status_output = gr.Textbox(label="Estado de Ejecución / Resultado del Envío", lines=5, interactive=False)
    results_table = gr.DataFrame(label="Preguntas y Respuestas del Agente", wrap=True)

    run_button.click(
        fn=execute_agent_operations,
        outputs=[status_output, results_table]
    )

if __name__ == "__main__":
    print("Iniciando aplicación de evaluación de agente...")
    demo.launch(debug=True, share=False)