import streamlit as st import openai import os # Set up OpenAI API key openai.api_key = os.getenv("OPENAI_API_KEY") # Define the archetypes and interests/options based on the prompts archetypes = [ "Architecture Admirers", "Art Aficionados", "Literature Enthusiasts", "History Buffs", "Luxury Traveler" "Biophilia and Nature Lovers", "Outdoor Recreation Enthusiasts", "Foodies and Culinary Explorers", "Craft Beer Enthusiasts", "Music Lovers", "Wellness and Mindfulness Seekers", "Urban Enthusiast", "Antique and Vintage Collectors", "Farm-to-Table Enthusiasts", "Spiritual and Holistic Healing", "Photography and Scenic Views", "Thrift and Vintage Fashion", "Environmental Sustainability Advocates", "LGBTQ+" ] all_interests = [ "Modern Architecture", "Contemporary Art", "Local Art Scenes", "Literary Landmarks", "Historical Sites", "Natural Attractions", "Scenic Hikes", "Water Sports", "Best Restaurants", "Food Markets", "Breweries", "Live Music Venues", "Meditation Centers", "Antique Shops", "Farmers' Markets", "Sacred Sites", "Holistic Therapies", "Best Photo Spots", "Iconic Landmarks", "Thrift Stores", "Specific Fashion Eras", "Eco-Conscious Attractions", "Green Spaces", "LGBTQ+ Bars", "Clubs", "LGBTQ+-Owned Businesses" ] # Remove duplicates from all_interests all_interests = list(set(all_interests)) def generate_itinerary(destination, duration, archetype, interests): # Construct the system's prompt as a string system_prompt = ( f"Create a detailed itinerary for a trip to {destination} spanning {duration} " f"tailored for {archetype}. Do not number the recommendations, just list the day in bold, and then the suggested times for the activities. \n" "Please include specific recommendations (please be sure to include hidden gems and off-the-beaten-path destinations) for the following interests:\n" ) # Construct the user input as a string user_input = "" for interest in interests: user_input += f"- {interest}\n" messages = [ {"role": "system", "content": system_prompt}, {"role": "user", "content": user_input} ] response = openai.ChatCompletion.create( model="gpt-3.5-turbo", messages=messages, temperature=0.5, max_tokens=1000 ) # Correctly access the response content generated_itinerary = response.choices[0].message['content'].strip() return generated_itinerary # Streamlit UI for collecting inputs st.set_page_config(layout="wide") st.markdown("

Hyperlocal Itinerary Generator

", unsafe_allow_html=True) st.write(":blue[A streamlined tool to craft personalized hyperlocal itineraries for clients. Tailored for potential and current clients, the app enables agents to curate detailed travel plans based on individual interests. Users input destination, trip duration, archetype (e.g., family, adventure seeker), and specific interests such as architecture or dining. Leveraging AI, the app generates bespoke itineraries, highlighting local attractions, dining options, and activities. With seamless integration of user preferences, agents can deliver immersive experiences that showcase the unique charm and appeal of each neighborhood, fostering deeper client engagement and satisfaction.]") # User input sections st.markdown("

Trip Details

", unsafe_allow_html=True) destination = st.text_input("Destination (City, State)", placeholder="Enter destination city and state") duration = st.selectbox("Duration", ["24 hours", "48 hours", "72 hours"]) archetype = st.selectbox("Archetype", ["Unknown"] + archetypes) # Include "Unknown" option st.markdown("

Interests

", unsafe_allow_html=True) # Calculate number of columns num_columns = 7 # Calculate approximate number of checkboxes per column approx_checkboxes_per_column = len(all_interests) // num_columns # Create a list to store checkboxes checkboxes = [] # Create columns for organizing checkboxes cols = st.columns(num_columns) # Loop over the number of columns for i in range(num_columns): # Calculate start and end indices for current column start_index = i * approx_checkboxes_per_column end_index = min((i + 1) * approx_checkboxes_per_column, len(all_interests)) # Get interests for current column column_interests = all_interests[start_index:end_index] # Add checkboxes to the current column container with cols[i]: for interest in column_interests: unique_key = f"{interest}-{all_interests.index(interest)}" # Append index to ensure uniqueness checkbox = st.checkbox(interest, key=unique_key, value=False) # Ensure each checkbox has a unique key checkboxes.append(checkbox) # If the button is pressed, generate content and display in the second column (right) generate_button = st.button('Generate Itinerary') if generate_button: interests = [checkbox.label for checkbox in checkboxes if checkbox.value] generated_itinerary = generate_itinerary(destination, duration, archetype, interests) # Display the generated itinerary st.markdown("

Generated Itinerary ⬇️

", unsafe_allow_html=True) st.markdown(generated_itinerary) download_button_str = f"Download Itinerary as Text Document" with st.expander("Download Itinerary"): st.download_button( label=download_button_str, data=generated_itinerary, file_name="generated_itinerary.txt", mime="text/plain" )