WeatherApp / app.py
akhilhsingh's picture
Create app.py
5356b03 verified
import os
import openai
import json
import requests
import streamlit as st
#from dotenv import load_dotenv
# Set API keys
openai.api_key = os.environ['OPENAI_API_KEY']
OPENWEATHER_API_KEY = os.environ['OPENWEATHER_API_KEY']
# Function to get the current weather
def get_current_weather(location):
"""Get the current weather in a given location"""
base_url = "http://api.openweathermap.org/data/2.5/weather?"
complete_url = f"{base_url}appid={OPENWEATHER_API_KEY}&q={location}"
response = requests.get(complete_url)
if response.status_code == 200:
data = response.json()
weather = data['weather'][0]['main']
temperature = data['main']['temp'] - 273.15 # Convert Kelvin to Celsius
return {
"city": location,
"weather": weather,
"temperature": round(temperature, 2)
}
else:
return {"city": location, "weather": "Data Fetch Error", "temperature": "N/A"}
# Streamlit app
st.title("Weather Info Assistant")
#st.write("Get the current weather information for a specific location. Just replace Gurgaon with the location")
user_input = st.text_input("Get the current weather information for a specific location. Just replace Gurgaon with the location", "What is the weather like in Gurgaon?")
if st.button("Get Weather"):
# Use GPT-3.5-turbo to parse the user query
response = openai.chat.completions.create(
model="gpt-3.5-turbo",
messages=[
{
"role": "user",
"content": user_input
}
],
temperature=0,
max_tokens=300,
functions=[
{
"name": "get_current_weather",
"description": "Get the current weather in a given location",
"parameters": {
"type": "object",
"properties": {
"location": {
"type": "string",
"description": "The city and state, e.g. San Francisco, CA",
},
},
"required": ["location"],
},
}
],
function_call="auto"
)
# Extract the location from the response
try:
# Extract the function call information
function_call_info = response.choices[0].message.function_call
function_name = function_call_info.name # This should be 'get_current_weather'
function_arguments = function_call_info.arguments # This is a JSON string
# Parse the JSON string to get the arguments dictionary
args = json.loads(function_arguments)
location = args['location']
# Now you can fetch the weather information using the extracted location
weather_info = get_current_weather(location)
# Define a dictionary to map weather conditions to emoticons
weather_icons = {
"Clear": "β˜€οΈ", # Sun icon
"Clouds": "☁️", # Cloud icon
"Rain": "🌧️", # Rain icon
"Snow": "❄️", # Snow icon
"Thunderstorm": "β›ˆοΈ", # Thunderstorm icon
"Mist": "🌫️", # Fog icon
"Smoke": "πŸ’¨", # Smoke icon
"Haze": "🌫️", # Haze icon
"Dust": "πŸŒͺ️", # Dust icon
"Fog": "🌫️", # Fog icon
"Sand": "🏜️", # Sand icon
"Ash": "πŸŒ‹", # Volcanic ash icon
"Squall": "🌬️", # Wind face icon
"Tornado": "πŸŒͺ️" # Tornado icon
}
if weather_info["weather"] != "Data Fetch Error":
icon = weather_icons.get(weather_info["weather"], "❓") # Default to question mark if no match
weather_description = f"The weather in **{weather_info['city']}** is currently `{weather_info['weather']}` with a temperature of `{weather_info['temperature']}Β°C`."
chat_response = openai.chat.completions.create(
model="gpt-3.5-turbo",
messages=[
{
"role": "system",
"content": "Generate a conversational response for weather information. Please include the weather and temperature details in the response and provide suggestion on things that can be done best in this weather"
},
{
"role": "user",
"content": weather_description
}
],
temperature=0.5,
max_tokens=300
)
# Use HTML to style the font size, color, and include the icon in the displayed message
st.markdown(f"<div style='font-size: 24px; color: blue; font-weight: bold;'> Weather: {weather_info['weather']} {icon} &emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp; Temperature: {weather_info['temperature']}Β°C</div>", unsafe_allow_html=True)
st.markdown(f"<div style='font-size: 20px;'> {chat_response.choices[0].message.content}", unsafe_allow_html=True)
else:
st.markdown(f"<div style='font-size: 20px;'>**Could not fetch weather data for {weather_info['city']}. Please try again.**</div>", unsafe_allow_html=True)
except Exception as e:
print(f"Error processing the response or fetching the weather: {e}")