o
    ȳg                     @   sn   d Z ddlZddlmZmZmZ ddlmZ ddlm	Z	 ddl
mZmZmZ eddd	d
G dd deZdS )z#Chain that calls Google Places API.    N)AnyDictOptional)
deprecated)get_from_dict_or_env)	BaseModel
ConfigDictmodel_validatorz0.0.33z1.0z1langchain_google_community.GooglePlacesAPIWrapper)sinceremovalalternative_importc                   @   s   e Zd ZU dZdZee ed< dZe	ed< dZ
ee ed< edddZed	d
edede	fddZdedefddZdedee fddZdeee	f dee fddZdS )GooglePlacesAPIWrappera  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()
    Ngplaces_api_keygoogle_map_clienttop_k_resultsTforbid)arbitrary_types_allowedextrabefore)modevaluesreturnc                 C   sH   t |dd}||d< zddl}|||d< W |S  ty#   tdw )z6Validate that api key is in your environment variable.r   GPLACES_API_KEYr   Nr   z\Could not import googlemaps python package. Please install it with `pip install googlemaps`.)r   
googlemapsClientImportError)clsr   r   r    r   k/var/www/html/chatdoc2/venv/lib/python3.10/site-packages/langchain_community/utilities/google_places_api.pyvalidate_environment-   s   z+GooglePlacesAPIWrapper.validate_environmentqueryc                 C   s   | j |d }t|}g }|dkrdS | jdu r|nt|| j}t|D ]}|| }| |d }|dur;|| q%ddd t	|D S )	zDRun Places search and get k number of places that exists that match.resultsr   z@Google Places did not find any places that match the descriptionNplace_id
c                 S   s"   g | ]\}}|d   d| qS )   z. r   ).0iitemr   r   r   
<listcomp>W   s   " z.GooglePlacesAPIWrapper.run.<locals>.<listcomp>)
r   placeslenr   minrangefetch_place_detailsappendjoin	enumerate)selfr    search_resultsnum_to_returnr)   r&   resultdetailsr   r   r   run@   s    


zGooglePlacesAPIWrapper.runr"   c              
   C   s\   z| j |}||d< | |}|W S  ty- } ztd|  W Y d }~d S d }~ww )Nr"   z0An Error occurred while fetching place details: )r   placeformat_place_details	Exceptionloggingerror)r1   r"   place_detailsformatted_detailser   r   r   r-   Y   s   
z*GooglePlacesAPIWrapper.fetch_place_detailsr<   c           	   
   C   s   zF| di  dd}| di  dd}| di  dd}| di  dd}| di  dd}| d| d	| d
| d| d
}|W S  tya } ztd|  W Y d }~d S d }~ww )Nr4   nameUnknownformatted_addressformatted_phone_numberwebsiter"   z

Address: z
Google place ID: z
Phone: z

Website: z

z2An error occurred while formatting place details: )getr9   r:   r;   )	r1   r<   r?   addressphone_numberrC   r"   r=   r>   r   r   r   r8   c   s0   z+GooglePlacesAPIWrapper.format_place_details)__name__
__module____qualname____doc__r   r   str__annotations__r   r   r   intr   model_configr	   classmethodr   r   r6   r-   r8   r   r   r   r   r      s   
 "
r   )rJ   r:   typingr   r   r   langchain_core._api.deprecationr   langchain_core.utilsr   pydanticr   r   r	   r   r   r   r   r   <module>   s    