import os import gradio as gr import requests import pandas as pd from smolagents import CodeAgent, InferenceClientModel, WebSearchTool # -------------------------------------------------- # Constants # -------------------------------------------------- DEFAULT_API_URL = "https://agents-course-unit4-scoring.hf.space" # -------------------------------------------------- # Agent Definition # -------------------------------------------------- class BasicAgent: def __init__(self): print("Initializing Agent...") self.model = InferenceClientModel( token=os.getenv("HF_TOKEN") ) self.agent = CodeAgent( tools=[WebSearchTool()], model=self.model, max_steps=5 ) print("Agent initialized successfully.") def __call__(self, question: str) -> str: try: print(f"Question: {question[:100]}") answer = self.agent.run(question) print(f"Answer: {answer}") return str(answer) except Exception as e: print(f"Agent Error: {e}") return f"Error: {e}" # -------------------------------------------------- # Evaluation Runner # -------------------------------------------------- def run_and_submit_all(profile: gr.OAuthProfile | None): space_id = os.getenv("SPACE_ID") if profile: username = profile.username print(f"Logged in as: {username}") else: return "Please Login to Hugging Face first.", None questions_url = f"{DEFAULT_API_URL}/questions" submit_url = f"{DEFAULT_API_URL}/submit" try: agent = BasicAgent() except Exception as e: return f"Error creating agent: {e}", None agent_code = f"https://huggingface.co/spaces/{space_id}/tree/main" # ---------------------------------------------- # Fetch Questions # ---------------------------------------------- try: response = requests.get(questions_url, timeout=30) response.raise_for_status() questions_data = response.json() print(f"Fetched {len(questions_data)} questions.") except Exception as e: return f"Error fetching questions: {e}", None # ---------------------------------------------- # Run Agent # ---------------------------------------------- results_log = [] answers_payload = [] for item in questions_data: task_id = item.get("task_id") question = item.get("question") if not task_id or not question: continue try: answer = agent(question) answers_payload.append( { "task_id": task_id, "submitted_answer": str(answer) } ) results_log.append( { "Task ID": task_id, "Question": question, "Submitted Answer": answer } ) except Exception as e: results_log.append( { "Task ID": task_id, "Question": question, "Submitted Answer": f"ERROR: {e}" } ) if len(answers_payload) == 0: return "No answers generated.", pd.DataFrame(results_log) # ---------------------------------------------- # Submit Answers # ---------------------------------------------- submission_data = { "username": username, "agent_code": agent_code, "answers": answers_payload } try: response = requests.post( submit_url, json=submission_data, timeout=120 ) response.raise_for_status() result = response.json() status = ( f"Submission Successful!\n" f"User: {result.get('username')}\n" f"Overall Score: {result.get('score')}%\n" f"Correct Answers: {result.get('correct_count')}/{result.get('total_attempted')}\n" f"Message: {result.get('message')}" ) return status, pd.DataFrame(results_log) except Exception as e: return ( f"Submission Failed: {e}", pd.DataFrame(results_log) ) # -------------------------------------------------- # UI # -------------------------------------------------- with gr.Blocks() as demo: gr.Markdown("# Hugging Face Agents Course - Final Assignment") gr.Markdown( """ 1. Login with Hugging Face 2. Click the evaluation button 3. Wait for all questions to finish 4. Answers will be submitted automatically """ ) gr.LoginButton() run_button = gr.Button( "Run Evaluation & Submit All Answers" ) status_output = gr.Textbox( label="Run Status / Submission Result", lines=8 ) results_table = gr.DataFrame( label="Questions and Agent Answers", wrap=True ) run_button.click( fn=run_and_submit_all, outputs=[ status_output, results_table ] ) # -------------------------------------------------- # Launch # -------------------------------------------------- if __name__ == "__main__": demo.launch()