o
    ưik#                     @   sL  d dl Z d dlmZmZmZmZmZ d dlmZ d dl	m
Z
 d dlT d dlmZmZ d dlmZ e Zejdeeged	gd
ejdeeged	gd
ejdeeged	gd
ejdeeged	gd
eedfdedededee fdd	Zejdeeged	gd
ejdeeged	gd
eefdededefddZdS )    N)	APIRouterDependsHTTPExceptionRequestResponse)ORJSONResponseverbose_proxy_logger)*)UserAPIKeyAuthuser_api_key_auth)ProxyBaseLLMRequestProcessingz/v1/search/{search_tool_name}search)dependenciesresponse_classtagsz/search/{search_tool_name}z
/v1/searchz/searchrequestfastapi_responseuser_api_key_dictsearch_tool_namec              
      s  ddl m}m}m}m}m}m}	m}
m}m	}m
}m} |  I dH }t|}|dur/||d< d|v r|d r|d |d< |durt|dr|d  td  dd	d
 |jD  dt|j   fdd
|jD }|r|d }|di d}|r||d< d|vri |d<  |d d< t|d}z:|jd$i d| d|d|ddd|d|d|d|d|ddd|d|d|d |
d!|	d"|I dH W S  ty } z|j||||d#I dH d}~ww )%a\
  
    Search endpoint for performing web searches.
    
    Follows the Perplexity Search API spec:
    https://docs.perplexity.ai/api-reference/search-post
    
    The search_tool_name can be passed either:
    1. In the URL path: /v1/search/{search_tool_name}
    2. In the request body: {"search_tool_name": "..."}
    
    Example with search_tool_name in URL (recommended - keeps body Perplexity-compatible):
    ```bash
    curl -X POST "http://localhost:4000/v1/search/litellm-search"         -H "Authorization: Bearer sk-1234"         -H "Content-Type: application/json"         -d '{
            "query": "latest AI developments 2024",
            "max_results": 5,
            "search_domain_filter": ["arxiv.org", "nature.com"],
            "country": "US"
        }'
    ```
    
    Example with search_tool_name in body:
    ```bash
    curl -X POST "http://localhost:4000/v1/search"         -H "Authorization: Bearer sk-1234"         -H "Content-Type: application/json"         -d '{
            "search_tool_name": "litellm-search",
            "query": "latest AI developments 2024",
            "max_results": 5,
            "search_domain_filter": ["arxiv.org", "nature.com"],
            "country": "US"
        }'
    ```
    
    Request Body Parameters (when search_tool_name not in URL):
    - search_tool_name (str, required if not in URL): Name of the search tool configured in router
    - query (str or list[str], required): Search query
    - max_results (int, optional): Maximum number of results (1-20), default 10
    - search_domain_filter (list[str], optional): List of domains to filter (max 20)
    - max_tokens_per_page (int, optional): Max tokens per page, default 1024
    - country (str, optional): Country code filter (e.g., 'US', 'GB', 'DE')
    
    When using URL path parameter, only Perplexity-compatible parameters are needed in body:
    - query (str or list[str], required): Search query
    - max_results (int, optional): Maximum number of results (1-20), default 10
    - search_domain_filter (list[str], optional): List of domains to filter (max 20)
    - max_tokens_per_page (int, optional): Max tokens per page, default 1024
    - country (str, optional): Country code filter (e.g., 'US', 'GB', 'DE')
    
    Response follows Perplexity Search API format:
    ```json
    {
        "object": "search",
        "results": [
            {
                "title": "Result title",
                "url": "https://example.com",
                "snippet": "Result snippet...",
                "date": "2024-01-01",
                "last_updated": "2024-01-01"
            }
        ]
    }
    ```
    r   )general_settings
llm_routerproxy_configproxy_logging_objselect_data_generatoruser_api_baseuser_max_tokens
user_modeluser_request_timeoutuser_temperatureversionNr   modelsearch_toolsz0Search endpoint - Looking for search_tool_name: z$. Available search tools in router: c                 S   s   g | ]}| d qS r   get.0tool r)   _/home/app/Keep/.python/lib/python3.10/site-packages/litellm/proxy/search_endpoints/endpoints.py
<listcomp>   s    zsearch.<locals>.<listcomp>z. Total search tools: c                    s   g | ]}| d  kr|qS r#   r$   r&   Zsearch_tool_name_valuer)   r*   r+      s
    litellm_paramssearch_providerZcustom_llm_providermetadataZmodel_group)datar   r   r   Z
route_typeZasearchr   r   r   r   r   r   r   r   r   r   r    )er   r   r    r)   )litellm.proxy.proxy_serverr   r   r   r   r   r   r   r   r   r   r    bodyorjsonloadshasattrr	   debugr"   lenr%   r   Zbase_process_llm_request	ExceptionZ_handle_llm_api_exception)r   r   r   r   r   r   r   r   r   r   r   r   r   r   r    r3   r0   Zmatching_toolsZsearch_toolr.   	processorr1   r)   r,   r*   r      s   4b



	
z/v1/search/toolsz/search/toolsc           
   
      s   ddl m} z@g }|durBt|drB|jD ]+}|d|di dd}d	|v r<|d	 r<|d	 d
}|r<||d
< || qd|dW S  tyi } zddlm}	 |		d|  t
dt|dd}~ww )ar  
    List all available search tools configured in the router.
    
    This endpoint returns the search tools that are currently loaded and available
    for use with the /v1/search endpoint.
    
    Example:
    ```bash
    curl -X GET "http://localhost:4000/v1/search/tools"         -H "Authorization: Bearer sk-1234"
    ```
    
    Response:
    ```json
    {
        "object": "list",
        "data": [
            {
                "search_tool_name": "litellm-search",
                "search_provider": "perplexity",
                "description": "Perplexity search tool"
            }
        ]
    }
    ```
    r   )r   Nr"   r   r-   r.   )r   r.   Zsearch_tool_infodescriptionlist)objectr0   r   zError listing search tools: i  )status_codedetail)r2   r   r6   r"   r%   appendr9   litellm._loggingr	   	exceptionr   str)
r   r   r   r   Zsearch_tools_listr(   Z	tool_infor;   r1   r	   r)   r)   r*   list_search_tools   s.   +
rD   )r4   Zfastapir   r   r   r   r   Zfastapi.responsesr   rA   r	   Zlitellm.proxy._typesZ$litellm.proxy.auth.user_api_key_authr   r   Z'litellm.proxy.common_request_processingr   ZrouterpostOptionalrC   r   r%   rD   r)   r)   r)   r*   <module>   s   	 	