Ë
    uPêj!(  ã                   ó–   — d Z ddl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e«      Z G d	„ d
ed¬«      Z G d„ de
«      Zy)z«
Calls Google Programmable Search Engine (PSE) API to search the web.

Google PSE API Reference: https://developers.google.com/custom-search/v1/reference/rest/v1/cse/list
é    )ÚFinalÚLiteralÚ	TypedDictN)ÚLogging)ÚBaseSearchConfigÚSearchResponseÚSearchResult)Úget_secret_strc                   ó0   — e Zd ZU dZeed<   eed<   eed<   y)Ú_GooglePSESearchRequestRequiredz2Required fields for Google PSE Search API request.ÚqÚcxÚkeyN)Ú__name__Ú
__module__Ú__qualname__Ú__doc__ÚstrÚ__annotations__© ó    úr/home/oem/CyberBrain26-unified/.venv/lib/python3.12/site-packages/litellm/llms/google_pse/search/transformation.pyr   r      s   … Ù<à
ƒFØƒGØ	„Hr   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<   eed<   eed<   eed<   eed<   y)ÚGooglePSESearchRequestz—
    Google Programmable Search Engine API request format.
    Based on: https://developers.google.com/custom-search/v1/reference/rest/v1/cse/list
    ÚnumÚstartÚcrÚdateRestrictÚ
exactTermsÚexcludeTermsÚfileTypeÚfilterÚglÚhqÚimgSizeÚimgTypeÚlinkSiteÚlrÚorTermsÚrelatedSiteÚrightsÚsafeÚ
searchTypeÚ
siteSearchÚsiteSearchFilterÚsortN)r   r   r   r   Úintr   r   r   r   r   r   r      s{   … ñð
 
ƒHØƒJØƒGØÓØƒOØÓØƒMØƒKØƒGØƒGØƒLØƒLØƒMØƒGØƒLØÓØƒKØ
ƒIØƒOØƒOØÓØ
„Ir   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dej                  dedefd„Zy)ÚGooglePSESearchConfigz*https://www.googleapis.com/customsearch/v1Úreturnc                   ó   — y)Nz
Google PSEr   r   r   r   Úui_friendly_namez&GooglePSESearchConfig.ui_friendly_name=   s   € àr   )ÚGETÚPOSTc                  ó   — y)zE
        Google PSE uses GET requests with query parameters.
        r8   r   )Úselfs    r   Úget_http_methodz%GooglePSESearchConfig.get_http_methodA   s   € ð r   NÚheadersÚapi_keyÚapi_basec                 óÀ   — | j                  ||dd| j                  ¬«      }|st        d«      ‚|j                  d«      xs t	        d«      }|st        d«      ‚d|d	<   |S )
zÌ
        Validate environment and return headers.

        Google PSE uses API key as a query parameter, not in headers.
        This method is called but headers are not used for authentication.
        ©ÚGOOGLE_PSE_API_KEYÚGOOGLE_PSE_API_BASE©Úcaller_api_keyÚcaller_api_baseÚkey_env_varsÚbase_env_varÚdefault_api_basezMGOOGLE_PSE_API_KEY is not set. Set `GOOGLE_PSE_API_KEY` environment variable.Úsearch_engine_idÚGOOGLE_PSE_ENGINE_IDzvGOOGLE_PSE_ENGINE_ID is not set. Set `GOOGLE_PSE_ENGINE_ID` environment variable or pass `search_engine_id` parameter.zapplication/jsonzContent-Type)Úresolve_server_api_keyrC   Ú
ValueErrorÚgetr
   )r;   r=   r>   r?   ÚkwargsrJ   s         r   Úvalidate_environmentz*GooglePSESearchConfig.validate_environmentG   sƒ   € ð ×-Ñ-Ø"Ø$Ø0Ø.Ø!×5Ñ5ð .ó 
ˆñ ÜÐlÓmÐmð #)§*¡*Ð-?Ó"@Ò"jÄNÐSiÓDjÐÙÜð Ióð ð #5ˆ�ÑØˆr   Úoptional_paramsÚdatac                 ó    — ddl m} |xs t        d«      xs | j                  }|r(t	        |t
        «      rd|v r|d   } ||«      }|› d|› �S |S )zý
        Get complete URL for Search endpoint with query parameters.

        Google PSE uses GET requests, so we build the full URL with query params here.
        The transformed request body (data) contains the parameters needed for the URL.
        r   )Ú	urlencoderC   Ú_google_pse_paramsú?)Úurllib.parserT   r
   rC   Ú
