from typing import Annotated, Any, Optional from arcade.sdk import ToolContext, tool from arcade_search.enums import GoogleHotelsSortBy from arcade_search.utils import call_serpapi, prepare_params @tool(requires_secrets=["SERP_API_KEY"]) async def search_hotels( context: ToolContext, location: Annotated[str, "Location to search for hotels, e.g., a city name, a state, etc."], check_in_date: Annotated[str, "Check-in date in YYYY-MM-DD format"], check_out_date: Annotated[str, "Check-out date in YYYY-MM-DD format"], query: Annotated[ Optional[str], "Anything that would be used in a regular Google Hotels search" ] = None, currency: Annotated[Optional[str], "Currency code for prices. Defaults to 'USD'"] = "USD", min_price: Annotated[Optional[int], "Minimum price per night. Defaults to no minimum"] = None, max_price: Annotated[Optional[int], "Maximum price per night. Defaults to no maximum"] = None, num_adults: Annotated[Optional[int], "Number of adults per room. Defaults to 2"] = 2, num_children: Annotated[Optional[int], "Number of children per room. Defaults to 0"] = 0, sort_by: Annotated[ GoogleHotelsSortBy, "The sorting order of the results. Defaults to RELEVANCE" ] = GoogleHotelsSortBy.RELEVANCE, num_results: Annotated[ Optional[int], "Maximum number of results to return. Defaults to 5. Max 20" ] = 5, ) -> Annotated[dict[str, Any], "Hotel search results from the Google Hotels API"]: """Retrieve hotel search results using the Google Hotels API.""" # Prepare the request params = prepare_params( "google_hotels", q=f"{query}, {location}" if query else location, check_in_date=check_in_date, check_out_date=check_out_date, currency=currency, min_price=min_price, max_price=max_price, adults=num_adults, children=num_children, sort_by=sort_by.to_api_value(), ) # Execute the request results = call_serpapi(context, params) # Parse the results properties = results.get("properties", [])[:num_results] # Remove unwanted fields from each property for hotel in properties: hotel.pop("images", None) hotel.pop("extracted_hotel_class", None) hotel.pop("reviews_breakdown", None) hotel.pop("serpapi_property_details_link", None) return {"properties": properties}