Spaces:
Sleeping
Sleeping
import gradio as gr | |
from gradio_folium import Folium | |
from folium import Map | |
import pandas as pd | |
import folium | |
from huggingface_hub import InferenceClient | |
from ast import literal_eval | |
repo_id = "mistralai/Mixtral-8x7B-Instruct-v0.1" | |
llm_client = InferenceClient(model=repo_id, timeout=180) | |
description_sf = "A one-day walk through San Francisco for my first visit. I want to take no cab or bike, everything should be on foot." | |
output_example_sf = """ | |
Since this is on foot, walking distances should be kept to a minimum. I'll make sure to provide a step by step visit and reorder points of interest to minimize the walking distance between each point. | |
I want to start at Fisherman's Wharf, then head to Ghirardelli Square, followed by the Cable Car Museum, Union Square, Chinatown, and finally Coit Tower, to provide a full day of sightseeing, with a mix of history, culture, and beautiful views. | |
Key points: [ | |
{"name": "Fisherman's Wharf", "lat": 37.8081, "lon": -122.4082, "description": "Fisherman's Wharf is a popular tourist destination in San Francisco, featuring Pier 39, the Maritime National Historical Park, and Boudin Bakery. It's a great place to start your day with breakfast and enjoy the sea lions."}, | |
{"name": "Ghirardelli Square", "lat": 37.8094, "lon": -122.4154, "description": "Ghirardelli Square is a historic square in San Francisco, known for its chocolate shop and various boutiques. It's a great place to grab a sweet treat and do some shopping."}, | |
{"name": "Cable Car Museum", "lat": 37.7931, "lon": -122.4058, "description": "The Cable Car Museum is a museum in San Francisco that showcases the history of the city's iconic cable cars. It's a great place to learn about the technology and history behind these unique vehicles."}, | |
{"name": "Union Square", "lat": 37.7873, "lon": -122.4062, "description": "Union Square is a public plaza in San Francisco, known for its shopping, dining, and entertainment options. It's a great place to relax, grab a bite to eat, and do some shopping."}, | |
{"name": "Chinatown", "lat": 37.7937, "lon": -122.4081, "description": "Chinatown is a vibrant neighborhood in San Francisco, known for its Chinese culture, history, and cuisine. It's a great place to explore the streets, try some delicious food, and learn about Chinese culture."}, | |
{"name": "Coit Tower", "lat": 37.8024, "lon": -122.4058, "description": "Coit Tower is a historic tower in San Francisco, known for its panoramic views of the city. It's a great place to end your day, taking in the sights and sounds of the city from above."} | |
] | |
""" | |
description_loire = "A 3-day bike trip through the Loire Valley." | |
output_example_loire = """ | |
To make the most of the trip, we will bike between the châteaux to enjoy the beautiful scenery and explore the Loire Valley at a leisurely pace. Here is a suggested itinerary for a 3-day bike trip through the Loire Valley: | |
1. Start at Château de Cheverny, a smaller but equally charming château with beautiful gardens. | |
2. Bike to Château de Chambord, the largest and most recognizable château in the Loire Valley. | |
3. Continue to Château de Blois, a historic château with a rich history. | |
4. End the day at Château de Chaumont-sur-Loire, a château with a stunning view of the Loire River. | |
5. On the second day, bike to Château de Chenonceau, a stunning château built over the River Cher. | |
6. Continue to Château d'Amboise, a historic château with ties to the French Renaissance. | |
7. End the day at Château d'Azay-le-Rideau, a charming château with a moat. | |
8. On the third day, bike to Château d'Ussé, a fairy-tale like château said to have inspired Sleeping Beauty. | |
9. End the trip at Château de Villandry, known for its beautiful gardens. | |
Key points: [ | |
{"name": "Château de Cheverny", "lat": 47.6333, "lon": 1.5667, "description": "Château de Cheverny is a smaller but equally charming château with beautiful gardens, known for its French classical architecture and rich history."}, | |
{"name": "Château de Chambord", "lat": 47.6111, "lon": 1.5167, "description": "Château de Chambord is the largest and most recognizable château in the Loire Valley, known for its French Renaissance architecture and beautiful gardens."}, | |
{"name": "Château de Blois", "lat": 47.5833, "lon": 1.3333, "description": "Château de Blois is a historic château with a rich history, known for its stunning architecture and beautiful gardens."}, | |
{"name": "Château de Chaumont-sur-Loire", "lat": 47.5167, "lon": 1.3167, "description": "Château de Chaumont-sur-Loire is a château with a stunning view of the Loire River, known for its beautiful gardens and rich history."}, | |
{"name": "Château de Chenonceau", "lat": 47.3917, "lon": 1.3667, "description": "Château de Chenonceau is a stunning château built over the River Cher, known for its beautiful gardens and rich history."}, | |
{"name": "Château d'Amboise", "lat": 47.4167, "lon": 1.0500, "description": "Château d'Amboise is a historic château with ties to the French Renaissance, known for its beautiful gardens and stunning views of the Loire Valley."}, | |
{"name": "Château d'Azay-le-Rideau", "lat": 47.3333, "lon": 0.6167, "description": "Château d'Azay-le-Rideau is a charming château with a moat, known for its French Renaissance architecture and beautiful gardens."}, | |
{"name": "Château d'Ussé", "lat": 47.2667, "lon": 0.5167, "description": "Château d'Ussé is a fairy-tale like château said to have inspired Sleeping Beauty, known for its beautiful gardens and stunning views of the Indre Valley."}, | |
{"name": "Château de Villandry", "lat": 47.1667, "lon": 0.4167, "description": "Château de Villandry is known for its beautiful gardens, featuring a water garden, ornamental flower gardens, and vegetable gardens."} | |
] | |
""" | |
def generate_key_points(text): | |
prompt = f""" | |
Please generate a set of key geographical points for the following description: {text}, as a json list of less than 10 dictionnaries with the following keys: 'name', 'lat', 'lon', 'description'. | |
Generally try to minimze the distance between locations. Always think of the transportation means that you want to use, and the timing: morning, afternoon, where to sleep. | |
For instance: | |
Description: {description_sf} | |
Thought: {output_example_sf} | |
Description: {description_loire} | |
Thought: {output_example_loire} | |
Now begin. You can make the descriptions a bit more verbose than in the examples. | |
Description: {text} | |
Thought: | |
""" | |
return llm_client.text_generation(prompt, max_new_tokens=2000) | |
def parse_llm_output(output): | |
rationale = "Thought: " + output.split("Key points:")[0] | |
key_points = output.split("Key points:")[1] | |
output = key_points.replace(" ", "") | |
parsed_output = literal_eval(output) | |
dataframe = pd.DataFrame.from_dict(parsed_output) | |
return dataframe, rationale | |
def create_map_from_markers(dataframe): | |
f_map = Map( | |
location=[dataframe["lat"].mean(), dataframe["lon"].mean()], | |
zoom_start=5, | |
tiles="CartoDB Voyager", | |
) | |
dataframe.apply( | |
lambda row: folium.CircleMarker( | |
location=[row["lat"], row["lon"]], | |
radius=10, | |
popup=folium.Popup( | |
f"<h4>{row['name']}</h4><p>{row['description']}</p>", max_width=450 | |
), | |
fill=True, | |
fill_color="blue", | |
fill_opacity=0.6, | |
color="blue", | |
weight=1, | |
).add_to(f_map), | |
axis=1, | |
) | |
bounds = [[row["lat"], row["lon"]] for _, row in dataframe.iterrows()] | |
f_map.fit_bounds(bounds, padding=(100, 100)) | |
return f_map | |
def run_display(text): | |
output = generate_key_points(text) | |
dataframe, rationale = parse_llm_output(output) | |
map = create_map_from_markers(dataframe) | |
return map, rationale | |
with gr.Blocks( | |
theme=gr.themes.Soft( | |
primary_hue=gr.themes.colors.yellow, | |
secondary_hue=gr.themes.colors.blue, | |
) | |
) as demo: | |
text = gr.Textbox( | |
label="Trip description", | |
value=description_sf, | |
) | |
button = gr.Button() | |
gr.Markdown("### LLM Output\n_Click the map to see information about the places._") | |
# Get initial map and rationale | |
example_dataframe, example_rationale = parse_llm_output(output_example_sf) | |
display_rationale = gr.Markdown(example_rationale) | |
starting_map = create_map_from_markers(example_dataframe) | |
map = Folium(value=starting_map, height=600, label="Chosen locations") | |
button.click(run_display, inputs=[text], outputs=[map, display_rationale]) | |
if __name__ == "__main__": | |
demo.launch() |