Ë
    uPêj,!  ã                   ór   — 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
 ddlmZmZmZ ddlmZ  G d„ d	e«      Zy)
z�
Calls DataForSEO SERP API to search the web.

DataForSEO API Reference: https://docs.dataforseo.com/v3/serp/google/organic/live/advanced/?bash
é    )ÚAnyÚFinalÚLiteralN)Ú DEFAULT_DATAFORSEO_LOCATION_CODE)ÚLogging)ÚBaseSearchConfigÚSearchResponseÚSearchResult)Úget_secret_strc                   óü   — e Zd 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
ee
   z  fd„Zdej                   dedefd„Zy)ÚDataForSEOSearchConfigzÏ
    Configuration for DataForSEO SERP API search.

    DataForSEO uses HTTP Basic Auth with login:password credentials.
    API endpoint: https://api.dataforseo.com/v3/serp/google/organic/live/advanced
    z?https://api.dataforseo.com/v3/serp/google/organic/live/advancedÚreturnc                   ó   — y)NÚ
DataForSEO© r   ó    úr/home/oem/CyberBrain26-unified/.venv/lib/python3.12/site-packages/litellm/llms/dataforseo/search/transformation.pyÚui_friendly_namez'DataForSEOSearchConfig.ui_friendly_name   s   € àr   )ÚGETÚPOSTc                  ó   — y)z?
        DataForSEO uses POST requests with JSON body.
        r   r   )Úselfs    r   Úget_http_methodz&DataForSEOSearchConfig.get_http_method#   s   € ð r   NÚheadersÚapi_keyÚapi_basec                 ó�  — ddl }t        d«      }t        d«      }t        |xr d|v «      }|rd|v r|j                  dd«      \  }}|s"|r |r| j	                  || j
                  dd«       |st        d«      ‚|st        d	«      ‚|› d|› �}	|j                  |	j                  «       «      j                  «       }
d
|
› �|d<   d|d<   |S )a"  
        Validate DataForSEO environment and set up authentication.

        DataForSEO uses HTTP Basic Auth with login:password format.
        The credentials should be in DATAFORSEO_LOGIN and DATAFORSEO_PASSWORD env vars,
        or passed as api_key in "login:password" format.
        r   NÚDATAFORSEO_LOGINÚDATAFORSEO_PASSWORDú:é   ÚDATAFORSEO_API_BASEzrDATAFORSEO_LOGIN is not set. Set `DATAFORSEO_LOGIN` environment variable or pass credentials in api_key parameter.zxDATAFORSEO_PASSWORD is not set. Set `DATAFORSEO_PASSWORD` environment variable or pass credentials in api_key parameter.zBasic ÚAuthorizationzapplication/jsonzContent-Type)
Úbase64r   ÚboolÚsplitÚ._assert_trusted_api_base_for_server_credentialr"   Ú
ValueErrorÚ	b64encodeÚencodeÚdecode)r   r   r   r   Úkwargsr$   ÚloginÚpasswordÚcaller_supplied_credentialsÚcredentialsÚencoded_credentialss              r   Úvalidate_environmentz+DataForSEOSearchConfig.validate_environment)   s   € ó 	ô Ð1Ó2ˆÜ!Ð"7Ó8ˆô .2°'Ò2L¸cÀW¸nÓ-MÐ#Ù�s˜g‘~Ø%Ÿm™m¨C°Ó3‰OˆE�8á*©u¹Ø×?Ñ?ØØ×(Ñ(Ø%Ø"ô	ñ Üð Eóð ñ Üð Kóð ð
 !&˜w a¨ zÐ2ˆØ%+×%5Ñ%5°k×6HÑ6HÓ6JÓ%K×%RÑ%RÓ%TÐØ%+Ð,?Ð+@Ð#Aˆ�Ñ Ø"4ˆ�Ñàˆr   Úoptional_paramsÚdatac                 ó<   — |xs t        d«      xs | j                  S )z‹
        Get complete URL for DataForSEO SERP API endpoint.

        DataForSEO uses POST requests, so no query parameters in URL.
        r"   )r   r"   )r   r   r3   r4   r,   s        r   Úget_complete_urlz'DataForSEOSearchConfig.get_complete_url\   s    € ð Ò\œ>Ð*?Ó@Ò\ÀD×D\ÑD\Ð\r   Úqueryc                 ó~  — i }t        |t        «      r	|r|d   nd}||d<   d|v r"|d   rt        t        |d   «      d«      }||d<   d|v r|d   r|d   |d<   d	|v r|d	   r|d	   |d
