o
    Zh	                     @   sD   d Z ddlmZmZmZmZ ddlmZmZm	Z	 G dd deZ
dS )ziUtil that calls DuckDuckGo Search.

No setup required. Free.
https://pypi.org/project/duckduckgo-search/
    )AnyDictListOptional)	BaseModel
ConfigDictmodel_validatorc                   @   sT  e Zd ZU dZdZee ed< 	 dZeed< 	 dZ	ee ed< 	 dZ
eed	< d
Zeed< 	 dZeed< 	 eddZeddededefddZ	d"ded	ee deeeef  fddZ	d"ded	ee deeeef  fddZ	d"ded	ee deeeef  fddZdedefddZ	d"ded	edee deeeef  fd d!ZdS )#DuckDuckGoSearchAPIWrapperzQWrapper for DuckDuckGo Search API.

    Free and does not require any setup.
    zwt-wtregionZmoderate
safesearchytime   max_resultsautobackendtextsourceZforbid)extrabefore)modevaluesreturnc                 C   s*   z	ddl m} W |S  ty   tdw )z3Validate that python package exists in environment.r   DDGSzmCould not import duckduckgo-search python package. Please install it with `pip install -U duckduckgo-search`.)duckduckgo_searchr   ImportError)clsr   r    r   f/var/www/html/lang_env/lib/python3.10/site-packages/langchain_community/utilities/duckduckgo_search.pyvalidate_environment,   s   z/DuckDuckGoSearchAPIWrapper.validate_environmentNqueryc              	   C   s|   ddl m} | +}|j|| j| j| j|p| j| jd}|r,dd |D W  d   S W d   g S 1 s7w   Y  g S )z<Run query through DuckDuckGo text search and return results.r   r   )r
   r   	timelimitr   r   c                 S      g | ]}|qS r   r   .0rr   r   r   
<listcomp>I       z9DuckDuckGoSearchAPIWrapper._ddgs_text.<locals>.<listcomp>N)r   r   r   r
   r   r   r   r   selfr!   r   r   ZddgsZddgs_genr   r   r   
_ddgs_text9   s$   	
z%DuckDuckGoSearchAPIWrapper._ddgs_textc                 C   sx   ddl m} | )}|j|| j| j| j|p| jd}|r*dd |D W  d   S W d   g S 1 s5w   Y  g S )z<Run query through DuckDuckGo news search and return results.r   r   )r
   r   r"   r   c                 S   r#   r   r   r$   r   r   r   r'   [   r(   z9DuckDuckGoSearchAPIWrapper._ddgs_news.<locals>.<listcomp>N)r   r   newsr
   r   r   r   r)   r   r   r   
_ddgs_newsL   s"   


z%DuckDuckGoSearchAPIWrapper._ddgs_newsc                 C   st   ddl m} | '}|j|| j| j|p| jd}|r(dd |D W  d   S W d   g S 1 s3w   Y  g S )z=Run query through DuckDuckGo image search and return results.r   r   )r
   r   r   c                 S   r#   r   r   r$   r   r   r   r'   l   r(   z;DuckDuckGoSearchAPIWrapper._ddgs_images.<locals>.<listcomp>N)r   r   imagesr
   r   r   r)   r   r   r   _ddgs_images^   s    
		z'DuckDuckGoSearchAPIWrapper._ddgs_imagesc                 C   sb   | j dkr| |}n| j dkr| |}n| j dkr!| |}ng }|s'dS ddd |D S )z=Run query through DuckDuckGo and return concatenated results.r   r,   r.   *No good DuckDuckGo Search Result was found c                 s   s    | ]}|d  V  qdS )bodyNr   r$   r   r   r   	<genexpr>|   s    z1DuckDuckGoSearchAPIWrapper.run.<locals>.<genexpr>)r   r+   r-   r/   join)r*   r!   resultsr   r   r   runo   s   


zDuckDuckGoSearchAPIWrapper.runc                 C   s   |p| j }|dkrdd | j||dD }n$|dkr'dd | j||dD }n|dkr8dd | j||dD }ng }|d	u rCd
dig}|S )a  Run query through DuckDuckGo and return metadata.

        Args:
            query: The query to search for.
            max_results: The number of results to return.
            source: The source to look from.

        Returns:
            A list of dictionaries with the following keys:
                snippet - The description of the result.
                title - The title of the result.
                link - The link to the result.
        r   c                 S   s$   g | ]}|d  |d |d dqS )r2   titlehref)snippetr7   linkr   r$   r   r   r   r'      s    z6DuckDuckGoSearchAPIWrapper.results.<locals>.<listcomp>)r   r,   c                 S   s0   g | ]}|d  |d |d |d |d dqS )r2   r7   urldater   )r9   r7   r:   r<   r   r   r$   r   r   r   r'      s    r.   c              
   S   s<   g | ]}|d  |d |d |d |d |d |d dqS )r7   	thumbnailimager;   heightwidthr   )r7   r=   r>   r;   r?   r@   r   r   r$   r   r   r   r'      s    
NResultr0   )r   r+   r-   r/   )r*   r!   r   r   r5   r   r   r   r5   ~   s"   



z"DuckDuckGoSearchAPIWrapper.results)N)__name__
__module____qualname____doc__r
   r   str__annotations__r   r   r   intr   r   r   Zmodel_configr   classmethodr   r   r    r   r+   r-   r/   r6   r5   r   r   r   r   r	      sl   
 


r	   N)rE   typingr   r   r   r   Zpydanticr   r   r   r	   r   r   r   r   <module>   s    