Ë
    uPêjà!  ã                   ó¦   — d Z ddl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	e«      Z G d
„ ded¬«      Z G d„ de«      Zy)zt
Calls SearchAPI.io's Google Search API endpoint.

SearchAPI.io API Reference: https://www.searchapi.io/docs/google
é    )ÚFinalÚLiteralÚ	TypedDictÚcast)Ú	urlencodeN)ÚLogging)ÚBaseSearchConfigÚSearchResponseÚSearchResult)Úget_secret_strc                   ó&   — e Zd ZU dZeed<   eed<   y)Ú_SearchAPIRequestRequiredz)Required fields for SearchAPI.io request.ÚengineÚqN)Ú__name__Ú
__module__Ú__qualname__Ú__doc__ÚstrÚ__annotations__© ó    úq/home/oem/CyberBrain26-unified/.venv/lib/python3.12/site-packages/litellm/llms/searchapi/search/transformation.pyr   r      s   … Ù3àƒKØ
„Fr   r   c                   óÆ   — 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<   y)ÚSearchAPIRequestzk
    SearchAPI.io request format for Google Search.
    Based on: https://www.searchapi.io/docs/google
    ÚkgmidÚdeviceÚlocationÚuuleÚgoogle_domainÚglÚhlÚlrÚcrÚnfprÚfilterÚsafeÚtime_periodÚtime_period_minÚtime_period_maxÚnumÚpageÚoptimization_strategyN)r   r   r   r   r   r   Úintr   r   r   r   r      sh   … ñð
 ƒJØƒKØƒMØ
ƒIØÓØƒGØƒGØƒGØƒGØ
ƒIØƒKØ
ƒIØÓØÓØÓØ	ƒHØ
ƒIØÔr   r   F)Útotalc                   ó.  — e Zd ZdZedefd„«       Zded   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deee   z  de	dedz  d	edz  dedz  de	fd„Zededee   defd„«       Zdej                   dedz  defd„Zy)ÚSearchAPIConfigz&https://www.searchapi.io/api/v1/searchÚreturnc                   ó   — y)NzSearchAPI.io (Google Search)r   r   r   r   Úui_friendly_namez SearchAPIConfig.ui_friendly_name9   s   € à-r   )ÚGETÚPOSTc                  ó   — y)z<
        SearchAPI.io uses GET requests for search.
        r5   r   )Úselfs    r   Úget_http_methodzSearchAPIConfig.get_http_method=   s   € ð r   NÚheadersÚapi_keyÚapi_basec                 ój   — | j                  ||dd| j                  ¬«      }|st        d«      ‚d|d<   |S )z:
        Validate environment and return headers.
        ©ÚSEARCHAPI_API_KEYÚSEARCHAPI_API_BASE©Úcaller_api_keyÚcaller_api_baseÚkey_env_varsÚbase_env_varÚdefault_api_baseúKSEARCHAPI_API_KEY is not set. Set `SEARCHAPI_API_KEY` environment variable.zapplication/jsonzContent-Type)Úresolve_server_api_keyr@   Ú
ValueError)r8   r:   r;   r<   Úkwargss        r   Úvalidate_environmentz$SearchAPIConfig.validate_environmentC   sN   € ð ×-Ñ-Ø"Ø$Ø/Ø-Ø!×4Ñ4ð .ó 
ˆñ ÜÐjÓkÐkà"4ˆ�Ñàˆr   Úoptional_paramsÚdatac                 óž   — |xs t        d«      xs | j                  }|r-t        |t        «      rd|v r|d   }t	        |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.
        r@   Ú_searchapi_paramsT)Údoseqú?)r   r@   Ú
