Ë
    uPêjÁ+  ã                  óT  — U d Z ddlmZ ddlZddlmZmZ ddlmZmZm	Z	 ddl
Z
ddlmZ  ej                  d«      Zded	<    ej                  d
«      Zded<   g d¢Zded<   ddlmZ ddlmZmZmZ ddlmZ dddœ	 	 	 	 	 	 	 dd„Z G d„ de	«      Z G d„ ded¬«      Z G d„ de«      Zy)zƒ
Brave Search /web/search endpoint.
Documentation: https://api-dashboard.search.brave.com/app/documentation/web-search/get-started
é    )ÚannotationsN)ÚdatetimeÚtimezone)ÚFinalÚLiteralÚ	TypedDict)Úparserz#^\s*\d{4}[-/]\d{1,2}[-/]\d{1,2}\s*$r   Ú_ISO_YMDz^\s*-?\d+(\.\d+)?\s*$Ú_UNIX_TIMESTAMP)ÚwebÚdiscussionsÚfaqsÚfaqÚnewsÚvideosÚBRAVE_SECTIONS)ÚLogging)ÚBaseSearchConfigÚSearchResponseÚSearchResult)Úget_secret_strF)ÚdayfirstÚ	yearfirstc               ó&  — | syt        | «      j                  «       } t        j                  | «      r\	 t	        | «      }|dkD  s|dk  r|dz  }t        j                  |t        j                  ¬«      j                  «       j                  «       S 	 t        j                  | «      rt        j                  | ddd¬«      }nt        j                  | ||d¬«      }|j                  «       j                  «       S # t        $ r Y yw xY w# t        $ r Y yw xY w)	zQ
    Convert a string/int/float to YYYY-MM-DD; return None if parsing fails.
    Ng   èvH7Bg   èvH7Âg     @�@)ÚtzTF)r   r   Úfuzzy)ÚstrÚstripr   ÚmatchÚfloatr   Úfromtimestampr   ÚutcÚdateÚ	isoformatÚ	Exceptionr
   r	   Úparse)Úsr   r   Úts_floatÚdts        úm/home/oem/CyberBrain26-unified/.venv/lib/python3.12/site-packages/litellm/llms/brave/search/transformation.pyÚto_yyyy_mm_ddr+      sí   € ñ ØäˆA‹�‰‹€Aô ×Ñ˜QÔð	Ü˜Q“xˆHà˜$Š (¨UÒ"2Ø˜FÑ"�Ü×)Ñ)¨(´x·|±|ÔD×IÑIÓK×UÑUÓWÐWð
Ü�>‰>˜!ÔÜ—‘˜a¨4¸%ÀtÔL‰Bä—‘˜a¨9¸xÈtÔTˆBØ�w‰w‹y×"Ñ"Ó$Ð$øô ò 	Ùð	ûô ò Ùðús%   ³AC5 ÂA%D Ã5	DÄ DÄ	DÄDc                  ó   — e Zd ZU dZded<   y)Ú_BraveSearchRequestRequiredz-Required fields for Brave Search API request.r   ÚqN©Ú__name__Ú
__module__Ú__qualname__Ú__doc__Ú__annotations__© ó    r*   r-   r-   @   s
   … Ù7à
„Fr6   r-   c                  óÆ   — 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<   y)ÚBraveSearchRequestzˆ
    Brave Search API request format.
    Based on: https://api-dashboard.search.brave.com/app/documentation/web-search/get-started
    ÚintÚcountÚoffsetr   ÚcountryÚsearch_langÚui_langÚ	freshnessÚ
safesearchÚ
spellcheckÚboolÚtext_decorationsÚresult_filterÚunitsÚ
goggles_idÚgogglesÚextra_snippetsÚsummaryÚenable_rich_callbackÚinclude_fetch_metadataÚ	operatorsNr/   r5   r6   r*   r8   r8   F   si   … ñð
 ƒJØƒKØƒLØÓØƒLØƒNØƒOØƒOØÓØÓØƒJØƒOØƒLØÓØƒMØÓØ Ó Ø„Or6   r8   )Útotalc                  ó¸   — e Zd ZdZedd„«       Zdd„Z	 	 d	 	 	 	 	 	 	 dd„Z	 d	 	 	 	 	 	 	 dd„Z	 	 d	 	 	 	 	 	 	 	 	 dd„Z	edd„«       Z
	 	 	 	 	 	 dd	„Zedd
„«       Zy)ÚBraveSearchConfigz.https://api.search.brave.com/res/v1/web/searchc                  ó   — y)NzBrave Searchr5   r5   r6   r*   Úui_friendly_namez"BraveSearchConfig.ui_friendly_namec   s   € àr6   c                 ó   — y)z@
        Brave Search API uses GET requests for search.
        ÚGETr5   )Úselfs    r*   Úget_http_methodz!BraveSearchConfig.get_http_methodg   s   € ð r6   Nc                óˆ   — | j                  ||dd| j                  ¬«      }|st        d«      ‚||d<   d|d<   d|d	<   d|d
