dlaima's picture
Update app.py
abf0257 verified
raw
history blame
6.71 kB
import os
import requests
import pandas as pd
import gradio as gr
from smolagents import ToolCallingAgent, OpenAIServerModel
from audio_transcriber import AudioTranscriptionTool
from image_analyzer import ImageAnalysisTool
from wikipedia_searcher import WikipediaSearcher
DEFAULT_API_URL = "https://agents-course-unit4-scoring.hf.space"
class GaiaAgent:
def __init__(self):
tools = [
AudioTranscriptionTool(),
ImageAnalysisTool(),
WikipediaSearcher()
]
model_id = os.getenv("OPENAI_MODEL_ID", "gpt-3.5-turbo")
self.agent = ToolCallingAgent(
model=OpenAIServerModel(model_id=model_id),
tools=tools
)
def __call__(self, query: str) -> str:
result = self.agent.run(query)
return result.get("output", "No output returned")
def run_and_submit_all(profile: gr.OAuthProfile | None):
space_id = os.getenv("SPACE_ID")
if profile:
username = profile.username
if isinstance(username, list):
username = username[0]
username = username.strip()
print(f"User logged in: {username}")
else:
print("User not logged in.")
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 = GaiaAgent()
except Exception as e:
print(f"Error initializing agent: {e}")
return f"Error initializing agent: {e}", None
agent_code = f"https://huggingface.co/spaces/{space_id}/tree/main"
print(f"Agent code URL: {agent_code}")
try:
response = requests.get(questions_url, timeout=15)
response.raise_for_status()
questions_data = response.json()
if not questions_data:
return "Fetched questions list is empty or invalid format.", None
print(f"Fetched {len(questions_data)} questions.")
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")
if not task_id:
continue
question_text = item.get("question", "")
file_url = item.get("file_url")
local_file_path = None
if file_url:
try:
ext = file_url.split(".")[-1].lower()
if ext in ["mp3", "wav", "jpeg", "jpg", "png"]:
local_file_path = f"./temp_{task_id}.{ext}"
with requests.get(file_url, stream=True) as r:
r.raise_for_status()
with open(local_file_path, "wb") as f:
for chunk in r.iter_content(chunk_size=8192):
f.write(chunk)
print(f"Downloaded file for task {task_id} to {local_file_path}")
question_text += f"\n\nFile path: {local_file_path}"
except Exception as e:
print(f"Failed to download file for task {task_id}: {e}")
try:
submitted_answer = agent(question_text)
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:
error_msg = f"AGENT ERROR: {e}"
results_log.append({
"Task ID": task_id,
"Question": question_text,
"Submitted Answer": error_msg
})
if local_file_path:
try:
os.remove(local_file_path)
except Exception:
pass
if not answers_payload:
return "Agent did not produce any answers to submit.", pd.DataFrame(results_log)
submission_data = {
"username": username,
"agent_code": agent_code,
"answers": answers_payload
}
print(f"Submitting {len(answers_payload)} answers to: {submit_url}")
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.')}"
)
results_df = pd.DataFrame(results_log)
return final_status, results_df
except requests.exceptions.HTTPError as e:
try:
detail = e.response.json().get("detail", e.response.text)
except Exception:
detail = e.response.text[:500]
return f"Submission Failed: {detail}", pd.DataFrame(results_log)
except requests.exceptions.Timeout:
return "Submission Failed: The request timed out.", pd.DataFrame(results_log)
except Exception as e:
return f"An unexpected error occurred during submission: {e}", pd.DataFrame(results_log)
# Gradio UI
with gr.Blocks() as demo:
gr.Markdown("# Basic Agent Evaluation Runner")
gr.Markdown("""
**Instructions:**
1. Clone this space and define your agent and tools.
2. Log in to your Hugging Face account using the button below.
3. Click 'Run Evaluation & Submit All Answers' to test your agent and submit results.
""")
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("\n" + "-"*30 + " App Starting " + "-"*30)
space_host = os.getenv("SPACE_HOST")
space_id = os.getenv("SPACE_ID")
if space_host:
print(f"✅ SPACE_HOST found: {space_host}")
print(f" Runtime URL should be: https://{space_host}.hf.space")
else:
print("ℹ️ SPACE_HOST not found.")
if space_id:
print(f"✅ SPACE_ID found: {space_id}")
print(f" Repo URL: https://huggingface.co/spaces/{space_id}")
else:
print("ℹ️ SPACE_ID not found.")
print("-"*(60 + len(" App Starting ")) + "\n")
demo.launch(debug=True, share=False)