Ë
    uPêjœ  ã                   ó¾   — U 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mZmZmZ ddlmZmZmZ ddlmZ d	Zeed
<   dZeed<   dZeed<    G d„ de«      Zy)aN  
Calls APISerpent's search endpoints to search Google, Bing, Yahoo, or DuckDuckGo.

Two endpoints under one provider, selected via the ``deep`` boolean param:
- ``deep=False`` (default) -> quick search (/api/search/quick)
- ``deep=True``            -> deep search  (/api/search)

APISerpent API Reference: https://apiserpent.com/docs
é    )ÚFinalÚLiteralÚcast)Ú	urlencodeN)ÚLogging)ÚDEEP_SEARCH_PATHÚNUM_MAXÚNUM_MINÚNUM_MIN_DEEPÚQUICK_SEARCH_PATHÚAPISerpentSearchParams)ÚBaseSearchConfigÚSearchResponseÚSearchResult)Úget_secret_strÚdeepÚDEEP_SEARCH_PARAMzhttps://apiserpent.comÚAPISERPENT_BASEÚ_apiserpent_paramsÚAPISERPENT_PARAMS_KEYc            	       ó  — e Zd Zedefd„«       Zded   fd„Zedede	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ededee   defd„«       Zdej"                  dedz  defd„Zy)ÚAPISerpentSearchConfigÚreturnc                   ó   — y)NÚ
APISerpent© r   ó    úr/home/oem/CyberBrain26-unified/.venv/lib/python3.12/site-packages/litellm/llms/apiserpent/search/transformation.pyÚui_friendly_namez'APISerpentSearchConfig.ui_friendly_name&   s   € àr   )ÚGETÚPOSTc                  ó   — y)Nr    r   )Úselfs    r   Úget_http_methodz&APISerpentSearchConfig.get_http_method*   s   € Ør   Úoptional_paramsc                 ó>   — t        | j                  t        «      «      S ©N)ÚboolÚgetr   )r%   s    r   Ú_is_deep_searchz&APISerpentSearchConfig._is_deep_search-   s   € ä�O×'Ñ'Ô(9Ó:Ó;Ð;r   NÚheadersÚapi_keyÚapi_basec                 óh   — | j                  ||ddt        ¬«      }|st        d«      ‚||d<   d|d<   |S )N)ÚAPISERPENT_API_KEYÚAPISERPENT_API_BASE)Úcaller_api_keyÚcaller_api_baseÚkey_env_varsÚbase_env_varÚdefault_api_basezMAPISERPENT_API_KEY is not set. Set `APISERPENT_API_KEY` environment variable.z	X-API-Keyzapplication/jsonzContent-Type)Úresolve_server_api_keyr   Ú
ValueError)r#   r+   r,   r-   Úkwargss        r   Úvalidate_environmentz+APISerpentSearchConfig.validate_environment1   sR   € ð ×-Ñ-Ø"Ø$Ø0Ø.Ü,ð .ó 
ˆñ ÜÐlÓmÐmØ&ˆ�ÑØ"4ˆ�ÑØˆr   Údatac                 ó$  — |xs t        d«      xs t        j                  d«      }| j                  |«      rt        nt
        }|j                  |«      s|› |› �}|r3t        |t        «      r#t        |v rt        |t           d¬«      }|› d|› �S |S )a�  
        Build the search URL. APISerpent uses GET, so the transformed request is
        serialized into the query string. The endpoint path (quick vs deep) is
        always applied; an ``api_base`` / ``APISERPENT_API_BASE`` override only
        changes the host. The ``endswith`` guard keeps this idempotent, since the
        handler re-invokes this method with the already-resolved URL as api_base.
        r0   ú/T)Údoseqú?)r   r   Úrstripr*   r   r   ÚendswithÚ
isinstanceÚdictr   r   )r#   r-   r%   r:   r8   ÚbaseÚpathÚquery_strings           r   Úget_complete_urlz'APISerpentSearchConfig.get_complete_urlE   s�   € ð ÒTœNÐ+@ÓAÒTÄ_×\Ñ\Ð]`ÓaˆØ*.×*>Ñ*>¸Ô*OÕ&ÔUfˆØ�}‰}˜TÔ"Ø�V˜D˜6�?ˆDá”J˜t¤TÔ*Ô/DÈÑ/LÜ"+¨DÔ1FÑ,GÈtÔ"TˆLØ�V˜1˜\˜NÐ+Ð+àˆr   Úqueryc                 ón  — t        |t        «      rdj                  |«      }| j                  |«      }i }d|v r.|rt        nt
        }t        |t        |d   t        «      «      |d<   d|v r$t        t        |d   «      j                  «       |d<   |j                  «       D ]&  \  }}|t        j                  «       v sŒ||vsŒ"|||<   Œ( i t        di |¤Žj                  «       ¥d|i¥}	d|v rD|d   }
