Ë
    tPêjE\  ã            
       óä  — U d Z ddlmZmZ ddlmZ ddlmZmZmZ ddl	m
Z
mZmZ ddlmZ ddlmZ ddlmZ dd	lmZmZmZ dd
lmZ ddlmZ ddlmZmZmZ ddlm Z   e
«       Z!ee"d<    e«       Z#ee"d<   dee$z  dz  de$dz  fd„Z%ee$egee   f   Z&ee"d<   d4d„Z'de$dedefd„Z(dede$dz  fd„Z)e(fde*e   dede&de*e   fd„Z+e!jY                  ddg ee«      ge¬«       ee«      fdefd „«       Z- G d!„ d"e«      Z.e!j_                  d#dg ee«      g¬$«      d%e.fd&„«       Z0 G d'„ d(e«      Z1e!je                  d)dg ee«      g¬$«      d*e$d%e1fd+„«       Z3e!ji                  d)dg ee«      g¬$«      d*e$fd,„«       Z5e!jY                  d)dg ee«      g¬$«      d*e$fd-„«       Z6 G d.„ d/e«      Z7e!j_                  d0dg ee«      g¬$«      d%e7fd1„«       Z8e!jY                  d2dg ee«      g¬$«      d3„ «       Z9y)5z!
CRUD ENDPOINTS FOR SEARCH TOOLS
é    )Ú	AwaitableÚCallable)Údatetime)ÚAnyÚFinalÚ	TypeAlias)Ú	APIRouterÚDependsÚHTTPException)Ú	BaseModel)Úverbose_proxy_logger)ÚUI_SESSION_TOKEN_TEAM_ID)ÚLiteLLM_TeamTableÚLitellmUserRolesÚUserAPIKeyAuth)Úuser_api_key_auth)ÚSearchToolRegistry)ÚListSearchToolsResponseÚ
SearchToolÚSearchToolInfoResponse)ÚSearchProvidersÚrouterÚSEARCH_TOOL_REGISTRYÚvalueNÚreturnc                 óL   — | €yt        | t        «      r| j                  «       S | S )zÆ
    Convert datetime object to ISO format string.

    Args:
        value: datetime object, string, or None

    Returns:
        ISO format string or original value if already string or None
    N)Ú
