Ë
    uPêjR$  ã                   ó¢   — d Z ddlmZmZmZ ddlmZ ddlZddlm	Z
 ddlmZmZmZ ddlmZ  G d„ d	e«      Z G d
„ ded¬«      Z G d„ de«      Zy)zp
Calls DuckDuckGo's Instant Answer API to search the web.

DuckDuckGo API Reference: https://duckduckgo.com/api
é    )ÚFinalÚLiteralÚ	TypedDict)Ú	urlencodeN)ÚLogging)ÚBaseSearchConfigÚSearchResponseÚSearchResult)Úget_secret_strc                   ó   — e Zd ZU dZeed<   y)Ú _DuckDuckGoSearchRequestRequiredz2Required fields for DuckDuckGo Search API request.ÚqN)Ú__name__Ú
__module__Ú__qualname__Ú__doc__ÚstrÚ__annotations__© ó    úr/home/oem/CyberBrain26-unified/.venv/lib/python3.12/site-packages/litellm/llms/duckduckgo/search/transformation.pyr   r      s
   … Ù<à
„Fr   r   c                   óD   — e Zd ZU dZeed<   eed<   eed<   eed<   eed<   y)ÚDuckDuckGoSearchRequestz`
    DuckDuckGo Instant Answer API request format.
    Based on: https://duckduckgo.com/api
    ÚformatÚprettyÚno_redirectÚno_htmlÚskip_disambigN)r   r   r   r   r   r   Úintr   r   r   r   r      s$   … ñð
 ƒKØƒKØÓØƒLØÔr   r   F)Útotalc            	       óÞ   — e Zd ZdZedefd„«       Zded   fd„Z	 	 dde	dedz  d	edz  de	fd
„Z
	 dd	edz  de	de	ee	   z  dz  defd„Zdeee   z  de	de	fd„Zdej                  dedefd„Zy)ÚDuckDuckGoSearchConfigzhttps://api.duckduckgo.comÚreturnc                   ó   — y)NÚ
DuckDuckGor   r   r   r   Úui_friendly_namez'DuckDuckGoSearchConfig.ui_friendly_name+   s   € àr   )ÚGETÚPOSTc                  ó   — y)zŸ
        Get HTTP method for search requests.
        DuckDuckGo Instant Answer API uses GET requests.

        Returns:
            HTTP method 'GET'
        r'   r   )Úselfs    r   Úget_http_methodz&DuckDuckGoSearchConfig.get_http_method/   s   € ð r   NÚheadersÚapi_keyÚapi_basec                 ó   — d|d<   |S )z�
        Validate environment and return headers.
        DuckDuckGo Instant Answer API does not require authentication.
        zapplication/jsonzContent-Typer   )r*   r,   r-   r.   Úkwargss        r   Úvalidate_environmentz+DuckDuckGoSearchConfig.validate_environment9   s   € ð #5ˆ�ÑØˆr   Úoptional_paramsÚdatac                 óž   — |xs t        d«      xs | j                  }|r-t        |t        «      rd|v r|d   }t	        |d¬«      }|› d|› �S |S )z‰
        Get complete URL for Search endpoint.
        DuckDuckGo uses query parameters, so we construct the URL with the query.
        ÚDUCKDUCKGO_API_BASEÚ_duckduckgo_paramsT)Údoseqz/?)r   r5   Ú
isinstanceÚdictr   )r*   r.   r2   r3   r0   ÚparamsÚquery_strings          r   Úget_complete_urlz'DuckDuckGoSearchConfig.get_complete_urlH   sb   € ð Ò`œ~Ð.CÓDÒ`È×H`ÑH`ˆñ ”J˜t¤TÔ*Ð/CÀtÑ/KØ Ð!5Ñ6ˆFÜ"+¨F¸$Ô"?ˆLØ�Z˜r , Ð0Ð0àˆr   Úqueryc                 ó´   — t        |t        «      rdj                  |«      }|ddœ}t        |«      }d|v r|d   |d<   g d¢}|D ]  }||v sŒ||   ||<   Œ d|iS )a
  
        Transform Search request to DuckDuckGo API format.

        Args:
            query: Search query (string or list of strings). DuckDuckGo only supports single string queries.
            optional_params: Optional parameters for the request
                - max_results: Maximum number of search results (DuckDuckGo API doesn't directly support this, used for filtering)
                - format: Output format ('json', 'xml')
                - pretty: Pretty print (0 or 1)
                - no_redirect: Skip HTTP redirects (0 or 1)
                - no_html: Remove HTML from text (0 or 1)
                - skip_disambig: Skip disambiguation results (0 or 1)

        Returns:
            Dict with typed request data following DuckDuckGoSearchRequest spec
        ú Újson)r   r   Úmax_resultsÚ_max_results)r   r   r   r   r6   )r8   ÚlistÚjoinr9   )r*   r=   r2   r0   Úrequest_dataÚresult_dataÚ
ddg_paramsÚparams           r   Útransform_search_requestz/DuckDuckGoSearchConfig.transform_search_request]   sŒ   € ô, �eœTÔ"à—H‘H˜U“OˆEð Øñ8
ˆô " ,Ó/ˆà˜OÑ+Ø*9¸-Ñ*HˆK˜Ñ'ò Rˆ
Øò 	<ˆEØ˜Ò'Ø%4°UÑ%;�˜EÒ"ð	<ð
 ! +ð
ð 	
r   Úraw_responseÚlogging_objc           	      ó  — |j                  «       }|j                  r |j                  j                  j                  ni }d}d|v r	 t	        |d   «      }g }|j                  d«      rb|j                  d«      rQt        |j                  dd«      |j                  dd«      |j                  dd«      dd¬«      }|j                  |«       |j                  dg «      }	|	D �]Š  }
|�t        |«      |k\  r �nwt        |
t        «      sŒ(d	|
v r•d
|
v r‘|
j                  d
d«      }|
j                  d	d«      }d|v r-|j                  dd«      }|d   }t        |«      dkD  r|d   n|}nt        |«      dkD  r|dd dz   n|}|}t        |||dd¬«      }|j                  |«       ŒÁd|
v sŒÆ|
j                  dg «      }|D ]®  }|�t        |«      |k\  r Œïd	|v sŒd
|v sŒ|j                  d
d«      }|j                  d	d«      }d|v r-|j                  dd«      }|d   }t        |«      dkD  r|d   n|}nt        |«      dkD  r|dd dz   n|}|}t        |||dd¬«      }|j                  |«       Œ° �Œ� t        |d¬«      S # t
        t        f$ r Y �Œ6w xY w)uM  
        Transform DuckDuckGo API response to LiteLLM unified SearchResponse format.

        DuckDuckGo â†’ LiteLLM mappings:
        - RelatedTopics[].Text â†’ SearchResult.title + snippet
        - RelatedTopics[].FirstURL â†’ SearchResult.url
        - RelatedTopics[].Text â†’ SearchResult.snippet
        - No date/last_updated fields in DuckDuckGo response (set to None)

        Args:
            raw_response: Raw httpx response from DuckDuckGo API
            logging_obj: Logging object for tracking

        Returns:
            SearchResponse with standardized format
        NrB   ÚAbstractURLÚAbstractTextÚHeadingÚ )ÚtitleÚurlÚsnippetÚdateÚlast_updatedÚRelatedTopicsÚFirstURLÚTextz - é   r   é2   z...ÚTopicsÚsearch)ÚresultsÚobject)r@   ÚrequestrR   r:   r   Ú
ValueErrorÚ	TypeErrorÚgetr
   ÚappendÚlenr8   r9   Úsplitr	   )r*   rJ   rK   r0   Úresponse_jsonÚquery_paramsrA   r]   Úabstract_resultÚrelated_topicsÚtopicÚtextrR   ÚpartsrQ   rS   Úsearch_resultÚnested_topicsÚnested_topics                      r   Útransform_search_responsez0DuckDuckGoSearchConfig.transform_search_responseŒ   sÚ  € ð,  ,×0Ñ0Ó2ˆð BN×AUÒAU˜l×2Ñ2×6Ñ6×=Ò=Ð[]ˆØˆØ˜\Ñ)ðÜ! ,¨~Ñ">Ó?�ð
 ˆð ×Ñ˜]Ô+°×0AÑ0AÀ.Ô0QÜ%1Ø#×'Ñ'¨	°2Ó6Ø!×%Ñ% m°RÓ8Ø%×)Ñ)¨.¸"Ó=ØØ!ô&ˆOð �N‰N˜?Ô+ð !.× 1Ñ 1°/À2Ó FˆØ#ó 9	:ˆEàÐ&¬3¨w«<¸;Ò+FÚä˜%¤Õ&à Ñ&¨6°U©?Ø Ÿ9™9 V¨RÓ0�DØŸ)™) J°Ó3�Cð  ‘}Ø $§
¡
¨5°!Ó 4˜Ø % a¡˜Ü.1°%«j¸1ªn %¨¢(À$™ä58¸³YÀ²^  S b 	¨EÒ 1È˜Ø"&˜ä$0Ø#ØØ 'Ø!Ø%)ô%�Mð —N‘N =Õ1ð  Ò&Ø$)§I¡I¨h¸Ó$;�MØ(5ò :˜à&Ð2´s¸7³|À{Ò7RÙ!à%¨Ò5¸&ÀLÒ:PØ#/×#3Ñ#3°F¸BÓ#?˜DØ".×"2Ñ"2°:¸rÓ"B˜Cð  %¨™}Ø(,¯
©
°5¸!Ó(< Ø(-¨a© Ü69¸%³jÀ1²n¨%°ª(È$¡ä=@À»YÈº^¨¨S¨b¨	°EÒ(9ÐQU Ø*. ä,8Ø&+Ø$'Ø(/Ø%)Ø-1ô-˜Mð $ŸN™N¨=Õ9ò3:ðA9	:ôv ØØô
ð 	
øôc ¤	Ð*ò Úðús   ÁI8 É8JÊ
J)NN)N)r   r   r   r5   Ústaticmethodr   r&   r   r+   r9   r1   rC   r<   rI   ÚhttpxÚResponseÚLiteLLMLoggingObjr	   rp   r   r   r   r"   r"   (   s  „ Ø6Ðàð˜cò ó ðð ¨Ñ!7ó ð #Ø#ñ	àðð �t‘ðð ˜‘*ð	ð 
óð& *.ñ	à˜‘*ðð ðð �T˜$‘ZÑ $Ñ&ð	ð 
óð*-
à�T˜#‘Y‰ð-
ð ð-
ð
 
ó-
ð^r
à—n‘nðr
ð 'ðr
ð
 
ôr
r   r"   )r   Útypingr   r   r   Úurllib.parser   rr   Ú*litellm.litellm_core_utils.litellm_loggingr   rt   Ú+litellm.llms.base_llm.search.transformationr   r	   r
   Úlitellm.secret_managers.mainr   r   r   r"   r   r   r   ú<module>rz      sT   ðñ÷ -Ñ ,Ý "ã å S÷ñ õ
 8ô yô ô
Ð>Àeõ 
ôV
Ð-õ V
r   