File size: 2,570 Bytes
70b0f89
 
c216f4b
 
70b0f89
c216f4b
 
 
 
 
 
 
 
 
70b0f89
 
c216f4b
70b0f89
 
 
 
 
c216f4b
 
 
 
70b0f89
 
c216f4b
70b0f89
 
 
 
 
c216f4b
 
 
 
70b0f89
 
c216f4b
70b0f89
 
 
 
 
 
c216f4b
 
 
 
70b0f89
 
 
 
 
 
 
 
 
 
 
 
 
 
 
c216f4b
 
 
 
 
 
 
 
 
70b0f89
 
c216f4b
70b0f89
 
 
c216f4b
70b0f89
 
 
 
c216f4b
70b0f89
 
 
c216f4b
 
 
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


import os
import requests
from smolagents import CodeAgent, tool, OpenAIServerModel

# ------------------------
# Constants
# ------------------------
API_URL = "https://agents-course-unit4-scoring.hf.space"

# ------------------------
# Tool definitions
# ------------------------

@tool
def fetch_questions() -> list:
    """
    Fetch the full list of GAIA evaluation questions.

    :return: A list of question dictionaries, each with 'task_id' and 'question'.
    """
    response = requests.get(f"{API_URL}/questions", timeout=15)
    response.raise_for_status()
    return response.json()


@tool
def fetch_random_question() -> dict:
    """
    Fetch a single random GAIA question.

    :return: A dict with keys 'task_id' and 'question'.
    """
    response = requests.get(f"{API_URL}/random-question", timeout=15)
    response.raise_for_status()
    return response.json()


@tool
def fetch_file(task_id: str) -> bytes:
    """
    Download a file associated with a given task_id.

    :param task_id: The ID of the GAIA task whose file you want to download.
    :return: The file content as raw bytes.
    """
    response = requests.get(f"{API_URL}/files/{task_id}", timeout=15)
    response.raise_for_status()
    return response.content


@tool
def submit_answers(
    username: str,
    agent_code: str,
    answers: list
) -> dict:
    """
    Submit the agent's answers to GAIA and return the scoring.

    :param username: Your Hugging Face username (identifies the submission).
    :param agent_code: URL to your HF Space code (for verification).
    :param answers: List of dicts each with 'task_id' and 'submitted_answer'.
    :return: A dict containing 'score', 'correct_count', 'total_attempted', 'message', etc.
    """
    payload = {
        "username": username,
        "agent_code": agent_code,
        "answers": answers
    }
    response = requests.post(f"{API_URL}/submit", json=payload, timeout=60)
    response.raise_for_status()
    return response.json()


def create_agent() -> CodeAgent:
    """
    Factory that returns a configured CodeAgent instance using OpenAI.

    Expects OPENAI_API_KEY in the environment.
    """
    openai_model = OpenAIServerModel(model_name="gpt-3.5-turbo")
    agent = CodeAgent(
        tools=[fetch_questions, fetch_random_question, fetch_file, submit_answers],
        model=openai_model,
        prompt_template=(
            "Here is a GAIA question:\n"
            "{question}\n"
            "Provide ONLY the exact answer (exact-match) with no extra text."
        )
    )
    return agent