isinstancer   Ú	isoformat)r   s    úz/home/oem/CyberBrain26-unified/.venv/lib/python3.12/site-packages/litellm/proxy/search_endpoints/search_tool_management.pyÚ_convert_datetime_to_strr    "   s(   € ð €}ØÜ�%œÔ"Ø�‰Ó Ð Ø€Ló    ÚTeamObjectLookupc               ƒ   ó¦   K  — ddl m}  	 | j                  «       ƒ d{  –—†  y7 Œ# t        $ r }t	        j
                  d|«       Y d}~yd}~ww xY w­w)zØPush the search tools table into this worker's router.

    Best-effort: the row is already committed, so a refresh failure must not surface as a 500 and
    push the caller into a retry that creates duplicates.
    r   )Úproxy_configNz>Search tool router refresh failed after a management write: %s)Úlitellm.proxy.proxy_serverr$   Úreload_search_tools_from_dbÚ	Exceptionr   Ú	exception)r$   Úes     r   Ú_refresh_router_search_toolsr*   6   sI   è ø€ õ 8ðlØ×6Ñ6Ó8×8Ò8ùÜò lÜ×&Ñ&Ð'gÐij×kÑkûðlüs6   ‚AŠ% �#ž% ¢A£% ¥	A®A	ÁAÁ	AÁAÚteam_idÚuser_api_key_dictc              ƒ   ól   K  — ddl m} ddlm}m}m}  || |||j                  |¬«      ƒ d {  –—† S 7 Œ­w)Nr   )Úget_team_object)Úprisma_clientÚproxy_logging_objÚuser_api_key_cache)r+   r/   r1   Úparent_otel_spanr0   )Úlitellm.proxy.auth.auth_checksr.   r%   r/   r0   r1   r2   )r+   r,   r.   r/   r0   r1   s         r   Ú_team_object_from_dbr4   D   sA   è ø€ Ý>÷ñ ñ !ØØ#Ø-Ø*×;Ñ;Ø+ô÷ ð ð ús   ‚+4­2®4c                 ó6   — | j                   }|r	|t        k(  ry|S )a  
    The team whose object_permission allowlist scopes this caller, or None when there is none.

    Every Admin UI session key is stamped with UI_SESSION_TOKEN_TEAM_ID, a reserved sentinel that
    never has a row in LiteLLM_TeamTable (`/team/new` rejects it as a real team id), so looking it
    up would raise 404 instead of resolving a team. It carries no allowlist of its own, so the
    caller is scoped by its key-level allowlist alone. Any other team id is looked up for real and
    a failed lookup still surfaces.
    N)r+   r   )r,   r+   s     r   Ú_allowlist_team_idr6   U   s"   € ð '×.Ñ.€GÙ�gÔ!9Ò9ØØ€Nr!   Úsearch_toolsÚlookup_team_objectc              ƒ   óB  K  — |j                   t        j                  t        j                  fv r| S ddlm} t        |«      }|r |||«      ƒ d{  –—† nd}g }| D ];  }|j                  d«      }|sŒ ||||¬«      ƒ d{  –—† sŒ+|j                  |«       Œ= |S 7 ŒJ7 Œ­w)zª
    Drop search tools the caller is not authorized to invoke, applying the same
    key/team object_permission allowlists enforced on /search. Admins see all tools.
    r   )Úcan_user_view_search_toolNÚsearch_tool_name)r;   Úvalid_tokenÚteam_object)	Ú	user_roler   ÚPROXY_ADMINÚPROXY_ADMIN_VIEW_ONLYr3   r:   r6   ÚgetÚappend)	r7   r,   r8   r:   Úallowlist_team_idr=   ÚvisibleÚtoolÚ	tool_names	            r   Ú_filter_visible_search_toolsrG   e   sÅ   è ø€ ð ×"Ñ"Ü×$Ñ$Ü×.Ñ.ð'ñ ð ÐåHä1Ð2CÓDÐáJ[Ñ Ð!2Ð4EÓF×FÐFÐaeð ð 46€GØò !ˆØ—H‘HÐ/Ó0ˆ	ÚÑ8Ø&Ø)Ø#ô 
÷ 
ñ 
ð
 �N‰N˜4Õ ð!ð €Nð 	Gøð
ús0   ‚ABÁBÁ BÁ2BÂ BÂBÂBÂBz/search_tools/listzSearch Tools)ÚtagsÚdependenciesÚresponse_modelc              ƒ   ó
  K  — ddl m} ddlm}m} |€t        dd¬«      ‚	 t        j                  |¬«      ƒ d{  –—† }|D �ch c]  }|j                  d	«      ’Œ }}g }g }	 |j                  «       ƒ d{  –—† }	|j                  |	«      }