<   |S )z:
        Validate environment and return headers.
        )ÚBRAVE_API_KEYÚBRAVE_API_BASE)Úcaller_api_keyÚcaller_api_baseÚkey_env_varsÚbase_env_varÚdefault_api_basezCBRAVE_API_KEY is not set. Set `BRAVE_API_KEY` environment variable.zX-Subscription-Tokenzapplication/jsonÚAcceptÚgzipzAccept-EncodingzContent-Type)Úresolve_server_api_keyrX   Ú
ValueError)rT   ÚheadersÚapi_keyÚapi_baseÚkwargss        r*   Úvalidate_environmentz&BraveSearchConfig.validate_environmentm   sn   € ð ×-Ñ-Ø"Ø$Ø+Ø)Ø!×0Ñ0ð .ó 
ˆñ ÜÐbÓcÐcà*1ˆÐ&Ñ'Ø.ˆ�ÑØ%+ˆÐ!Ñ"Ø"4ˆ�Ñàˆr6   c                ó¤   — ddl m} |xs t        d«      xs | j                  }|r*t	        |t
        «      rd|v r|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   )Ú	urlencoderX   Ú_brave_paramsT)Údoseqú?)Úurllib.parserh   r   rX   Ú
isinstanceÚdict)rT   rd   Úoptional_paramsÚdatare   rh   ÚparamsÚquery_strings           r*   Úget_complete_urlz"BraveSearchConfig.get_complete_url‰   sc   € õ 	+àÒVœ~Ð.>Ó?ÒVÀ4×CVÑCVˆñ ”J˜t¤TÔ*¨À$Ñ/FØ  Ñ1ˆFÙ"+¨F¸$Ô"?ˆLØ�Z˜q  Ð/Ð/àˆr6   c                ó®  — t        |t        «      rdj                  |«      }d|i}d|v r|d   du rd|d<   nd|d<   d|v rt        |d   d«      }||d<   d	|v r;|d	   }t        |t        «      r&t	        |«      d
kD  r| j                  |d   |«      |d<   t        |«      }	|j                  «       D ]"  \  }
}|
| j                  «       vsŒ|
|	vsŒ||	|
<   Œ$ d|	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.   rK   FTÚmax_resultsé   r:   Úsearch_domain_filterr   ri   )	rm   ÚlistÚjoinÚminÚlenÚ_append_domain_filtersrn   ÚitemsÚ(get_supported_perplexity_optional_params)rT   Úqueryro   rc   Úsearch_engine_idre   Úrequest_dataÚnum_resultsÚdomainsÚresult_dataÚparamÚvalues               r*   Útransform_search_requestz*BraveSearchConfig.transform_search_request¢   s   € ô6 �eœTÔ"à—H‘H˜U“OˆEð �ð3
ˆð $ Ñ6¸?ÐKcÑ;dÐhmÑ;mØ5:ˆLÐ1Ò2à59ˆLÐ1Ñ2ð ˜OÑ+ä!$ _°]Ñ%CÀRÓ!HˆKØ$/ˆL˜Ñ!à! _Ñ4à,Ð-CÑDˆGÜ˜'¤4Ô(¬S°«\¸AÒ-=Ø$(×$?Ñ$?ÀÈSÑ@QÐSZÓ$[�˜SÑ!ô " ,Ó/ˆð ,×1Ñ1Ó3ò 	+‰LˆE�5Ø˜D×IÑIÓKÒKÐPUÐ]hÒPhØ%*�˜EÒ"ð	+ð ˜[ð
ð 	
r6   c                ód   — |D �cg c]  }d|› �‘Œ	 }}dj                  |«      }d| › d|› d�S c c}w )zK
        Add site: filters to emulate domain restriction in Brave.
        zsite:z OR ú(z) AND (ú))rz   )r€   r„   ÚdomainÚdomain_clausesÚdomain_querys        r*   r}   z(BraveSearchConfig._append_domain_filtersæ   sI   € ð
 AHÖ H°f 5¨¨Ò!1Ð HˆÐ HØ$Ÿk™k¨.Ó9ˆà�5�'˜  ¨aÐ0Ð0ùò !Is   …-c                óè  — |j                  «       }g }|j                  r |j                  j                  j                  ni }| j	                  t        |«      «      }t        dt        t        |j                  dd«      «      d«      «      }|D ]Ø  }	|j                  |	i «      j                  dg «      D ]±  }
t        |«      |k\  r Œ8|
j                  dd«      }|
j                  dd«      }|
j                  dd«      }t        |
j                  d	«      xs |
j                  d
«      «      }t        |
j                  dd«      «      }t        |||||¬«      }|j                  |«       Œ³ ŒÚ t        |d¬«      S )z_
        Transform Brave Search API response to LiteLLM unified SearchResponse format.
        é   r:   rw   ÚresultsÚtitleÚ ÚurlÚdescriptionÚpage_ageÚageÚfetched_content_timestamp)r’   r”   Úsnippetr#   Úlast_updatedÚsearch)r‘   Úobject)ÚjsonÚrequestr”   rq   Ú_sections_from_paramsrn   Úmaxr{   r9   Úgetr|   r+   r   Úappendr   )rT   Úraw_responseÚlogging_objre   Úresponse_jsonr‘   Úquery_paramsÚsections_to_processrv   ÚsectionÚresultr’   r”   r™   r#   rš   Úsearch_results                    r*   Útransform_search_responsez+BraveSearchConfig.transform_search_responseð   sc  € ð  ,×0Ñ0Ó2ˆð .0ˆàAM×AUÒAU˜l×2Ñ2×6Ñ6×=Ò=Ð[]ˆØ%)×%?Ñ%?ÄÀ\Ó@RÓ%SÐÜ  ¤C¬¨L×,<Ñ,<¸WÀbÓ,IÓ(JÈBÓ$OÓPˆà*ò 	.ˆGØ'×+Ñ+¨G°RÓ8×<Ñ<¸YÈÓKò .�ô
 �w“< ;Ò.ÙàŸ
