o
    ưiU                     @   s   d Z ddlmZmZ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 deZG d	d
 d
eddZG dd deZdS )z8
Calls Perplexity's /search endpoint to search the web.
    )DictListOptional	TypedDictUnionN)Logging)BaseSearchConfigSearchResponseSearchResult)get_secret_strc                   @   s&   e Zd ZU dZeeee f ed< dS ) _PerplexitySearchRequestRequiredz2Required fields for Perplexity Search API request.queryN)__name__
__module____qualname____doc__r   strr   __annotations__ r   r   d/home/app/Keep/.python/lib/python3.10/site-packages/litellm/llms/perplexity/search/transformation.pyr      s   
 r   c                   @   s6   e Zd ZU dZeed< ee ed< eed< eed< dS )PerplexitySearchRequestzr
    Perplexity Search API request format.
    Based on: https://docs.perplexity.ai/api-reference/search-post
    max_resultssearch_domain_filtermax_tokens_per_pagecountryN)r   r   r   r   intr   r   r   r   r   r   r   r      s   
 r   F)totalc                   @   s   e Zd ZdZedefddZ		ddedee dee defd	d
Z		ddee de
deeeee f  defddZdeeee f de
defddZdejdedefddZdS )PerplexitySearchConfigzhttps://api.perplexity.aireturnc                   C   s   dS )NZ
Perplexityr   r   r   r   r   ui_friendly_name$   s   z'PerplexitySearchConfig.ui_friendly_nameNheadersapi_keyapi_basec                 K   s2   |pt d}|stdd| |d< d|d< |S )z:
        Validate environment and return headers.
        ZPERPLEXITYAI_API_KEYzQPERPLEXITYAI_API_KEY is not set. Set `PERPLEXITYAI_API_KEY` environment variable.zBearer Authorizationzapplication/jsonzContent-Type)r   
ValueError)selfr    r!   r"   kwargsr   r   r   validate_environment(   s   
z+PerplexitySearchConfig.validate_environmentoptional_paramsdatac                 K   s*   |pt dp| j}|ds| d}|S )z7
        Get complete URL for Search endpoint.
        PERPLEXITY_API_BASEz/search)r   r*   endswith)r%   r"   r(   r)   r&   r   r   r   get_complete_url9   s   


z'PerplexitySearchConfig.get_complete_urlr   c           	      K   sx   d|i}| d}|dur||d< | d}|dur||d< | d}|dur+||d< | d}|dur8||d< t|S )a4  
        Transform Search request to Perplexity API format.

        Note: LiteLLM's native spec is the perplexity search spec.

        There's no transformation needed for the request data.
        
        https://docs.perplexity.ai/api-reference/search-post
        
        Args:
            query: Search query (string or list of strings)
            optional_params: Optional parameters for the request
                - max_results: Maximum number of search results (1-20)
                - search_domain_filter: List of domains to filter (max 20)
                - max_tokens_per_page: Max tokens per page (default 1024)
                - country: Country code filter (e.g., 'US', 'GB', 'DE')
            
        Returns:
            Dict with typed request data following PerplexitySearchRequest spec
        r   r   Nr   r   r   )getdict)	r%   r   r(   r&   Zrequest_datar   r   r   r   r   r   r   transform_search_requestL   s   



z/PerplexitySearchConfig.transform_search_requestraw_responselogging_objc              	   K   sj   |  }g }|dg D ]"}t|dd|dd|dd|d|dd}|| qt|d	d
S )a5  
        Transform Perplexity API response to standard SearchResponse format.
        
        Args:
            raw_response: Raw httpx response from Perplexity API
            logging_obj: Logging object for tracking
            
        Returns:
            SearchResponse with standardized format
        resultstitle urlsnippetdatelast_updated)r3   r5   r6   r7   r8   search)r2   object)jsonr-   r
   appendr	   )r%   r0   r1   r&   Zresponse_jsonr2   resultZsearch_resultr   r   r   transform_search_response}   s   


z0PerplexitySearchConfig.transform_search_response)NN)N)r   r   r   r*   staticmethodr   r   r   r   r'   r.   r   r   r,   r/   httpxResponseLiteLLMLoggingObjr	   r>   r   r   r   r   r   !   sN    


1r   )r   typingr   r   r   r   r   r@   Z*litellm.litellm_core_utils.litellm_loggingr   rB   Z+litellm.llms.base_llm.search.transformationr   r	   r
   Zlitellm.secret_managers.mainr   r   r   r   r   r   r   r   <module>   s    