o
    ưiZ5                  
   @   s  d dl mZmZmZmZmZ d dl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 d dlmZ d d	lmZmZ G d
d deZe
 Zdd Zd&defddZdee dee defddZd&dedee defddZdedee dededef
ddZdedee dededef
ddZ dedee dededef
d d!Z!dedee dededef
d"d#Z"G d$d% d%Z#dS )'    )DictListOptionalUnioncastN)verbose_logger)InMemoryCache)factory)BaseLLMExceptionget_secret_str)AllMessageValues)WatsonXAPIParamsWatsonXCredentialsc                
       s<   e Zd Z	ddededeeeej	f  f fddZ
  ZS )WatsonXAIErrorNstatus_codemessageheadersc                    s   t  j|||d d S N)r   r   r   )super__init__)selfr   r   r   	__class__ X/home/app/Keep/.python/lib/python3.10/site-packages/litellm/llms/watsonx/common_utils.pyr      s   zWatsonXAIError.__init__N)__name__
__module____qualname__intstrr   r   r   httpxHeadersr   __classcell__r   r   r   r   r      s    r   c                   C   s   t dpdS )NZWATSONX_IAM_URLz(https://iam.cloud.ibm.com/identity/tokenr   r   r   r   r   get_watsonx_iam_url   s   
r%   returnc                 K   s   t | }|d u r`i }d|d< | d u r#tdp"tdp"tdp"td} | d u r+tdd|d	< d
| d}t }td||| tjj	|||d}|
  | }|d }t j| ||d d d tt|S )Nz!application/x-www-form-urlencodedContent-Type
WX_API_KEYWATSONX_API_KEYWATSONX_APIKEYWATSONX_ZENAPIKEYzAPI key is requiredapplication/jsonAcceptz&urn:ibm:params:oauth:grant-type:apikey)Z
grant_typeapikeyzNcalling ibm `/identity/token` to retrieve IAM token.
URL=%s
headers=%s
data=%s)urldatar   Zaccess_tokenZ
expires_in
   )keyvaluettl)iam_token_cacheZ	get_cacher   
ValueErrorr%   r   debuglitellmZmodule_level_clientpostraise_for_statusjsonZ	set_cacher   r!   )api_keyparamsresultr   r0   Ziam_token_urlresponseZ	json_datar   r   r   generate_iam_token"   sJ   


r@   r<   tokenc                 C   s   |d ur|S t | }|S r   )r@   r<   rA   r   r   r   _generate_watsonx_tokenM   s   rC   r=   modelc                 C   s   |  d|  dd}|  dd}|  d|  dd}|du r(|  d|  dd}|du r8td	p7td
p7td}|du rHtdpGtdpGtd}|du r\tdp[tdp[tdp[td}|du rs|du rs|durs|dsstdddt|||dS )zw
    Find watsonx.ai credentials in the params or environment variables and return the headers for authentication.
    
project_idZwatsonx_projectNspace_idregion_nameregionZwatsonx_region_nameZwatsonx_regionZWATSONX_PROJECT_IDZWX_PROJECT_IDZ
PROJECT_IDZWATSONX_REGIONZ	WX_REGIONZREGIONZWATSONX_DEPLOYMENT_SPACE_IDZWATSONX_SPACE_IDZWX_SPACE_IDZSPACE_IDdeployment/  zError: Watsonx project_id and space_id not set. Set WX_PROJECT_ID or WX_SPACE_ID in environment variables or pass in as a parameter.r   r   )rE   rF   rG   )popr   
startswithr   r   )r=   rD   rE   rF   rG   r   r   r   _get_api_paramsT   sV   rN   messagesprovidercustom_prompt_dictc              
      s   ddl m} | |v r1||  }tj||d|d|dd|dd|dd|d	dd
S ||jjkr=tj|dS || |dI dH }|rJ|S tj| |ddS )z:Async core logic for converting watsonx messages to promptr   WatsonXModelPattern	role_dictrolesinitial_prompt_value final_prompt_value	bos_token	eos_tokenrO   rT   rV   rX   rY   rZ   rO   rD   rO   NwatsonxrD   rO   Zcustom_llm_provider	litellm.types.llms.watsonxrS   ptfZcustom_promptgetZIBM_MISTRALAIr3   Zmistral_instruct_ptZprompt_factoryrD   rO   rP   rQ   apply_template_fnrS   Zmodel_prompt_dictr>   r   r   r   _aconvert_watsonx_messages_core   s,   





rf   c              
   C   s   ddl m} | |v r0||  }tj||d|d|dd|dd|dd|d	dd
S ||jjkr<tj|dS || |d}|rF|S tj| |ddS )z9Sync core logic for converting watsonx messages to promptr   rR   rT   rU   rV   rW   rX   rY   rZ   r[   r\   r]   r^   r_   r`   rd   r   r   r   _convert_watsonx_messages_core   s*   





