File size: 5,325 Bytes
cb47347
0f04201
e3db752
cb47347
7b96044
cb47347
e0f71e1
60ee11d
 
 
 
 
 
 
 
 
 
 
 
 
 
 
0f04201
fea02f6
cb47347
60ee11d
 
 
cb47347
fea02f6
60ee11d
 
 
cb47347
7b96044
fea02f6
 
e0f71e1
 
7b96044
 
cb47347
 
 
 
 
 
 
4438ccd
 
cb47347
 
 
 
 
e0f71e1
 
 
 
 
 
 
 
 
 
cb47347
3ae3815
cb47347
3ae3815
c690ade
 
ba16989
 
3ae3815
 
cb47347
0f04201
 
cb47347
e0f71e1
 
 
cb47347
60ee11d
cb47347
60ee11d
 
cb47347
e0f71e1
 
cb47347
 
 
 
 
 
 
 
 
e0f71e1
cb47347
 
 
 
e0f71e1
 
 
 
cb47347
 
e0f71e1
 
 
 
cb47347
 
e0f71e1
 
 
 
 
 
 
 
 
 
cb47347
e0f71e1
cb47347
e0f71e1
cb47347
e0f71e1
cb47347
 
c690ade
e0f71e1
 
cb47347
 
 
 
 
e0f71e1
 
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
139
140
141
142
143
144
145
import requests
from langchain.tools import tool
from loguru import logger

from .common import config, vehicle


def get_weather_current_location():
    """
    Returns the CURRENT weather in current location.
    When responding to user, only mention the weather condition, temperature, and the temperature that it feels like, unless the user asks for more information.

    Returns:
        dict: The weather data in the specified location.
    """
    print(
        f"get_weather: location is empty, using the vehicle location. ({vehicle.location})"
    )
    location = vehicle.location
    return get_weather(location)


@tool
def get_weather(location: str = "here"):
    """
    Get the current weather in a specified location.
    When responding to user, only mention the weather condition, temperature, and the temperature that it feels like, unless the user asks for more information.

    Args:
        location (string) : Optional. The name of the location, if empty or here, the vehicle location is used.

    Returns:
        dict: The weather data in the specified location.
    """

    if location == "" or location == "here":
        logger.warning(
            f"get_weather: location is empty, using the vehicle location. ({vehicle.location})"
        )
        location = vehicle.location

    # The endpoint URL provided by WeatherAPI
    url = f"http://api.weatherapi.com/v1/current.json?key={config.WEATHER_API_KEY}&q={location}&aqi=no"

    # Make the API request
    response = requests.get(url)

    if response.status_code != 200:
        print(f"Failed to get weather data: {response.status_code}, {response.text}")
        return f"Failed to get weather data, try again", response

    # Parse the JSON response
    weather_data = response.json()

    # Extracting the necessary pieces of data
    location = weather_data["location"]["name"]
    region = weather_data["location"]["region"]
    country = weather_data["location"]["country"]
    time = weather_data["location"]["localtime"]
    temperature_c = weather_data["current"]["temp_c"]
    condition_text = weather_data["current"]["condition"]["text"]
    if "wind_kph" in weather_data["current"]:
        wind_kph = weather_data["current"]["wind_kph"]
    humidity = weather_data["current"]["humidity"]
    feelslike_c = weather_data["current"]["feelslike_c"]

    # Formulate the sentences - {region}, {country}
    weather_sentences = (
        f"The current weather in {location} is {condition_text} "
        f"with a temperature of {temperature_c} °C"
        f" that feels like {feelslike_c} °C."
        if feelslike_c != temperature_c
        else ""
        # f"Humidity is at {humidity}%. "
        # f"Wind speed is {wind_kph} kph." if 'wind_kph' in weather_data['current'] else ""
    )
    # return weather_sentences, weather_data
    return weather_sentences


# weather forecast API
def get_forecast(city_name: str = "", when=0, **kwargs):
    """
    Get the weather forecast in a specified number of days for a specified location.
    Args:
        city_name (string) : Required. The name of the city.
        when (int) : Required. in number of days (until the day for which we want to know the forecast) (example: tomorrow is 1, in two days is 2, etc.)
    """

    when += 1
    # The endpoint URL provided by WeatherAPI
    url = f"http://api.weatherapi.com/v1/forecast.json?key={WEATHER_API_KEY}&q={city_name}&days={str(when)}&aqi=no"

    # Make the API request
    response = requests.get(url)

    if response.status_code == 200:
        # Parse the JSON response
        data = response.json()

        # Initialize an empty string to hold our result
        forecast_sentences = ""

        # Extract city information
        location = data.get("location", {})
        city_name = location.get("name", "the specified location")

        # print(data)

        # Extract the forecast days
        forecast_days = data.get("forecast", {}).get("forecastday", [])[when - 1 :]
        # number = 0

        # print (forecast_days)

        for day in forecast_days:
            date = day.get("date", "a specific day")
            conditions = (
                day.get("day", {})
                .get("condition", {})
                .get("text", "weather conditions")
            )
            max_temp_c = day.get("day", {}).get("maxtemp_c", "N/A")
            min_temp_c = day.get("day", {}).get("mintemp_c", "N/A")
            chance_of_rain = day.get("day", {}).get("daily_chance_of_rain", "N/A")

            if when == 1:
                number_str = "today"
            elif when == 2:
                number_str = "tomorrow"
            else:
                number_str = f"in {when-1} days"

            # Generate a sentence for the day's forecast
            forecast_sentence = f"On {date} ({number_str}) in {city_name}, the weather will be {conditions} with a high of {max_temp_c} °C and a low of {min_temp_c} °C. There's a {chance_of_rain}% chance of rain. "

            # number = number + 1
            # Add the sentence to the result
            forecast_sentences += forecast_sentence
        return forecast_sentences
    else:
        # Handle errors
        print(f"Failed to get weather data: {response.status_code}, {response.text}")
        return f"error {response.status_code}"