Spaces:
Sleeping
Sleeping
Update app.py
Browse files
app.py
CHANGED
|
@@ -9,9 +9,7 @@ weather_api_key = os.getenv("openweather")
|
|
| 9 |
openai_api_key = os.getenv("OPENAI_API_KEY")
|
| 10 |
client = OpenAI(api_key=openai_api_key)
|
| 11 |
|
| 12 |
-
#
|
| 13 |
-
# Fetch Weather Data
|
| 14 |
-
# -------------------------------
|
| 15 |
def get_weather(city_name):
|
| 16 |
if not city_name.strip():
|
| 17 |
city_name = "Dubai"
|
|
@@ -45,10 +43,7 @@ def get_weather(city_name):
|
|
| 45 |
except Exception:
|
| 46 |
return None
|
| 47 |
|
| 48 |
-
|
| 49 |
-
# -------------------------------
|
| 50 |
-
# Weather Display HTML
|
| 51 |
-
# -------------------------------
|
| 52 |
def format_weather_display(data):
|
| 53 |
if not data:
|
| 54 |
return "<div style='text-align:center; color: #e74c3c; font-size: 18px; padding: 40px;'>β City not found. Please try again.</div>"
|
|
@@ -99,10 +94,7 @@ def format_weather_display(data):
|
|
| 99 |
</div>
|
| 100 |
"""
|
| 101 |
|
| 102 |
-
|
| 103 |
-
# -------------------------------
|
| 104 |
# Chatbot
|
| 105 |
-
# -------------------------------
|
| 106 |
def travel_chat(msg, history):
|
| 107 |
messages = [{"role": "system", "content": "You are a helpful travel assistant. Suggest tourist attractions, activities, and travel tips for any city."}]
|
| 108 |
for h in history:
|
|
@@ -123,10 +115,7 @@ def travel_chat(msg, history):
|
|
| 123 |
history.append({"role": "assistant", "content": reply})
|
| 124 |
return history, history
|
| 125 |
|
| 126 |
-
|
| 127 |
-
# -------------------------------
|
| 128 |
# Attractions
|
| 129 |
-
# -------------------------------
|
| 130 |
def get_attractions(city, country, temp, weather_desc):
|
| 131 |
try:
|
| 132 |
messages = [
|
|
@@ -162,7 +151,6 @@ def get_attractions(city, country, temp, weather_desc):
|
|
| 162 |
except Exception:
|
| 163 |
return [("Error", "Could not fetch attractions.")]
|
| 164 |
|
| 165 |
-
|
| 166 |
def format_attraction_card(name, details):
|
| 167 |
return f"""
|
| 168 |
<div class='card'>
|
|
@@ -171,10 +159,7 @@ def format_attraction_card(name, details):
|
|
| 171 |
</div>
|
| 172 |
"""
|
| 173 |
|
| 174 |
-
|
| 175 |
-
# -------------------------------
|
| 176 |
# CSS
|
| 177 |
-
# -------------------------------
|
| 178 |
custom_css = """
|
| 179 |
body, .gradio-container {
|
| 180 |
background: linear-gradient(135deg, #f5f7fa 0%, #bbdefb 100%) !important;
|
|
@@ -246,9 +231,6 @@ body, .gradio-container {
|
|
| 246 |
}
|
| 247 |
"""
|
| 248 |
|
| 249 |
-
# -------------------------------
|
| 250 |
-
# Generate Attraction Cards
|
| 251 |
-
# -------------------------------
|
| 252 |
def generate_attraction_cards(city):
|
| 253 |
weather = get_weather(city)
|
| 254 |
if not weather:
|
|
@@ -262,27 +244,22 @@ def generate_attraction_cards(city):
|
|
| 262 |
)
|
| 263 |
return "<div class='card-grid'>" + "".join(format_attraction_card(name, details) for name, details in attractions) + "</div>"
|
| 264 |
|
| 265 |
-
|
| 266 |
-
# -------------------------------
|
| 267 |
# UI
|
| 268 |
-
# -------------------------------
|
| 269 |
def launch_ui():
|
| 270 |
with gr.Blocks(css=custom_css, title="TripMate AI") as demo:
|
| 271 |
-
#
|
| 272 |
-
gr.
|
| 273 |
|
| 274 |
with gr.Row(equal_height=True):
|
| 275 |
-
# Weather section
|
| 276 |
with gr.Column(scale=1):
|
| 277 |
-
gr.
|
| 278 |
with gr.Group(elem_classes="content-box"):
|
| 279 |
city_input = gr.Textbox(label="ποΈ City Name", value="Dubai")
|
| 280 |
update_btn = gr.Button("π Get Weather Data")
|
| 281 |
weather_html = gr.HTML()
|
| 282 |
|
| 283 |
-
# Chatbot section
|
| 284 |
with gr.Column(scale=1):
|
| 285 |
-
gr.
|
| 286 |
with gr.Group(elem_classes="content-box"):
|
| 287 |
chat = gr.Chatbot(height=350, type="messages")
|
| 288 |
with gr.Row():
|
|
@@ -290,8 +267,7 @@ def launch_ui():
|
|
| 290 |
ask_btn = gr.Button("Send", scale=1)
|
| 291 |
state = gr.State([])
|
| 292 |
|
| 293 |
-
|
| 294 |
-
gr.Markdown("<div class='section-header'>ποΈ Top Attractions You Can Visit</div>")
|
| 295 |
attractions_html = gr.HTML()
|
| 296 |
|
| 297 |
def update_all(city):
|
|
@@ -306,9 +282,8 @@ def launch_ui():
|
|
| 306 |
demo.load(fn=lambda: update_all("Dubai"), inputs=None, outputs=[weather_html, attractions_html])
|
| 307 |
|
| 308 |
# Footer
|
| 309 |
-
gr.
|
| 310 |
|
| 311 |
demo.launch()
|
| 312 |
|
| 313 |
-
|
| 314 |
launch_ui()
|
|
|
|
| 9 |
openai_api_key = os.getenv("OPENAI_API_KEY")
|
| 10 |
client = OpenAI(api_key=openai_api_key)
|
| 11 |
|
| 12 |
+
# Weather fetch
|
|
|
|
|
|
|
| 13 |
def get_weather(city_name):
|
| 14 |
if not city_name.strip():
|
| 15 |
city_name = "Dubai"
|
|
|
|
| 43 |
except Exception:
|
| 44 |
return None
|
| 45 |
|
| 46 |
+
# Weather display
|
|
|
|
|
|
|
|
|
|
| 47 |
def format_weather_display(data):
|
| 48 |
if not data:
|
| 49 |
return "<div style='text-align:center; color: #e74c3c; font-size: 18px; padding: 40px;'>β City not found. Please try again.</div>"
|
|
|
|
| 94 |
</div>
|
| 95 |
"""
|
| 96 |
|
|
|
|
|
|
|
| 97 |
# Chatbot
|
|
|
|
| 98 |
def travel_chat(msg, history):
|
| 99 |
messages = [{"role": "system", "content": "You are a helpful travel assistant. Suggest tourist attractions, activities, and travel tips for any city."}]
|
| 100 |
for h in history:
|
|
|
|
| 115 |
history.append({"role": "assistant", "content": reply})
|
| 116 |
return history, history
|
| 117 |
|
|
|
|
|
|
|
| 118 |
# Attractions
|
|
|
|
| 119 |
def get_attractions(city, country, temp, weather_desc):
|
| 120 |
try:
|
| 121 |
messages = [
|
|
|
|
| 151 |
except Exception:
|
| 152 |
return [("Error", "Could not fetch attractions.")]
|
| 153 |
|
|
|
|
| 154 |
def format_attraction_card(name, details):
|
| 155 |
return f"""
|
| 156 |
<div class='card'>
|
|
|
|
| 159 |
</div>
|
| 160 |
"""
|
| 161 |
|
|
|
|
|
|
|
| 162 |
# CSS
|
|
|
|
| 163 |
custom_css = """
|
| 164 |
body, .gradio-container {
|
| 165 |
background: linear-gradient(135deg, #f5f7fa 0%, #bbdefb 100%) !important;
|
|
|
|
| 231 |
}
|
| 232 |
"""
|
| 233 |
|
|
|
|
|
|
|
|
|
|
| 234 |
def generate_attraction_cards(city):
|
| 235 |
weather = get_weather(city)
|
| 236 |
if not weather:
|
|
|
|
| 244 |
)
|
| 245 |
return "<div class='card-grid'>" + "".join(format_attraction_card(name, details) for name, details in attractions) + "</div>"
|
| 246 |
|
|
|
|
|
|
|
| 247 |
# UI
|
|
|
|
| 248 |
def launch_ui():
|
| 249 |
with gr.Blocks(css=custom_css, title="TripMate AI") as demo:
|
| 250 |
+
# Header
|
| 251 |
+
gr.HTML("<div id='main-title'>π TripMate AI</div>")
|
| 252 |
|
| 253 |
with gr.Row(equal_height=True):
|
|
|
|
| 254 |
with gr.Column(scale=1):
|
| 255 |
+
gr.HTML("<div class='section-header'>π€οΈ Weather Dashboard</div>")
|
| 256 |
with gr.Group(elem_classes="content-box"):
|
| 257 |
city_input = gr.Textbox(label="ποΈ City Name", value="Dubai")
|
| 258 |
update_btn = gr.Button("π Get Weather Data")
|
| 259 |
weather_html = gr.HTML()
|
| 260 |
|
|
|
|
| 261 |
with gr.Column(scale=1):
|
| 262 |
+
gr.HTML("<div class='section-header'>π€ Travel Assistant</div>")
|
| 263 |
with gr.Group(elem_classes="content-box"):
|
| 264 |
chat = gr.Chatbot(height=350, type="messages")
|
| 265 |
with gr.Row():
|
|
|
|
| 267 |
ask_btn = gr.Button("Send", scale=1)
|
| 268 |
state = gr.State([])
|
| 269 |
|
| 270 |
+
gr.HTML("<div class='section-header'>ποΈ Top Attractions You Can Visit</div>")
|
|
|
|
| 271 |
attractions_html = gr.HTML()
|
| 272 |
|
| 273 |
def update_all(city):
|
|
|
|
| 282 |
demo.load(fn=lambda: update_all("Dubai"), inputs=None, outputs=[weather_html, attractions_html])
|
| 283 |
|
| 284 |
# Footer
|
| 285 |
+
gr.HTML("<div class='footer'>Β© 2025 TripMate AI β Your AI-powered travel companion.</div>")
|
| 286 |
|
| 287 |
demo.launch()
|
| 288 |
|
|
|
|
| 289 |
launch_ui()
|