Ë
    tPêjU+  ã                   ó`  — U d dl mZ 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­ d dlmZmZ d dlmZ  e«       Zeed	<   ej+                  d
 ee«      ge
dg¬«      ej+                  d ee«      ge
dg¬«      ej+                  d ee«      ge
dg¬«      ej+                  d ee«      ge
dg¬«       ee«      dfdededededz  fd„«       «       «       «       Zej1                  d ee«      ge
dg¬«      ej1                  d ee«      ge
dg¬«       ee«      fdededefd„«       «       Zy)é    )ÚFinalN)Ú	APIRouterÚDependsÚHTTPExceptionÚRequestÚResponse)ÚORJSONResponse©Úverbose_proxy_logger)Ú*)ÚUserAPIKeyAuthÚuser_api_key_auth)ÚProxyBaseLLMRequestProcessingÚrouterz/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              ƒ   óf  K  — ddl m}m}m}m}m}m}	m}
m}m	}m
}m} | j                  «       ƒ d{  –—† }t        j                  |«      }|�||d<   d|v �rO|d   �rI|d   |d<   |d   }ddlm}m}m} 	  |||¬«      ƒ d{  –—†  |j&                  rEddl m}m}m}  ||j&                  |||j,                  |¬	«      ƒ d{  –—† } |||¬
«      ƒ d{  –—†  |�Ìt5        |d«      rÀt1        j6                  d||j8                  D �cg c]  }|j;                  d«      ‘Œ c}t=        |j8                  «      «       |j8                  D �cg c]  }|j;                  d«      |k(  sŒ|‘Œ }}|r>|d   }|j;                  di «      j;                  d«      }|r||d<   d|vri |d<   ||d   d<   d|vst?        |j;                  d«      t@        «      si |d<   tC        |dd«      �|jD                  |d   d<   tC        |dd«      �|j&                  |d   d<   tG        |¬«      }	 |jI                  | ||d|||||d||||
|	|¬«      ƒ d{  –—† S 7 �Œ7 �ŒÃ7 �Œ‡7 �Œx# t.        $ r}t1        j2                  d||«       ‚ d}~ww xY wc c}w c c}w 7 ŒC# t.        $ r#}|jK                  ||||¬«      ƒ d{  –—†7  ‚d}~ww xY 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)Úcan_key_call_search_toolÚcan_team_call_search_toolÚget_team_object)r   Úvalid_token)Úprisma_clientr   Úuser_api_key_cache)Úteam_idr*   r+   Úparent_otel_spanr   )r   Úteam_objectz+Search tool authorization failed for %s: %sÚsearch_toolszpSearch endpoint - Looking for search_tool_name: %s. Available search tools in router: %s. Total search tools: %sÚlitellm_paramsÚsearch_providerÚcustom_llm_providerÚmetadataÚmodel_groupÚteam_metadataÚuser_api_key_team_metadatar,   Úuser_api_key_team_id)ÚdataÚasearch)r   r   r   Ú
route_typer   r   r   r   r   r%   r!   r#   r"   r    r   r$   )Úer   r   r$   )&Úlitellm.proxy.proxy_serverr   r   r   r   r   r   r    r!   r"   r#   r$   ÚbodyÚorjsonÚloadsÚlitellm.proxy.auth.auth_checksr&   r'   r(   r,   r*   r+   r-   Ú	Exceptionr   ÚerrorÚhasattrÚdebugr/   ÚgetÚlenÚ
isinstanceÚdictÚgetattrr5   r   Úbase_process_llm_requestÚ_handle_llm_api_exception)r   r   r   r   r   r   r   r   r   r   r    r!   r"   r#   r$   r=   r8   Úsearch_tool_name_valuer&   r'   r(   r*   r+   r.   r;   ÚtoolÚmatching_toolsÚsearch_toolr1   Ú	processors                                 úm/home/oem/CyberBrain26-unified/.venv/lib/python3.12/site-packages/litellm/proxy/search_endpoints/endpoints.pyr   r      s<  è ø€ ÷D÷ ÷ ñ ð  Ÿ™›×&€DÜ—,‘,˜tÓ$€Dð Ð#Ø#3ˆÐÑ à˜TÒ! dÐ+=Ó&>ØÐ/Ñ0ˆˆW‰Ø(,Ð-?Ñ(@Ð÷	
ñ 	
ð	á*Ø!7Ø-ô÷ ð ð !×(Ò(÷ñ ñ ,;Ø-×5Ñ5Ø"/Ø'9Ø%6×%GÑ%GØ&7ô,÷ &�ñ 0Ø%;Ø +ô÷ ð ð Ð!¤g¨j¸.Ô&IÜ ×&Ñ&ð CØ&Ø:D×:QÑ:QÖR°$�—‘Ð,Õ-ÒRÜ�J×+Ñ+Ó,ô	ð ",×!8Ñ!8ö%Ø¸D¿H¹HÐEWÓ<XÐ\rÓ<r’ð%ˆNð %ñ Ø%3°AÑ%6�Ø)4¯©Ð9IÈ2Ó)N×)RÑ)RÐSdÓ)e�á"Ø2A�DÐ.Ñ/à TÑ)Ø')�D˜Ñ$Ø2H��ZÑ  Ñ/ð
 ˜Ñ¤Z°·±¸Ó0DÄdÔ%KØˆˆZÑÜÐ  /°4Ó8ÐDØ9J×9XÑ9XˆˆZÑÐ5Ñ6ÜÐ  )¨TÓ2Ð>Ø3D×3LÑ3LˆˆZÑÐ/Ñ0ô 5¸$Ô?€Ið
Ø×7Ñ7ØØ-Ø/Ø Ø/Ø!Ø-Ø%Ø"7ØØ!Ø-Ø!5Ø+Ø'Øð! 8ó 
÷ 
ð 	
ði 'ùð(ùð&ùðúô ò 	Ü ×&Ñ&Ð'TÐVlÐnoÔpØûð	üò Sùò%ð8
ùô$ ò 
Ø×7Ñ7ØØ/Ø/Øð	 8ó 
÷ 
ð 
ð 	
ûð
üsË   ‚.J1°I±AJ1Á4I ÂIÂ>I Ã IÃI ÃI
ÃI Ã-J1ÄI6Ä)J1ÅI;ÅI;Å#B4J1È$J È<J È=J É J1ÉI ÉI É
I É	I3ÉI.É.I3É3J1Ê J Ê	J.ÊJ)Ê#J&Ê$J)Ê)J.Ê.J1z/v1/search/toolsz/search/toolsc              ƒ   ó´  K  — ddl m} 	 g }|�…t        |d«      ry|j                  D ]j  }|j	                  d«      |j	                  di «      j	                  d«      dœ}d	|v r |d	   r|d	   j	                  d
«      }|r||d
<   |j                  |«       Œl d|dœS # t        $ r4}ddlm}	  |	j                  d|«       t        dt        |«      ¬«      ‚d}~ww xY 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   r0   r1   )r   r1   Úsearch_tool_infoÚdescriptionÚlist)Úobjectr8   r
   zError listing search tools: %siô  )Ústatus_codeÚdetail)r<   r   rC   r/   rE   ÚappendrA   Úlitellm._loggingr   Ú	exceptionr   Ústr)
r   r   r   r   Úsearch_tools_listrM   Ú	tool_inforT   r;   r   s
             rQ   Úlist_search_toolsr_   ñ   sò   è ø€ õV 6ð<Ø#%ÐàÐ!¤g¨j¸.Ô&IØ"×/Ñ/ò 4�à(,¯©Ð1CÓ(DØ'+§x¡xÐ0@À"Ó'E×'IÑ'IÐJ[Ó'\ñ�	ð &¨Ñ-°$Ð7IÒ2JØ"&Ð'9Ñ":×">Ñ">¸}Ó"M�KÙ"Ø3>˜	 -Ñ0à!×(Ñ(¨Õ3ð4ð !Ð*;Ñ<Ð<øÜò <Ý9à&Ð×&Ñ&Ð'GÈÔKÜ¨´C¸³FÔ;Ð;ûð	<üs)   ‚CŠBB ÂCÂ	CÂ!/CÃCÃC)Útypingr   r>   Úfastapir   r   r   r   r   Úfastapi.responsesr	   rZ   r   Úlitellm.proxy._typesÚ$litellm.proxy.auth.user_api_key_authr   r   Ú'litellm.proxy.common_request_processingr   r   Ú__annotations__Úpostr\   r   rE   r_   © ó    rQ   ú<module>rj      s¾  ðö ã ß HÕ HÝ ,å 1Ü "ß RÝ Qá“€ˆÓ ð ‡�Ø#ÙÐ+Ó,Ð-Ø!Ø
ˆð	 ó ð ‡�Ø ÙÐ+Ó,Ð-Ø!Ø
ˆð	 ó ð ‡�ØÙÐ+Ó,Ð-Ø!Ø
ˆð	 ó ð ‡�ØÙÐ+Ó,Ð-Ø!Ø
ˆð	 ó ñ )0Ð0AÓ(BØ#'ñ	E
ØðE
àðE
ð &ðE
ð ˜D‘jò	E
óóóóð0E
ðP ‡�ØÙÐ+Ó,Ð-Ø!Ø
ˆð	 ó ð ‡�ØÙÐ+Ó,Ð-Ø!Ø
ˆð	 ó ñ )0Ð0AÓ(Bñ8<Øð8<àð8<ð &ò8<óóñ8<ri   