U
    h                     @   sD   d Z ddlmZmZ ddlmZmZ ddlmZ G dd deZ	dS )z&Util that calls Google Scholar Search.    )DictOptional)	BaseModelroot_validator)get_from_dict_or_envc                   @   s~   e Zd ZU dZdZeed< dZeed< dZ	eed< dZ
ee ed	< G d
d dZeddeedddZeedddZdS )GoogleScholarAPIWrappera  Wrapper for Google Scholar API

    You can create serpapi key by signing up at: https://serpapi.com/users/sign_up.

    The wrapper uses the serpapi python package:
    https://serpapi.com/integrations/python#search-google-scholar

    To use, you should have the environment variable ``SERP_API_KEY``
    set with your API key, or pass `serp_api_key` as a named parameter
    to the constructor.

    Attributes:
        top_k_results: number of results to return from google-scholar query search.
            By default it returns top 10 results.
        hl: attribute defines the language to use for the Google Scholar search.
            It's a two-letter language code.
            (e.g., en for English, es for Spanish, or fr for French). Head to the
            Google languages page for a full list of supported Google languages:
            https://serpapi.com/google-languages

        lr: attribute defines one or multiple languages to limit the search to.
            It uses lang_{two-letter language code} to specify languages
            and | as a delimiter. (e.g., lang_fr|lang_de will only search French
            and German pages). Head to the Google lr languages for a full
            list of supported languages: https://serpapi.com/google-lr-languages

     Example:
        .. code-block:: python

        from langchain_community.utilities import GoogleScholarAPIWrapper
        google_scholar = GoogleScholarAPIWrapper()
        google_scholar.run('langchain')
    
   top_k_resultsenhlZlang_enlrNserp_api_keyc                   @   s   e Zd ZdZdS )zGoogleScholarAPIWrapper.ConfigZforbidN)__name__
__module____qualname__extra r   r   P/tmp/pip-unpacked-wheel-9gdii04g/langchain_community/utilities/google_scholar.pyConfig1   s   r   T)pre)valuesreturnc                 C   sT   t |dd}||d< zddlm} W n tk
r@   tdY nX ||_||d< |S )z?Validate that api key and python package exists in environment.r   SERP_API_KEYr   )GoogleScholarSearchzigoogle-search-results is not installed. Please install it with `pip install google-search-results>=2.4.2`google_scholar_engine)r   Zserpapir   ImportErrorr   )clsr   r   r   r   r   r   validate_environment4   s    
z,GoogleScholarAPIWrapper.validate_environment)queryr   c                 C   s   g }d}|t | jd dk rd| ||| jt| jd| jd dg }|| |sZqd|d7 }q| jd dkr|dkr|r| ||| jd | j| jd dg }|| |sdS dd	 |D }d
	|S )z6Run query through GoogleSearchScholar and parse resultr         )qstartr   numr   Zorganic_results)r!   r"   r#   r   r   z'No good Google Scholar Result was foundc                 S   sx   g | ]p}d | dd dddd | di  dg D  d	| di  d
d d| di  di  dd qS )zTitle: title z

Authors: ,c                 S   s   g | ]}| d qS )name)get).0authorr   r   r   
<listcomp>z   s     z:GoogleScholarAPIWrapper.run.<locals>.<listcomp>.<listcomp>Zpublication_infoZauthorsz

Summary: summaryz
Total-Citations: Zinline_linksZcited_bytotal)r(   join)r)   resultr   r   r   r+   y   s   z/GoogleScholarAPIWrapper.run.<locals>.<listcomp>z

)
maxr	   r   r   minr   get_dictr(   extendr.   )selfr   Ztotal_resultspageresultsZdocsr   r   r   runH   s^      


 
zGoogleScholarAPIWrapper.run)r   r   r   __doc__r	   int__annotations__r   strr   r   r   r   r   r   r   r7   r   r   r   r   r   	   s   
"r   N)
r8   typingr   r   Zlangchain_core.pydantic_v1r   r   Zlangchain_core.utilsr   r   r   r   r   r   <module>   s   