YajieXu's picture
Update app.py
a64f38b verified
import os
import gradio as gr
import requests
from smolagents import OpenAIServerModel, DuckDuckGoSearchTool, CodeAgent, WikipediaSearchTool
from pathlib import Path
import tempfile
import pandas as pd
import re
# --- Constants ---
DEFAULT_API_URL = "https://agents-course-unit4-scoring.hf.space"
# --- File Download Helper ---
def download_file_if_any(base_api_url: str, task_id: str) -> str | None:
url = f"{base_api_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
cdisp = resp.headers.get("content-disposition", "")
filename = task_id
if "filename=" in cdisp:
m = re.search(r'filename="([^\"]+)"', cdisp)
if m:
filename = m.group(1)
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)
# --- Basic Agent ---
class BasicAgent:
def __init__(self):
self.agent = CodeAgent(
model=OpenAIServerModel(model_id="gpt-4o"),
tools=[DuckDuckGoSearchTool(), WikipediaSearchTool()],
add_base_tools=True,
additional_authorized_imports=[]
)
print("BasicAgent initialized.")
def __call__(self, question: str) -> str:
print(f"Agent received question (first 50 chars): {question[:50]}...")
fixed_answer = self.agent.run(question)
print(f"Agent returning answer: {fixed_answer}")
return fixed_answer
# --- Evaluation Logic ---
def run_and_submit_all(profile: gr.OAuthProfile | None):
space_id = "YajieXu/Final_Assignment_Template"
if profile:
username = f"{profile.username}"
else:
return "Please Login to Hugging Face with the button.", None
api_url = DEFAULT_API_URL
questions_url = f"{api_url}/questions"
submit_url = f"{api_url}/submit"
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"
try:
response = requests.get(questions_url, timeout=15)
response.raise_for_status()
questions_data = response.json()
except Exception as e:
return f"Error fetching questions: {e}", None
results_log = []
answers_payload = []
for item in questions_data:
task_id = item.get("task_id")
question_text = item.get("question")
try:
file_path = download_file_if_any(api_url, task_id)
except Exception as e:
file_path = None
print(f"[file fetch error] {task_id}: {e}")
q_for_agent = (
f"{question_text}\n\n---\nA file was downloaded for this task and saved locally at:\n{file_path}\n---\n\n"
if file_path else question_text
)
if not task_id or question_text is None:
continue
try:
submitted_answer = agent(q_for_agent)
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:
results_log.append({"Task ID": task_id, "Question": question_text, "Submitted Answer": f"AGENT ERROR: {e}"})
if not answers_payload:
return "Agent did not produce any answers to submit.", pd.DataFrame(results_log)
submission_data = {"username": username.strip(), "agent_code": agent_code, "answers": answers_payload}
try:
response = requests.post(submit_url, 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)
# --- Gradio UI ---
with gr.Blocks() as demo:
gr.Markdown("# Basic Agent Evaluation Runner")
gr.Markdown("""
**Instructions:**
1. Log in to your Hugging Face account.
2. Click the button to run the agent and submit answers.
3. Your score will be printed below.
""")
gr.LoginButton()
run_button = gr.Button("Run Evaluation & Submit All Answers")
status_output = gr.Textbox(label="Run Status / Submission Result", lines=5, interactive=False)
results_table = gr.DataFrame(label="Questions and Agent Answers", wrap=True)
run_button.click(fn=run_and_submit_all, outputs=[status_output, results_table])
if __name__ == "__main__":
print("Launching GAIA agent app...")
demo.launch(debug=True, share=False)