|
r|
}|D ]{  }|j                  d	«      }|sŒt        |j                  di «      «      } ||dd¬«      }|j                  d«      }|j                  t!        d|||rt        |«      ndddd¬«      «       Œ} |D �cg c]  }|j                  d	«      |vsŒ|‘Œ }}|D ]§  }t        |j                  di «      «      } ||dd¬«      }|j                  t!        |j                  d«      |j                  d	d«      ||j                  d«      t#        |j                  d«      «      t#        |j                  d«      «      d¬«      «       Œ© t%        || «      ƒ d{  –—† }t'        |¬«      S 7 �ŒÄc c}w 7 �Œ‘# t        $ r!}t        j                  d
|«       Y d}~�ŒŸd}~ww xY wc c}w 7 ŒM# t
        $ r ‚ t        $ r1}t        j(                  d|«       t        dt+        |«      ¬«      ‚d}~ww xY w­w)aÊ  
    List all search tools that are available in the database and config file.

    Example Request:
    ```bash
    curl -X GET "http://localhost:4000/search_tools/list" -H "Authorization: Bearer <your_api_key>"
    ```

    Example Response:
    ```json
    {
        "search_tools": [
            {
                "search_tool_id": "123e4567-e89b-12d3-a456-426614174000",
                "search_tool_name": "litellm-search",
                "litellm_params": {
                    "search_provider": "perplexity",
                    "api_key": "sk-***",
                    "api_base": "https://api.perplexity.ai"
                },
                "search_tool_info": {
                    "description": "Perplexity search tool"
                },
                "created_at": "2023-11-09T12:34:56.789Z",
                "updated_at": "2023-11-09T12:34:56.789Z",
                "is_from_config": false
            },
            {
                "search_tool_name": "config-search-tool",
                "litellm_params": {
                    "search_provider": "tavily",
                    "api_key": "tvly-***"
                },
                "is_from_config": true
            }
        ]
    }
    ```
    r   ©Ú_get_masked_values)r/   r$   Néô  úPrisma client not initialized©Ústatus_codeÚdetail©r/   r;   z-Could not get config-defined search tools: %sÚlitellm_paramsé   ©Úunmasked_lengthÚnumber_of_asterisksÚsearch_tool_infoT©Úsearch_tool_idr;   rT   rY   Ú
created_atÚ
updated_atÚis_from_configr[   Ú r\   r]   F)r7   zError getting search tools: %s)Ú*litellm.litellm_core_utils.litellm_loggingrM   r%   r/   r$   r   r   Úget_all_search_tools_from_dbrA   Ú
get_configÚparse_search_toolsr'   r   ÚdebugÚdictrB   r   r    rG   r   r(   Ústr)r,   rM   r/   r$   Úsearch_tools_from_dbrE   Údb_tool_namesÚsearch_tool_configsÚconfig_search_toolsÚconfigÚparsed_toolsr)   Úconfig_search_toolrF   Úlitellm_params_dictÚmasked_litellm_params_dictÚconfig_tool_infoÚdb_search_toolÚvisible_search_toolss                      r   Úlist_search_toolsrs   ‡   s»  è ø€ õ` NßFàÐÜ¨Ð4SÔTÐTðG<Ü%9×%VÑ%VÐerÐ%VÓ%s×sÐàI]Ö^À §¡Ð);Õ <Ð^ˆÐ^à<>Ðà Ðð	[Ø".×"9Ñ"9Ó";×;ˆFØ".×"AÑ"AÀ&Ó"IˆLÙØ&2Ð#ð #6ò 	ÐØ*×.Ñ.Ð/AÓBˆIÚÜ&*Ð+=×+AÑ+AÐBRÐTVÓ+WÓ&XÐ#Ù-?Ø'Ø$%Ø()ô.Ð*ð
 $6×#9Ñ#9Ð:LÓ#MÐ à#×*Ñ*Ü*Ø'+Ø)2Ø'AÙDT¬$Ð/?Ô*@ÐZ^Ø#'Ø#'Ø'+ôõ
