a
    bg                     @   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                   @   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< eddZedde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autobackendtextsourceZforbid)extrabefore)mode)valuesreturnc                 C   s0   zddl m} W n ty*   tdY n0 |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   }/var/www/html/cobodadashboardai.evdpl.com/venv/lib/python3.9/site-packages/langchain_community/utilities/duckduckgo_search.pyvalidate_environment,   s    
z/DuckDuckGoSearchAPIWrapper.validate_environmentN)queryr   r   c              	   C   sz   ddl m} | T}|j|| j| j| j|p.| j| jd}|rXdd |D W  d   S W d   n1 sl0    Y  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>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   sv   ddl m} | P}|j|| j| j| j|p.| jd}|rTdd |D W  d   S W d   n1 sh0    Y  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&   [   r'   z9DuckDuckGoSearchAPIWrapper._ddgs_news.<locals>.<listcomp>N)r   r   newsr
   r   r   r   r(   r   r   r   
_ddgs_newsL   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>i   r'   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u 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   NResultr-   )r   r*   r,   )r)   r!   r   r   r2   r   r   r   r2   k   s    

z"DuckDuckGoSearchAPIWrapper.results)N)N)N)__name__
__module____qualname____doc__r
   r   str__annotations__r   r   r   intr   r   r   Zmodel_configr   classmethodr   r   r    r   r*   r,   r3   r2   r   r   r   r   r	      s:   
   
r	   N)r>   typingr   r   r   r   Zpydanticr   r   r   r	   r   r   r   r   <module>   s   