isinstanceÚdict)r;   r?   rQ   rR   rO   rT   ÚparamsÚquery_strings           r   Úget_complete_urlz&GooglePSESearchConfig.get_complete_urlh   sc   € õ 	+àÒ`œ~Ð.CÓDÒ`È×H`ÑH`ˆñ ”J˜t¤TÔ*Ð/CÀtÑ/KØ Ð!5Ñ6ˆFÙ"+¨FÓ"3ˆLØ�Z˜q  Ð/Ð/àˆr   ÚqueryrJ   c                 ól  — t        |t        «      rdj                  |«      }| j                  ||dd| j                  ¬«      }|xs t        d«      }|st        d«      ‚|st        d«      ‚|||dœ}d	|v rt        |d	   d
«      }||d<   d|v rK|d   }	t        |	t        «      rt        |	«      dkD  r|	d   |d<   d|d<   nt        |	t        «      r
|	|d<   d|d<   d|v r|d   j                  «       |d<   t        |«      }
|j                  «       D ]"  \  }}|| j                  «       vsŒ||
vsŒ||
|<   Œ$ d|
iS )u  
        Transform Search request to Google PSE API format.

        Transforms Perplexity unified spec parameters:
        - query â†’ q (same)
        - max_results â†’ num
        - search_domain_filter â†’ siteSearch
        - country â†’ gl
        - max_tokens_per_page â†’ (not applicable, ignored)

        All other Google PSE-specific parameters are passed through as-is.

        Args:
            query: Search query (string or list of strings). Google PSE supports single string queries.
            optional_params: Optional parameters for the request
            api_key: Google API key
            search_engine_id: Google Programmable Search Engine ID (cx parameter)

        Returns:
            Dict with typed request data following GooglePSESearchRequest spec
        ú rA   rC   rD   rK   zGOOGLE_PSE_API_KEY is requiredz GOOGLE_PSE_ENGINE_ID is required)r   r   r   Úmax_resultsé
   r   Úsearch_domain_filterr   r.   Úir/   Úcountryr#   rU   )rX   ÚlistÚjoinrL   rC   r
   rM   ÚminÚlenr   ÚupperrY   ÚitemsÚ(get_supported_perplexity_optional_params)r;   r]   rQ   r>   r?   rJ   rO   Úrequest_dataÚnum_resultsÚdomainsÚresult_dataÚparamÚvalues                r   Útransform_search_requestz.GooglePSESearchConfig.transform_search_request�   sŽ  € ô< �eœTÔ"à—H‘H˜U“OˆEð
 ×-Ñ-Ø"Ø$Ø0Ø.Ø!×5Ñ5ð .ó 
ˆð ,ÒU¬~Ð>TÓ/UÐáÜÐ=Ó>Ð>ÙÜÐ?Ó@Ð@ð Ø"Øñ7
ˆð ˜OÑ+ä!$ _°]Ñ%CÀRÓ!HˆKØ"-ˆL˜Ñà! _Ñ4à,Ð-CÑDˆGÜ˜'¤4Ô(¬S°«\¸AÒ-=Ø-4°Q©Z�˜\Ñ*Ø36�Ð/Ò0Ü˜G¤SÔ)Ø-4�˜\Ñ*Ø36�Ð/Ñ0à˜Ñ'à!0°Ñ!;×!AÑ!AÓ!CˆL˜Ñô " ,Ó/ˆð ,×1Ñ1Ó3ò 	+‰LˆE�5Ø˜D×IÑIÓKÒKÐPUÐ]hÒPhØ%*�˜EÒ"ð	+ð ! +ð
ð 	
r   Úraw_responseÚlogging_objc           	      ó  — |j                  «       }g }|j                  dg «      D ]S  }t        |j                  dd«      |j                  dd«      |j                  dd«      dd¬«      }|j                  |«       ŒU t	        |d¬	«      S )
u+  
        Transform Google PSE API response to LiteLLM unified SearchResponse format.

        Google PSE â†’ LiteLLM mappings:
        - items[].title â†’ SearchResult.title
        - items[].link â†’ SearchResult.url
        - items[].snippet â†’ SearchResult.snippet
        - No date/last_updated fields in Google PSE response (set to None)

        Args:
            raw_response: Raw httpx response from Google PSE API
            logging_obj: Logging object for tracking

        Returns:
            SearchResponse with standardized format
        rj   ÚtitleÚ ÚlinkÚsnippetN)rv   Úurlry   ÚdateÚlast_updatedÚsearch)ÚresultsÚobject)ÚjsonrN   r	   Úappendr   )r;   rs   rt   rO   Úresponse_jsonr~   ÚitemÚsearch_results           r   Útransform_search_responsez/GooglePSESearchConfig.transform_search_responseÜ   s’   € ð,  ,×0Ñ0Ó2ˆð ˆØ!×%Ñ% g¨rÓ2ò 	*ˆDÜ(Ø—h‘h˜w¨Ó+Ø—H‘H˜V RÓ(ØŸ™ ¨BÓ/ØØ!ôˆMð �N‰N˜=Õ)ð	*ô ØØô
ð 	
r   )NN)N)NNN)r   r   r   rC   Ústaticmethodr   r7   r   r<   rY   rP   re   r\   rr   ÚhttpxÚResponseÚLiteLLMLoggingObjr   r…   r   r   r   r4   r4   :   s;  „ ØFÐàð˜cò ó ðð ¨Ñ!7ó ð #Ø#ñ	àðð �t‘ðð ˜‘*ð	ð 
óðJ *.ñ	à˜‘*ðð ðð �T˜$‘ZÑ $Ñ&ð	ð 
óð: #Ø#Ø'+ñY
à�T˜#‘Y‰ðY
ð ðY
ð �t‘ð	Y
ð
 ˜‘*ðY
ð  ™*ðY
ð 
óY
ðv'
à—n‘nð'
ð 'ð'
ð
 
ô'
r   r4   )r   Útypingr   r   r   r‡   Ú*litellm.litellm_core_utils.litellm_loggingr   r‰   Ú+litellm.llms.base_llm.search.transformationr   r   r	   Úlitellm.secret_managers.mainr
   r   r   r4   r   r   r   ú<module>rŽ      sQ   ðñ÷ -Ñ ,ã å S÷ñ õ
 8ô iô ôÐ<ÀEõ ô<I
Ð,õ I
r   