o
    ưi                     @   s   d Z ddl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 ddl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 G dd deeZdS )z
Transformation logic for IBM watsonx.ai's /ml/v1/text/rerank endpoint.

Docs - https://cloud.ibm.com/apidocs/watsonx-ai#text-rerank
    N)AnyDictListOptionalUnioncast)LiteLLMLoggingObj)BaseRerankConfig)get_secret_str)WatsonXAIEndpoint)RerankResponseRerankResponseMetaRerankTokens   )IBMWatsonXMixin_generate_watsonx_token_get_api_paramsc                   @   sH  e Zd ZdZ	d&dee dedee defddZdedefd	d
Z			d'dededee dee de
f
ddZ						d(dee dedededeeee
eef f  dee dee deee  dee dee dee de
fddZdede
dedefddZdi i i fdedejd ed!edee d"eded#edefd$d%ZdS ))IBMWatsonXRerankConfigz1
    IBM watsonx.ai Rerank API configuration
    Napi_basemodeloptional_paramsreturnc           	      C   sD   | j |d}tjj}|d| }|pi }| j||dd d}|S )N)r   /api_version)urlr   )Z_get_base_urlr   ZRERANKvaluerstripZ_add_api_version_to_urlget)	selfr   r   r   base_urlZendpointr   paramsZcomplete_url r!   a/home/app/Keep/.python/lib/python3.10/site-packages/litellm/llms/watsonx/rerank/transformation.pyget_complete_url    s   z'IBMWatsonXRerankConfig.get_complete_urlc                 C   s   g dS )N)query	documentstop_nreturn_documentsmax_tokens_per_docr!   )r   r   r!   r!   r"   "get_supported_cohere_rerank_params0   s   z9IBMWatsonXRerankConfig.get_supported_cohere_rerank_paramsheadersapi_keyc                 C   s   |pi }ddd}d|v ri ||S t tt |dd p td}t tt |dd p/td}|r;d| |d< n|rEd	| |d< nt||d
}d| |d< i ||S )Nzapplication/json)zContent-TypeAcceptAuthorizationtokenZWATSONX_TOKENzen_api_keyZWATSONX_ZENAPIKEYzBearer z
ZenApiKey )r+   r.   )r   r   strpopr
   r   )r   r*   r   r+   r   default_headersr.   r/   r!   r!   r"   validate_environment9   s*   z+IBMWatsonXRerankConfig.validate_environmentTnon_default_paramsdrop_paramsr$   r%   custom_llm_providerr&   rank_fieldsr'   max_chunks_per_docr(   c                 C   s  i }|dur|  D ]|\}}|dkr|dur||d< q
|dkr-|dur-dd |D |d< q
|dkrB|durB||di d	i d< q
|d
kr\|dur\t|tr\||di d	i d< q
|dkrm|durm||di d< q
|dkrz|durz||d< q
|dkr|dur||d< q
t|S )zJ
        Map Cohere rerank params to IBM watsonx.ai rerank params
        Nr$   r%   c                 S   s"   g | ]}t |trd |in|qS )text)
isinstancer0   ).0elr!   r!   r"   
<listcomp>r   s    zCIBMWatsonXRerankConfig.map_cohere_rerank_params.<locals>.<listcomp>Zinputsr&   
parametersZreturn_optionsr'   r(   Ztruncate_input_tokensZ
project_idZspace_id)items
setdefaultr:   booldict)r   r4   r   r5   r$   r%   r6   r&   r7   r'   r8   r(   optional_rerank_paramskvr!   r!   r"   map_cohere_rerank_params[   s*   

z/IBMWatsonXRerankConfig.map_cohere_rerank_paramsrC   c                 C   s"   t ||d}| j||d}||B S )zC
        Transform request to IBM watsonx.ai rerank format
        )r    r   )r   Z
api_params)r   Z_prepare_payload)r   r   rC   r*   Zwatsonx_api_paramsZwatsonx_auth_payloadr!   r!   r"   transform_rerank_request   s   	z/IBMWatsonXRerankConfig.transform_rerank_requestraw_responsemodel_responselogging_objrequest_datalitellm_paramsc	              
   C   s  z|  }	W n ty! }
 z| jdt|
 |j|jdd}
~
ww |	d}|du r2td|	 g }|D ]*}|d |d d}d	|v r[t|d	 trUd
|d	 i|d< n|d	 |d< |	| q6|	dpp|	dpptt
 }t|	ddd}t|d}t|||dS )z[
        Transform IBM watsonx.ai rerank response to LiteLLM RerankResponse format
        zFailed to parse response: )error_messagestatus_coder*   Nresultsz!No results found in the response=indexZscore)rP   Zrelevance_scoreinputr9   ZdocumentidZmodel_idZinput_token_countr   )Zinput_tokens)tokens)rR   rO   meta)json	ExceptionZget_error_classr0   rN   r*   r   
ValueErrorr:   appenduuiduuid4r   r   r   )r   r   rH   rI   rJ   r+   rK   r   rL   Zraw_response_jsoneZ_resultsZtransformed_resultsresultZtransformed_resultZresponse_id_tokensZrerank_metar!   r!   r"   transform_rerank_response   sB   
 

z0IBMWatsonXRerankConfig.transform_rerank_response)N)NN)NNNTNN)__name__
__module____qualname____doc__r   r0   rB   r#   listr)   r   r3   rA   r   r   r   intrF   rG   httpxResponser   r   r^   r!   r!   r!   r"   r      s    

)
	

)
	
r   )rb   rY   typingr   r   r   r   r   r   re   Z)litellm.llms.base_llm.chat.transformationr   Z+litellm.llms.base_llm.rerank.transformationr	   Zlitellm.secret_managers.mainr
   Zlitellm.types.llms.watsonxr   Zlitellm.types.rerankr   r   r   Zcommon_utilsr   r   r   r   r!   r!   r!   r"   <module>   s     