YajieXu's picture
Update app.py
c8461ca verified
raw
history blame
5.38 kB
import os
import gradio as gr
import requests
from smolagents import HfApiModel, DuckDuckGoSearchTool, CodeAgent, WikipediaSearchTool
import pandas as pd
import tempfile
from pathlib import Path
import re
# --- Constants ---
DEFAULT_API_URL = "https://agents-course-unit4-scoring.hf.space"
# --- File Handling ---
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 Definition ---
class BasicAgent:
def __init__(self):
model = HfApiModel(
model_id='Qwen/Qwen2.5-Coder-32B-Instruct',
max_tokens=2096,
temperature=0.5,
custom_role_conversions=None,
)
self.agent = CodeAgent(
model=model,
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]}...")
try:
fixed_answer = self.agent.run(question)
print(f"Agent returning answer: {fixed_answer}")
return fixed_answer
except Exception as e:
print(f"Error during inference: {e}")
return f"AGENT ERROR: {e}"
# --- Run and Submit ---
def run_and_submit_all(profile: gr.OAuthProfile | None):
space_id = "l3xv/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
q_for_agent = f"{question_text}\n\n---\nFile: {file_path}\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)
# --- 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)