Visionkambanje's picture
Update app.py
656091a verified
Raw
History Blame Contribute Delete
4.68 kB
import os
import gradio as gr
import requests
import pandas as pd
from smolagents import CodeAgent, DuckDuckGoSearchTool, InferenceClientModel, PythonInterpreterTool, WikipediaSearchTool, FinalAnswerTool
# --- Constants ---
DEFAULT_API_URL = "https://agents-course-unit4-scoring.hf.space"
# --- Hugging Face API Key ---
HF_API_KEY = os.environ.get("HF_TOKEN")
if not HF_API_KEY:
raise ValueError("❌ Hugging Face API key not found. Please add it under Settings → Variables and secrets.")
# --- Initialize Hugging Face Model ---
model = InferenceClientModel(
model_id="HuggingFaceH4/zephyr-7b-beta", # ✅ chat model
token=HF_API_KEY
)
# --- Basic Agent Definition ---
class BasicAgent:
def __init__(self, model):
self.model = model
self.agent = CodeAgent(
tools=[
DuckDuckGoSearchTool(),
PythonInterpreterTool(),
WikipediaSearchTool(),
FinalAnswerTool()
],
model=self.model
)
print("✅ BasicAgent initialized with Hugging Face model.")
def __call__(self, question: str) -> str:
print(f"Agent received question (first 50 chars): {question[:50]}...")
try:
answer = self.agent.run(question)
if not answer:
return "⚠️ Model returned no answer."
return answer
except Exception as e:
print(f"❌ Error during agent run: {e}")
return f"AGENT ERROR: {str(e)}"
# --- Run & Submit Function ---
def run_and_submit_all(profile: gr.OAuthProfile | None = None):
if not profile:
return "Please login to Hugging Face with the button.", None
username = profile.username
print(f"User logged in: {username}")
# Initialize agent
agent = BasicAgent(model=model)
# Fetch questions
questions_url = f"{DEFAULT_API_URL}/questions"
submit_url = f"{DEFAULT_API_URL}/submit"
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
except Exception as e:
return f"Error fetching questions: {e}", None
# Run agent on all questions
results_log = []
answers_payload = []
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:
continue
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})
if not answers_payload:
return "Agent did not produce any answers to submit.", pd.DataFrame(results_log)
# Prepare submission
space_id = os.getenv("SPACE_ID", "your_space_id_here") # optional fallback
agent_code = f"https://huggingface.co/spaces/{space_id}/tree/main"
submission_data = {"username": username.strip(), "agent_code": agent_code, "answers": answers_payload}
# Submit
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 Interface ---
with gr.Blocks() as demo:
gr.Markdown("# Basic Agent Evaluation Runner")
gr.Markdown("""
**Instructions:**
1. Login with your Hugging Face account.
2. Click 'Run Evaluation & Submit All Answers' to fetch questions, run your agent, and submit.
""")
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,
inputs=(),
outputs=[status_output, results_table]
)
if __name__ == "__main__":
demo.launch(debug=True, share=False)