Spaces:
Sleeping
Sleeping
import streamlit as st | |
import os | |
from dotenv import load_dotenv | |
from crewai import Agent, Task, Crew, Process | |
from crewai import LLM | |
import litellm | |
from crewai_tools import SerperDevTool | |
from typing import Any, Dict | |
import sys | |
from datetime import datetime | |
from queue import Queue | |
import threading | |
from referral_codes import validate_referral_code | |
# Page config | |
st.set_page_config( | |
page_title="Travel Planning Agent", | |
page_icon="🌍", | |
layout="wide" | |
) | |
# Load environment variables | |
load_dotenv() | |
def initialize_llm(): | |
# Get API key | |
api_key = os.getenv("GEMINI_API_KEY") | |
if not api_key: | |
raise ValueError("GEMINI_API_KEY not found in environment variables") | |
st.write(f"Debug: API Key found: {api_key[:10]}...") | |
# Initialize Gemini LLM with API Key | |
return LLM( | |
model="gemini/gemini-1.5-pro-latest", | |
api_key=api_key, | |
temperature=0.7 | |
) | |
def create_travel_agent(llm): | |
return Agent( | |
role="Elite AI Travel Strategist", | |
goal=( | |
"Design the most optimized, personalized, and budget-conscious travel plans based on the user's unique preferences, " | |
"including origin, destination, budget, travel dates, group size, preferred activities, and travel style. " | |
"Leverage cutting-edge AI with real-time data from flights, hotels, transport services, local attractions, and events " | |
"to craft seamless, time-efficient, and experience-rich itineraries. " | |
"Ensure dynamic adaptability to handle disruptions, availability changes, and user modifications, creating a hassle-free travel experience." | |
), | |
backstory=( | |
"I am an AI-powered **Master Travel Architect** with deep expertise in curating extraordinary journeys tailored to individual tastes, " | |
"whether for solo travelers, families, business professionals, or adventure seekers. " | |
"With an extensive knowledge of global destinations, cultural insights, seasonal trends, and logistical intricacies, " | |
"I meticulously craft itineraries that blend adventure, relaxation, and cultural immersion. " | |
"By integrating real-time APIs for flights, accommodations, activities, and local events, " | |
"I ensure each recommendation is accurate, cost-effective, and aligned with the traveler’s needs." | |
), | |
personality=( | |
"Hyper-intelligent, intuitive, and proactive. I am a meticulous planner with a deep understanding of travel logistics, " | |
"capable of anticipating potential issues before they arise. " | |
"I balance **comfort, adventure, and budget efficiency**, ensuring every itinerary is customized for a truly unique experience. " | |
"I dynamically adjust plans based on live travel updates, offer personalized recommendations based on user preferences, " | |
"and present a seamless blend of structured scheduling with flexibility. " | |
"Whether it’s a luxury escape, an immersive cultural journey, or an action-packed adventure, I craft the **perfect** travel blueprint." | |
), | |
tools=[SerperDevTool()], | |
allow_delegation=True, | |
humaninput=True, | |
llm=llm, | |
verbose=True | |
) | |
def create_travel_task(agent, user_inputs): | |
return Task( | |
description=f""" | |
You are an **AI Travel Planner** responsible for crafting a **personalized, budget-conscious, and time-efficient travel plan** using advanced tools for data retrieval, analysis, and real-time updates. | |
The user has provided the following details: | |
- **Origin:** {user_inputs['origin']} | |
- **Destination:** {user_inputs['destination']} | |
- **Budget:** {user_inputs['budget']} (in local currency) | |
- **Preferred Activities:** {user_inputs['activities']} | |
- **Transport Preference:** {user_inputs['transport']} | |
- **Time Available:** {user_inputs['time']} | |
## **Step 1: Generate an Optimized Itinerary** | |
- **Retrieve real-time data** (e.g., weather, crowd levels, and local events) to suggest the best times to visit attractions. | |
- Create a **structured, multi-day travel plan** that maximizes available time while balancing **sightseeing, relaxation, and local experiences**. | |
- Incorporate **seasonal and cultural insights** to enhance the travel experience. | |
- Prioritize **time-efficient routes** using mapping tools. | |
## **Step 2: Smart Transport & Accommodation Planning** | |
- Suggest the most **efficient transport options** based on {user_inputs['transport']}. | |
- Compare **flights, trains, buses, or car rentals** for cost, duration, and convenience. | |
- Recommend **accommodations** within budget, balancing comfort, location, and safety. | |
- Provide estimated travel times and **real-time availability** for transport & hotels. | |
- Include **relevant booking links** for: | |
- **Flights:** Skyscanner, Google Flights, Kayak | |
- **Trains & Buses:** Omio, Rail Europe, FlixBus | |
- **Car Rentals:** Rentalcars, Turo, Enterprise | |
- **Hotels & Stays:** Booking.com, Airbnb, Agoda | |
## **Step 3: Cost Estimation & Budgeting** | |
- **Break down estimated costs** for: | |
- **Transport:** (flights, public transport, or car rentals) | |
- **Accommodation:** (hotels, hostels, or rentals) | |
- **Meals & Dining:** (local food spots vs. premium dining) | |
- **Activities & Attractions:** (ticket prices, entry fees, and reservations) | |
- Offer **budget-friendly vs. premium options** while ensuring the plan stays within {user_inputs['budget']}. | |
- Suggest **discount passes, travel cards, and best booking platforms** for savings. | |
- Provide **direct booking links for tours, attractions, and dining** using: | |
- **Attractions & Tours:** GetYourGuide, Viator, Klook | |
- **Restaurant Reservations:** OpenTable, TheFork, Zomato | |
## **Step 4: Flexibility & Real-Time Adjustments** | |
- **Retrieve live updates** on: | |
- **Transport delays, strikes, or disruptions.** | |
- **Weather conditions affecting travel plans.** | |
- **Local event schedules & closures.** | |
- Include **alternative activity suggestions** in case of last-minute changes. | |
- Provide **emergency contacts, visa requirements, safety tips**, and **last-minute booking options**. | |
- Offer a **summary dashboard** with real-time insights for easy decision-making. | |
## **Step 5: AI-Powered Personalized Enhancements** | |
- Utilize **LLM-based recommendation engines** to personalize the itinerary based on travel history, reviews, and preferences. | |
- Suggest **AI-curated food experiences, offbeat destinations, and hidden gems**. | |
- Implement **interactive chatbot support** for instant Q&A and local guides. | |
""", | |
agent=agent, | |
expected_output=""" | |
A structured, **highly optimized travel plan**, including: | |
- **Day-by-day itinerary** tailored to user preferences. | |
- **Real-time transport & accommodation recommendations** with direct booking links. | |
- **Estimated cost breakdown** with budget-conscious choices. | |
- **Dining & event recommendations** with reservation links. | |
- **Alternative options & live travel insights** for flexibility. | |
- **Safety, visa, and emergency contact details.** | |
- **Interactive AI-driven suggestions for a hassle-free experience.** | |
-**Links to the booking webistes for travel and hotel returned from the serperDevtool** | |
""" | |
) | |
def log_status(container, message): | |
"""Simple function to log status messages using Streamlit's native components""" | |
timestamp = datetime.now().strftime("%H:%M:%S") | |
container.info(f"[{timestamp}] {message}") | |
def main(): | |
# Ensure environment variables are loaded | |
load_dotenv() | |
st.title("🌍 AI Travel Planning Assistant") | |
# Session state for referral code validation | |
if 'referral_validated' not in st.session_state: | |
st.session_state.referral_validated = False | |
st.session_state.user_type = None | |
# Debug information in sidebar | |
st.sidebar.title("Debug Information") | |
st.sidebar.write(f"GEMINI_API_KEY present: {bool(os.getenv('GEMINI_API_KEY'))}") | |
# Referral code validation | |
if not st.session_state.referral_validated: | |
st.write("Welcome! Please enter your referral code to access the travel planner.") | |
with st.form("referral_form"): | |
referral_code = st.text_input("Referral Code", key="referral_input") | |
submit_code = st.form_submit_button("Submit") | |
if submit_code: | |
is_valid, user_type, message = validate_referral_code(referral_code) | |
if is_valid: | |
st.session_state.referral_validated = True | |
st.session_state.user_type = user_type | |
st.success(f"Welcome! You have {user_type.title()} access.") | |
st.experimental_rerun() | |
else: | |
st.error(message) | |
return | |
# Show user type in sidebar | |
st.sidebar.write(f"Access Level: {st.session_state.user_type.title()}") | |
st.write("Let me help you plan your perfect trip!") | |
# Input form | |
with st.form("travel_form"): | |
col1, col2 = st.columns(2) | |
with col1: | |
origin = st.text_input("Origin", placeholder="e.g., New York") | |
destination = st.text_input("Destination", placeholder="e.g., Paris") | |
budget = st.number_input("Budget (in local currency)", min_value=0.0, value=1000.0, step=100.0) | |
with col2: | |
activities = st.text_input("Preferred Activities", placeholder="e.g., cultural, adventure, leisure") | |
transport = st.text_input("Preferred Transport", placeholder="e.g., flight, train, bus") | |
time = st.text_input("Time Available", placeholder="e.g., 5 days") | |
submit_button = st.form_submit_button("Generate Travel Plan") | |
if submit_button: | |
if not all([origin, destination, activities, transport, time]): | |
st.error("Please fill in all the fields!") | |
return | |
user_inputs = { | |
"origin": origin, | |
"destination": destination, | |
"budget": budget, | |
"activities": activities, | |
"transport": transport, | |
"time": time | |
} | |
with st.spinner("🤖 Generating your personalized travel plan... This may take a few minutes."): | |
try: | |
# Create an expander for logs | |
with st.expander("Progress Updates", expanded=True): | |
status_container = st.empty() | |
# Initialize components | |
log_status(status_container, "Initializing LLM...") | |
llm = initialize_llm() | |
log_status(status_container, "Creating travel agent...") | |
travel_agent = create_travel_agent(llm) | |
log_status(status_container, "Creating travel task...") | |
travel_task = create_travel_task(travel_agent, user_inputs) | |
log_status(status_container, "Setting up crew...") | |
crew = Crew( | |
agents=[travel_agent], | |
tasks=[travel_task], | |
verbose=True, | |
process=Process.sequential | |
) | |
log_status(status_container, "Starting travel plan generation...") | |
results = crew.kickoff() | |
log_status(status_container, "✨ Travel plan generation completed!") | |
# Display results | |
st.success("✨ Your travel plan is ready!") | |
st.markdown(results) | |
except Exception as e: | |
st.error(f"An error occurred: {str(e)}") | |
st.error("Please try again or contact support if the problem persists.") | |
if __name__ == "__main__": | |
main() | |