ð	ð0 1ö
Ø°D·H±HÐ=OÓ4PÐXeÒ4eŠDð
Ðð 
ð 3ò 	ˆNÜ"& ~×'9Ñ'9Ð:JÈBÓ'OÓ"PÐÙ);Ø#Ø !Ø$%ô*Ð&ð  ×&Ñ&Ü&Ø#1×#5Ñ#5Ð6FÓ#GØ%3×%7Ñ%7Ð8JÈBÓ%OØ#=Ø%3×%7Ñ%7Ð8JÓ%KÜ7¸×8JÑ8JÈ<Ó8XÓYÜ7¸×8JÑ8JÈ<Ó8XÓYØ#(ôõ
ð	ô( -IÐI\Ð^oÓ,p×&pÐä&Ð4HÔIÐIðC  tûâ^ð <úô ò 	[Ü ×&Ñ&Ð'VÐXY×ZÒZûð	[üò4
ð0 'qùô ò ØÜò <Ü×&Ñ&Ð'GÈÔKÜ¨´C¸³FÔ;Ð;ûð<üs¬   ‚J¡H= ºG>»H= ÁHÁH= Á"H	 Á5HÁ6H	 ÂH= Â(A+H= ÄH6Ä,H6Ä0B=H= Ç-H;Ç.H= Ç=JÇ>H= ÈH= ÈH	 È		H3ÈH.È(H= È.H3È3	H= È=J É,I;É;J Ê Jc                   ó   — e Zd ZU eed<   y)ÚCreateSearchToolRequestÚsearch_toolN©Ú__name__Ú
__module__Ú__qualname__r   Ú__annotations__© r!   r   ru   ru     ó   … ØÔr!   ru   z/search_tools)rH   rI   Úrequestc              ƒ   ó|  K  — ddl m} |€t        dd¬«      ‚	 t        j	                  | j
                  |¬«      ƒ d{  –—† }t        «       ƒ d{  –—†  t        j                  d|j                  d	«      «       |S 7 Œ=7 Œ-# t        $ r1}t        j                  d
|«       t        dt        |«      ¬«      ‚d}~ww xY w­w)aD  
    Create a new search tool.

    Example Request:
    ```bash
    curl -X POST "http://localhost:4000/search_tools" \
        -H "Authorization: Bearer <your_api_key>" \
        -H "Content-Type: application/json" \
        -d '{
            "search_tool": {
                "search_tool_name": "litellm-search",
                "litellm_params": {
                    "search_provider": "perplexity",
                    "api_key": "sk-..."
                },
                "search_tool_info": {
                    "description": "Perplexity search tool"
                }
            }
        }'
    ```

    Example Response:
    ```json
    {
        "search_tool_id": "123e4567-e89b-12d3-a456-426614174000",
        "search_tool_name": "litellm-search",
        "litellm_params": {
            "search_provider": "perplexity",
            "api_key": "sk-..."
        },
        "search_tool_info": {
            "description": "Perplexity search tool"
        },
        "created_at": "2023-11-09T12:34:56.789Z",
        "updated_at": "2023-11-09T12:34:56.789Z"
    }
    ```
    r   rS   NrN   rO   rP   )rv   r/   z0Successfully added search tool '%s' to database.r;   z"Error adding search tool to db: %s)r%   r/   r   r   Úadd_search_tool_to_dbrv   r*   r   rd   rA   r'   r(   rf   )r~   r/   Úresultr)   s       r   Úcreate_search_toolr‚     s¼   è ø€ õZ 9àÐÜ¨Ð4SÔTÐTð<Ü2×HÑHØ×+Ñ+¸=ð Ió 
÷ 
ˆô +Ó,×,Ð,ä×"Ñ"Ø>Ø�J‰JÐ)Ó*ô	
ð
 ˆð
