o
    ưi&                      @   s   d Z ddlmZmZmZmZ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	 d	eZG d
d deddZG dd deZdS )zt
Calls SearchAPI.io's Google Search API endpoint.

SearchAPI.io API Reference: https://www.searchapi.io/docs/google
    )DictListLiteralOptional	TypedDictUnioncast)	urlencodeN)Logging)BaseSearchConfigSearchResponseSearchResult)get_secret_strc                   @   s"   e Zd ZU dZeed< eed< dS )_SearchAPIRequestRequiredz)Required fields for SearchAPI.io request.engineqN)__name__
__module____qualname____doc__str__annotations__ r   r   c/home/app/Keep/.python/lib/python3.10/site-packages/litellm/llms/searchapi/search/transformation.pyr      s   
 r   c                   @   s   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< eed	< eed
< eed< eed< eed< eed< eed< eed< eed< eed< eed< dS )SearchAPIRequestzk
    SearchAPI.io request format for Google Search.
    Based on: https://www.searchapi.io/docs/google
    ZkgmidZdevicelocationZuuleZgoogle_domainglZhllrcrZnfprfiltersafeZtime_periodZtime_period_minZtime_period_maxnumpageZoptimization_strategyN)r   r   r   r   r   r   intr   r   r   r   r      s(   
 r   F)totalc                   @   s   e Zd ZdZedefddZded 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deeee f ded
e
e de
e de	f
ddZededee defddZdejde
e defddZdS )SearchAPIConfigz&https://www.searchapi.io/api/v1/searchreturnc                   C      dS )NzSearchAPI.io (Google Search)r   r   r   r   r   ui_friendly_name6   s   z SearchAPIConfig.ui_friendly_name)GETPOSTc                 C   r'   )z<
        SearchAPI.io uses GET requests for search.
        r)   r   )selfr   r   r   get_http_method:   s   zSearchAPIConfig.get_http_methodNheadersapi_keyapi_basec                 K   s$   |pt d}|stdd|d< |S )z:
        Validate environment and return headers.
        SEARCHAPI_API_KEYKSEARCHAPI_API_KEY is not set. Set `SEARCHAPI_API_KEY` environment variable.zapplication/jsonzContent-Type)r   
ValueError)r+   r-   r.   r/   kwargsr   r   r   validate_environment@   s   
z$SearchAPIConfig.validate_environmentoptional_paramsdatac                 K   sN   |pt dp| j}|r%t|tr%d|v r%|d }t|dd}| d| S |S )z
        Get complete URL for Search endpoint with query parameters.

        SearchAPI.io uses GET requests and includes api_key in query params.
        SEARCHAPI_API_BASE_searchapi_paramsT)doseq?)r   r7   
isinstancedictr	   )r+   r/   r5   r6   r3   paramsZquery_stringr   r   r   get_complete_urlU   s   z SearchAPIConfig.get_complete_urlquerysearch_engine_idc                 K   s   t |tr
d|}|ptd}|stdd|d}t|}||d< d|v r2t|d d}||d	< d
|v rQ|d
 }	t |	trQt|	dkrQ| t	|d |	|d< d|v r`t
t	|d  |d< | D ]\}
}|
|  vrv|
|vrv|||
< qdd|iS )u%  
        Transform Search request to SearchAPI.io format.

        Transforms unified spec parameters:
        - query → q
        - max_results → num (limited to 10 by Google)
        - search_domain_filter → q (append site: filters)
        - country → gl

        Args:
            query: Search query (string or list of strings)
            optional_params: Optional parameters for the request
            api_key: API key for authentication

        Returns:
            Dict with typed request data following SearchAPI.io spec
         r0   r1   Zgoogle)r   r   r.   Zmax_results
   r!   Zsearch_domain_filterr   r   Zcountryr   r8   )r;   listjoinr   r2   r<   minlen_append_domain_filtersr   r   loweritemsZ(get_supported_perplexity_optional_params)r+   r?   r5   r.   r@   r3   Zrequest_dataZresult_dataZnum_resultsdomainsparamvaluer   r   r   transform_search_requestk   s<   

z(SearchAPIConfig.transform_search_requestrJ   c                 C   s*   dd |D }d |}d|  d| dS )zK
        Add site: filters to restrict search to specific domains.
        c                 S   s   g | ]}d | qS )zsite:r   ).0domainr   r   r   
<listcomp>   s    z:SearchAPIConfig._append_domain_filters.<locals>.<listcomp>z OR (z) AND ())rD   )r?   rJ   Zdomain_clausesZdomain_queryr   r   r   rG      s   
z&SearchAPIConfig._append_domain_filtersraw_responselogging_objc                 K   st   |  }g }|dg D ]'}|dd}|dd}|dd}	|d}
t|||	|
dd}|| qt|d	d
S )ur  
        Transform SearchAPI.io response to LiteLLM unified SearchResponse format.
        
        SearchAPI.io → LiteLLM mappings:
        - organic_results[].title → SearchResult.title
        - organic_results[].link → SearchResult.url
        - organic_results[].snippet → SearchResult.snippet
        - organic_results[].date → SearchResult.date
        Zorganic_resultstitle linksnippetdateN)rU   urlrX   rY   Zlast_updatedsearch)resultsobject)jsongetr   appendr   )r+   rS   rT   r3   Zresponse_jsonr\   resultrU   rZ   rX   rY   Zsearch_resultr   r   r   transform_search_response   s&   
z)SearchAPIConfig.transform_search_response)NN)N)r   r   r   r7   staticmethodr   r(   r   r,   r   r   r4   r<   r   r   r>   rM   rG   httpxResponseLiteLLMLoggingObjr   rb   r   r   r   r   r%   3   s`    	


K	r%   )r   typingr   r   r   r   r   r   r   urllib.parser	   rd   Z*litellm.litellm_core_utils.litellm_loggingr
   rf   Z+litellm.llms.base_llm.search.transformationr   r   r   Zlitellm.secret_managers.mainr   r   r   r%   r   r   r   r   <module>   s    $