
    PL
j                    v    d Z ddlmZ ddlZddlmZmZ ddlmZ  ej	        e
          Z G d de          ZdS )u  DuckDuckGo search — plugin form (via the ``ddgs`` package).

Subclasses the plugin-facing :class:`agent.web_search_provider.WebSearchProvider`.
The legacy in-tree module ``tools.web_providers.ddgs`` was removed in the
same commit that moved this code under ``plugins/``; this file is now the
canonical implementation.

The ``ddgs`` package is an optional dependency. ``is_available()`` reflects
whether the package is importable; the plugin still registers either way so
``hermes tools`` can prompt the user to install it.
    )annotationsN)AnyDict)WebSearchProviderc                  l    e Zd ZdZedd            Zedd            ZddZddZdd	Z	dddZ
ddZdS )DDGSWebSearchProvidera  DuckDuckGo HTML-scrape search provider.

    No API key needed. Rate limits are enforced server-side by DuckDuckGo;
    the provider surfaces ``DuckDuckGoSearchException`` and other ddgs errors
    as ``{"success": False, "error": ...}`` rather than raising.
    returnstrc                    dS )Nddgs selfs    =/home/kuhnn/.hermes/hermes-agent/plugins/web/ddgs/provider.pynamezDDGSWebSearchProvider.name   s    v    c                    dS )NDuckDuckGo (ddgs)r   r   s    r   display_namez"DDGSWebSearchProvider.display_name#   s    ""r   boolc                2    	 ddl }dS # t          $ r Y dS w xY w)u   Return True when the ``ddgs`` package is importable.

        Probes the import once; cheap because Python caches the import. Must
        NOT perform network I/O — runs at tool-registration time and on every
        ``hermes tools`` paint.
        r   NTF)r   ImportError)r   r   s     r   is_availablez"DDGSWebSearchProvider.is_available'   s7    	KKK4 	 	 	55	s    
c                    dS )NTr   r   s    r   supports_searchz%DDGSWebSearchProvider.supports_search5   s    tr   c                    dS )NFr   r   s    r   supports_extractz&DDGSWebSearchProvider.supports_extract8   s    ur      querylimitintDict[str, Any]c                ,   	 ddl m} n# t          $ r dddcY S w xY wt          dt	          |                    }	 g } |            5 }t          |                    ||                    D ]\  }}||k    r nt          |                    d          p|                    d	          pd
          }	|	                    t          |                    dd
                    |	t          |                    dd
                    |dz   d           ddd           n# 1 swxY w Y   n:# t          $ r-}
t                              d|
           dd|
 dcY d}
~
S d}
~
ww xY wt                              d|t          |          |           dd|idS )z:Execute a DuckDuckGo search and return normalized results.r   )DDGSFu8   ddgs package is not installed — run `pip install ddgs`)successerror   )max_resultshrefurl titlebody)r,   r*   descriptionpositionNzDDGS search error: %szDuckDuckGo search failed: z'DDGS search '%s': %d results (limit %d)Tweb)r%   data)r   r$   r   maxr!   	enumeratetextr
   getappend	Exceptionloggerwarninginfolen)r   r   r    r$   
safe_limitweb_resultsclientihitr*   excs              r   searchzDDGSWebSearchProvider.search;   s5   	!!!!!!! 	 	 	 S    	 CJJ''
	SK 6'Ez(R(RSS  FAsJcggfooEE2FFC&&%(")=)=%>%>#&+.swwvr/B/B+C+C()A	                    	S 	S 	SNN2C888$/QC/Q/QRRRRRRRR	S 	=uc+FVFVX]^^^%)=>>>sN   	 D+ CDD+ D##D+ &D#'D+ +
E"5"EE"E"c                    dddg ddS )Nr   u   free · no key · search onlyuR   Search via the ddgs Python package — no API key (pair with any extract provider)r   )r   badgetagenv_vars
post_setupr   r   s    r   get_setup_schemaz&DDGSWebSearchProvider.get_setup_schema_   s"    '4g !
 
 	
r   N)r	   r
   )r	   r   )r   )r   r
   r    r!   r	   r"   )r	   r"   )__name__
__module____qualname____doc__propertyr   r   r   r   r   rB   rH   r   r   r   r   r      s             X # # # X#         "? "? "? "? "?H	
 	
 	
 	
 	
 	
r   r   )rL   
__future__r   loggingtypingr   r   agent.web_search_providerr   	getLoggerrI   r8   r   r   r   r   <module>rS      s   
 
 # " " " " "          7 7 7 7 7 7		8	$	$Q
 Q
 Q
 Q
 Q
- Q
 Q
 Q
 Q
 Q
r   