Vani7065's picture
Update app.py
1730d8f verified
Raw History Blame Contribute Delete
7.22 kB
import os
import gradio as gr
import requests
import inspect
import pandas as pd
from openai import OpenAI
client = OpenAI(api_key="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")
# --- Constants ---
DEFAULT_API_URL = "https://agents-course-unit4-scoring.hf.space"
# --- Basic Agent Definition ---
class BasicAgent:
def __init__(self):
self.api_key = os.getenv("OPENAI_API_KEY")
if not self.api_key:
raise ValueError("OpenAI API key not found. Please set OPENAI_API_KEY as environment variable.")
# Optional: Log OpenAI constructor arguments
print("🔍 OpenAI init params:", list(inspect.signature(OpenAI.__init__).parameters.keys()))
# ✅ Ensure only valid args passed
self.client = OpenAI(api_key=self.api_key)
print("✅ OpenAI Agent initialized (v1+ syntax).")
def __call__(self, question: str) -> str:
print(f"❓ Question received: {question[:50]}...")
try:
response = self.client.chat.completions.create(
model="gpt-3.5-turbo",
messages=[
{"role": "system", "content": "You are a helpful assistant that answers GAIA benchmark questions."},
{"role": "user", "content": question}
],
max_tokens=300,
temperature=0.7
)
answer = response.choices[0].message.content.strip()
print(f"✅ Answer: {answer}")
return answer
except Exception as e:
print(f"❌ Error calling OpenAI API: {e}")
return f"ERROR: {e}"
def run_and_submit_all(profile: gr.OAuthProfile | None):
space_id = os.getenv("SPACE_ID")
if profile:
username = f"{profile.username}"
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 = BasicAgent()
except Exception as e:
print(f"Error instantiating agent: {e}")
return f"Error initializing agent: {e}", None
agent_code = f"https://huggingface.co/spaces/{space_id}/tree/main"
print(agent_code)
print(f"Fetching questions from: {questions_url}")
try:
response = requests.get(questions_url, timeout=15)
response.raise_for_status()
questions_data = response.json()
if not questions_data:
print("Fetched questions list is empty.")
return "Fetched questions list is empty or invalid format.", None
print(f"Fetched {len(questions_data)} questions.")
except requests.exceptions.RequestException as e:
print(f"Error fetching questions: {e}")
return f"Error fetching questions: {e}", None
except requests.exceptions.JSONDecodeError as e:
print(f"Error decoding JSON response: {e}")
return f"Error decoding server response for questions: {e}", None
except Exception as e:
print(f"Unexpected error fetching questions: {e}")
return f"Unexpected error fetching questions: {e}", None
results_log = []
answers_payload = []
print(f"Running agent on {len(questions_data)} questions...")
for item in questions_data:
task_id = item.get("task_id")
question_text = item.get("question")
if not task_id or question_text is None:
print(f"Skipping invalid item: {item}")
continue
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:
print(f"Error running agent on task {task_id}: {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
}
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.')}"
)
print("Submission successful.")
return final_status, pd.DataFrame(results_log)
except requests.exceptions.HTTPError as e:
try:
error_detail = f"{e.response.status_code} - {e.response.json().get('detail', e.response.text)}"
except Exception:
error_detail = f"{e.response.status_code} - {e.response.text}"
return f"Submission Failed: {error_detail}", pd.DataFrame(results_log)
except requests.exceptions.Timeout:
return "Submission Failed: The request timed out.", pd.DataFrame(results_log)
except requests.exceptions.RequestException as e:
return f"Submission Failed: Network error - {e}", pd.DataFrame(results_log)
except Exception as e:
return f"Unexpected error during submission: {e}", pd.DataFrame(results_log)
# --- Gradio Interface ---
with gr.Blocks() as demo:
gr.Markdown("# Basic Agent Evaluation Runner")
gr.Markdown("""
**Instructions:**
1. Clone this space and modify the code to define your own agent.
2. Log in with your Hugging Face account.
3. Click 'Run Evaluation & Submit All Answers' to start.
""")
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: {space_host}")
print(f"Runtime URL: https://{space_host}.hf.space")
else:
print("ℹ️ SPACE_HOST not found.")
if space_id:
print(f"✅ SPACE_ID: {space_id}")
print(f"Repo: https://huggingface.co/spaces/{space_id}/tree/main")
else:
print("ℹ️ SPACE_ID not found.")
print("-" * 70)
print("Launching Gradio Interface...")
demo.launch(debug=True, share=False)