File size: 4,618 Bytes
10e9b7d
 
eccf8e4
3c4371f
10e9b7d
4b78dea
 
 
3db6293
e80aab9
4b78dea
 
 
 
 
 
 
31243f4
 
4b78dea
 
 
 
 
31243f4
4b78dea
 
 
 
 
4021bf3
4b78dea
 
 
 
31243f4
4b78dea
 
31243f4
4b78dea
3c4371f
4b78dea
 
3c4371f
4b78dea
7e4a06b
4b78dea
31243f4
 
e80aab9
4b78dea
31243f4
 
 
4b78dea
 
36ed51a
3c4371f
4b78dea
eccf8e4
4b78dea
 
 
7d65c66
4b78dea
e80aab9
4b78dea
 
 
 
7d65c66
 
4b78dea
 
31243f4
 
4b78dea
31243f4
 
4b78dea
31243f4
4b78dea
 
 
 
 
 
 
 
 
 
31243f4
4b78dea
 
 
 
 
31243f4
 
4b78dea
31243f4
4b78dea
 
 
 
 
 
e80aab9
 
4b78dea
 
 
 
 
 
 
 
 
 
e80aab9
4b78dea
 
e80aab9
4b78dea
e80aab9
4b78dea
 
 
 
 
7d65c66
4b78dea
e80aab9
 
4b78dea
 
 
e80aab9
4b78dea
0ee0419
4b78dea
 
 
e80aab9
 
7e4a06b
4b78dea
e80aab9
4b78dea
 
e80aab9
4b78dea
31243f4
4b78dea
e80aab9
 
 
3c4371f
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
import os
import gradio as gr
import requests
import pandas as pd

# =====================================================
# Constants (DO NOT CHANGE)
# =====================================================
DEFAULT_API_URL = "https://agents-course-unit4-scoring.hf.space"


# =====================================================
# Agent Definition (THIS IS THE ONLY PART YOU EDIT)
# =====================================================
from agent import agent as gaia_agent


class BasicAgent:
    def __init__(self):
        """
        Initialize your GAIA agent here.
        """
        pass

    def __call__(self, question: str) -> str:
        """
        Required interface for HF Unit 4 scoring.
        """
        return gaia_agent(question, files=None)


# =====================================================
# Evaluation & Submission Logic (DO NOT CHANGE)
# =====================================================
def run_and_submit_all(profile: gr.OAuthProfile | None):
    """
    Fetches all GAIA questions, runs the agent, submits answers,
    and returns the official score.
    """
    space_id = os.getenv("SPACE_ID")

    if not profile:
        return "❌ Please log in with Hugging Face.", None

    username = profile.username
    api_url = DEFAULT_API_URL

    questions_url = f"{api_url}/questions"
    submit_url = f"{api_url}/submit"

    # 1. Load agent
    try:
        agent = BasicAgent()
    except Exception as e:
        return f"❌ Error initializing agent: {e}", None

    agent_code = f"https://huggingface.co/spaces/{space_id}/tree/main"

    # 2. Fetch questions
    try:
        resp = requests.get(questions_url, timeout=15)
        resp.raise_for_status()
        questions = resp.json()
    except Exception as e:
        return f"❌ Error fetching questions: {e}", None

    if not questions:
        return "❌ No questions returned.", None

    # 3. Run agent
    results_log = []
    answers_payload = []

    for item in questions:
        task_id = item.get("task_id")
        question_text = item.get("question")

        if not task_id or question_text is None:
            continue

        try:
            answer = agent(question_text)
            answers_payload.append({
                "task_id": task_id,
                "submitted_answer": answer
            })
            results_log.append({
                "Task ID": task_id,
                "Question": question_text,
                "Submitted Answer": answer
            })
        except Exception as e:
            results_log.append({
                "Task ID": task_id,
                "Question": question_text,
                "Submitted Answer": f"AGENT ERROR: {e}"
            })

    if not answers_payload:
        return "❌ Agent produced no answers.", pd.DataFrame(results_log)

    # 4. Submit
    submission = {
        "username": username.strip(),
        "agent_code": agent_code,
        "answers": answers_payload
    }

    try:
        resp = requests.post(submit_url, json=submission, timeout=180)
        resp.raise_for_status()
        result = resp.json()

        status = (
            f"βœ… Submission Successful\n"
            f"User: {result.get('username')}\n"
            f"Score: {result.get('score')}%\n"
            f"Correct: {result.get('correct_count')} / {result.get('total_attempted')}\n"
            f"Message: {result.get('message')}"
        )
        return status, pd.DataFrame(results_log)

    except requests.exceptions.HTTPError as e:
        detail = e.response.text
        try:
            detail = e.response.json().get("detail", detail)
        except Exception:
            pass
        return f"❌ Submission failed: {detail}", pd.DataFrame(results_log)

    except Exception as e:
        return f"❌ Unexpected error: {e}", pd.DataFrame(results_log)


# =====================================================
# Gradio Interface (DO NOT CHANGE)
# =====================================================
with gr.Blocks() as demo:
    gr.Markdown("# 🧠 HF Agents Course β€” Unit 4 Evaluation")
    gr.Markdown(
        "1. Log in with Hugging Face\n"
        "2. Click **Run Evaluation & Submit All Answers**\n"
        "3. Wait for your GAIA score"
    )

    gr.LoginButton()
    run_btn = gr.Button("Run Evaluation & Submit All Answers")

    status = gr.Textbox(label="Submission Result", lines=6, interactive=False)
    table = gr.DataFrame(label="Agent Output", wrap=True)

    run_btn.click(
        fn=run_and_submit_all,
        outputs=[status, table]
    )

if __name__ == "__main__":
    demo.launch(debug=True, share=False)