File size: 4,844 Bytes
bc26476
9b5b26a
 
 
c19d193
6aae614
9b5b26a
 
bc26476
9b5b26a
50584ea
 
 
 
 
 
 
9b5b26a
50584ea
 
 
 
9b5b26a
 
50584ea
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
9b5b26a
50584ea
8c01ffb
bc26476
 
 
 
 
 
 
 
 
 
 
8c01ffb
bc26476
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
ae7a494
bc26476
 
 
 
ae7a494
bc26476
e121372
bc26476
 
 
 
13d500a
8c01ffb
bc26476
861422e
 
9b5b26a
bc26476
8c01ffb
8fe992b
50584ea
8c01ffb
 
 
 
 
 
861422e
8fe992b
 
bc26476
8c01ffb
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
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
from smolagents import CodeAgent, DuckDuckGoSearchTool, HfApiModel, load_tool, tool
import datetime
import requests
import pytz
import yaml
from tools.final_answer import FinalAnswerTool
from Gradio_UI import GradioUI

# Custom Tools
@tool
def convert_time_between_timezones(
    time_str: str,
    from_tz: str,
    to_tz: str,
    time_format: str = "%Y-%m-%d %H:%M:%S"
) -> str:
    """Converts a time between two timezones, handling DST automatically.
    Args:
        time_str: The time string to convert (e.g., '2023-12-25 16:00:00')
        from_tz: Source timezone (e.g., 'Europe/Madrid', 'UTC+2', 'America/Mexico_City')
        to_tz: Target timezone (e.g., 'America/Sao_Paulo', 'UTC-3')
        time_format: Format of input/output time strings
    """
    try:
        # Handle UTC offsets (like 'UTC+2')
        if from_tz.startswith('UTC'):
            from_tz = f'Etc/GMT{-int(from_tz[3:])}' if '+' in from_tz else f'Etc/GMT{+int(from_tz[3:])}'
        if to_tz.startswith('UTC'):
            to_tz = f'Etc/GMT{-int(to_tz[3:])}' if '+' in to_tz else f'Etc/GMT{+int(to_tz[3:])}'

        # Get timezone objects
        from_zone = pytz.timezone(from_tz)
        to_zone = pytz.timezone(to_tz)
        
        # Parse time (naive) and localize to source timezone
        naive_time = datetime.datetime.strptime(time_str, time_format)
        localized_time = from_zone.localize(naive_time)
        
        # Convert to target timezone
        converted_time = localized_time.astimezone(to_zone)
        
        # Get current UTC offsets to show the difference
        from_offset = localized_time.strftime('%z')
        to_offset = converted_time.strftime('%z')
        
        return (f"{localized_time.strftime(time_format)} {from_tz} ({from_offset}) "
                f"is {converted_time.strftime(time_format)} {to_tz} ({to_offset})")
    
    except pytz.UnknownTimeZoneError as e:
        common_tz = {
            'Spain': 'Europe/Madrid',
            'São Paulo': 'America/Sao_Paulo',
            'SP': 'America/Sao_Paulo',
            'Paulo, Mexico': 'America/Mexico_City',
            'CEST': 'Europe/Madrid',  # Central European Summer Time
            'CET': 'Europe/Paris',    # Central European Time
            'BRT': 'America/Sao_Paulo'
        }
        if e.args[0] in common_tz:
            return f"Note: Using '{common_tz[e.args[0]]}' for '{e.args[0]}'.\n" + \
                   convert_time_between_timezones(time_str, common_tz[e.args[0]], to_tz, time_format)
        return f"Error: Unknown timezone - {str(e)}. Common timezones: Europe/Madrid, America/Sao_Paulo, etc."
    except Exception as e:
        return f"Error converting time: {str(e)}"

@tool
def weather_lookup(city: str) -> str:
    """Fetches current weather conditions for a specified city.
    Args:
        city: The city name to get weather for (e.g., 'Paris, France')
    """
    try:
        response = requests.get(f"https://wttr.in/{city}?format=%C+%t")
        return f"Weather in {city}: {response.text}"
    except Exception as e:
        return f"Error fetching weather: {str(e)}"

@tool
def unit_converter(value: float, from_unit: str, to_unit: str) -> str:
    """Converts between different units (length, weight, temperature).
    Args:
        value: The numerical value to convert
        from_unit: The unit to convert from (e.g., 'miles')
        to_unit: The unit to convert to (e.g., 'kilometers')
    """
    # Simplified conversion examples
    conversions = {
        ('miles', 'kilometers'): lambda x: x * 1.60934,
        ('fahrenheit', 'celsius'): lambda x: (x - 32) * 5/9,
        ('pounds', 'kilograms'): lambda x: x * 0.453592
    }
    try:
        if (from_unit, to_unit) in conversions:
            result = conversions[(from_unit, to_unit)](value)
            return f"{value} {from_unit} = {result:.2f} {to_unit}"
        return f"Conversion from {from_unit} to {to_unit} not supported"
    except Exception as e:
        return f"Conversion error: {str(e)}"

# Initialize tools
final_answer = FinalAnswerTool()
duckduckgo_search = DuckDuckGoSearchTool()
image_generation_tool = load_tool("agents-course/text-to-image", trust_remote_code=True)

# Initialize model
model = HfApiModel(
    max_tokens=2096,
    temperature=0.5,
    model_id='Qwen/Qwen2.5-Coder-32B-Instruct',
    custom_role_conversions=None,
)

# Load system prompt
with open("prompts.yaml", 'r') as stream:
    prompt_templates = yaml.safe_load(stream)
    
# Create agent with all tools
agent = CodeAgent(
    model=model,
    tools=[final_answer, duckduckgo_search, image_generation_tool, convert_time_between_timezones],
    max_steps=6,
    verbosity_level=1,
    grammar=None,
    planning_interval=None,
    name=None,
    description=None,
    prompt_templates=prompt_templates
)

# Launch the interface
GradioUI(agent).launch()