Spaces:
Sleeping
Sleeping
| """ | |
| Shared formatting utilities for consistent output across all tools. | |
| """ | |
| from typing import List, Dict, Any | |
| class ResponseFormatter: | |
| """Handles consistent formatting of responses with emojis and structure.""" | |
| def format_restaurant_response(location: str, distance: float, restaurants: List[Dict]) -> str: | |
| """Format restaurant search results.""" | |
| output = f"π½οΈ **Top Restaurants in {location.title()}** π½οΈ\n" | |
| output += f"π *Within {distance} miles*\n\n" | |
| output += f"π― Found {len(restaurants)} amazing restaurants! Here are the top picks:\n\n" | |
| for i, restaurant in enumerate(restaurants, 1): | |
| output += f"**#{i} {restaurant['name']}** β\n" | |
| output += f"π΄ **Cuisine:** {restaurant['cuisine_type']}\n" | |
| output += f"π **Address:** {restaurant['address']}\n" | |
| output += f"πΆ **Distance:** {restaurant['distance']}\n" | |
| if restaurant['rating'] != 'Not rated': | |
| output += f"β **Rating:** {restaurant['rating']}\n" | |
| if restaurant['price']: | |
| output += f"π° **Price:** {restaurant['price']}\n" | |
| output += f"π¨βπ³ **Recommended Dishes:**\n" | |
| for dish in restaurant['recommended_dishes']: | |
| output += f" β’ {dish}\n" | |
| if restaurant['description'] != 'No description available': | |
| output += f"βΉοΈ **About:** {restaurant['description'][:150]}...\n" | |
| output += "\n" + "β" * 50 + "\n\n" | |
| output += "π *Enjoy your dining experience!* π" | |
| return output | |
| def format_place_response(location: str, places: List[Dict]) -> str: | |
| """Format place/hotel search results.""" | |
| output = f"π¨ **Places to Stay in {location.title()}** π¨\n\n" | |
| output += f"π― Found {len(places)} amazing places! Here are the top suggestions:\n\n" | |
| for i, place in enumerate(places, 1): | |
| output += f"**#{i} {place['name']}** β\n" | |
| output += f"π¨ **Type:** {place['type']}\n" | |
| output += f"π **Address:** {place['address']}\n" | |
| output += f"πΆ **Distance:** {place['distance']}\n" | |
| if place['rating'] != 'Not rated': | |
| output += f"β **Rating:** {place['rating']}\n" | |
| if place['description'] != 'No description available': | |
| output += f"βΉοΈ **About:** {place['description'][:150]}...\n" | |
| output += "\n" + "β" * 50 + "\n\n" | |
| output += "π *Have a wonderful stay!* π" | |
| return output | |
| def format_hiking_response(location: str, max_distance: int, difficulty: str, | |
| hikes: List[Dict], stats: Dict) -> str: | |
| """Format hiking trail search results.""" | |
| output = f"ποΈ **Hiking Trails near {location.title()}** ποΈ\n" | |
| output += f"π *Within {max_distance} miles, Difficulty: {difficulty}*\n\n" | |
| # Add statistics | |
| output += "π **Quick Stats:**\n" | |
| output += f"β’ π₯Ύ **Total Trails Found:** {stats['total_hikes']}\n" | |
| output += f"β’ π **Average Distance:** {stats['avg_distance']} miles\n" | |
| output += f"β’ β°οΈ **Average Elevation Gain:** {stats['avg_elevation']:,} ft\n" | |
| output += f"β’ β **Average Rating:** {stats['avg_rating']}\n\n" | |
| # Add difficulty distribution | |
| output += "π― **Difficulty Distribution:**\n" | |
| for diff, count in stats['difficulty_distribution'].items(): | |
| output += f"β’ {diff}: {count} trails\n" | |
| output += "\n" | |
| # Add trail details | |
| output += "π₯Ύ **Top Recommended Trails:**\n\n" | |
| for i, hike in enumerate(hikes[:5], 1): # Limit to top 5 | |
| output += f"**#{i} {hike['name']}** ποΈ\n" | |
| output += f"π― **Difficulty:** {hike['difficulty_level']} (Score: {hike['difficulty_score']:.1f}/100)\n" | |
| output += f"π **Distance:** {hike['distance']} miles\n" | |
| output += f"β°οΈ **Elevation Gain:** {hike['elevation_gain']:,} ft\n" | |
| output += f"β **Rating:** {hike['rating']} ({hike['reviews']} reviews)\n" | |
| output += f"π **Distance from you:** {hike['distance_from_user']} miles\n" | |
| output += f"π **Features:** {', '.join(hike['features'])}\n" | |
| output += f"π **Source:** {hike.get('source', 'Database')}\n" | |
| output += "\n" + "β" * 50 + "\n\n" | |
| output += "π² *Happy hiking and stay safe on the trails!* π²" | |
| return output | |
| def format_sentiment_response(text: str, polarity: float = 0.5, | |
| subjectivity: float = 0.5, assessment: str = "neutral") -> str: | |
| """Format sentiment analysis results.""" | |
| output = f"π **Sentiment Analysis Result** π\n\n" | |
| output += f"π **Text Analyzed:** {text}\n\n" | |
| output += f"π **Analysis:**\n" | |
| output += f"β’ π **Polarity:** {polarity} ({'Positive' if polarity > 0.1 else 'Negative' if polarity < -0.1 else 'Neutral'})\n" | |
| output += f"β’ π€ **Subjectivity:** {subjectivity} ({'Subjective' if subjectivity > 0.5 else 'Objective'})\n" | |
| output += f"β’ π **Overall Assessment:** {assessment.title()} sentiment\n\n" | |
| if polarity > 0.3: | |
| output += f"π‘ *This text expresses positive emotions and favorable opinions.*" | |
| elif polarity < -0.3: | |
| output += f"π‘ *This text expresses negative emotions and unfavorable opinions.*" | |
| else: | |
| output += f"π‘ *This text shows a balanced emotional tone with neutral sentiment.*" | |
| return output | |
| def format_error(error_message: str) -> str: | |
| """Format error messages consistently.""" | |
| return f"β **Error:** {error_message}" | |
| def format_no_results(service_type: str, location: str = "") -> str: | |
| """Format no results messages.""" | |
| emoji_map = { | |
| "restaurants": "π½οΈ", | |
| "places": "π¨", | |
| "hotels": "π¨", | |
| "trails": "ποΈ", | |
| "hikes": "ποΈ" | |
| } | |
| emoji = emoji_map.get(service_type.lower(), "π") | |
| location_text = f" in {location}" if location else "" | |
| return f"{emoji} **No {service_type} found{location_text}.** Try expanding your search radius or using a different location." |