øð 	-ùô ò <Ü×&Ñ&Ð'KÈQÔOÜ¨´C¸³FÔ;Ð;ûð<üsJ   ‚B<™$A? ½A;¾A? ÁA=Á*A? Á:B<Á;A? Á=A? Á?	B9Â,B4Â4B9Â9B<c                   ó   — e Zd ZU eed<   y)ÚUpdateSearchToolRequestrv   Nrw   r|   r!   r   r„   r„   O  r}   r!   r„   z/search_tools/{search_tool_id}r[   c              ƒ   ó  K  — ddl m} |€t        dd¬«      ‚	 t        j	                  | |¬«      ƒ d{  –—† }|€t        dd	| › d
�¬«      ‚t        j                  | |j                  |¬«      ƒ d{  –—† }t        «       ƒ d{  –—†  t        j                  d|j                  d«      «       |S 7 Œz7 Œ?7 Œ/# t        $ r}|‚d}~wt        $ r1}t        j                  d|«       t        dt        |«      ¬«      ‚d}~ww xY w­w)ap  
    Update an existing search tool.

    Example Request:
    ```bash
    curl -X PUT "http://localhost:4000/search_tools/123e4567-e89b-12d3-a456-426614174000" \
        -H "Authorization: Bearer <your_api_key>" \
        -H "Content-Type: application/json" \
        -d '{
            "search_tool": {
                "search_tool_name": "updated-search",
                "litellm_params": {
                    "search_provider": "perplexity",
                    "api_key": "sk-new-key"
                },
                "search_tool_info": {
                    "description": "Updated search tool"
                }
            }
        }'
    ```

    Example Response:
    ```json
    {
        "search_tool_id": "123e4567-e89b-12d3-a456-426614174000",
        "search_tool_name": "updated-search",
        "litellm_params": {
            "search_provider": "perplexity",
            "api_key": "sk-new-key"
        },
        "search_tool_info": {
            "description": "Updated search tool"
        },
        "created_at": "2023-11-09T12:34:56.789Z",
        "updated_at": "2023-11-09T13:45:12.345Z"
    }
    ```
    r   rS   NrN   rO   rP   ©r[   r/   é”  úSearch tool with ID ú
 not found)r[   rv   r/   z2Successfully updated search tool '%s' in database.r;   zError updating search tool: %s)r%   r/   r   r   Úget_search_tool_by_id_from_dbÚupdate_search_tool_in_dbrv   r*   r   rd   rA   r'   r(   rf   )r[   r~   r/   Úexisting_toolr�   r)   s         r   Úupdate_search_toolr�   S  s  è ø€ õZ 9àÐÜ¨Ð4SÔTÐTð<ä%9×%WÑ%WØ)¸ð &Xó &
÷  
ˆð Ð ÜØØ-¨nÐ-=¸ZÐHôð ô
 3×KÑKØ)Ø×+Ñ+Ø'ð Ló 
÷ 
ˆô +Ó,×,Ð,ä×"Ñ"Ø@Ø�J‰JÐ)Ó*ô	
ð
 ˆð/ 
øð
øð 	-ùô ò ØˆûÜò <Ü×&Ñ&Ð'GÈÔKÜ¨´C¸³FÔ;Ð;ûð<üsh   ‚C?™B4 ³B.´<B4 Á0B0Á1B4 ÂB2Â*B4 Â-C?Â.B4 Â0B4 Â2B4 Â4	C<Â=B?Â?C<Ã,C7Ã7C<Ã<C?c              ƒ   óÌ  K  — ddl m} |€t        dd¬«      ‚	 t        j	                  | |¬«      ƒ d{  –—† }|€t        dd	| › d
�¬«      ‚t        j                  | |¬«      ƒ d{  –—† }t        «       ƒ d{  –—†  t        j                  d«       |S 7 Œ_7 Œ/7 Œ# t        $ r}|‚d}~wt        $ r1}t        j                  d|«       t        dt        |«      ¬«      ‚d}~ww xY w­w)aš  
    Delete a search tool.

    Example Request:
    ```bash
    curl -X DELETE "http://localhost:4000/search_tools/123e4567-e89b-12d3-a456-426614174000" \
        -H "Authorization: Bearer <your_api_key>"
    ```

    Example Response:
    ```json
    {
        "message": "Search tool 123e4567-e89b-12d3-a456-426614174000 deleted successfully",
        "search_tool_name": "litellm-search"
    }
    ```
    r   rS   NrN   rO   rP   r†   r‡   rˆ   r‰   z/Successfully deleted search tool from database.zError deleting search tool: %s)r%   r/   r   r   rŠ   Údelete_search_tool_from_dbr*   r   rd   r'   r(   rf   )r[   r/   rŒ   r�   r)   s        r   Údelete_search_toolr�   ¦  sÿ   è ø€ õ. 9àÐÜ¨Ð4SÔTÐTð<ä%9×%WÑ%WØ)¸ð &Xó &
