|  | from crewai import Crew | 
					
						
						|  | from trip_agents import TripAgents, StreamToExpander | 
					
						
						|  | from trip_tasks import TripTasks | 
					
						
						|  | import streamlit as st | 
					
						
						|  | import datetime | 
					
						
						|  | import sys | 
					
						
						|  |  | 
					
						
						|  | st.set_page_config(page_icon="βοΈ", layout="wide") | 
					
						
						|  |  | 
					
						
						|  |  | 
					
						
						|  | def icon(emoji: str): | 
					
						
						|  | """Shows an emoji as a Notion-style page icon.""" | 
					
						
						|  | st.write( | 
					
						
						|  | f'<span style="font-size: 78px; line-height: 1">{emoji}</span>', | 
					
						
						|  | unsafe_allow_html=True, | 
					
						
						|  | ) | 
					
						
						|  |  | 
					
						
						|  |  | 
					
						
						|  | class TripCrew: | 
					
						
						|  |  | 
					
						
						|  | def __init__(self, origin, cities, date_range, interests): | 
					
						
						|  | self.cities = cities | 
					
						
						|  | self.origin = origin | 
					
						
						|  | self.interests = interests | 
					
						
						|  | self.date_range = date_range | 
					
						
						|  | self.output_placeholder = st.empty() | 
					
						
						|  |  | 
					
						
						|  | def run(self): | 
					
						
						|  | agents = TripAgents() | 
					
						
						|  | tasks = TripTasks() | 
					
						
						|  |  | 
					
						
						|  | city_selector_agent = agents.city_selection_agent() | 
					
						
						|  | local_expert_agent = agents.local_expert() | 
					
						
						|  | travel_concierge_agent = agents.travel_concierge() | 
					
						
						|  |  | 
					
						
						|  | identify_task = tasks.identify_task( | 
					
						
						|  | city_selector_agent, | 
					
						
						|  | self.origin, | 
					
						
						|  | self.cities, | 
					
						
						|  | self.interests, | 
					
						
						|  | self.date_range | 
					
						
						|  | ) | 
					
						
						|  |  | 
					
						
						|  | gather_task = tasks.gather_task( | 
					
						
						|  | local_expert_agent, | 
					
						
						|  | self.origin, | 
					
						
						|  | self.interests, | 
					
						
						|  | self.date_range | 
					
						
						|  | ) | 
					
						
						|  |  | 
					
						
						|  | plan_task = tasks.plan_task( | 
					
						
						|  | travel_concierge_agent, | 
					
						
						|  | self.origin, | 
					
						
						|  | self.interests, | 
					
						
						|  | self.date_range | 
					
						
						|  | ) | 
					
						
						|  |  | 
					
						
						|  | crew = Crew( | 
					
						
						|  | agents=[ | 
					
						
						|  | city_selector_agent, local_expert_agent, travel_concierge_agent | 
					
						
						|  | ], | 
					
						
						|  | tasks=[identify_task, gather_task, plan_task], | 
					
						
						|  | verbose=True | 
					
						
						|  | ) | 
					
						
						|  |  | 
					
						
						|  | result = crew.kickoff() | 
					
						
						|  | self.output_placeholder.markdown(result) | 
					
						
						|  |  | 
					
						
						|  | return result | 
					
						
						|  |  | 
					
						
						|  |  | 
					
						
						|  | if __name__ == "__main__": | 
					
						
						|  | icon("ποΈ VacAIgent") | 
					
						
						|  |  | 
					
						
						|  | st.subheader("Let AI agents plan your next vacation!", | 
					
						
						|  | divider="rainbow", anchor=False) | 
					
						
						|  |  | 
					
						
						|  | import datetime | 
					
						
						|  |  | 
					
						
						|  | today = datetime.datetime.now().date() | 
					
						
						|  | next_year = today.year + 1 | 
					
						
						|  | jan_16_next_year = datetime.date(next_year, 1, 10) | 
					
						
						|  |  | 
					
						
						|  | with st.sidebar: | 
					
						
						|  | st.header("π Enter your trip details") | 
					
						
						|  | with st.form("my_form"): | 
					
						
						|  | location = st.text_input( | 
					
						
						|  | "Where are you currently located?", placeholder="San Mateo, CA") | 
					
						
						|  | cities = st.text_input( | 
					
						
						|  | "City and country are you interested in vacationing at?", placeholder="Bali, Indonesia") | 
					
						
						|  | date_range = st.date_input( | 
					
						
						|  | "Date range you are interested in traveling?", | 
					
						
						|  | min_value=today, | 
					
						
						|  | value=(today, jan_16_next_year + datetime.timedelta(days=6)), | 
					
						
						|  | format="MM/DD/YYYY", | 
					
						
						|  | ) | 
					
						
						|  | interests = st.text_area("High level interests and hobbies or extra details about your trip?", | 
					
						
						|  | placeholder="2 adults who love swimming, dancing, hiking, and eating") | 
					
						
						|  |  | 
					
						
						|  | submitted = st.form_submit_button("Submit") | 
					
						
						|  |  | 
					
						
						|  | st.divider() | 
					
						
						|  |  | 
					
						
						|  |  | 
					
						
						|  | st.sidebar.markdown( | 
					
						
						|  | """ | 
					
						
						|  | Credits to [**@joaomdmoura**](https://twitter.com/joaomdmoura) | 
					
						
						|  | for creating **crewAI** π | 
					
						
						|  | """, | 
					
						
						|  | unsafe_allow_html=True | 
					
						
						|  | ) | 
					
						
						|  |  | 
					
						
						|  | st.sidebar.info("Click the logo to visit GitHub repo", icon="π") | 
					
						
						|  | st.sidebar.markdown( | 
					
						
						|  | """ | 
					
						
						|  | <a href="https://github.com/joaomdmoura/crewAI" target="_blank"> | 
					
						
						|  | <img src="https://raw.githubusercontent.com/joaomdmoura/crewAI/main/docs/crewai_logo.png" alt="CrewAI Logo" style="width:100px;"/> | 
					
						
						|  | </a> | 
					
						
						|  | """, | 
					
						
						|  | unsafe_allow_html=True | 
					
						
						|  | ) | 
					
						
						|  |  | 
					
						
						|  |  | 
					
						
						|  | if submitted: | 
					
						
						|  | with st.status("π€ **Agents at work...**", state="running", expanded=True) as status: | 
					
						
						|  | with st.container(height=500, border=False): | 
					
						
						|  | sys.stdout = StreamToExpander(st) | 
					
						
						|  | trip_crew = TripCrew(location, cities, date_range, interests) | 
					
						
						|  | result = trip_crew.run() | 
					
						
						|  | status.update(label="β
 Trip Plan Ready!", | 
					
						
						|  | state="complete", expanded=False) | 
					
						
						|  |  | 
					
						
						|  | st.subheader("Here is your Trip Plan", anchor=False, divider="rainbow") | 
					
						
						|  | st.markdown(result) | 
					
						
						|  |  |