trip-planner / app.py
Amitabhab's picture
A copy button is now available in the textbox
6f6111b
#!/usr/bin/env python
"""
Travel planner based on Agentic AI workflow.
This module deploys a portal which can customize a day to day travel itinerary
for a person using multiple specialized AI crews.
Implemented using Gradio and Crew AI
A deployment is available at https://huggingface.co/spaces/sambanovasystems/trip-planner
"""
import json
import logging
from typing import List, Tuple
import gradio as gr
import plotly.graph_objects as go
from crew import AddressSummaryCrew, TravelCrew
def filter_map(text_list: List[str], lat: List[str], lon: List[str]) -> go.Figure:
"""
Create a Map showing the points specified in the inputs.
Args:
text_list: List of the description of all locations that will be shown on the map
lat: List of latitude coordinates of the locations
lon: List of longitude coordinates of the locations
Returns:
Figure: Map with the points specified in the inputs
"""
fig = go.Figure(
go.Scattermapbox(lat=lat, lon=lon, mode='markers', marker=go.scattermapbox.Marker(size=11), hovertext=text_list)
)
fig.update_layout(
mapbox_style='open-street-map',
hovermode='closest',
mapbox=dict(bearing=0, center=go.layout.mapbox.Center(lat=lat[1], lon=lon[1]), pitch=0, zoom=10),
)
return fig
def run(
origin: str,
destination: str,
age: int,
trip_duration: int,
interests: List[str],
cuisine_preferences: List[str],
children: bool,
budget: int,
) -> Tuple[str, go.Figure]:
"""
Run the specfied query using Crew AI agents
Args:
origin: Origin city of the traveller
destination: Destination that traveller is going to
age: Age profile of traveller
interests: Specific interests of the traveller
cuisine_preferences: Specific cuisine preferences of the traveller
children: Whether traveller has children travelling with them
budget: Total budget of traveller in US Dollars
Returns:
Returns a tuple containing the itinerary and map
"""
logger.info(
f'Origin: {origin}, Destination: {destination}, Age: {age}, Duration: {trip_duration},'
f' Interests: {interests}, Cuisines: {cuisine_preferences}, Children: {children}, Daily Budget: {budget}'
)
inputs = {
'origin': origin,
'destination': destination,
'age': age,
'trip_duration': trip_duration,
'interests': interests,
'cuisine_preferences': cuisine_preferences,
'children': children,
'budget': budget,
}
result = TravelCrew().crew().kickoff(inputs=inputs)
inputs_for_address = {'text': str(result)}
addresses = AddressSummaryCrew().crew().kickoff(inputs=inputs_for_address)
json_addresses = None
if addresses.json_dict:
json_addresses = addresses.json_dict
if not json_addresses:
try:
json_addresses = json.loads(addresses.raw)
except json.JSONDecodeError as e:
# Try with different format of result data generated with ```json and ending with ```
try:
json_addresses = json.loads(addresses.raw[8:-4])
except json.JSONDecodeError as e:
# Try with different format of result data generated with ``` and ending with ```
try:
json_addresses = json.loads(addresses.raw[4:-4])
except json.JSONDecodeError as e:
logger.error('Error loading Crew Output for addresses')
logger.info(addresses.raw)
return (result, None)
fig = filter_map(json_addresses['name'], json_addresses['lat'], json_addresses['lon'])
return (result, fig)
logger = logging.getLogger()
logger.setLevel(logging.INFO)
demo = gr.Interface(
title='Plan your itinerary with the help of AI',
description='Use this app to create a detailed itinerary on how to explore a new place.'
' Itinerary is customized to your taste. Powered by Sambanova Cloud.',
fn=run,
inputs=[
gr.Textbox(label='Where are you travelling from?'),
gr.Textbox(label='Where are you going?'),
gr.Slider(label='Your age?', value=30, minimum=15, maximum=90, step=5),
gr.Slider(label='How many days are you travelling?', value=5, minimum=1, maximum=14, step=1),
gr.CheckboxGroup(
['Museums', 'Shopping', 'Entertainment', 'Nightlife', 'Outdoor Adventures'],
label='Checkbox your specific interests.',
),
gr.CheckboxGroup(
[
'Ethnic',
'American',
'Italian',
'Mexican',
'Chinese',
'Japanese',
'Indian',
'Thai',
'French',
'Vietnamese',
'Vegan',
],
label='Checkbox your cuisine preferences.',
),
gr.Checkbox(label='Check if children are travelling with you'),
gr.Slider(
label='Total budget of trip in USD', show_label=True, value=1000, minimum=500, maximum=10000, step=500
),
],
outputs=[
gr.Textbox(label='Complete Personalized Itinerary of your Trip', show_label=True, show_copy_button=True, autoscroll=False),
gr.Plot(label='Venues on a Map. Please verify with a Navigation System before traveling.'),
],
)
demo.launch()