
    Ng~                     R    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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                      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          Z ed          ededefd                        Z	 dded	ee         deeeef                  fdZ	 dded	ee         deeeef                  fdZdedefdZ	 dded	edee         deeeef                  f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apibackendtextsourceforbid)extrabefore)modevaluesreturnc                 P    	 ddl m} n# t          $ r t          d          w xY w|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   s      k/var/www/html/ai-engine/env/lib/python3.11/site-packages/langchain_community/utilities/duckduckgo_search.pyvalidate_environmentz/DuckDuckGoSearchAPIWrapper.validate_environment,   sV    	....... 	 	 	M  	
 s   	 #Nqueryc           	          ddl m}  |            5 }|                    || j        | j        | j        |p| j        | j                  }|rd |D             cddd           S 	 ddd           n# 1 swxY w Y   g S )z<Run query through DuckDuckGo text search and return results.r   r   )r   r   	timelimitr   r   c                     g | ]}|S  r)   .0rs     r#   
<listcomp>z9DuckDuckGoSearchAPIWrapper._ddgs_text.<locals>.<listcomp>I       ,,,a,,,    N)r    r   r   r   r   r   r   r   selfr%   r   r   ddgsddgs_gens         r#   
_ddgs_textz%DuckDuckGoSearchAPIWrapper._ddgs_text9   s     	+*****TVV 
	-tyy{?)';4+; !  H  -,,8,,,
	- 
	- 
	- 
	- 
	- 
	- 
	- 
	--
	- 
	- 
	- 
	- 
	- 
	- 
	- 
	- 
	- 
	- 
	- 
	- 
	- 
	- 
	- 	s   AA//A36A3c                     ddl m}  |            5 }|                    || j        | j        | j        |p| j                  }|rd |D             cddd           S 	 ddd           n# 1 swxY w Y   g S )z<Run query through DuckDuckGo news search and return results.r   r   )r   r   r'   r   c                     g | ]}|S r)   r)   r*   s     r#   r-   z9DuckDuckGoSearchAPIWrapper._ddgs_news.<locals>.<listcomp>[   r.   r/   N)r    r   newsr   r   r   r   r0   s         r#   
_ddgs_newsz%DuckDuckGoSearchAPIWrapper._ddgs_newsL   s     	+*****TVV 		-tyy{?)';4+; !  H  -,,8,,,		- 		- 		- 		- 		- 		- 		- 		--		- 		- 		- 		- 		- 		- 		- 		- 		- 		- 		- 		- 		- 		- 		- 	s   >A))A-0A-c                     | j         dk    r|                     |          }n#| j         dk    r|                     |          }ng }|sdS d                    d |D                       S )z=Run query through DuckDuckGo and return concatenated results.r   r7   *No good DuckDuckGo Search Result was found c              3   &   K   | ]}|d          V  dS )bodyNr)   r*   s     r#   	<genexpr>z1DuckDuckGoSearchAPIWrapper.run.<locals>.<genexpr>i   s&      33a&	333333r/   )r   r4   r8   join)r1   r%   resultss      r#   runzDuckDuckGoSearchAPIWrapper.run^   sw    ;&  ooe,,GG[F""ooe,,GGG 	@??xx337333333r/   c                     |p| j         }|dk    r"d |                     ||          D             }n*|dk    r"d |                     ||          D             }ng }|d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                 >    g | ]}|d          |d         |d         dS )r=   titlehref)snippetrD   linkr)   r*   s     r#   r-   z6DuckDuckGoSearchAPIWrapper.results.<locals>.<listcomp>}   s>        fI'
AfINN  r/   )r   r7   c                 Z    g | ](}|d          |d         |d         |d         |d         d)S )r=   rD   urldater   )rF   rD   rG   rJ   r   r)   r*   s     r#   r-   z6DuckDuckGoSearchAPIWrapper.results.<locals>.<listcomp>   sT     	 	 	   !ywZeHfIk 	 	 	r/   NResultr:   )r   r4   r8   )r1   r%   r   r   r@   s        r#   r@   z"DuckDuckGoSearchAPIWrapper.resultsk   s      &4;V KHH  GG v	 	 KHH	 	 	GG G? "NOPGr/   )N)__name__
__module____qualname____doc__r   r   str__annotations__r   r   r   intr   r   r   model_configr	   classmethodr   r   r$   r   r4   r8   rA   r@   r)   r/   r#   r   r      s         
 $FHSM### !J    D(3- KGS FC :  L _(###	$ 	3 	 	 	 [ $#	 8< '/}	d38n	   ( 8< '/}	d38n	   $4 4 4 4 4 4 EI' '''*'4<SM'	d38n	' ' ' ' ' 'r/   r   N)rO   typingr   r   r   r   pydanticr   r   r	   r   r)   r/   r#   <module>rW      s     - , , , , , , , , , , , ; ; ; ; ; ; ; ; ; ;F F F F F F F F F Fr/   