
    
im                     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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auto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   DDGSzSCould not import ddgs python package. Please install it with `pip install -U ddgs`.)ddgsr   ImportError)clsr   r   s      C:\Users\Dell Inspiron 16\Desktop\tws\AgrotaPowerBi\back-agrota-powerbi\mcp-client-agrota\venv\Lib\site-packages\langchain_community/utilities/duckduckgo_search.pyvalidate_environmentz/DuckDuckGoSearchAPIWrapper.validate_environment,   sV    	!!!!!!! 	 	 	@  	
 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   r    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                     ddl m}  |            5 }|                    || 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 image search and return results.r   r   )r   r   r   c                     g | ]}|S r)   r)   r*   s     r#   r-   z;DuckDuckGoSearchAPIWrapper._ddgs_images.<locals>.<listcomp>l   r.   r/   N)r    r   imagesr   r   r   r0   s         r#   _ddgs_imagesz'DuckDuckGoSearchAPIWrapper._ddgs_images^   s     	TVV 	-t{{{?';4+;	 #  H  -,,8,,,	- 	- 	- 	- 	- 	- 	- 	--	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	s   8A##A'*A'c                    | j         dk    r|                     |          }nD| 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   r6   r:   *No good DuckDuckGo Search Result was found c              3   &   K   | ]}|d          V  dS )bodyNr)   r*   s     r#   	<genexpr>z1DuckDuckGoSearchAPIWrapper.run.<locals>.<genexpr>|   s&      33a&	333333r/   )r   r3   r7   r;   join)r1   r%   resultss      r#   runzDuckDuckGoSearchAPIWrapper.runo   s    ;&  ooe,,GG[F""ooe,,GG[H$$''..GGG 	@??xx337333333r/   c                    |p| j         }|dk    r"d |                     ||          D             }nR|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)snippetrG   linkr)   r*   s     r#   r-   z6DuckDuckGoSearchAPIWrapper.results.<locals>.<listcomp>   s>        fI'
AfINN  r/   )r   r6   c                 Z    g | ](}|d          |d         |d         |d         |d         d)S )r@   rG   urldater   )rI   rG   rJ   rM   r   r)   r*   s     r#   r-   z6DuckDuckGoSearchAPIWrapper.results.<locals>.<listcomp>   sT     	 	 	   !ywZeHfIk 	 	 	r/   r:   c           
      v    g | ]6}|d          |d         |d         |d         |d         |d         |d         d7S )rG   	thumbnailimagerL   heightwidthr   )rG   rO   rP   rL   rQ   rR   r   r)   r*   s     r#   r-   z6DuckDuckGoSearchAPIWrapper.results.<locals>.<listcomp>   sb         wZ!";wZU8kwZk   r/   NResultr=   )r   r3   r7   r;   )r1   r%   r   r   rC   s        r#   rC   z"DuckDuckGoSearchAPIWrapper.results~   s      &4;V KHH  GG v	 	 KHH	 	 	GG x  **5k*JJ  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   r3   r7   r;   rD   rC   r)   r/   r#   r   r      sT         
 $FHSM### !J    D(3- KGS FC :  L _(###	$ 	3 	 	 	 [ $#	 8< '/}	d38n	   ( 8< '/}	d38n	   & 8< '/}	d38n	   "4 4 4 4 4 4  EI4 44'*44<SM4	d38n	4 4 4 4 4 4r/   r   N)rW   typingr   r   r   r   pydanticr   r   r	   r   r)   r/   r#   <module>r_      s     - , , , , , , , , , , , ; ; ; ; ; ; ; ; ; ;f f f f f f f f f fr/   