U
    h"                     @   s<   d Z ddlmZmZmZ ddl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/
    )DictListOptional)	BaseModelroot_validatorc                   @   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< dZ
eed	< d
Zeed< dZeed< G dd dZeddeedddZd!eee eeeef  dddZd"eee eeeef  dddZeedddZd#eeee eeeef  d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apibackendtextsourcec                   @   s   e Zd ZdZdS )z!DuckDuckGoSearchAPIWrapper.ConfigZforbidN)__name__
__module____qualname__extra r   r   S/tmp/pip-unpacked-wheel-9gdii04g/langchain_community/utilities/duckduckgo_search.pyConfig(   s   r   T)pre)valuesreturnc                 C   s2   zddl m} W n tk
r,   tdY nX |S )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   r   r   validate_environment+   s    
z/DuckDuckGoSearchAPIWrapper.validate_environmentN)queryr   r   c              
   C   sd   ddl m} | H}|j|| j| j| j|p.| j| jd}|rVdd |D W  5 Q R  S W 5 Q R X g S )z<Run query through DuckDuckGo text search and return results.r   r   )r   r	   	timelimitr   r   c                 S   s   g | ]}|qS r   r   .0rr   r   r   
<listcomp>G   s     z9DuckDuckGoSearchAPIWrapper._ddgs_text.<locals>.<listcomp>)r   r   r   r   r	   r   r   r   selfr"   r   r   ZddgsZddgs_genr   r   r   
_ddgs_text7   s    $z%DuckDuckGoSearchAPIWrapper._ddgs_textc              
   C   s`   ddl m} | D}|j|| j| j| j|p.| jd}|rRdd |D W  5 Q R  S W 5 Q R X g S )z<Run query through DuckDuckGo news search and return results.r   r   )r   r	   r#   r   c                 S   s   g | ]}|qS r   r   r$   r   r   r   r'   Y   s     z9DuckDuckGoSearchAPIWrapper._ddgs_news.<locals>.<listcomp>)r   r   newsr   r	   r   r   r(   r   r   r   
_ddgs_newsJ   s    $z%DuckDuckGoSearchAPIWrapper._ddgs_news)r"   r   c                 C   sL   | j dkr| |}n| j dkr,| |}ng }|s8dS ddd |D S )z=Run query through DuckDuckGo and return concatenated results.r   r+   *No good DuckDuckGo Search Result was found c                 s   s   | ]}|d  V  qdS )bodyNr   r$   r   r   r   	<genexpr>g   s     z1DuckDuckGoSearchAPIWrapper.run.<locals>.<genexpr>)r   r*   r,   join)r)   r"   resultsr   r   r   run\   s    

zDuckDuckGoSearchAPIWrapper.run)r"   r   r   r   c                 C   sh   |p| j }|dkr,dd | j||dD }n&|dkrNdd | j||dD }ng }|dkrdd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 )r/   titlehref)snippetr4   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 )r/   r4   urldater   )r6   r4   r7   r9   r   r   r$   r   r   r   r'      s   NZResultr-   )r   r*   r,   )r)   r"   r   r   r2   r   r   r   r2   i   s    

z"DuckDuckGoSearchAPIWrapper.results)N)N)N)r   r   r   __doc__r   r   str__annotations__r	   r   r   intr   r   r   r   r   r!   r   r*   r,   r3   r2   r   r   r   r   r      s<   
       r   N)	r:   typingr   r   r   Zlangchain_core.pydantic_v1r   r   r   r   r   r   r   <module>   s   