o
    ưit+                     @  s   d Z ddlmZ ddlmZmZ ddlmZ ddlmZm	Z	m
Z
mZmZmZ ddlZddlZedZedZg d	Zdd
lmZ ddlmZmZmZ ddlmZ ddddddZG dd deZG dd deddZG dd deZ dS ) z
Brave Search /web/search endpoint.
Documentation: https://api-dashboard.search.brave.com/app/documentation/web-search/get-started
    )annotations)datetimetimezone)parser)DictListLiteralOptional	TypedDictUnionNz#^\s*\d{4}[-/]\d{1,2}[-/]\d{1,2}\s*$z^\s*-?\d+(\.\d+)?\s*$)ZwebZdiscussionsZfaqsZfaqnewsZvideos)Logging)BaseSearchConfigSearchResponseSearchResult)get_secret_strF)dayfirst	yearfirstsUnion[str, int, float, None]r   boolr   returnOptional[str]c                C  s   | sdS t |  } t| r7zt| }|dks|dk r |d }tj|tjd	 
 W S  ty6   Y dS w zt| rGtj| dddd}n	tj| ||dd}|	 
 W S  ty`   Y dS w )	zQ
    Convert a string/int/float to YYYY-MM-DD; return None if parsing fails.
    Ng   vH7Bg   vH7g     @@)tzTF)r   r   Zfuzzy)strstrip_UNIX_TIMESTAMPmatchfloatr   fromtimestampr   utcdate	isoformat	Exception_ISO_YMDr   parse)r   r   r   Zts_floatdt r'   _/home/app/Keep/.python/lib/python3.10/site-packages/litellm/llms/brave/search/transformation.pyto_yyyy_mm_dd   s(   	

r)   c                   @  s   e Zd ZU dZded< dS )_BraveSearchRequestRequiredz-Required fields for Brave Search API request.r   qN__name__
__module____qualname____doc____annotations__r'   r'   r'   r(   r*   ?   s   
 r*   c                   @  s   e Zd ZU dZded< ded< ded< ded< ded< ded	< ded
< ded< ded< ded< ded< ded< ded< ded< ded< ded< ded< ded< dS )BraveSearchRequestz
    Brave Search API request format.
    Based on: https://api-dashboard.search.brave.com/app/documentation/web-search/get-started
    intcountoffsetr   ZcountryZsearch_langZui_langZ	freshnessZ
safesearchZ
spellcheckr   Ztext_decorationsresult_filterZunitsZ
goggles_idgogglesZextra_snippetssummaryZenable_rich_callbackinclude_fetch_metadata	operatorsNr,   r'   r'   r'   r(   r2   E   s(   
 r2   )totalc                   @  s|   e Zd ZdZed*ddZd+ddZ				d,d-ddZ		d.d/ddZ				d,d0ddZ	ed1ddZ
d2d%d&Zed3d(d)Zd	S )4BraveSearchConfigz.https://api.search.brave.com/res/v1/web/searchr   r   c                   C     dS )NzBrave Searchr'   r'   r'   r'   r(   ui_friendly_nameb   s   z"BraveSearchConfig.ui_friendly_nameLiteral['GET', 'POST']c                 C  r=   )z@
        Brave Search API uses GET requests for search.
        GETr'   )selfr'   r'   r(   get_http_methodf   s   z!BraveSearchConfig.get_http_methodNheadersr   api_keyr   api_basec                 K  s<   |pt d}|std||d< d|d< d|d< d|d< |S )	z:
        Validate environment and return headers.
        ZBRAVE_API_KEYzCBRAVE_API_KEY is not set. Set `BRAVE_API_KEY` environment variable.zX-Subscription-Tokenzapplication/jsonAcceptgzipzAccept-EncodingzContent-Type)r   
ValueError)rA   rC   rD   rE   kwargsr'   r'   r(   validate_environmentl   s   
z&BraveSearchConfig.validate_environmentoptional_paramsdictdata!Optional[Union[Dict, List[Dict]]]c                 K  sZ   ddl m} |ptdp| j}|r+t|tr+d|v r+|d }||dd}| d| S |S )z
        Get complete URL for Search endpoint with query parameters.

        The Brave Search API uses GET requests and therefore needs the request
        body (data) to construct query parameters in the URL.
        r   )	urlencodeBRAVE_API_BASE_brave_paramsT)doseq?)urllib.parserO   r   rP   
isinstancerL   )rA   rE   rK   rM   rI   rO   paramsZquery_stringr'   r'   r(   get_complete_url   s   z"BraveSearchConfig.get_complete_urlqueryUnion[str, List[str]]search_engine_idc                 K  s   t |tr
d|}d|i}d|v r|d du rd|d< nd|d< d|v r0t|d d}||d< d	|v rM|d	 }t |trMt|d
krM| |d ||d< t|}	| D ]\}
}|
|  vrg|
|	vrg||	|
< qUd|	iS )u  
        Transform Search request to Brave Search API format.

        Transforms Perplexity unified spec parameters:
        - query → q (same)
        - max_results → count
        - search_domain_filter → q (append domain filters)
        - country → country
        - max_tokens_per_page → (not applicable, ignored)

        All other Brave Search API-specific parameters are passed through as-is.

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

        Returns:
            Dict with typed request data following Brave Search API spec
         r+   r9   FTmax_results   r4   Zsearch_domain_filterr   rQ   )	rU   listjoinminlen_append_domain_filtersrL   itemsZ(get_supported_perplexity_optional_params)rA   rX   rK   rD   rZ   rI   Zrequest_dataZnum_resultsdomainsZresult_dataparamvaluer'   r'   r(   transform_search_request   s2   


z*BraveSearchConfig.transform_search_requestrd   	List[str]c                 C  s*   dd |D }d |}d|  d| dS )zK
        Add site: filters to emulate domain restriction in Brave.
        c                 S  s   g | ]}d | qS )zsite:r'   ).0domainr'   r'   r(   
<listcomp>   s    z<BraveSearchConfig._append_domain_filters.<locals>.<listcomp>z OR (z) AND ())r_   )rX   rd   Zdomain_clausesZdomain_queryr'   r'   r(   rb      s   
z(BraveSearchConfig._append_domain_filtersraw_responsehttpx.Responselogging_objOptional[LiteLLMLoggingObj]r   c              	   K  s   |  }g }|jr|jjjni }| t|}tdtt|	ddd}|D ]K}	|	|	i 	dg D ]>}
t
||kr= n5|
	dd}|
	dd}|
	dd}t|
	d	pY|
	d
}t|
	dd}t|||||d}|| q3q't|ddS )z_
        Transform Brave Search API response to LiteLLM unified SearchResponse format.
           r4   r]   resultstitle urldescriptionZpage_ageZageZfetched_content_timestamp)rt   rv   snippetr!   last_updatedsearch)rs   object)jsonrequestrv   rV   _sections_from_paramsrL   maxr`   r3   getra   r)   r   appendr   )rA   rn   rp   rI   Zresponse_jsonrs   query_paramsZsections_to_processr\   sectionresultrt   rv   rx   r!   ry   Zsearch_resultr'   r'   r(   transform_search_response   s:   	
z+BraveSearchConfig.transform_search_responser   c                 C  sF   |  d}g }|rt|trdd |dD }dd |D }|p"tS )z
        Returns a list of sections the user has requested via the Brave Search
        API's `result_filter` parameter. If no `result_filter` parameter is
        provided, returns all sections.
        r6   c                 S  s   g | ]}|  qS r'   )r   )ri   partr'   r'   r(   rk   0  s    z;BraveSearchConfig._sections_from_params.<locals>.<listcomp>,c                 S  s    g | ]}|  tv r|  qS r'   )lowerBRAVE_SECTIONS)ri   r   r'   r'   r(   rk   2  s     )r   rU   r   splitr   )r   Z
raw_filterZrequested_filterssectionsr'   r'   r(   r~   %  s   
z'BraveSearchConfig._sections_from_params)r   r   )r   r?   )NN)rC   r   rD   r   rE   r   r   r   )N)rE   r   rK   rL   rM   rN   r   r   )
rX   rY   rK   rL   rD   r   rZ   r   r   r   )rX   r   rd   rh   r   r   )rn   ro   rp   rq   r   r   )r   rL   r   rh   )r-   r.   r/   rP   staticmethodr>   rB   rJ   rW   rg   rb   r   r~   r'   r'   r'   r(   r<   _   s$    
	L
	2r<   )r   r   r   r   r   r   r   r   )!r0   
__future__r   r   r   Zdateutilr   typingr   r   r   r	   r
   r   Zhttpxrecompiler$   r   r   Z*litellm.litellm_core_utils.litellm_loggingr   ZLiteLLMLoggingObjZ+litellm.llms.base_llm.search.transformationr   r   r   Zlitellm.secret_managers.mainr   r)   r*   r2   r<   r'   r'   r'   r(   <module>   s&     

$