File size: 5,310 Bytes
6165204
 
 
 
10af3d7
 
50e5a10
5054645
50e5a10
6165204
10af3d7
50e5a10
1f05742
e4f42cb
6165204
10af3d7
6165204
10af3d7
6165204
 
9903381
50e5a10
6165204
50e5a10
10af3d7
6165204
5054645
6165204
50e5a10
503c790
6165204
 
50e5a10
10af3d7
6165204
10af3d7
 
503c790
10af3d7
 
6165204
b86a6cd
6165204
 
 
50e5a10
10af3d7
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
6165204
10af3d7
6165204
503c790
10af3d7
6165204
 
50e5a10
 
 
 
6165204
10af3d7
6165204
 
10af3d7
503c790
6165204
 
10af3d7
 
 
 
 
 
 
 
 
 
6165204
10af3d7
7939a0c
 
 
 
10af3d7
 
 
 
 
 
50e5a10
10af3d7
 
7939a0c
10af3d7
 
 
 
6165204
10af3d7
6165204
10af3d7
50e5a10
 
 
 
 
6165204
 
50e5a10
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
import os
import gradio as gr
import requests
import pandas as pd
from smolagents import AzureOpenAIServerModel
from huggingface_hub import login
from dotenv import load_dotenv

load_dotenv()  # Cargar variables de entorno

# Constants
DEFAULT_API_URL = "https://agents-course-unit4-scoring.hf.space"

def run_and_submit_all(profile: gr.OAuthProfile | None):
    """
    Obtiene todas las preguntas, ejecuta el BasicAgent sobre ellas, envía las respuestas y muestra los resultados.
    """
    space_id = os.getenv("SPACE_ID")  # Obtener el ID del espacio para enviar el enlace al código

    if profile:
        username = f"{profile.username}"
        print(f"Usuario logueado: {username}")
    else:
        print("Usuario no logueado.")
        return "Por favor, inicie sesión en Hugging Face.", None

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

    try:
        print("Iniciando agente...")
        agent = agent.BasicAgent()  # Aquí inicializamos el agente
    except Exception as e:
        print(f"Error al inicializar el agente: {e}")
        return f"Error al inicializar el agente: {e}", None

    # 2. Obtener preguntas
    print(f"Obteniendo preguntas de: {questions_url}")
    try:
        response = requests.get(questions_url, timeout=15)
        response.raise_for_status()
        questions_data = response.json()
        if not questions_data:
            print("La lista de preguntas está vacía.")
            return "La lista de preguntas está vacía o en formato incorrecto.", None
        print(f"Obtenidas {len(questions_data)} preguntas.")
        for q in questions_data:
            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 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

    # 3. Ejecutar agente sobre preguntas
    results_log = []
    answers_payload = []
    print(f"Ejecutando agente sobre {len(questions_data)} preguntas...")
    for item in questions_data:
        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 question_text is None:
            print(f"Saltando elemento con task_id o pregunta faltante: {item}")
            continue
        try:
            submitted_answer = agent.forward(question_text)  # Aquí ejecutamos el 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 ejecutando agente sobre tarea {task_id}: {e}")
            results_log.append({"Task ID": task_id, "Question": question_text, "Submitted Answer": f"ERROR AGENTE: {e}"})

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

    # 4. Preparar la sumisión
    submission_data = {"username": username.strip(), "agent_code": agent_code, "answers": answers_payload}
    print(f"Enviando respuestas para el usuario '{username}'...")

    # 5. Enviar respuestas
    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!\n"
            f"Usuario: {result_data.get('username')}\n"
            f"Puntuación total: {result_data.get('score', 'N/A')}% "
            f"({result_data.get('correct_count', '?')}/{result_data.get('total_attempted', '?')} correctas)"
        )
        print("Envío exitoso.")
        results_df = pd.DataFrame(results_log)
        return final_status, results_df
    except requests.exceptions.RequestException as e:
        status_message = f"Error al enviar respuestas: {e}"
        print(status_message)
        results_df = pd.DataFrame(results_log)
        return status_message, results_df

# Interfaz de Gradio
with gr.Blocks() as demo:
    gr.Markdown("# Evaluador de Agente Básico")
    gr.LoginButton()
    run_button = gr.Button("Ejecutar Evaluación y Enviar Todas las Respuestas")
    status_output = gr.Textbox(label="Resultado de Ejecución / Envío", lines=5, interactive=False)
    results_table = gr.DataFrame(label="Preguntas y Respuestas del Agente", wrap=True)
    run_button.click(fn=run_and_submit_all, outputs=[status_output, results_table])

if __name__ == "__main__":
    demo.launch(debug=True, share=False)