mcp_client / utils /formatting.py
SrikanthNagelli's picture
initial commit
100c46f
"""
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."""
@staticmethod
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
@staticmethod
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
@staticmethod
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
@staticmethod
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
@staticmethod
def format_error(error_message: str) -> str:
"""Format error messages consistently."""
return f"❌ **Error:** {error_message}"
@staticmethod
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."