isinstanceÚdictr   )r8   r<   rL   rM   rJ   ÚparamsÚquery_strings          r   Úget_complete_urlz SearchAPIConfig.get_complete_url\   sb   € ð Ò^œ~Ð.BÓCÒ^Àt×G^ÑG^ˆñ ”J˜t¤TÔ*Ð/BÀdÑ/JØ Ð!4Ñ5ˆFÜ"+¨F¸$Ô"?ˆLØ�Z˜q  Ð/Ð/àˆr   ÚqueryÚsearch_engine_idc                 óJ  — t        |t        «      rdj                  |«      }| j                  ||dd| j                  ¬«      }|st        d«      ‚d|dœ}t        |«      }||d<   d	|v rt        |d	   d
«      }	|	|d<   d|v rD|d   }
t        |
t        «      r/t        |
«      dkD  r!| j                  t        |d   «      |
«      |d<   d|v r$t        t        |d   «      j                  «       |d<   |j                  «       D ]"  \  }}|| j                  «       vsŒ||vsŒ|||<   Œ$ d|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
        ú r>   r@   rA   rG   Úgoogle)r   r   r;   Úmax_resultsé
   r+   Úsearch_domain_filterr   r   Úcountryr!   rO   )rR   ÚlistÚjoinrH   r@   rI   rS   ÚminÚlenÚ_append_domain_filtersr   r   ÚlowerÚitemsÚ(get_supported_perplexity_optional_params)r8   rW   rL   r;   r<   rX   rJ   Úrequest_dataÚresult_dataÚnum_resultsÚdomainsÚparamÚvalues                r   Útransform_search_requestz(SearchAPIConfig.transform_search_requestr   sf  € ô4 �eœTÔ"Ø—H‘H˜U“OˆEð
 ×-Ñ-Ø"Ø$Ø/Ø-Ø!×4Ñ4ð .ó 
ˆñ ÜÐjÓkÐkð Øñ1
ˆô " ,Ó/ˆØ!(ˆ�IÑð ˜OÑ+ä!$ _°]Ñ%CÀRÓ!HˆKØ!,ˆK˜Ñà! _Ñ4à,Ð-CÑDˆGÜ˜'¤4Ô(¬S°«\¸AÒ-=Ø#'×#>Ñ#>¼sÀ;ÈsÑCSÓ?TÐV]Ó#^�˜CÑ à˜Ñ'ä $¤S¨/¸)Ñ*DÓ E× KÑ KÓ MˆK˜Ñð ,×1Ñ1Ó3ò 	+‰LˆE�5Ø˜D×IÑIÓKÒKÐPUÐ]hÒPhØ%*�˜EÒ"ð	+ð   ð
ð 	
r   rk   c                 ód   — |D �cg c]  }d|› �‘Œ	 }}dj                  |«      }d| › d|› d�S c c}w )zK
        Add site: filters to restrict search to specific domains.
        zsite:z OR ú(z) AND (ú))ra   )rW   rk   ÚdomainÚdomain_clausesÚdomain_querys        r   rd   z&SearchAPIConfig._append_domain_filters¿   sI   € ð
 AHÖ H°f 5¨¨Ò!1Ð HˆÐ HØ$Ÿk™k¨.Ó9ˆà�5�'˜  ¨aÐ0Ð0ùò !Is   …-Úraw_responseÚlogging_objc                 ó>  — |j                  «       }g }|j                  dg «      D ]j  }|j                  dd«      }|j                  dd«      }|j                  dd«      }	|j                  d«      }
t        |||	|
d¬«      }|j                  |«       Œl t	        |d	¬
«      S )uj  
        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
        Úorganic_resultsÚtitleÚ ÚlinkÚsnippetÚdateN)ry   Úurlr|   r}   Úlast_updatedÚsearch)ÚresultsÚobject)ÚjsonÚgetr   Úappendr
   )r8   ru   rv   rJ   Úresponse_jsonr�   Úresultry   r~   r|   r}   Úsearch_results               r   Útransform_search_responsez)SearchAPIConfig.transform_search_responseÉ   s²   € ð  ,×0Ñ0Ó2ˆð .0ˆð $×'Ñ'Ð(9¸2Ó>ò 	*ˆFØ—J‘J˜w¨Ó+ˆEØ—*‘*˜V RÓ(ˆCØ—j‘j ¨BÓ/ˆGØ—:‘:˜fÓ%ˆDä(ØØØØØ!ôˆMð �N‰N˜=Õ)ð	*ô  ØØô
ð 	
r   )NN)N)NNN)r   r   r   r@   Ústaticmethodr   r4   r   r9   rS   rK   r`   rV   rn   rd   ÚhttpxÚResponseÚLiteLLMLoggingObjr
   r‰   r   r   r   r1   r1   6   sl  „ ØAÐàð.˜cò .ó ð.ð ¨Ñ!7ó ð #Ø#ñ	àðð �t‘ðð ˜‘*ð	ð 
óð: *.ñ	à˜‘*ðð ðð �T˜$‘ZÑ $Ñ&ð	ð 
óð4 #Ø#Ø'+ñK
à�T˜#‘Y‰ðK
ð ðK
ð �t‘ð	K
ð
 ˜‘*ðK
ð  ™*ðK
ð 
óK
ðZ ð1 cð 1°D¸±Ið 1À#ò 1ó ð1ð(
à—n‘nð(
ð '¨Ñ-ð(
ð
 
ô(
r   r1   )r   Útypingr   r   r   r   Úurllib.parser   r‹   Ú*litellm.litellm_core_utils.litellm_loggingr   r�   Ú+litellm.llms.base_llm.search.transformationr	   r
   r   Úlitellm.secret_managers.mainr   r   r   r1   r   r   r   ú<module>r“      sT   ðñ÷ 3Ó 2Ý "ã å S÷ñ õ
 8ô 	ô ôÐ0¸õ ô4{
Ð&õ {
r   