o
    ưiS                     @   s   d Z ddlmZmZmZ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 deZG d	d
 d
eddZG dd deZdS )z]
Calls Serper's /search endpoint to search Google.

Serper API Reference: https://serper.dev
    )DictListOptional	TypedDictUnionN)Logging)BaseSearchConfigSearchResponseSearchResult)get_secret_strc                   @   s   e Zd ZU dZeed< dS )_SerperSearchRequestRequiredz.Required fields for Serper Search API request.qN)__name__
__module____qualname____doc__str__annotations__ r   r   `/home/app/Keep/.python/lib/python3.10/site-packages/litellm/llms/serper/search/transformation.pyr      s   
 r   c                   @   sJ   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< d	S )
SerperSearchRequestzL
    Serper Search API request format.
    Based on: https://serper.dev
    numpageglZhllocationZautocorrectZtbsN)r   r   r   r   intr   r   boolr   r   r   r   r      s   
 r   F)totalc                   @   s   e Zd ZdZedefddZ		ddedee dee defd	d
Z		ddee de
deeeee f  defddZdeeee f de
defddZdejdedefddZdS )SerperSearchConfigzhttps://google.serper.devreturnc                   C   s   dS )NZSerperr   r   r   r   r   ui_friendly_name)   s   z#SerperSearchConfig.ui_friendly_nameNheadersapi_keyapi_basec                 K   s,   |pt d}|std||d< d|d< |S )z:
        Validate environment and return headers.
        ZSERPER_API_KEYzESERPER_API_KEY is not set. Set `SERPER_API_KEY` environment variable.z	X-API-KEYzapplication/jsonzContent-Type)r   
ValueError)selfr!   r"   r#   kwargsr   r   r   validate_environment-   s   
z'SerperSearchConfig.validate_environmentoptional_paramsdatac                 K   s4   |pt dp| j}|d}|ds| d}|S )z7
        Get complete URL for Search endpoint.
        SERPER_API_BASE/z/search)r   r*   rstripendswith)r%   r#   r(   r)   r&   r   r   r   get_complete_url>   s
   



z#SerperSearchConfig.get_complete_urlqueryc           
      K   s   t |tr
d|}d|i}d|v r|d |d< d|v r$|d  |d< d|v rN|d }t |trNt|dkrNd	d
d |D }d|d  d| d|d< t|}| D ]\}}	||  vrh||vrh|	||< qV|S )aw  
        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   Zmax_resultsr   Zcountryr   Zsearch_domain_filterr   z OR c                 s   s    | ]}d | V  qdS )zsite:Nr   ).0dr   r   r   	<genexpr>s   s    z>SerperSearchConfig.transform_search_request.<locals>.<genexpr>(z) ())
isinstancelistjoinlowerlendictitemsZ(get_supported_perplexity_optional_params)
r%   r/   r(   r&   Zrequest_datadomainsZdomain_clausesZresult_dataparamvaluer   r   r   transform_search_requestP   s&   

z+SerperSearchConfig.transform_search_requestraw_responselogging_objc                 K   sd   |  }g }|dg D ]}t|dd|dd|dd|ddd}|| qt|d	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
        Zorganictitle linksnippetdateN)rC   urlrF   rG   Zlast_updatedsearch)resultsobject)jsongetr
   appendr	   )r%   rA   rB   r&   Zresponse_jsonrJ   resultZsearch_resultr   r   r   transform_search_response   s   


z,SerperSearchConfig.transform_search_response)NN)N)r   r   r   r*   staticmethodr   r    r   r   r'   r;   r   r   r.   r@   httpxResponseLiteLLMLoggingObjr	   rP   r   r   r   r   r   &   sN    


0r   )r   typingr   r   r   r   r   rR   Z*litellm.litellm_core_utils.litellm_loggingr   rT   Z+litellm.llms.base_llm.search.transformationr   r	   r
   Zlitellm.secret_managers.mainr   r   r   r   r   r   r   r   <module>   s    