o
    ưi                     @   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 )z
Calls Firecrawl's /search endpoint to search the web.

Firecrawl API Reference: https://docs.firecrawl.dev/api-reference/endpoint/search
    )DictListOptional	TypedDictUnionN)Logging)BaseSearchConfigSearchResponseSearchResult)get_secret_strc                   @   s   e Zd ZU dZeed< dS )_FirecrawlSearchRequestRequiredz1Required fields for Firecrawl Search API request.queryN)__name__
__module____qualname____doc__str__annotations__ r   r   c/home/app/Keep/.python/lib/python3.10/site-packages/litellm/llms/firecrawl/search/transformation.pyr      s   
 r   c                   @   sj   e Zd ZU dZeed< ee ed< eeeef  ed< eed< eed< eed< eed< e	ed	< eed
< dS )FirecrawlSearchRequestzu
    Firecrawl Search API request format.
    Based on: https://docs.firecrawl.dev/api-reference/endpoint/search
    limitsources
categoriesZtbslocationcountrytimeoutZignoreInvalidURLsscrapeOptionsN)
r   r   r   r   intr   r   r   r   boolr   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 )FirecrawlSearchConfigzhttps://api.firecrawl.dev/v2returnc                   C   s   dS )NZ	Firecrawlr   r   r   r   r   ui_friendly_name+   s   z&FirecrawlSearchConfig.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FIRECRAWL_API_KEYzKFIRECRAWL_API_KEY is not set. Set `FIRECRAWL_API_KEY` environment variable.zBearer Authorizationzapplication/jsonzContent-Type)r   
ValueError)selfr$   r%   r&   kwargsr   r   r   validate_environment/   s   
z*FirecrawlSearchConfig.validate_environmentoptional_paramsdatac                 K   s*   |pt dp| j}|ds| d}|S )z7
        Get complete URL for Search endpoint.
        FIRECRAWL_API_BASEz/search)r   r.   endswith)r)   r&   r,   r-   r*   r   r   r   get_complete_url@   s   


z&FirecrawlSearchConfig.get_complete_urlr   c                 K   s   t |tr
d|}d|i}d|v r|d |d< d|v r"|d |d< t|}| D ]\}}||  vr<||vr<|||< q*d|vrIdgdd	|d< |S )
u  
        Transform Search request to Firecrawl API format.
        
        Transforms Perplexity unified spec parameters:
        - query → query (same)
        - max_results → limit
        - search_domain_filter → (not directly supported, can use scrapeOptions)
        - country → country
        - max_tokens_per_page → (not applicable, ignored)
        
        All other Firecrawl-specific parameters are passed through as-is.
        
        Args:
            query: Search query (string or list of strings). Firecrawl only supports single string queries.
            optional_params: Optional parameters for the request
            
        Returns:
            Dict with typed request data following FirecrawlSearchRequest spec
         r   Zmax_resultsr   r   r   markdownT)formatsZonlyMainContent)
isinstancelistjoindictitemsZ(get_supported_perplexity_optional_params)r)   r   r,   r*   Zrequest_dataZresult_dataparamvaluer   r   r   transform_search_requestS   s$   


z.FirecrawlSearchConfig.transform_search_requestraw_responselogging_objc                 K   s   |  }g }|di }|dg }|D ]#}|dp |dd}	t|dd|dd|	ddd	}
||
 q|d
g }|D ]&}|dpL|dd}	t|dd|dd|	|ddd	}
||
 q@t|ddS )u4  
        Transform Firecrawl API response to LiteLLM unified SearchResponse format.
        
        Firecrawl → LiteLLM mappings:
        - data.web[].title → SearchResult.title
        - data.web[].url → SearchResult.url
        - data.web[].description OR data.web[].markdown → SearchResult.snippet
        - No date field in web results (set to None)
        - No last_updated field in Firecrawl response (set to None)
        
        Note: Firecrawl v2 returns results organized by source type (web, images, news).
        We primarily use web results for the unified format.
        
        Args:
            raw_response: Raw httpx response from Firecrawl API
            logging_obj: Logging object for tracking
            
        Returns:
            SearchResponse with standardized format
        r-   Zwebr2   description titleurlN)r@   rA   snippetdateZlast_updatednewsrB   rC   search)resultsobject)jsongetr
   appendr	   )r)   r<   r=   r*   Zresponse_jsonrF   r-   Zweb_resultsresultrB   Zsearch_resultZnews_resultsr   r   r   transform_search_response   s:   



z/FirecrawlSearchConfig.transform_search_response)NN)N)r   r   r   r.   staticmethodr   r#   r   r   r+   r7   r   r   r0   r;   httpxResponseLiteLLMLoggingObjr	   rL   r   r   r   r   r!   (   sN    


:r!   )r   typingr   r   r   r   r   rN   Z*litellm.litellm_core_utils.litellm_loggingr   rP   Z+litellm.llms.base_llm.search.transformationr   r	   r
   Zlitellm.secret_managers.mainr   r   r   r!   r   r   r   r   <module>   s    