<   d|vr	d|vrd|d<   d|vrd|vr	t        |d<   |j                  «       D ]"  \  }}|| j                  «       vsŒ||vsŒ|||<   Œ$ |gS )u  
        Transform Search request to DataForSEO SERP API format.

        Args:
            query: Search query (string or list of strings). DataForSEO supports single string queries.
            optional_params: Optional parameters for the request
                - max_results: Maximum number of search results â†’ maps to `depth` (max 700)
                - country: Country name â†’ maps to `location_name`
                - search_domain_filter: Domain to filter results â†’ maps to `domain`
                - Plus any DataForSEO-specific parameters (location_code, language_code, device, os, etc.)
            api_key: DataForSEO credentials (login:password format)

        Returns:
            List[Dict]: Request body for DataForSEO API (array of task objects as required by API)
        r   Ú ÚkeywordÚmax_resultsi¼  ÚdepthÚcountryÚlocation_nameÚsearch_domain_filterÚdomainÚlanguage_codeÚlanguage_nameÚenÚlocation_code)Ú
isinstanceÚlistÚminÚintr   ÚitemsÚ(get_supported_perplexity_optional_params)	r   r7   r3   r   r,   Útaskr<   ÚparamÚvalues	            r   Útransform_search_requestz/DataForSEOSearchConfig.transform_search_requestj   s  € ð. ')ˆô �eœTÔ"Ù %�E˜!’H¨2ˆEð  ˆˆY‰ð ˜OÑ+°ÀÒ0Näœs ?°=Ñ#AÓBÀCÓHˆEØ!ˆD�‰Mà˜Ñ'¨O¸IÒ,Fð %4°IÑ$>ˆD�Ñ!à! _Ñ4¸ÐI_Ò9`à,Ð-CÑDˆD�‰Nð  $Ñ&¨?À$Ñ+FØ$(ˆD�Ñ!ð  $Ñ&¨?À$Ñ+FÜ$DˆD�Ñ!ð ,×1Ñ1Ó3ò 	$‰LˆE�5Ø˜D×IÑIÓKÒKÐPUÐ]aÒPaØ#��U’ð	$ð
 ˆvˆr   Úraw_responseÚlogging_objc           	      óÖ  — |j                  «       }g }d|v rÇt        |d   «      dkD  r¶|d   d   }|j                  d«      dk(  ršd|v r–t        |d   «      dkD  r…|d   d   }|j                  dg «      D ]h  }|j                  d«      dk(  sŒt        |j                  d	d
«      |j                  dd
«      |j                  dd
«      dd¬«      }	|j	                  |	«       Œj t        |d¬«      S )um  
        Transform DataForSEO SERP API response to LiteLLM unified SearchResponse format.

        DataForSEO â†’ LiteLLM mappings:
        - tasks[0].result[*].items[*].title â†’ SearchResult.title
        - tasks[0].result[*].items[*].url â†’ SearchResult.url
        - tasks[0].result[*].items[*].description â†’ SearchResult.snippet
        - No date/last_updated fields in standard response (set to None)

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

        Returns:
            SearchResponse with standardized format
        Útasksr   Ústatus_codei N  ÚresultrI   ÚtypeÚorganicÚtitler9   ÚurlÚdescriptionN)rW   rX   ÚsnippetÚdateÚlast_updatedÚsearch)ÚresultsÚobject)ÚjsonÚlenÚgetr
   Úappendr	   )
r   rO   rP   r,   Úresponse_jsonr^   rK   rT   ÚitemÚsearch_results
             r   Útransform_search_responsez0DataForSEOSearchConfig.transform_search_response©   s  € ð,  ,×0Ñ0Ó2ˆð ˆð �mÑ#¬¨M¸'Ñ,BÓ(CÀaÒ(GØ'¨Ñ0°Ñ3ˆDð �x‰x˜Ó&¨%Ò/°HÀÑ4Dä�t˜H‘~Ó&¨Ò*Ø$(¨¡N°1Ñ$5�Fð !'§
¡
¨7°BÓ 7ò 
:˜àŸ8™8 FÓ+¨yÓ8Ü,8Ø&*§h¡h¨w¸Ó&;Ø$(§H¡H¨U°BÓ$7Ø(,¯©°ÀÓ(CØ%)Ø-1ô-˜Mð $ŸN™N¨=Õ9ð
:ô ØØô
ð 	
r   )NN)N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r"   ÚstaticmethodÚstrr   r   r   Údictr2   rF   r6   rN   ÚhttpxÚResponseÚLiteLLMLoggingObjr	   rg   r   r   r   r   r      s(  „ ñð \Ðàð˜cò ó ðð ¨Ñ!7ó ð #Ø#ñ	1àð1ð �t‘ð1ð ˜‘*ð	1ð 
ó1ðn *.ñ	]à˜‘*ð]ð ð]ð �T˜$‘ZÑ $Ñ&ð	]ð 
ó]ð$ #ñ	=à�T˜#‘Y‰ð=ð ð=ð �t‘ð	=ð 
��T‘
Ñ	ó=ð~5
à—n‘nð5
ð 'ð5
ð
 
ô5
r   r   )rk   Útypingr   r   r   ro   Úlitellm.constantsr   Ú*litellm.litellm_core_utils.litellm_loggingr   rq   Ú+litellm.llms.base_llm.search.transformationr   r	   r
   Úlitellm.secret_managers.mainr   r   r   r   r   ú<module>rw      s9   ðñ÷ 'Ñ &ã å >Ý S÷ñ õ
 8ôI
Ð-õ I
r   