File size: 3,031 Bytes
bece47b
9b5b26a
 
 
c19d193
6aae614
9b5b26a
 
bece47b
 
9aedbf9
c778676
 
ee43a34
c778676
 
ee43a34
1cb1525
 
c778676
 
1cb1525
c778676
1cb1525
 
c778676
 
 
1cb1525
c778676
1cb1525
 
c778676
1cb1525
c778676
 
 
 
 
1cb1525
 
c778676
9b5b26a
 
 
90dd6dc
9b5b26a
90dd6dc
9b5b26a
 
 
 
90dd6dc
9b5b26a
90dd6dc
8c01ffb
bece47b
8c01ffb
6aae614
90dd6dc
ae7a494
e121372
bece47b
 
 
13d500a
8c01ffb
90dd6dc
 
 
 
 
 
 
 
bece47b
 
 
8c01ffb
8fe992b
4982450
 
90dd6dc
c778676
9aedbf9
4982450
90dd6dc
8c01ffb
90dd6dc
8fe992b
 
bece47b
 
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
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

# --- FERRAMENTAS PERSONALIZADAS ---

@tool
def get_time_diff_between_timezones(timezone_a: str, timezone_b: str) -> str:
    """Calcula a diferença de horas entre duas timezones quaisquer.
    Args:
        timezone_a: A primeira timezone (ex: 'Europe/Lisbon').
        timezone_b: A segunda timezone para comparar (ex: 'Asia/Tokyo').
    """
    try:
        # Definir as timezones
        tz_a = pytz.timezone(timezone_a)
        tz_b = pytz.timezone(timezone_b)
        
        # Obter a data atual
        now = datetime.datetime.now()
        
        # Calcular os offsets em relação ao UTC
        offset_a = tz_a.localize(now).utcoffset().total_seconds() / 3600
        offset_b = tz_b.localize(now).utcoffset().total_seconds() / 3600
        
        diff = offset_a - offset_b
        
        if diff == 0:
            return f"Não há diferença horária entre {timezone_a} e {timezone_b}."
        
        # Lógica para explicar a diferença de forma humana
        if diff > 0:
            return f"{timezone_a} está {abs(diff)} horas à frente de {timezone_b}."
        else:
            return f"{timezone_a} está {abs(diff)} horas atrás de {timezone_b}."

    except Exception as e:
        return f"Erro ao calcular a diferença entre {timezone_a} e {timezone_b}: {str(e)}"

@tool
def get_current_time_in_timezone(timezone: str) -> str:
    """Busca a hora local atual numa timezone específica.
    Args:
        timezone: Uma string de timezone válida (ex: 'Europe/Lisbon').
    """
    try:
        tz = pytz.timezone(timezone)
        local_time = datetime.datetime.now(tz).strftime("%Y-%m-%d %H:%M:%S")
        return f"A hora atual em {timezone} é: {local_time}"
    except Exception as e:
        return f"Erro ao obter a hora para '{timezone}': {str(e)}"

# --- INICIALIZAÇÃO ---

final_answer = FinalAnswerTool()
search_tool = DuckDuckGoSearchTool() 

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

# RECOMENDAÇÃO: Se o ficheiro prompts.yaml estiver a causar o KeyError 'final_answer', 
# o melhor é não o carregar até que o ficheiro esteja corrigido.
prompt_templates = None
try:
    with open("prompts.yaml", 'r') as stream:
        prompt_templates = yaml.safe_load(stream)
except Exception:
    print("Aviso: prompts.yaml não encontrado ou inválido. Usando templates padrão.")

# --- CRIAÇÃO DO AGENTE ---

agent = CodeAgent(
    model=model,
    tools=[
        final_answer, 
        search_tool,      
        get_time_diff_between_timezones, # Substitui a antiga por esta
        get_current_time_in_timezone
    ], 
    max_steps=10, 
    verbosity_level=1,
    prompt_templates=prompt_templates if prompt_templates else None 
)

if __name__ == "__main__":
    GradioUI(agent).launch()