File size: 3,327 Bytes
61e2bd8
808bca2
 
 
 
61e2bd8
808bca2
 
61e2bd8
808bca2
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
61e2bd8
808bca2
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
c36ad5a
808bca2
 
 
 
 
 
 
 
 
c36ad5a
808bca2
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
61e2bd8
808bca2
 
c36ad5a
808bca2
 
 
 
 
 
 
 
61e2bd8
808bca2
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
import os
import requests
from duckduckgo_search import DDGS
import pandas as pd
import io

# This is the base URL for the competition API, used to construct file URLs.
GAIA_API_URL = "https://agents-course-unit4-scoring.hf.space"

def web_search(query: str) -> str:
    """
    Performs a web search using the DuckDuckGo search engine and returns the top results.
    Use this to find current information, facts, or to answer general knowledge questions.
    
    Args:
        query (str): The search query.
        
    Returns:
        str: A formatted string of the search results.
    """
    print(f"Tool: Performing web search for '{query}'...")
    try:
        with DDGS() as ddgs:
            results = [r for r in ddgs.text(query, max_results=5)]
            return "\n".join([f"[{i+1}] {r['title']}: {r['body']}" for i, r in enumerate(results)]) if results else "No results found."
    except Exception as e:
        return f"Error during web search: {e}"

def read_file_from_api(task_id: str) -> str:
    """
    Downloads and reads the content of a file associated with a specific task_id from the GAIA competition API.
    Only use this tool when the user's question explicitly mentions a file or attachment.
    
    Args:
        task_id (str): The task ID associated with the file to download.
        
    Returns:
        str: The content of the file as a string, or an error message.
    """
    print(f"Tool: Reading file for task_id '{task_id}'...")
    file_url = f"{GAIA_API_URL}/files/{task_id}"
    try:
        response = requests.get(file_url, timeout=10)
        response.raise_for_status()
        # We assume the content is text-based (txt, csv, json, etc.) for direct reading
        return response.text
    except requests.exceptions.RequestException as e:
        return f"Error reading file from API: {e}"

def python_interpreter(code: str) -> str:
    """
    Executes a given string of Python code and returns its standard output.
    This tool is highly useful for calculations, data manipulation (using pandas), or any complex logic.
    The code runs in a restricted environment. Only print the final result.
    It has access to the 'pandas' library (as pd).
    
    Args:
        code (str): A string containing valid Python code.
        
    Returns:
        str: The captured stdout from the executed code, or the error.
    """
    print(f"Tool: Executing Python code:\n---\n{code}\n---")
    # WARNING: Executing arbitrary code is a security risk.
    # In a real-world application, this should be done in a sandboxed environment.
    local_scope = {"pd": pd, "io": io}
    
    # Use a string stream to capture the output of 'print' statements
    string_stream = io.StringIO()
    
    try:
        # Redirect stdout to our string stream
        import sys
        original_stdout = sys.stdout
        sys.stdout = string_stream
        
        # Execute the code
        exec(code, {"__builtins__": __builtins__}, local_scope)
        
    except Exception as e:
        # Restore stdout and return the error
        sys.stdout = original_stdout
        print(f"Error executing python code: {e}")
        return f"Error: {type(e).__name__}: {e}"
    finally:
        # Always restore stdout
        sys.stdout = original_stdout
        
    return string_stream.getvalue()