|
|
from smolagents import CodeAgent, DuckDuckGoSearchTool, HfApiModel, VisitWebpageTool, PythonInterpreterTool, LiteLLMModel, tool |
|
|
from tools.wiki_tool import WikiTool |
|
|
from tools.excel_analysis_tool import ExcelAnalysisTool |
|
|
import os |
|
|
import requests |
|
|
import re |
|
|
import tempfile |
|
|
from pathlib import Path |
|
|
from typing import Optional |
|
|
|
|
|
@tool |
|
|
def check_answer(answer: str) -> str: |
|
|
""" |
|
|
Reviews the answer to check that it meets the requirements specified by the user and modifies it if necessary. |
|
|
Args: |
|
|
answer (str): The answer fo the Agent. |
|
|
Returns: |
|
|
str: The final answer. |
|
|
""" |
|
|
return answer |
|
|
|
|
|
@tool |
|
|
def reverse_sentence_tool(reverse_sentence: str) -> str: |
|
|
""" |
|
|
This tool receives a sentence where both the word order and the characters in each word are reversed. |
|
|
It returns the sentence with words and order corrected. |
|
|
Args: |
|
|
reverse_sentence: A sentence with reversed words and reversed word order. |
|
|
Returns: |
|
|
A sentence in natural reading order. |
|
|
""" |
|
|
inverted_words = reverse_sentence.split(" ")[::-1] |
|
|
correct_words = [word[::-1] for word in inverted_words] |
|
|
|
|
|
return " ".join(correct_words) |
|
|
|
|
|
@tool |
|
|
def download_file_if_any(base_api_url: str, task_id: str) -> Optional[str]: |
|
|
""" |
|
|
Downloads a file from a remote API using a task ID. |
|
|
|
|
|
Args: |
|
|
base_api_url (str): Base URL of the API to fetch files from (e.g., "https://example.com/api"). |
|
|
task_id (str): Task identifier used to locate the file. |
|
|
|
|
|
Returns: |
|
|
Optional[str]: Path to the downloaded file, or None if the file is not found (404). |
|
|
""" |
|
|
url = f"{base_api_url}/files/{task_id}" |
|
|
try: |
|
|
resp = requests.get(url, timeout=30) |
|
|
if resp.status_code == 404: |
|
|
return None |
|
|
resp.raise_for_status() |
|
|
except requests.exceptions.HTTPError as e: |
|
|
raise e |
|
|
|
|
|
|
|
|
cdisp = resp.headers.get("content-disposition", "") |
|
|
filename = task_id |
|
|
if "filename=" in cdisp: |
|
|
match = re.search(r'filename="([^"]+)"', cdisp) |
|
|
if match: |
|
|
filename = match.group(1) |
|
|
|
|
|
tmp_dir = Path(tempfile.gettempdir()) / "gaia_files" |
|
|
tmp_dir.mkdir(parents=True, exist_ok=True) |
|
|
file_path = tmp_dir / filename |
|
|
|
|
|
with open(file_path, "wb") as f: |
|
|
f.write(resp.content) |
|
|
|
|
|
return str(file_path) |
|
|
|
|
|
def create_agent(): |
|
|
""" |
|
|
Creates and configures the CodeAgent with the necessary model and tools. |
|
|
|
|
|
Returns: |
|
|
CodeAgent: The configured agent instance. |
|
|
""" |
|
|
|
|
|
token = os.getenv("HF_API_KEY") |
|
|
if not token: |
|
|
raise RuntimeError("Missing Hugging Face API key. Set HF_API_KEY environment variable.") |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
model = LiteLLMModel( |
|
|
token=token, |
|
|
model_id="gemini/gemini-2.0-flash", |
|
|
api_key=os.getenv("GEMINI_API_KEY"), |
|
|
) |
|
|
|
|
|
|
|
|
wiki_tool = WikiTool() |
|
|
web_search_tool = DuckDuckGoSearchTool() |
|
|
excel_analysis_tool = ExcelAnalysisTool() |
|
|
visitWebpageTool = VisitWebpageTool() |
|
|
python_interpreter_tool = PythonInterpreterTool() |
|
|
|
|
|
|
|
|
agent = CodeAgent( |
|
|
model=model, |
|
|
tools=[wiki_tool, web_search_tool, excel_analysis_tool, visitWebpageTool, python_interpreter_tool, check_answer, reverse_sentence_tool, download_file_if_any], |
|
|
add_base_tools=True, |
|
|
max_steps=8, |
|
|
verbosity_level=2, |
|
|
additional_authorized_imports=['numpy','subprocess', 're', 'pandas', 'requests', 'json', 'os', 'pathlib', 'tempfile'], |
|
|
) |
|
|
return agent |
|
|
|
|
|
|
|
|
if __name__ == "__main__": |
|
|
agent = create_agent() |
|
|
print("Agent created with tools:", [tool.name for tool in agent.tools]) |
|
|
|