File size: 4,296 Bytes
878d0d3
668a282
9b5b26a
 
c19d193
6aae614
8fe992b
c118378
 
9b5b26a
 
878d0d3
9b5b26a
878d0d3
 
9b5b26a
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
8c01ffb
 
c118378
8a46751
c118378
 
 
19a8d54
c118378
 
8a46751
c118378
 
 
 
 
 
5ffc0c2
c118378
 
 
 
 
 
 
19a8d54
 
c118378
 
 
 
 
 
 
 
 
8a46751
c118378
 
 
8a46751
c118378
 
8a46751
c118378
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
6aae614
e121372
bf6d34c
 
878d0d3
fe328e0
13d500a
8c01ffb
 
9b5b26a
 
8c01ffb
861422e
 
9b5b26a
8c01ffb
8fe992b
c118378
8c01ffb
 
 
 
 
 
861422e
8fe992b
 
9b5b26a
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
132
133
134
135
136
137
138
from smolagents import CodeAgent, DuckDuckGoSearchTool, HfApiModel, load_tool, tool
from datetime import datetime
import requests
import pytz
import yaml
from tools.final_answer import FinalAnswerTool

import xml.etree.ElementTree as ET

from Gradio_UI import GradioUI

# Below is an example of a tool that does nothing. Amaze us with your creativity!
@tool
def my_custom_tool(arg1:str, arg2:int)-> str: # it's important to specify the return type
    # Keep this format for the tool description / args description but feel free to modify the tool
    """A tool that does nothing yet 
    Args:
        arg1: the first argument
        arg2: the second argument
    """
    return "What magic will you build ?"

@tool
def get_current_time_in_timezone(timezone: str) -> str:
    """A tool that fetches the current local time in a specified timezone.
    Args:
        timezone: A string representing a valid timezone (e.g., 'America/New_York').
    """
    try:
        # Create timezone object
        tz = pytz.timezone(timezone)
        # Get current time in that 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 get_city_id(city_name: str) -> str:
    """A tool that get city ID from city name.

    Args:
        city_name:  The city name that you want to get city id written in Japanese.

    Returns:
        city_id as string. If not get, return None.
    """

    # XMLのURL
    xml_url = "https://weather.tsukumijima.net/primary_area.xml"

    try:
        response = requests.get(xml_url)
        response.raise_for_status()
        response.encoding = response.apparent_encoding
        xml_string = response.text

        root = ET.fromstring(xml_string)
        for city in root.findall('.//city'):
            if city.get('title') == city_name:
                city_id = city.get('id')
                return f"city_id is {city_id}"
        return None
    except requests.exceptions.RequestException as e:
        print(f"Error during request: {e}")
        return None
    except ET.ParseError as e:
        print(f"Error parsing XML: {e}")
        return None

@tool
def get_weather(city_id: str) -> str:
    """Get city weather forecast from city id.

    Args:
        city_id: A string that represent city id. (e.g., 140010)

    Returns:
        Weather forecast message
    """
    try:
        url = f"https://weather.tsukumijima.net/api/forecast?city={city_id}"
        response = requests.get(url)
        response.raise_for_status()

        data_json = response.json()

        # 今日の予報を取得 (forecasts[0])
        date_str = data_json["forecasts"][0]["date"]
        date = datetime.strptime(date_str, "%Y-%m-%d").strftime("%Y年%m月%d日")
        title = data_json["title"]
        weather = data_json["forecasts"][0]["telop"]

        # 明日の予報を取得 (forecasts[1])
        weather2 = data_json["forecasts"][1]["telop"]
        
        results = f"{date}{title}{weather}です。明日は{weather2}でしょう。"
        return results
    
    except requests.exceptions.RequestException as e:
        return f"天気情報の取得に失敗しました: {e}"
        
    except KeyError as e:
        return f"予期しないデータ形式です: {e}"
    except TypeError as e:
        return f"気温データが取得できませんでした: {e}"


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


# Import tool from Hub
image_generation_tool = load_tool("agents-course/text-to-image", trust_remote_code=True)

with open("prompts.yaml", 'r') as stream:
    prompt_templates = yaml.safe_load(stream)
    
agent = CodeAgent(
    model=model,
    tools=[final_answer, image_generation_tool, get_current_time_in_timezone, get_weather, get_city_id], # add your tools here (don't remove final_answer)
    max_steps=6,
    verbosity_level=1,
    grammar=None,
    planning_interval=None,
    name=None,
    description=None,
    prompt_templates=prompt_templates
)


GradioUI(agent).launch()