pathmohd123's picture
Update app.py
f63b186 verified
raw
history blame
5.21 kB
import os
import json
import requests
import traceback
import gradio as gr
import pandas as pd
from typing import Optional
from dotenv import load_dotenv
from huggingface_hub import InferenceClient
# ──────────────── Load Environment ────────────────
load_dotenv()
hf_token = os.getenv("HF_TOKEN")
DEFAULT_API_URL = "https://agents-course-unit4-scoring.hf.space"
MODEL_ID = "mistralai/Mistral-7B-Instruct-v0.1"
# ──────────────── Load Inference Client ────────────────
try:
client = InferenceClient(model=MODEL_ID, token=hf_token)
except Exception as e:
raise RuntimeError(f"Model loading failed: {e}")
# ──────────────── Agent Class ────────────────
class MistralAgent:
def __init__(self):
print("βœ… MistralAgent (Inference API) initialized.")
def __call__(self, question: str) -> str:
try:
prompt = f"[INST] {question.strip()} [/INST]"
response = client.text_generation(prompt, max_new_tokens=100, temperature=0.0, do_sample=False)
return response.strip()
except Exception as e:
return f"LLM Error: {e}"
# ──────────────── API Helpers ────────────────
def get_all_questions(api_url: str) -> list[dict]:
resp = requests.get(f"{api_url}/questions", timeout=15)
resp.raise_for_status()
return resp.json()
def submit_answers(api_url: str, username: str, code_link: str, answers: list[dict]) -> dict:
payload = {
"username": username,
"agent_code": code_link,
"answers": answers
}
resp = requests.post(f"{api_url}/submit", json=payload, timeout=60)
resp.raise_for_status()
return resp.json()
# ──────────────── Gradio Evaluation Logic ────────────────
def run_and_submit_all(profile: Optional[gr.OAuthProfile]):
if not profile:
return "❌ Please log in to Hugging Face using the button above.", None
username = profile.username.strip()
space_id = os.getenv("SPACE_ID", "")
code_link = f"https://huggingface.co/spaces/{space_id}/tree/main" if space_id else ""
try:
agent = MistralAgent()
except Exception as e:
return f"❌ Error initializing agent: {e}", None
try:
questions_data = get_all_questions(DEFAULT_API_URL)
except Exception as e:
return f"❌ Failed to load questions: {e}", None
answers_payload = []
results_log = []
for item in questions_data:
task_id = item.get("task_id")
question_text = item.get("question", "")
if not task_id or not question_text:
continue
try:
submitted_answer = agent(question_text)
except Exception as e:
submitted_answer = f"AGENT ERROR: {e}"
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 "❌ No answers submitted.", pd.DataFrame(results_log)
try:
result_data = submit_answers(DEFAULT_API_URL, username, code_link, answers_payload)
except requests.exceptions.HTTPError as e:
try:
detail = e.response.json().get("detail", e.response.text)
except Exception:
detail = e.response.text
return f"❌ Submission Failed: HTTP {e.response.status_code}. Detail: {detail}", pd.DataFrame(results_log)
except Exception as e:
return f"❌ Submission Error: {e}", pd.DataFrame(results_log)
score = result_data.get("score", "N/A")
correct_count = result_data.get("correct_count", "?")
total = result_data.get("total_attempted", "?")
message = result_data.get("message", "")
final_status = (
f"βœ… Submission Successful!\n"
f"User: {username}\n"
f"Score: {score}% ({correct_count}/{total} correct)\n"
f"Message: {message}"
)
return final_status, pd.DataFrame(results_log)
# ──────────────── Gradio UI ────────────────
with gr.Blocks() as demo:
gr.Markdown("# 🧠 Mistral-7B Agent Evaluation (via Inference API)")
gr.Markdown(
"""
**Instructions:**
1. Copy this Space and define your own agent logic.
2. Log in with your Hugging Face account.
3. Click β€œRun Evaluation & Submit All Answers” to test and submit.
"""
)
gr.LoginButton()
run_button = gr.Button("Run Evaluation & Submit All Answers")
status_output = gr.Textbox(label="Status", lines=5, interactive=False)
results_table = gr.DataFrame(label="Agent Answers", wrap=True)
run_button.click(fn=run_and_submit_all, inputs=[], outputs=[status_output, results_table])
if __name__ == "__main__":
print("Launching Gradio Interface...")
demo.launch(debug=True, server_name="0.0.0.0", server_port=7860)