o
    ȳg                     @   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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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regionmoderate
safesearchytime   max_resultsautobackendtextsource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    k/var/www/html/chatdoc2/venv/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   ddgs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   sL   | 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   r0   *No good DuckDuckGo Search Result was found c                 s   s    | ]}|d  V  qdS )bodyNr    r&   r    r    r!   	<genexpr>i   s    z1DuckDuckGoSearchAPIWrapper.run.<locals>.<genexpr>)r   r/   r1   join)r,   r#   resultsr    r    r!   run^   s   

zDuckDuckGoSearchAPIWrapper.runc                 C   sh   |p| j }|dkrdd | j||dD }n|dkr'dd | j||dD }ng }|du r2d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 )r4   titlehref)snippetr9   linkr    r&   r    r    r!   r)   }   s    z6DuckDuckGoSearchAPIWrapper.results.<locals>.<listcomp>)r   r0   c                 S   s0   g | ]}|d  |d |d |d |d dqS )r4   r9   urldater   )r;   r9   r<   r>   r   r    r&   r    r    r!   r)      s    NResultr2   )r   r/   r1   )r,   r#   r   r   r7   r    r    r!   r7   k   s   

z"DuckDuckGoSearchAPIWrapper.results)N)__name__
__module____qualname____doc__r
   r   str__annotations__r   r   r   intr   r   r   model_configr   classmethodr   r   r"   r   r/   r1   r8   r7   r    r    r    r!   r	      s\   
 

r	   N)rC   typingr   r   r   r   pydanticr   r   r   r	   r    r    r    r!   <module>   s    