÷  
ˆð Ð ÜØØ-¨nÐ-=¸ZÐHôð ô
 3×MÑMØ)¸ð Nó 
÷ 
ˆô +Ó,×,Ð,ä×"Ñ"Ð#TÔUàˆð% 
øð
øð 	-ùô
 ò ØˆûÜò <Ü×&Ñ&Ð'GÈÔKÜ¨´C¸³FÔ;Ð;ûð<üsh   ‚C$™B ³B´1B Á%BÁ&B Á7BÁ8B ÂC$ÂB ÂB ÂB Â	C!Â"B$Â$C!Â0,CÃC!Ã!C$c              ƒ   ól  K  — ddl m} ddlm} |€t	        dd¬«      ‚	 t
        j                  | |¬«      ƒ d{  –—† }|€t	        d	d
| › d�¬«      ‚t        |j                  di «      «      } ||dd¬«      }t        |j                  d«      |j                  dd«      ||j                  d«      t        |j                  d«      «      t        |j                  d«      «      d¬«      S 7 Œ­# t        $ r}|‚d}~wt        $ r1}t        j                  d|«       t	        dt        |«      ¬«      ‚d}~ww xY w­w)aÙ  
    Get detailed information about a specific search tool by ID.

    Example Request:
    ```bash
    curl -X GET "http://localhost:4000/search_tools/123e4567-e89b-12d3-a456-426614174000" \
        -H "Authorization: Bearer <your_api_key>"
    ```

    Example Response:
    ```json
    {
        "search_tool_id": "123e4567-e89b-12d3-a456-426614174000",
        "search_tool_name": "litellm-search",
        "litellm_params": {
            "search_provider": "perplexity",
            "api_key": "sk-***"
        },
        "search_tool_info": {
            "description": "Perplexity search tool"
        },
        "created_at": "2023-11-09T12:34:56.789Z",
        "updated_at": "2023-11-09T12:34:56.789Z"
    }
    ```
    r   rL   rS   NrN   rO   rP   r†   r‡   rˆ   r‰   rT   rU   rV   r[   r;   r_   rY   r\   r]   FrZ   z"Error getting search tool info: %s)r`   rM   r%   r/   r   r   rŠ   re   rA   r   r    r'   r   r(   rf   )r[   rM   r/   r�   rn   ro   r)   s          r   Úget_search_tool_infor’   Þ  s@  è ø€ õ@ NÝ8àÐÜ¨Ð4SÔTÐTð <Ü2×PÑPØ)¸ð Qó 
