import re import tempfile from pathlib import Path import pandas as pd import requests class HsEvaluatorClient: def __init__(self, username, space_id): self.space_id = space_id self.username = username self.base_url = "https://agents-course-unit4-scoring.hf.space" def fetch_questions(self): try: response = requests.get(f"{self.base_url}/questions", timeout=15) response.raise_for_status() return response.json() except Exception as e: print(f"Error fetching questions: {e}") return None def download_file_if_any(self, task_id: str) -> str | None: url = f"{self.base_url}/files/{task_id}" try: resp = requests.get(url, timeout=30) if resp.status_code == 404: return None resp.raise_for_status() except requests.exceptions.HTTPError as e: raise e # ▸ Save bytes to a named file inside the system temp dir # Try to keep original extension from Content-Disposition if present. cdisp = resp.headers.get("content-disposition", "") filename = task_id # default base name if "filename=" in cdisp: m = re.search(r'filename="([^"]+)"', cdisp) if m: filename = m.group(1) # keep provided name tmp_dir = Path(tempfile.gettempdir()) / "gaia_files" tmp_dir.mkdir(exist_ok=True) file_path = tmp_dir / filename with open(file_path, "wb") as f: f.write(resp.content) return str(file_path) def submit_answers(self, answers_payload, results_log): agent_code = f"https://huggingface.co/spaces/{self.space_id}/tree/main" submission_data = { "username": self.username.strip(), "agent_code": agent_code, "answers": answers_payload } try: response = requests.post(f"{self.base_url}/submit", json=submission_data, timeout=60) response.raise_for_status() result_data = response.json() final_status = ( f"Submission Successful!\n" f"User: {result_data.get('username')}\n" f"Overall Score: {result_data.get('score', 'N/A')}% " f"({result_data.get('correct_count', '?')}/{result_data.get('total_attempted', '?')} correct)\n" f"Message: {result_data.get('message', 'No message received.')}" ) return final_status, pd.DataFrame(results_log) except Exception as e: return f"Submission Failed: {e}", pd.DataFrame(results_log)