dlaima's picture
Update app.py
b935165 verified
raw
history blame
7.08 kB
import os
import gradio as gr
import requests
import pandas as pd
import re
from smolagents import CodeAgent, DuckDuckGoSearchTool
from smolagents.models import OpenAIServerModel
SYSTEM_PROMPT = """You are a general AI assistant. Reason step by step, then finish with:
FINAL ANSWER: [YOUR FINAL ANSWER]
Answer rules:
- Numbers: no commas, units, or extra words. Just digits.
- Strings: lowercase, no articles or abbreviations.
- Lists: comma-separated, following the above.
Examples:
Q: What is 12 + 7?
A: 12 + 7 = 19
FINAL ANSWER: 19
Q: Name three European capital cities.
A: They are Amsterdam, Berlin, and Rome.
FINAL ANSWER: amsterdam, berlin, rome
Q: What is the square root of 81?
A: \u221a81 = 9
FINAL ANSWER: 9
Now answer the following:
"""
DEFAULT_API_URL = "https://agents-course-unit4-scoring.hf.space"
class PatchedOpenAIServerModel(OpenAIServerModel):
def generate(self, messages, stop_sequences=None, **kwargs):
if isinstance(messages, list):
if not any(m["role"] == "system" for m in messages):
messages = [{"role": "system", "content": SYSTEM_PROMPT}] + messages
else:
raise TypeError("Expected 'messages' to be a list of message dicts")
return super().generate(messages=messages, stop_sequences=stop_sequences, **kwargs)
class MyAgent:
def __init__(self):
self.model = PatchedOpenAIServerModel(model_id="gpt-4")
self.agent = CodeAgent(tools=[DuckDuckGoSearchTool()], model=self.model)
def __call__(self, question: str) -> str:
return self.agent.run(question)
def extract_final_answer(output: str) -> str:
if "FINAL ANSWER:" in output:
return output.split("FINAL ANSWER:")[-1].strip().rstrip('.')
return output.strip()
def sanitize_answer(ans: str) -> str:
ans = re.sub(r'\$|%|,', '', ans)
ans = ans.strip().rstrip('.')
return ans
def run_and_submit_all(profile: gr.OAuthProfile | None):
space_id = os.getenv("SPACE_ID")
if profile:
username = profile.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 = MyAgent()
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}")
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:
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 = []
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:
continue
try:
raw_output = agent(question_text)
extracted = extract_final_answer(raw_output)
submitted_answer = sanitize_answer(extracted)
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 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)
with gr.Blocks() as demo:
gr.Markdown("# Basic Agent Evaluation Runner")
gr.Markdown("""
**Instructions:**
1. Clone this space, modify code to define your agent's logic, tools, and packages.
2. Log in to your Hugging Face account using the button below.
3. Click 'Run Evaluation & Submit All Answers' to fetch questions, run your agent, submit answers, and see your score.
**Note:** Submitting can take some time.
""")
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 environment variable not found (running locally?).")
if space_id:
print(f"✅ SPACE_ID found: {space_id}")
print(f" Repo URL: https://huggingface.co/spaces/{space_id}")
print(f" Repo Tree URL: https://huggingface.co/spaces/{space_id}/tree/main")
else:
print("ℹ️ SPACE_ID environment variable not found (running locally?).")
print("-"*(60 + len(" App Starting ")) + "\n")
print("Launching Gradio Interface for Basic Agent Evaluation...")
demo.launch(debug=True, share=False)