
    7|h	                     J    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
y)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y)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                 D    	 ddl m} |S # t        $ r t        d      w xY 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   s      n/var/www/html/test/engine/venv/lib/python3.12/site-packages/langchain_community/utilities/duckduckgo_search.pyvalidate_environmentz/DuckDuckGoSearchAPIWrapper.validate_environment,   s5    	.   	M 	s   
 Nqueryc           	      (   ddl m}  |       5 }|j                  || j                  | j                  | j
                  |xs | j                  | j                        }|r|D cg c]  }| c}cddd       S 	 ddd       g S c c}w # 1 sw Y   g S xY w)z<Run query through DuckDuckGo text search and return results.r   r   )r   r   	timelimitr   r   N)r    r   r   r   r   r   r   r   selfr%   r   r   ddgsddgs_genrs          r#   
_ddgs_textz%DuckDuckGoSearchAPIWrapper._ddgs_text9   s     	+V 
	-tyy{{??))';4+;+; ! H #+,a,
	- 
	- 
	- 	 -
	- 	s   AB"	B+BBBc           	         ddl m}  |       5 }|j                  || j                  | j                  | j
                  |xs | j                        }|r|D cg c]  }| c}cddd       S 	 ddd       g S c c}w # 1 sw Y   g S xY w)z<Run query through DuckDuckGo news search and return results.r   r   )r   r   r'   r   N)r    r   newsr   r   r   r   r(   s          r#   
_ddgs_newsz%DuckDuckGoSearchAPIWrapper._ddgs_newsL   s     	+V 		-tyy{{??))';4+;+; ! H #+,a,		- 		- 		- 	 -		- 	s   A	A<	A7 A<7A<<Bc                     ddl m}  |       5 }|j                  || j                  | j                  |xs | j
                        }|r|D cg c]  }| c}cddd       S 	 ddd       g S c c}w # 1 sw Y   g S xY w)z=Run query through DuckDuckGo image search and return results.r   r   )r   r   r   N)r    r   imagesr   r   r   r(   s          r#   _ddgs_imagesz'DuckDuckGoSearchAPIWrapper._ddgs_images^   s     	+V 	-t{{{{??';4+;+;	 # H #+,a,	- 	- 	- 	 -	- 	s   >A1	A,A1,A11A;c                    | j                   dk(  r| j                  |      }nD| j                   dk(  r| j                  |      }n#| j                   dk(  r| j                  |      }ng }|sydj	                  d |D              S )z=Run query through DuckDuckGo and return concatenated results.r   r/   r2   *No good DuckDuckGo Search Result was found c              3   &   K   | ]	  }|d      yw)bodyN ).0r,   s     r#   	<genexpr>z1DuckDuckGoSearchAPIWrapper.run.<locals>.<genexpr>|   s     3a&	3s   )r   r-   r0   r3   join)r)   r%   resultss      r#   runzDuckDuckGoSearchAPIWrapper.runo   sr    ;;& ooe,G[[F"ooe,G[[H$''.GG?xx37333    c                    |xs | j                   }|dk(  r.| j                  ||      D cg c]  }|d   |d   |d   d }}n|dk(  r6| j                  ||      D cg c]  }|d   |d   |d   |d	   |d
   d }}nE|dk(  r>| j                  ||      D cg c]!  }|d   |d   |d   |d   |d   |d   |d
   d# }}ng }|ddig}|S c c}w c c}w c c}w )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   )r   r8   titlehref)snippetrA   linkr/   urldater   )rC   rA   rD   rF   r   r2   	thumbnailimageheightwidth)rA   rG   rH   rE   rI   rJ   r   Resultr5   )r   r-   r0   r3   )r)   r%   r   r   r,   r=   s         r#   r=   z"DuckDuckGoSearchAPIWrapper.results~   sS     &4;;V KH fI'
AfING  v KH	   !ywZeHfIk	G 	 x **5k*J  wZ!";wZU8kwZkG  G? "NOPGE
	s   CC&C)N)__name__
__module____qualname____doc__r   r   str__annotations__r   r   r   intr   r   r   model_configr	   classmethodr   r   r$   r   r-   r0   r3   r>   r=   r9   r?   r#   r   r      s   
 $FHSM# !J  D(3- KGS FC L (#	$ 	3 	  $	 8<'/}	d38n	( 8<'/}	d38n	& 8<'/}	d38n	"4 4 4  EI44'*44<SM4	d38n	4r?   r   N)rO   typingr   r   r   r   pydanticr   r   r	   r   r9   r?   r#   <module>rW      s&    - , ; ;f fr?   