Journi-MAS / tools /search_accommodations.py
PLBot's picture
fix search_accommondations tool
019446c
from typing import Any, Optional
from smolagents.tools import Tool
from duckduckgo_search import DDGS
class SearchAccommodationsTool(Tool):
name = "search_accommodations"
description = "Searches for available accommodations at a travel destination with customizable filters like budget, style, and location."
inputs = {
'destination': {'type': 'string', 'description': 'The destination city or region (e.g., "Tokyo", "Bali", "Paris")'},
'budget': {'type': 'string', 'description': 'Price range (e.g., "budget", "mid-range", "luxury")', 'nullable': True},
'style': {'type': 'string', 'description': 'Type of accommodation (e.g., "hotel", "hostel", "apartment", "resort")', 'nullable': True},
'location': {'type': 'string', 'description': 'Preferred area or neighborhood', 'nullable': True}
}
output_type = "string"
def __init__(self, max_results=8):
super().__init__()
try:
from duckduckgo_search import DDGS
except ImportError as e:
raise ImportError(
"You must install package `duckduckgo_search` to run this tool: for instance run `pip install duckduckgo-search`."
) from e
self.ddgs = DDGS()
self.max_results = max_results
def forward(self, destination: str, budget: Optional[str] = None, style: Optional[str] = None, location: Optional[str] = None) -> str:
try:
# Construct a search query based on the parameters
query = f"accommodations {destination}"
if budget:
query += f" {budget} price"
if style:
query += f" {style}"
if location:
query += f" in {location}"
# Execute the search
results = self.ddgs.text(query, max_results=self.max_results)
if not results:
return f"No accommodation results found for {destination}. Try adjusting your search parameters."
# Format the results
formatted_results = f"🏨 **Accommodation Options in {destination}**\n\n"
# Add search parameters if provided
search_params = []
if budget:
search_params.append(f"Budget: {budget}")
if style:
search_params.append(f"Type: {style}")
if location:
search_params.append(f"Area: {location}")
if search_params:
formatted_results += "Search filters: " + ", ".join(search_params) + "\n\n"
# Format each result
for i, result in enumerate(results, 1):
title = result.get('title', 'Unnamed Accommodation')
url = result.get('href', '#')
snippet = result.get('body', 'No description available')
formatted_results += f"### {i}. {title}\n"
formatted_results += f"{snippet}\n"
formatted_results += f"[View Details]({url})\n\n"
formatted_results += "Note: These are search results. For accurate pricing and availability, check the official websites or booking platforms."
return formatted_results
except Exception as e:
return f"Error searching for accommodations: {str(e)}"