÷ 
ˆð ˆ>ÜØØ-¨nÐ-=¸ZÐHôð ô &*¨&¯*©*Ð5EÀrÓ*JÓ%KÐÙ,>ØØØ !ô-
Ð"ô &Ø!Ÿ:™:Ð&6Ó7Ø#ŸZ™ZÐ(:¸BÓ?Ø5Ø#ŸZ™ZÐ(:Ó;Ü/°·
±
¸<Ó0HÓIÜ/°·
±
¸<Ó0HÓIØ ô
ð 	
ð%
ùô6 ò ØˆûÜò <Ü×&Ñ&Ð'KÈQÔOÜ¨´C¸³FÔ;Ð;ûð<üsE   ‚D4ŸC) ¹C'ºB,C) Ã&D4Ã'C) Ã)	D1Ã2C4Ã4D1Ä ,D,Ä,D1Ä1D4c                   ó"   — e Zd ZU eeef   ed<   y)ÚTestSearchToolConnectionRequestrT   N)rx   ry   rz   re   rf   r   r{   r|   r!   r   r”   r”   '  s   … Ø˜˜c˜‘NÔ"r!   r”   z/search_tools/test_connectionc              ƒ   óD  K  — 	 ddl m} | j                  }|j                  d«      }|j                  d«      }|j                  d«      }|st	        dd¬«      ‚t        j                  d	|«       d
} |||||dd¬«      ƒ d{  –—† }t        j                  d|«       dd|› d�||r#|j                  rt        |j                  «      dœS ddœS 7 ŒJ# t        $ rF}t        |«      }	t        |«      j                  }
t        j                  d|	«       d|	|
dœcY d}~S d}~ww xY w­w)aÀ  
    Test connection to a search provider with the given configuration.
    
    Makes a simple test search query to verify the API key and configuration are valid.

    Example Request:
    ```bash
    curl -X POST "http://localhost:4000/search_tools/test_connection" \
        -H "Authorization: Bearer <your_api_key>" \
        -H "Content-Type: application/json" \
        -d '{
            "litellm_params": {
                "search_provider": "perplexity",
                "api_key": "sk-..."
            }
        }'
    ```

    Example Response (Success):
    ```json
    {
        "status": "success",
        "message": "Successfully connected to perplexity search provider",
        "test_query": "test",
        "results_count": 5
    }
    ```

    Example Response (Failure):
    ```json
    {
        "status": "error",
        "message": "Authentication failed: Invalid API key",
        "error_type": "AuthenticationError"
    }
    ```
    r   )ÚasearchÚsearch_providerÚapi_keyÚapi_basei�  z-search_provider is required in litellm_paramsrP   z)Testing connection to search provider: %sÚtesté   g      $@)Úqueryr—   r˜   r™   Úmax_resultsÚtimeoutNz4Successfully tested connection to %s search providerÚsuccesszSuccessfully connected to z search provider)ÚstatusÚmessageÚ
