
AI Travel Chatbot in Python [Python +Ai]
Menu
AI Travel Chatbot in Python
1. Imports & API Setup
import streamlit as st
import wikipedia
import google.generativeai as genai
import urllib.parse
- streamlit: For creating the web app.
- wikipedia: To fetch a short city description.
- google.generativeai: To use Gemini API for travel suggestions.
- urllib.parse: Helps create safe URLs for Google Maps links.
API Configuration:
genai.configure(api_key="") # Add your Gemini API key
- You need to sign up at Google AI Studio to get your API key.
2. Helper Function – Google Maps Link
def get_maps_link(place, city):
query = urllib.parse.quote(f"{place} {city}")
return f"https://www.google.com/maps/search/?api=1&query={query}"
- Combines place + city → formats into a Google Maps search link.
- Ensures no spaces/special characters break the link.
3. Get City Description (Wikipedia)
def get_city_description(city):
try:
summary = wikipedia.summary(city, sentences=3, auto_suggest=False)
return summary
except wikipedia.DisambiguationError as e:
try:
summary = wikipedia.summary(e.options[0], sentences=3, auto_suggest=False)
return summary
except:
return "❗ Couldn't find a proper description for this city."
except:
return "❗ Couldn't find a proper description for this city."
4. Get Travel Info
def get_travel_info_gemini(city):
prompt = f"""Provide concise travel details for {city} including:
1. Three famous places to visit
2. Three popular local foods
3. Three best malls
4. Three recommended restaurants
Only give names in bullet points, no extra description."""
model = genai.GenerativeModel('models')
response = model.generate_content(prompt)
return response.text
- Sends a prompt to Gemini asking for travel data.
- Gemini replies with bullet-pointed names of places, foods, malls, and restaurants.
5. Stylish HTML + CSS for UI
st.markdown("""
<style>
.title { ... }
.section-header { ... }
.item { ... }
.map-link { ... }
.description { ... }
</style>
""", unsafe_allow_html=True)
- Custom CSS for:
- Title (
.title
) - Headers like “Famous Places” (
.section-header
) - Each item row (
.item
) - Google Maps link styling (
.map-link
) - Description paragraph (
.description
)
- Title (
- Why use this? → Streamlit’s default look is basic, so this gives your app a clean, modern, and colorful design.
6. Main App UI
city = st.text_input("Enter City Name")
if st.button("Get Travel Info"):
...
- Input field for the city name.
- Button triggers all the logic (fetch Wikipedia + Gemini info + display results).
7. Parsing Gemini Response
lines = [line.strip('-• ').strip() for line in details.split('\n') if line.strip()]
current_section = None
for line in lines:
...
- Splits the Gemini response line by line.
- Filters each line into one of the 4 lists:
famous_places
,foods
,malls
,restaurants
- Limits to 3 items per list (skips extras).
- If fewer than 3 items are found → fills with N/A later.
8. Reusable Display Function
def display_table(title, items, icon):
st.markdown(f'<div class="section-header">{icon} {title}</div>', unsafe_allow_html=True)
if items:
for item in items:
link = get_maps_link(item, city)
st.markdown(f'<div class="item">🔹 <b>{item}</b> | <a class="map-link" href="{link}" target="_blank">Open in Google Maps</a></div>', unsafe_allow_html=True)
else:
for _ in range(3):
st.markdown(f'<div class="item">🔹 <i>N/A</i></div>', unsafe_allow_html=True)
- Displays each section (title + items + Google Maps links).
- Repeats for all 4 categories.
- Items always show as 3 lines (with links or “N/A”).
9. Explore City on Google Maps
st.markdown(f'<div class="section-header">🌐 Explore {city.title()} on <a class="map-link" href="{get_maps_link(city, "")}" target="_blank">Google Maps</a></div>', unsafe_allow_html=True)
- General Google Maps link to explore the whole city.
Post Views: 56
Post Comment