t        |
t        «      r/t!        |
«      dkD  r!| j#                  t        |	d   «      |
«      |	d<   t$        |	iS )	aû  
        Transform a unified search request into APISerpent query params.

        Unified spec mappings:
        - query               -> q
        - max_results         -> num (clamped to the endpoint's valid range)
        - country             -> country (lowercased)
        - search_domain_filter -> site: clauses appended to q

        All other APISerpent params (engine, language, freshness, safe, pages,
        format, pixel_position) pass through, defaulting via APISerpentSearchParams.
        ú Úmax_resultsÚnumÚcountryÚqÚsearch_domain_filterr   r   )rA   ÚlistÚjoinr*   r   r
   ÚmaxÚminr	   r   ÚstrÚlowerÚitemsr   Úfield_namesÚto_request_paramsÚlenÚ_append_domain_filtersr   )r#   rG   r%   r8   Úis_deepÚ	overridesÚnum_minÚparamÚvalueÚparamsÚdomainss              r   Útransform_search_requestz/APISerpentSearchConfig.transform_search_request^   s?  € ô$ �eœTÔ"Ø—H‘H˜U“OˆEà×-Ñ-¨oÓ>ˆà!#ˆ	Ø˜OÑ+Ù-4�\¼'ˆGÜ" 7¬C°ÀÑ0NÔPWÓ,XÓYˆI�eÑØ˜Ñ'Ü#'¬¨_¸YÑ-GÓ#H×#NÑ#NÓ#PˆI�iÑ à+×1Ñ1Ó3ò 	)‰LˆE�5ØÔ.×:Ñ:Ó<Ò<ÀÈiÒAWØ#(�	˜%Ò ð	)ð `Ô1Ñ>°IÑ>×PÑPÓRÐ_ÐTWÐY^Ñ_ˆà! _Ñ4Ø,Ð-CÑDˆGÜ˜'¤4Ô(¬S°«\¸AÒ-=Ø"×9Ñ9¼#¸fÀS¹kÓ:JÈGÓT��s‘ä% vÐ.Ð.r   r`   c                 óD   — dj                  d„ |D «       «      }d| › d|› d�S )Nz OR c              3   ó&   K  — | ]	  }d |› �–— Œ y­w)zsite:Nr   )Ú.0Údomains     r   ú	<genexpr>z@APISerpentSearchConfig._append_domain_filters.<locals>.<genexpr>‹   s   è ø€ Ò+SÀ¨e°F°8Ô,<Ñ+Sùs   ‚ú(z) (ú))rP   )rG   r`   Údomain_clausess      r   rY   z-APISerpentSearchConfig._append_domain_filters‰   s,   € à &§¡Ñ+SÈ7Ô+SÓ SˆØ�5�'˜˜^Ð,¨AÐ.Ð.r   Úraw_responseÚlogging_objc                 ó|  — |j                  «       }|j                  d«      xs i }t        |t        «      r|j                  dg «      n|}g }|D ]`  }|j	                  t        |j                  dd«      |j                  dd«      |j                  dd«      |j                  d«      d¬	«      «       Œb t        |d
¬«      S )zî
        Transform APISerpent response to the unified SearchResponse format.

        Full format nests results under ``results.organic[]``; simple format
        returns a flat ``results[]`` array. Both expose title/url/snippet.
        ÚresultsÚorganicÚtitleÚ ÚurlÚsnippetÚdateN)ro   rq   rr   rs   Úlast_updatedÚsearch)rm   Úobject)Újsonr)   rA   rB   Úappendr   r   )	r#   rj   rk   r8   Úresponse_jsonÚraw_resultsrn   rm   Úresults	            r   Útransform_search_responsez0APISerpentSearchConfig.transform_search_responseŽ   sº   € ð  ,×0Ñ0Ó2ˆà*×.Ñ.¨yÓ9Ò?¸RˆÜ;EÀkÔSWÔ;X˜Ÿ™¨°BÔ7Ð^iˆà-/ˆØò 		ˆFØ�N‰NÜØ Ÿ*™* W¨bÓ1ØŸ
™
 5¨"Ó-Ø"ŸJ™J y°"Ó5ØŸ™ FÓ+Ø!%ôõð		ô ØØô
ð 	
r   )NNr'   )Ú__name__Ú
__module__Ú__qualname__ÚstaticmethodrS   r   r   r$   rB   r(   r*   r9   rO   rF   ra   rY   ÚhttpxÚResponseÚLiteLLMLoggingObjr   r|   r   r   r   r   r   %   sL  „ Øð˜cò ó ðð ¨Ñ!7ó ð ð<¨ð <°$ò <ó ð<ð #Ø#ñ	àðð �t‘ðð ˜‘*ð	ð 
óð0 *.ñ	à˜‘*ðð ðð �T˜$‘ZÑ $Ñ&ð	ð 
óð2)/à�T˜#‘Y‰ð)/ð ð)/ð
 
ó)/ðV ð/ cð /°D¸±Ið /À#ò /ó ð/ð 
à—n‘nð 
ð '¨Ñ-ð 
ð
 
ô 
r   r   )Ú__doc__Útypingr   r   r   Úurllib.parser   r�   Ú*litellm.litellm_core_utils.litellm_loggingr   rƒ   Ú'litellm.llms.apiserpent.search.defaultsr   r	   r
   r   r   r   Ú+litellm.llms.base_llm.search.transformationr   r   r   Úlitellm.secret_managers.mainr   r   Ú__annotations__r   r   r   r   r   r   ú<module>rŒ      sc   ðò÷ (Ñ 'Ý "ã å S÷÷ ÷ñ õ
 8à!Ð �5Ó !Ø1€�Ó 1Ø3Ð �uÓ 3ôI
Ð-õ I
r   