Ë
    uPêj’  ã                   ó’   — d Z ddlmZ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 Exa AI's /search endpoint to search the web.

Exa AI API Reference: https://docs.exa.ai/reference/search
é    )ÚFinalÚ	TypedDictN)ÚLogging)ÚBaseSearchConfigÚSearchResponseÚSearchResult)Úget_secret_strc                   ó   — e Zd ZU dZeed<   y)Ú_ExaAISearchRequestRequiredz.Required fields for Exa AI Search API request.ÚqueryN)Ú__name__Ú
__module__Ú__qualname__Ú__doc__ÚstrÚ__annotations__© ó    ún/home/oem/CyberBrain26-unified/.venv/lib/python3.12/site-packages/litellm/llms/exa_ai/search/transformation.pyr   r      s
   … Ù8à„Jr   r   c                   óÆ   — e Zd ZU dZeed<   eed<   eed<   eed<   ee   ed<   ee   ed<   eed<   eed	<   eed
<   eed<   ee   ed<   ee   ed<   ee	z  ed<   eed<   e	ed<   y)ÚExaAISearchRequestz^
    Exa AI Search API request format.
    Based on: https://docs.exa.ai/reference/search
    ÚtypeÚcategoryÚuserLocationÚ
numResultsÚincludeDomainsÚexcludeDomainsÚstartCrawlDateÚendCrawlDateÚstartPublishedDateÚendPublishedDateÚincludeTextÚexcludeTextÚcontextÚ
moderationÚcontentsN)
r   r   r   r   r   r   ÚintÚlistÚboolÚdictr   r   r   r   r      ss   … ñð
 ƒIØƒMØÓØƒOØ˜‘IÓØ˜‘IÓØÓØÓØÓØÓØ�c‘ÓØ�c‘ÓØ�D‰[ÓØÓØ„Nr   r   F)Útotalc            	       óÌ   — e Zd ZdZ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dej                  dedefd„Zy)ÚExaAISearchConfigzhttps://api.exa.aiÚreturnc                   ó   — y)NzExa AIr   r   r   r   Úui_friendly_namez"ExaAISearchConfig.ui_friendly_name4   s   € àr   NÚheadersÚapi_keyÚapi_basec                 ót   — | j                  ||dd| j                  ¬«      }|st        d«      ‚||d<   d|d<   |S )z:
        Validate environment and return headers.
        )ÚEXA_API_KEYÚEXA_API_BASE)Úcaller_api_keyÚcaller_api_baseÚkey_env_varsÚbase_env_varÚdefault_api_basez?EXA_API_KEY is not set. Set `EXA_API_KEY` environment variable.z	x-api-keyzapplication/jsonzContent-Type)Úresolve_server_api_keyÚEXA_AI_API_BASEÚ
ValueError)Úselfr1   r2   r3   Úkwargss        r   Úvalidate_environmentz&ExaAISearchConfig.validate_environment8   sX   € ð ×-Ñ-Ø"Ø$Ø)Ø'Ø!×1Ñ1ð .ó 
ˆñ ÜÐ^Ó_Ð_Ø&ˆ�ÑØ"4ˆ�ÑØˆr   Úoptional_paramsÚdatac                 ól   — |xs t        d«      xs | j                  }|j                  d«      s|› d�}|S )z7
        Get complete URL for Search endpoint.
        r6   z/search)r	   r=   Úendswith)r?   r3   rB   rC   r@   s        r   Úget_complete_urlz"ExaAISearchConfig.get_complete_urlO   s?   € ð ÒUœ~¨nÓ=ÒUÀ×AUÑAUˆð × Ñ  Ô+Ø"˜ 7Ð+ˆHàˆr   r   c                 ó.  — t        |t        «      rdj                  |«      }d|i}d|v r|d   |d<   d|v r|d   |d<   d|v r|d   |d<   t        |«      }|j	                  «       D ]"  \  }}|| j                  «       vsŒ||vsŒ|||<   Œ$ d	|vrd
