File size: 2,600 Bytes
c216f4b
 
70b0f89
c216f4b
 
 
 
 
 
 
 
 
70b0f89
c216f4b
70b0f89
 
 
434f948
70b0f89
d3f09f9
 
 
70b0f89
 
c216f4b
70b0f89
 
 
434f948
70b0f89
d3f09f9
 
 
70b0f89
 
c216f4b
70b0f89
d3f09f9
70b0f89
434f948
 
70b0f89
d3f09f9
 
 
70b0f89
 
 
 
 
 
 
 
434f948
70b0f89
434f948
 
 
 
70b0f89
c216f4b
 
 
 
 
d3f09f9
 
 
70b0f89
 
c216f4b
434f948
 
 
 
c216f4b
434f948
70b0f89
 
434f948
c216f4b
70b0f89
 
434f948
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
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: List of question dicts, each containing 'task_id' and 'question'.
    """
    resp = requests.get(f"{API_URL}/questions", timeout=15)
    resp.raise_for_status()
    return resp.json()

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

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

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

    :param task_id: The GAIA task ID whose file should be downloaded.
    :return: Raw bytes of the file content.
    """
    resp = requests.get(f"{API_URL}/files/{task_id}", timeout=15)
    resp.raise_for_status()
    return resp.content

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

    :param username: Hugging Face username for submission identification.
    :param agent_code: URL linking to the code repository of this Space.
    :param answers: List of dicts, each with 'task_id' and 'submitted_answer'.
    :return: Dict with keys 'username', 'score', 'correct_count', 'total_attempted', 'message', etc.
    """
    payload = {
        "username": username,
        "agent_code": agent_code,
        "answers": answers
    }
    resp = requests.post(f"{API_URL}/submit", json=payload, timeout=60)
    resp.raise_for_status()
    return resp.json()

def create_agent() -> CodeAgent:
    """
    Factory that initializes and returns a configured CodeAgent using OpenAI GPT-3.5-turbo.
    Expects OPENAI_API_KEY set in the environment.

    :return: Configured CodeAgent instance.
    """
    model = OpenAIServerModel(model_name="gpt-3.5-turbo")
    agent = CodeAgent(
        tools=[fetch_questions, fetch_random_question, fetch_file, submit_answers],
        model=model,
        prompt_template=(
            "Here is a GAIA question:\n"
            "{question}\n"
            "Provide only the exact answer (exact-match), with no additional explanation."
        )
    )
    return agent