import os import gradio as gr import requests import pandas as pd # ===================================================== # Constants (DO NOT CHANGE) # ===================================================== DEFAULT_API_URL = "https://agents-course-unit4-scoring.hf.space" # ===================================================== # Agent Definition (THIS IS THE ONLY PART YOU EDIT) # ===================================================== from agent import agent as gaia_agent class BasicAgent: def __init__(self): """ Initialize your GAIA agent here. """ pass def __call__(self, question: str) -> str: """ Required interface for HF Unit 4 scoring. """ return gaia_agent(question, files=None) # ===================================================== # Evaluation & Submission Logic (DO NOT CHANGE) # ===================================================== def run_and_submit_all(profile: gr.OAuthProfile | None): """ Fetches all GAIA questions, runs the agent, submits answers, and returns the official score. """ space_id = os.getenv("SPACE_ID") if not profile: return "❌ Please log in with Hugging Face.", None username = profile.username api_url = DEFAULT_API_URL questions_url = f"{api_url}/questions" submit_url = f"{api_url}/submit" # 1. Load agent try: agent = BasicAgent() except Exception as e: return f"❌ Error initializing agent: {e}", None agent_code = f"https://huggingface.co/spaces/{space_id}/tree/main" # 2. Fetch questions try: resp = requests.get(questions_url, timeout=15) resp.raise_for_status() questions = resp.json() except Exception as e: return f"❌ Error fetching questions: {e}", None if not questions: return "❌ No questions returned.", None # 3. Run agent results_log = [] answers_payload = [] for item in questions: task_id = item.get("task_id") question_text = item.get("question") if not task_id or question_text is None: continue try: answer = agent(question_text) answers_payload.append({ "task_id": task_id, "submitted_answer": answer }) results_log.append({ "Task ID": task_id, "Question": question_text, "Submitted Answer": answer }) except Exception as e: results_log.append({ "Task ID": task_id, "Question": question_text, "Submitted Answer": f"AGENT ERROR: {e}" }) if not answers_payload: return "❌ Agent produced no answers.", pd.DataFrame(results_log) # 4. Submit submission = { "username": username.strip(), "agent_code": agent_code, "answers": answers_payload } try: resp = requests.post(submit_url, json=submission, timeout=180) resp.raise_for_status() result = resp.json() status = ( f"✅ Submission Successful\n" f"User: {result.get('username')}\n" f"Score: {result.get('score')}%\n" f"Correct: {result.get('correct_count')} / {result.get('total_attempted')}\n" f"Message: {result.get('message')}" ) return status, pd.DataFrame(results_log) except requests.exceptions.HTTPError as e: detail = e.response.text try: detail = e.response.json().get("detail", detail) except Exception: pass return f"❌ Submission failed: {detail}", pd.DataFrame(results_log) except Exception as e: return f"❌ Unexpected error: {e}", pd.DataFrame(results_log) # ===================================================== # Gradio Interface (DO NOT CHANGE) # ===================================================== with gr.Blocks() as demo: gr.Markdown("# 🧠 HF Agents Course — Unit 4 Evaluation") gr.Markdown( "1. Log in with Hugging Face\n" "2. Click **Run Evaluation & Submit All Answers**\n" "3. Wait for your GAIA score" ) gr.LoginButton() run_btn = gr.Button("Run Evaluation & Submit All Answers") status = gr.Textbox(label="Submission Result", lines=6, interactive=False) table = gr.DataFrame(label="Agent Output", wrap=True) run_btn.click( fn=run_and_submit_all, outputs=[status, table] ) if __name__ == "__main__": demo.launch(debug=True, share=False)