Spaces:
Sleeping
Sleeping
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) | |