o
    ưi                     @   s   d Z ddlmZ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 )z
Calls Linkup's /search endpoint to search the web.

Linkup API Reference: https://docs.linkup.so/pages/documentation/api-reference/endpoint/post-search
    )DictListLiteralOptional	TypedDictUnionN)Logging)BaseSearchConfigSearchResponseSearchResult)get_secret_strc                   @   s2   e Zd ZU dZeed< ed ed< ed ed< dS )_LinkupSearchRequestRequiredz.Required fields for Linkup Search API request.q)deepstandarddepth)searchResultsZsourcedAnswerZ
structured
outputTypeN)__name__
__module____qualname____doc__str__annotations__r    r   r   `/home/app/Keep/.python/lib/python3.10/site-packages/litellm/llms/linkup/search/transformation.pyr      s   
 r   c                   @   sb   e Zd ZU dZeed< eed< eed< eed< eed< ee ed< ee ed< eed	< eed
< dS )LinkupSearchRequestz
    Linkup Search API request format.
    Based on: https://docs.linkup.so/pages/documentation/api-reference/endpoint/post-search
    ZstructuredOutputSchemaZincludeSourcesZincludeImagesZfromDateZtoDateincludeDomainsZexcludeDomainsZincludeInlineCitations
maxResultsN)	r   r   r   r   r   r   boolr   intr   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 )LinkupSearchConfigzhttps://api.linkup.so/v1returnc                   C   s   dS )NZLinkupr   r   r   r   r   ui_friendly_name1   s   z#LinkupSearchConfig.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LINKUP_API_KEYzELINKUP_API_KEY is not set. Set `LINKUP_API_KEY` environment variable.zBearer Authorizationzapplication/jsonzContent-Type)r   
ValueError)selfr%   r&   r'   kwargsr   r   r   validate_environment5   s   
z'LinkupSearchConfig.validate_environmentoptional_paramsdatac                 K   s*   |pt dp| j}|ds| d}|S )z7
        Get complete URL for Search endpoint.
        LINKUP_API_BASEz/search)r   r/   endswith)r*   r'   r-   r.   r+   r   r   r   get_complete_urlH   s
   

z#LinkupSearchConfig.get_complete_urlqueryc                 K   s   t |tr
d|}||dd|ddd}d|v r"|d |d< d	|v r,|d	 |d
< t|}| D ]\}}||  vrF||vrF|||< q4|S )a  
        Transform Search request to Linkup API format.

        Transforms Perplexity unified spec parameters:
        - query -> q
        - max_results -> maxResults
        - search_domain_filter -> includeDomains
        - country -> (not directly supported)
        - max_tokens_per_page -> (not applicable)

        All other Linkup-specific parameters are passed through as-is.

        Args:
            query: Search query (string or list of strings). Linkup only supports single string queries.
            optional_params: Optional parameters for the request

        Returns:
            Dict with typed request data following LinkupSearchRequest spec
         r   r   r   r   )r   r   r   Zmax_resultsr   Zsearch_domain_filterr   )
isinstancelistjoingetdictitemsZ(get_supported_perplexity_optional_params)r*   r2   r-   r+   Zrequest_dataZresult_dataparamvaluer   r   r   transform_search_request\   s"   



z+LinkupSearchConfig.transform_search_requestraw_responselogging_objc           
   	   K   s   |  }g }|dg }|D ]I}|dd}|dkr5t|dd|dd|ddddd	}	||	 q|d
krWt|d|dd|dd|ddddd	}	||	 qt|ddS )aF  
        Transform Linkup API response to LiteLLM unified SearchResponse format.

        Linkup -> LiteLLM mappings:
        - results[].name -> SearchResult.title
        - results[].url -> SearchResult.url
        - results[].content -> SearchResult.snippet
        - No date field in results (set to None)
        - No last_updated field in Linkup response (set to None)

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

        Returns:
            SearchResponse with standardized format
        resultstypetextname urlcontentN)titlerD   snippetdateZlast_updatedimagesearch)r?   object)jsonr7   r   appendr
   )
r*   r=   r>   r+   Zresponse_jsonr?   Zraw_resultsresultZresult_typeZsearch_resultr   r   r   transform_search_response   s8   





z,LinkupSearchConfig.transform_search_response)NN)N)r   r   r   r/   staticmethodr   r$   r   r   r,   r8   r   r   r1   r<   httpxResponseLiteLLMLoggingObjr
   rO   r   r   r   r   r"   .   sN    


7r"   )r   typingr   r   r   r   r   r   rQ   Z*litellm.litellm_core_utils.litellm_loggingr   rS   Z+litellm.llms.base_llm.search.transformationr	   r
   r   Zlitellm.secret_managers.mainr   r   r   r"   r   r   r   r   <module>   s     