test_queryÚresults_countz(Failed to connect to search provider: %sÚerror)r    r¡   Ú
error_type)Úlitellm.searchr–   rT   rA   r   r   rd   ÚresultsÚlenr'   rf   Útyperx   r(   )r~   r–   rT   r—   r˜   r™   r¢   Úresponser)   Úerror_messager¥   s              r   Útest_search_tool_connectionr¬   +  sJ  è ø€ ðV-
Ý*ð !(× 6Ñ 6ˆØ!/×!3Ñ!3Ð4EÓ!FˆØ'×+Ñ+¨IÓ6ˆØ(×,Ñ,¨ZÓ8ˆáÜ¨CÐ8gÔhÐhä×"Ñ"Ð#NÐP_Ô`ð #ˆ
Ù 'ØØ+ØØØØô!
÷ 
ˆô 	×"Ñ"Ð#YÐ[jÔkð  Ø3°OÐ3DÐDTÐUØ$Ù7?ÀH×DTÒDTœc (×"2Ñ"2Ó3ñ	
ð 	
ð [\ñ	
ð 	
ð
ùô$ ò 
Ü" 1›vˆÜ  ›G×,Ñ,ˆ
ä×&Ñ&Ð'QÐS`Ôað Ø$Ø$ñ
õ 	
ûð
üsT   ‚D „A=C ÂCÂAC ÃD ÃC ÃD ÃC Ã	DÃ;DÄDÄD ÄDÄD z$/search_tools/ui/available_providersc               ƒ   ó¨  K  — 	 ddl m}  g }t        D ]E  }	 | j                  |¬«      }|�.|j	                  «       }|j                  |j                  |dœ«       ŒG d|iS # t        $ r+}t        j                  d|j                  |«       Y d}~Œ{d}~ww xY w# t        $ r1}t        j                  d|«       t        d	t        |«      ¬
«      ‚d}~ww xY w­w)aª  
    Get the list of available search providers with their configuration fields.
    
    Auto-discovers search providers and their UI-friendly names from transformation configs.

    Example Request:
    ```bash
    curl -X GET "http://localhost:4000/search_tools/ui/available_providers" \
        -H "Authorization: Bearer <your_api_key>"
    ```

    Example Response:
    ```json
    {
        "providers": [
            {
                "provider_name": "perplexity",
                "ui_friendly_name": "Perplexity"
            },
            {
                "provider_name": "tavily",
                "ui_friendly_name": "Tavily"
            }
        ]
    }
    ```
    r   )ÚProviderConfigManager)ÚproviderN)Úprovider_nameÚui_friendly_namez/Could not get config for search provider %s: %sÚ	providersz,Error getting available search providers: %srN   rP   )Úlitellm.utilsr®   r   Úget_provider_search_configr±   rB   r   r'   r   rd   r(   r   rf   )r®   Úavailable_providersr¯   rk   Úui_namer)   s         r   Úget_available_search_providersr·   †  sâ   è ø€ ðB<Ý7à%'Ðô (ò 	ˆHðà.×IÑIÐS[ÐIÓ\�àÐ%à$×5Ñ5Ó7�Gà'×.Ñ.à-5¯^©^Ø07ñôøð	ð& Ð0Ð1Ð1øô	 ò Ü$×*Ñ*Ð+\Ð^f×^lÑ^lÐnoÔpÜûðûô
 ò <Ü×&Ñ&Ð'UÐWXÔYÜ¨´C¸³FÔ;Ð;ûð<üsR   ‚C„B –AAÁB ÁCÁ	BÁ'!BÂB ÂBÂB Â	CÂ,C
Ã
CÃC)r   N):Ú__doc__Úcollections.abcr   r   r   Útypingr   r   r   Úfastapir	   r
   r   Úpydanticr   Úlitellm._loggingr   Úlitellm.constantsr   Úlitellm.proxy._typesr   r   r   Ú$litellm.proxy.auth.user_api_key_authr   Ú3litellm.proxy.search_endpoints.search_tool_registryr   Úlitellm.types.searchr   r   r   Úlitellm.types.utilsr   r   r{   r   rf   r    r"   r*   r4   r6   ÚlistrG   rA   rs   ru   Úpostr‚   r„   Úputr�   Údeleter�   r’   r”   r¬   r·   r|   r!   r   ú<module>rÈ      s  ðò÷ 0Ý ß (Ñ (ç 5Ñ 5Ý å 1Ý 6÷ñ õ
 CÝ R÷ñ õ
 0ñ “€ˆÓ Ù0Ó2Ð �eÓ 2ð H¨s¡N°TÑ$9ð ¸cÀD¹jó ð" '¨¨^Ð'<¸iÐHYÑ>ZÐ'ZÑ[Ð �)Ó [ólð¨ð Àð ÐSdó ð"¨.ð ¸SÀ4¹Zó ð& ,@ñØÐ-Ñ.ðà%ðð )ðð 
Ð
 Ñ!ó	ðD ‡�ØØ
Ð	ÙÐ+Ó,Ð-Ø*ð	 ó ñ )0Ð0AÓ(Bñw<Ø%òw<óðw<ôt˜iô ð ‡�ØØ
Ð	ÙÐ+Ó,Ð-ð ó ð
<<Ð&=ò <<óð
<<ô~˜iô ð ‡�Ø$Ø
Ð	ÙÐ+Ó,Ð-ð ó ð
K<¨Sð K<Ð;Rò K<óð
K<ð\ ‡�Ø$Ø
Ð	ÙÐ+Ó,Ð-ð ó ð
0<¨Sò 0<óð
0<ðf ‡�Ø$Ø
Ð	ÙÐ+Ó,Ð-ð ó ð
A<¨sò A<óð
A<ôH# iô #ð ‡�Ø#Ø
Ð	ÙÐ+Ó,Ð-ð ó ð
S
Ð/Nò S
óð
S
ðl ‡�Ø*Ø
Ð	ÙÐ+Ó,Ð-ð ó ñ
8<óñ
8<r!   