di|d	<   |S )uª  
        Transform Search request to Exa AI API format.

        Transforms Perplexity unified spec parameters:
        - query â†’ query (same)
        - max_results â†’ numResults
        - search_domain_filter â†’ includeDomains
        - country â†’ userLocation
        - max_tokens_per_page â†’ (not applicable, ignored)

        All other Exa-specific parameters are passed through as-is.

        Args:
            query: Search query (string or list of strings). Exa AI only supports single string queries.
            optional_params: Optional parameters for the request

        Returns:
            Dict with typed request data following ExaAISearchRequest spec
        ú r   Úmax_resultsr   Úsearch_domain_filterr   Úcountryr   r&   ÚtextT)Ú
isinstancer(   Újoinr*   ÚitemsÚ(get_supported_perplexity_optional_params)r?   r   rB   r@   Úrequest_dataÚresult_dataÚparamÚvalues           r   Útransform_search_requestz*ExaAISearchConfig.transform_search_requesta   sÞ   € ô2 �eœTÔ"à—H‘H˜U“OˆEð �Uð3
ˆð
 ˜OÑ+Ø)8¸Ñ)GˆL˜Ñ&à! _Ñ4Ø-<Ð=SÑ-TˆLÐ)Ñ*à˜Ñ'Ø+:¸9Ñ+EˆL˜Ñ(ô " ,Ó/ˆð ,×1Ñ1Ó3ò 	+‰LˆE�5Ø˜D×IÑIÓKÒKÐPUÐ]hÒPhØ%*�˜EÒ"ð	+ð ˜[Ñ(Ø'-¨t nˆK˜
Ñ#àÐr   Úraw_responseÚlogging_objc           	      ó.  — |j                  «       }g }|j                  dg «      D ]b  }t        |j                  dd«      |j                  dd«      |j                  dd«      |j                  d«      d¬«      }|j                  |«       Œd t	        |d	¬
«      S )uO  
        Transform Exa AI API response to LiteLLM unified SearchResponse format.

        Exa AI â†’ LiteLLM mappings:
        - results[].title â†’ SearchResult.title
        - results[].url â†’ SearchResult.url
        - results[].text â†’ SearchResult.snippet
        - results[].publishedDate â†’ SearchResult.date
        - No last_updated field in Exa AI response (set to None)

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

        Returns:
            SearchResponse with standardized format
        ÚresultsÚtitleÚ ÚurlrL   ÚpublishedDateN)rZ   r\   ÚsnippetÚdateÚlast_updatedÚsearch)rY   Úobject)ÚjsonÚgetr   Úappendr   )r?   rV   rW   r@   Úresponse_jsonrY   ÚresultÚsearch_results           r   Útransform_search_responsez+ExaAISearchConfig.transform_search_response›   s›   € ð.  ,×0Ñ0Ó2ˆð ˆØ#×'Ñ'¨	°2Ó6ò 	*ˆFÜ(Ø—j‘j ¨"Ó-Ø—J‘J˜u bÓ)ØŸ
™
 6¨2Ó.Ø—Z‘Z Ó0Ø!ôˆMð �N‰N˜=Õ)ð	*ô ØØô
ð 	
r   )NN)N)r   r   r   r=   Ústaticmethodr   r0   r*   rA   r(   rF   rU   ÚhttpxÚResponseÚLiteLLMLoggingObjr   ri   r   r   r   r-   r-   1   sì   „ Ø*€Oàð˜cò ó ðð #Ø#ñ	àðð �t‘ðð ˜‘*ð	ð 
óð6 *.ñ	à˜‘*ðð ðð �T˜$‘ZÑ $Ñ&ð	ð 
óð$8à�T˜#‘Y‰ð8ð ð8ð
 
ó8ðt(
à—n‘nð(
ð 'ð(
ð
 
ô(
r   r-   )r   Útypingr   r   rk   Ú*litellm.litellm_core_utils.litellm_loggingr   rm   Ú+litellm.llms.base_llm.search.transformationr   r   r   Úlitellm.secret_managers.mainr	   r   r   r-   r   r   r   ú<module>rr      sN   ðñ÷ $ã å S÷ñ õ
 8ô )ô ôÐ4¸Eõ ô.R
Ð(õ R
r   