File size: 5,064 Bytes
10e9b7d
 
eccf8e4
3c4371f
e80aab9
9fa0d97
 
 
 
405550e
9fa0d97
 
e283efe
7986740
 
 
 
 
 
 
 
 
31243f4
 
405550e
 
 
 
a088572
 
b3fb03d
 
405550e
9fa0d97
 
7986740
a088572
0d2c0c6
7986740
 
 
405550e
7986740
e283efe
7986740
 
e283efe
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
import os
import gradio as gr
import requests
import pandas as pd

from smolagents import (
    CodeAgent,
    DuckDuckGoSearchTool,
    WikipediaSearchTool,
    LiteLLMModel,
)

DEFAULT_API_URL = "https://agents-course-unit4-scoring.hf.space"

GAIA_SYSTEM_PROMPT = """You are a general AI assistant. I will ask you a question. Report your thoughts, and finish your answer with the following template:
FINAL ANSWER: [YOUR FINAL ANSWER].
YOUR FINAL ANSWER should be a number OR as few words as possible OR a comma separated list of numbers and/or strings.
If you are asked for a number, don't use commas to write your number, and don't use units such as $ or percent sign unless specified otherwise.
If you are asked for a string, don't use articles, don't use abbreviations (e.g. for cities), and write the digits in plain text unless specified otherwise.
If you are asked for a comma separated list, apply the above rules depending on whether the element to be put in the list is a number or a string."""


class BasicAgent:
    def __init__(self):
        api_key = os.getenv("GEMINI_API_KEY")
        print(f"[BasicAgent] GEMINI_API_KEY loaded: {bool(api_key)}, length: {len(api_key) if api_key else 0}")
        if not api_key:
            raise RuntimeError("GEMINI_API_KEY is not set. Add it in Settings → Variables and secrets, then Factory rebuild.")
        self.agent = CodeAgent(
            tools=[DuckDuckGoSearchTool(), WikipediaSearchTool()],
            model=LiteLLMModel(
                model_id="gemini/gemini-2.0-flash",
                api_key=api_key,
            ),
            max_steps=12,
            additional_authorized_imports=["pandas", "numpy", "datetime", "re", "json", "math"],
        )

    def __call__(self, question: str) -> str:
        try:
            raw = str(self.agent.run(f"{GAIA_SYSTEM_PROMPT}\n\nQuestion: {question}"))
            print(f"[Agent raw, first 300]: {raw[:300]}")
            if "FINAL ANSWER:" in raw:
                return raw.split("FINAL ANSWER:")[-1].strip().rstrip(".").strip()
            return raw.strip()
        except Exception as e:
            err = f"ERR: {type(e).__name__}: {str(e)[:200]}"
            print(f"[Agent exception]: {err}")
            return err


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:
        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:
        return f"Error initializing agent: {e}", None

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

    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

    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)

    submission_data = {"username": username.strip(), "agent_code": agent_code, "answers": answers_payload}

    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)


with gr.Blocks() as demo:
    gr.Markdown("# Basic Agent Evaluation Runner")
    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__":
    demo.launch(debug=True, share=False)