rg   c                    s(   ddl m} t| ||||jdI dH S )z3Async version of convert_watsonx_messages_to_promptr   IBMWatsonXChatConfigrD   rO   rP   rQ   re   N)(litellm.llms.watsonx.chat.transformationri   rf   Zaapply_prompt_templaterD   rO   rP   rQ   ri   r   r   r   #aconvert_watsonx_messages_to_prompt   s   rm   c                 C   s    ddl m} t| ||||jdS )z2Sync version of convert_watsonx_messages_to_promptr   rh   rj   )rk   ri   rg   Zapply_prompt_templaterl   r   r   r   "convert_watsonx_messages_to_prompt   s   rn   c                   @   s   e Zd Z		ddededee dededee dee d	efd
dZ	dee d	efddZ
dedee d	efddZdededeeejf d	efddZededee dee d	efddZdeded	efddZdS )IBMWatsonXMixinNr   rD   rO   optional_paramslitellm_paramsr<   api_baser&   c                 C   s   ddd}d|v ri ||S t tt |dptd}	t tt |dd p*td}
|	r6d|	 |d< n|
r@d	|
 |d< nt||	d
}	d|	 |d< i ||S )Nr,   )r'   r-   AuthorizationrA   ZWATSONX_TOKENzen_api_keyr+   zBearer z
ZenApiKey rB   )r   r   r!   rc   r   rL   rC   )r   r   rD   rO   rp   rq   r<   rr   default_headersrA   rt   r   r   r   validate_environment   s*   z$IBMWatsonXMixin.validate_environmentc                 C   s<   |pt dpt dpt dpt d}|d u rtddd|S )NWATSONX_API_BASEWATSONX_URLWX_URLWML_URLrJ   zpError: Watsonx URL not set. Set WATSONX_API_BASE in environment variables or pass in as parameter - 'api_base='.rK   )r   r   )r   rr   r/   r   r   r   _get_base_url  s   zIBMWatsonXMixin._get_base_urlr/   api_versionc                 C   s   |pt j}|d|  }|S )Nz	?version=)r8   ZWATSONX_DEFAULT_API_VERSION)r   r/   r|   r   r   r   _add_api_version_to_url,  s   
z'IBMWatsonXMixin._add_api_version_to_urlerror_messager   c                 C   s   t |||dS r   )r   )r   r~   r   r   r   r   r   get_error_class2  s   zIBMWatsonXMixin.get_error_classc              
   C   s  |p|  dd ptdptdptdptd}|p7|  d|  d|  dd p7td	p7td
p7tdp7td}|  d|  dd }d }|d urb|d|}|d|d|}|d|dd }|d u skt|tsqtddd|d u szt|tstdddt||ttt |dS )Nr.   r*   r)   r(   r+   r/   rr   base_urlrw   rx   ry   rz   wx_credentialsZwatsonx_credentialsr<   rA   Zwatsonx_tokenrJ   zrError: Watsonx API key not set. Set WATSONX_API_KEY in environment variables or pass in as parameter - 'api_key='.rK   zuError: Watsonx API base not set. Set WATSONX_API_BASE in environment variables or pass in as parameter - 'api_base='.)r<   rr   rA   )	rL   r   rc   
isinstancer!   r   r   r   r   )rp   r<   rr   r   rA   r   r   r   get_watsonx_credentials9  sp   

z'IBMWatsonXMixin.get_watsonx_credentials
api_paramsc                 C   sF   i }| dr	i S ||d< |d d ur|d |d< |S |d |d< |S )NrI   Zmodel_idrE   rF   )rM   )r   rD   r   payloadr   r   r   _prepare_payloadt  s   
z IBMWatsonXMixin._prepare_payload)NN)r   r   r   r   r!   r   r   dictr   rv   r{   r}   r    r   r"   r#   r
   r   staticmethodr   r   r   r   r   r   r   r   ro      sT    	
$
:ro   r   )$typingr   r   r   r   r   r"   r8   r   Zlitellm.cachingr   Z+litellm.litellm_core_utils.prompt_templatesr	   rb   Z)litellm.llms.base_llm.chat.transformationr
   Zlitellm.secret_managers.mainr   Zlitellm.types.llms.openair   ra   r   r   r   r5   r%   r!   r@   rC   r   rN   rf   rg   rm   rn   ro   r   r   r   r   <module>   sz    
+6
$
$

