Source code for langchain_community.utilities.google_places_api
"""Chain that calls Google Places API."""importloggingfromtypingimportAny,Dict,Optionalfromlangchain_core._api.deprecationimportdeprecatedfromlangchain_core.pydantic_v1importBaseModel,root_validatorfromlangchain_core.utilsimportget_from_dict_or_env
[docs]@deprecated(since="0.0.33",removal="1.0",alternative_import="langchain_google_community.GooglePlacesAPIWrapper",)classGooglePlacesAPIWrapper(BaseModel):"""Wrapper around Google Places API. To use, you should have the ``googlemaps`` python package installed, **an API key for the google maps platform**, and the environment variable ''GPLACES_API_KEY'' set with your API key , or pass 'gplaces_api_key' as a named parameter to the constructor. By default, this will return the all the results on the input query. You can use the top_k_results argument to limit the number of results. Example: .. code-block:: python from langchain_community.utilities import GooglePlacesAPIWrapper gplaceapi = GooglePlacesAPIWrapper() """gplaces_api_key:Optional[str]=Nonegoogle_map_client:Any#: :meta private:top_k_results:Optional[int]=NoneclassConfig:arbitrary_types_allowed=Trueextra="forbid"@root_validator(pre=True)defvalidate_environment(cls,values:Dict)->Dict:"""Validate that api key is in your environment variable."""gplaces_api_key=get_from_dict_or_env(values,"gplaces_api_key","GPLACES_API_KEY")values["gplaces_api_key"]=gplaces_api_keytry:importgooglemapsvalues["google_map_client"]=googlemaps.Client(gplaces_api_key)exceptImportError:raiseImportError("Could not import googlemaps python package. ""Please install it with `pip install googlemaps`.")returnvalues
[docs]defrun(self,query:str)->str:"""Run Places search and get k number of places that exists that match."""search_results=self.google_map_client.places(query)["results"]num_to_return=len(search_results)places=[]ifnum_to_return==0:return"Google Places did not find any places that match the description"num_to_return=(num_to_returnifself.top_k_resultsisNoneelsemin(num_to_return,self.top_k_results))foriinrange(num_to_return):result=search_results[i]details=self.fetch_place_details(result["place_id"])ifdetailsisnotNone:places.append(details)return"\n".join([f"{i+1}. {item}"fori,iteminenumerate(places)])
[docs]deffetch_place_details(self,place_id:str)->Optional[str]:try:place_details=self.google_map_client.place(place_id)place_details["place_id"]=place_idformatted_details=self.format_place_details(place_details)returnformatted_detailsexceptExceptionase:logging.error(f"An Error occurred while fetching place details: {e}")returnNone
[docs]defformat_place_details(self,place_details:Dict[str,Any])->Optional[str]:try:name=place_details.get("result",{}).get("name","Unknown")address=place_details.get("result",{}).get("formatted_address","Unknown")phone_number=place_details.get("result",{}).get("formatted_phone_number","Unknown")website=place_details.get("result",{}).get("website","Unknown")place_id=place_details.get("result",{}).get("place_id","Unknown")formatted_details=(f"{name}\nAddress: {address}\n"f"Google place ID: {place_id}\n"f"Phone: {phone_number}\nWebsite: {website}\n\n")returnformatted_detailsexceptExceptionase:logging.error(f"An error occurred while formatting place details: {e}")returnNone