™
 7¨BÓ/�Ø—j‘j ¨Ó+�Ø Ÿ*™* ]°BÓ7�Ü$ V§Z¡Z°
Ó%;Ò%P¸v¿z¹zÈ%Ó?PÓQ�Ü,¨V¯Z©ZÐ8SÐUWÓ-XÓY�ä ,ØØØ#ØØ!-ô!�ð —‘˜}Õ-ñ-.ð	.ô2 ØØô
ð 	
r6   c                ó4  — | j                  d«      }g }|r<t        |t        «      r,|j                  d«      D �cg c]  }|j	                  «       ‘Œ }}|D �cg c])  }|j                  «       t        v sŒ|j                  «       ‘Œ+ }}|xs t        S c c}w c c}w )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.
        rD   ú,)r¡   rm   r   Úsplitr   Úlowerr   )r¦   Ú
raw_filterÚrequested_filtersÚpartr'   Úsectionss         r*   rŸ   z'BraveSearchConfig._sections_from_params   s†   € ð )×,Ñ,¨_Ó=ˆ
Ø')Ðáœ* Z´Ô5Ø:D×:JÑ:JÈ3Ó:OÖ P°$ §¡¥Ð PÐÐ Pà.?Ö_¨À1Ç7Á7Ã9ÔP^ÒC^˜1Ÿ7™7�9Ð_ˆÐ_ØÒ)œ>Ð)ùò !Qùâ_s   ¹BÁBÁ2B)Úreturnr   )r´   zLiteral['GET', 'POST'])NN)rb   rn   rc   ú
str | Nonerd   rµ   r´   rn   )N)rd   rµ   ro   rn   rp   zdict | list[dict] | Noner´   r   )
r€   zstr | list[str]ro   rn   rc   rµ   r�   rµ   r´   rn   )r€   r   r„   ú	list[str]r´   r   )r£   zhttpx.Responser¤   zLiteLLMLoggingObj | Noner´   r   )r¦   rn   r´   r¶   )r0   r1   r2   rX   ÚstaticmethodrQ   rU   rf   rs   rˆ   r}   r«   rŸ   r5   r6   r*   rO   rO   `   s  „ ØE€Nàòó ðóð #Ø#ð	àðð ðð ð	ð 
óð@ *.ð	àðð ðð 'ð	ð 
óð: #Ø'+ðB
àðB
ð ðB
ð ð	B
ð
 %ðB
ð 
óB
ðH ò1ó ð1ð.
à$ð.
ð .ð.
ð
 
ó.
ð` ò*ó ñ*r6   rO   )r'   zstr | float | Noner   rB   r   rB   r´   rµ   )r3   Ú
__future__r   Úrer   r   Útypingr   r   r   ÚhttpxÚdateutilr	   Úcompiler
   r4   r   r   Ú*litellm.litellm_core_utils.litellm_loggingr   ÚLiteLLMLoggingObjÚ+litellm.llms.base_llm.search.transformationr   r   r   Úlitellm.secret_managers.mainr   r+   r-   r8   rO   r5   r6   r*   ú<module>rÂ      sÇ   ðòõ
 #ã 	ß 'ß ,Ñ ,ã Ý à�"—*‘*ÐCÓD€ˆ%Ó DØ#˜Ÿ™Ð$<Ó=€�Ó =ÚO€�Ó Oå S÷ñ õ
 8ð Øñ	!Øð!ð ð!ð ð	!ð
 ó!ôH )ô ôÐ4¸Eõ ô4N*Ð(õ N*r6   