File size: 2,775 Bytes
c8dc912
72e14cc
c8dc912
72e14cc
 
 
c8dc912
72e14cc
 
 
c8dc912
72e14cc
c8dc912
 
 
72e14cc
c8dc912
72e14cc
c8dc912
72e14cc
 
 
c8dc912
 
72e14cc
 
c8dc912
72e14cc
c8dc912
 
72e14cc
 
 
c8dc912
72e14cc
c8dc912
 
72e14cc
 
c8dc912
72e14cc
c8dc912
 
72e14cc
 
c8dc912
72e14cc
c8dc912
 
72e14cc
 
c8dc912
72e14cc
c8dc912
72e14cc
 
c8dc912
72e14cc
 
c8dc912
72e14cc
 
 
c8dc912
72e14cc
 
 
c8dc912
72e14cc
c8dc912
72e14cc
 
 
 
 
 
c8dc912
 
72e14cc
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
c8dc912
72e14cc
 
 
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
import os
import datetime
import requests
import pytz
import yaml
from typing import List

from langchain.text_splitter import CharacterTextSplitter
from tools.final_answer import FinalAnswerTool
from smolagents import CodeAgent, LiteLLMModel, DuckDuckGoSearchTool, load_tool, tool

# === TOOLS ===

@tool
def web_search(query: str) -> str:
    """Allows search through DuckDuckGo.
    Args:
        query: what you want to search
    """
    search_tool = DuckDuckGoSearchTool()
    results = search_tool(query)
    return "\n".join(results)

@tool
def get_current_time_in_timezone(timezone: str) -> str:
    """Fetches the current local time in a specified timezone.
    Args:
        timezone: A string representing a valid timezone (e.g., 'America/New_York').
    """
    try:
        tz = pytz.timezone(timezone)
        local_time = datetime.datetime.now(tz).strftime("%Y-%m-%d %H:%M:%S")
        return f"The current local time in {timezone} is: {local_time}"
    except Exception as e:
        return f"Error fetching time for timezone '{timezone}': {str(e)}"

@tool
def visit_webpage(url: str) -> str:
    """Fetches raw HTML content of a web page.
    Args:
        url: The url of the webpage.
    """
    try:
        response = requests.get(url, timeout=5)
        return response.text[:5000]  # Limit length
    except Exception as e:
        return f"[ERROR fetching {url}]: {str(e)}"

@tool
def text_splitter(text: str) -> List[str]:
    """Splits text into chunks using LangChain's CharacterTextSplitter.
    Args:
        text: A string of text to split.
    """
    splitter = CharacterTextSplitter(chunk_size=450, chunk_overlap=10)
    return splitter.split_text(text)

# === FINAL ANSWER TOOL ===
final_answer = FinalAnswerTool()

# === LOAD PROMPT TEMPLATES ===
with open("prompts.yaml", "r") as stream:
    prompt_templates = yaml.safe_load(stream)

# === LOAD agent.json CONFIG ===
with open("agent.json", "r") as f:
    agent_config = yaml.safe_load(f)

model_config = agent_config["model"]["data"]

# === BUILD MODEL ===
model = LiteLLMModel(
    model_id="gemini/gemini-2.0-flash-lite",
    api_key=os.getenv("GEMINI_API_KEY"),
    temperature=0.5,
    max_tokens=1024,
)

# === IMPORT TOOL FROM HUB ===
image_generation_tool = load_tool("agents-course/text-to-image", trust_remote_code=True)

# === BUILD AGENT ===
agent = CodeAgent(
    model=model,
    tools=[
        final_answer,
        web_search,
        get_current_time_in_timezone,
        visit_webpage,
        text_splitter,
        image_generation_tool
    ],
    max_steps=6,
    verbosity_level=1,
    grammar=None,
    planning_interval=None,
    name=None,
    description=None,
    prompt_templates=prompt_templates
)

# === EXPORT AGENT ===
def get_agent():
    return agent