Ë
    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)z]
Calls Serper's /search endpoint to search Google.

Serper API Reference: https://serper.dev
é    )ÚFinalÚ	TypedDictN)ÚLogging)ÚBaseSearchConfigÚSearchResponseÚSearchResult)Úget_secret_strc                   ó   — e Zd ZU dZeed<   y)Ú_SerperSearchRequestRequiredz.Required fields for Serper Search API request.ÚqN)Ú__name__Ú
__module__Ú__qualname__Ú__doc__ÚstrÚ__annotations__© ó    ún/home/oem/CyberBrain26-unified/.venv/lib/python3.12/site-packages/litellm/llms/serper/search/transformation.pyr   r      s
   … Ù8à
„Fr   r   c                   óX   — e Zd ZU dZeed<   eed<   eed<   eed<   eed<   eed<   eed<   y	)
ÚSerperSearchRequestzL
    Serper Search API request format.
    Based on: https://serper.dev
    ÚnumÚpageÚglÚhlÚlocationÚautocorrectÚtbsN)r   r   r   r   Úintr   r   Úboolr   r   r   r   r      s-   … ñð
 
ƒHØ
ƒIØƒGØƒGØƒMØÓØ	„Hr   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)ÚSerperSearchConfigzhttps://google.serper.devÚreturnc                   ó   — y)NÚSerperr   r   r   r   Úui_friendly_namez#SerperSearchConfig.ui_friendly_name,   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.
        )ÚSERPER_API_KEYÚSERPER_API_BASE)Úcaller_api_keyÚcaller_api_baseÚkey_env_varsÚbase_env_varÚdefault_api_basezESERPER_API_KEY is not set. Set `SERPER_API_KEY` environment variable.z	X-API-KEYzapplication/jsonzContent-Type)Úresolve_server_api_keyr-   Ú
ValueError)Úselfr(   r)   r*   Úkwargss        r   Úvalidate_environmentz'SerperSearchConfig.validate_environment0   sX   € ð ×-Ñ-Ø"Ø$Ø,Ø*Ø!×1Ñ1ð .ó 
ˆñ ÜÐdÓeÐeØ&ˆ�ÑØ"4ˆ�ÑØˆr   Úoptional_paramsÚdatac                 óŽ   — |xs t        d«      xs | j                  }|j                  d«      }|j                  d«      s|› d�}|S )z7
        Get complete URL for Search endpoint.
        r-   ú/z/search)r	   r-   ÚrstripÚendswith)r5   r*   r8   r9   r6   s        r   Úget_complete_urlz#SerperSearchConfig.get_complete_urlG   sL   € ð ÒXœ~Ð.?Ó@ÒXÀD×DXÑDXˆØ—?‘? 3Ó'ˆà× Ñ  Ô+Ø"˜ 7Ð+ˆHàˆr   Úqueryc                 ó¸  — t        |t        «      rdj                  |«      }d|i}d|v r|d   |d<   d|v r|d   j                  «       |d<   d|v rJ|d   }t        |t        «      r5t	        |«      dkD  r'd	j                  d
„ |D «       «      }d|d   › d|› d�|d<   t        |«      }|j                  «       D ]"  \  }}	|| j                  «       vsŒ||vsŒ|	||<   Œ$ |S )ac  
        Transform Search request to Serper API format.

        Args:
            query: Search query (string or list of strings). Serper only supports single string queries.
            optional_params: Optional parameters for the request
                - max_results: Maximum number of search results -> maps to `num`
                - search_domain_filter: List of domains -> appended as site: clauses to `q`
                - country: Country code filter (e.g., 'US', 'GB') -> maps to `gl` (lowercased)

        Returns:
            Dict with typed request data following SerperSearchRequest spec
        ú r   Úmax_resultsr   Úcountryr   Úsearch_domain_filterr   z OR c              3   ó&   K  — | ]	  }d |› �–— Œ y­w)zsite:Nr   )Ú.0Úds     r   ú	<genexpr>z>SerperSearchConfig.transform_search_request.<locals>.<genexpr>|   s   è ø€ Ò3QÀA°e¸A¸3´KÑ3Qùs   ‚ú(z) (ú))Ú
isinstanceÚlistÚjoinÚlowerÚlenÚdictÚitemsÚ(get_supported_perplexity_optional_params)
r5   r?   r8   r6   Úrequest_dataÚdomainsÚdomain_clausesÚresult_dataÚparamÚvalues
             r   Útransform_search_requestz+SerperSearchConfig.transform_search_requestY   s  € ô& �eœTÔ"Ø—H‘H˜U“OˆEð �ð4
ˆð ˜OÑ+Ø"1°-Ñ"@ˆL˜Ñà˜Ñ'Ø!0°Ñ!;×!AÑ!AÓ!CˆL˜Ñà! _Ñ4Ø,Ð-CÑDˆGÜ˜'¤4Ô(¬S°«\¸AÒ-=Ø(.¯©Ñ3QÈÔ3QÓ(Q�Ø&'¨°SÑ(9Ð':¸#¸nÐ=MÈQÐ$O�˜SÑ!ô " ,Ó/ˆð ,×1Ñ1Ó3ò 	+‰LˆE�5Ø˜D×IÑIÓKÒKÐPUÐ]hÒPhØ%*�˜EÒ"ð	+ð Ð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 )a$  
        Transform Serper API response to LiteLLM unified SearchResponse format.

        Serper -> LiteLLM mappings:
        - organic[].title -> SearchResult.title
        - organic[].link  -> SearchResult.url
        - organic[].snippet -> SearchResult.snippet
        - organic[].date -> SearchResult.date (optional, not always present)

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

        Returns:
            SearchResponse with standardized format
        ÚorganicÚtitleÚ ÚlinkÚsnippetÚdateN)r^   Úurlra   rb   Úlast_updatedÚsearch)ÚresultsÚobject)ÚjsonÚgetr   Úappendr   )r5   rZ   r[   r6   Úresponse_jsonrf   ÚresultÚsearch_results           r   Útransform_search_responsez,SerperSearchConfig.transform_search_response‰   s™   € ð,  ,×0Ñ0Ó2ˆàˆØ#×'Ñ'¨	°2Ó6ò 	*ˆFÜ(Ø—j‘j ¨"Ó-Ø—J‘J˜v rÓ*ØŸ
™
 9¨bÓ1Ø—Z‘Z Ó'Ø!ôˆMð �N‰N˜=Õ)ð	*ô ØØô
ð 	
r   )NN)N)r   r   r   r-   Ústaticmethodr   r'   rP   r7   rL   r>   rY   ÚhttpxÚResponseÚLiteLLMLoggingObjr   rn   r   r   r   r#   r#   )   sì   „ Ø1€Oàð˜cò ó ðð #Ø#ñ	àðð �t‘ðð ˜‘*ð	ð 
óð6 *.ñ	à˜‘*ðð ðð �T˜$‘ZÑ $Ñ&ð	ð 
óð$.à�T˜#‘Y‰ð.ð ð.ð
 
ó.ð`&
à—n‘nð&
ð 'ð&
ð
 
ô&
r   r#   )r   Útypingr   r   rp   Ú*litellm.litellm_core_utils.litellm_loggingr   rr   Ú+litellm.llms.base_llm.search.transformationr   r   r   Úlitellm.secret_managers.mainr	   r   r   r#   r   r   r   ú<module>rw      sN   ðñ÷ $ã å S÷ñ õ
 8ô 9ô ôÐ6¸eõ ôF
Ð)õ F
r   