
    iZ5              
          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e      Z e
       Zd ZddefdZdee   dee   defdZddedee   defdZdedee   dededef
dZdedee   dededef
dZ dedee   dededef
dZ!dedee   dededef
dZ" G d d      Z#y)    )DictListOptionalUnioncastN)verbose_logger)InMemoryCache)factory)BaseLLMExceptionget_secret_str)AllMessageValues)WatsonXAPIParamsWatsonXCredentialsc            
       T     e Zd Z	 ddededeeeej                  f      f fdZ
 xZS )WatsonXAIErrorstatus_codemessageheadersc                 *    t         |   |||       y N)r   r   r   )super__init__)selfr   r   r   	__class__s       r/Users/manta/Documents/Projects/TheRoad-I1/.venv/lib/python3.12/site-packages/litellm/llms/watsonx/common_utils.pyr   zWatsonXAIError.__init__   s     	['7S    N)__name__
__module____qualname__intstrr   r   r   httpxHeadersr   __classcell__)r   s   @r   r   r      sF    
 9=	TT T %emm 345	T Tr   r   c                       t        d      xs dS )NWATSONX_IAM_URLz(https://iam.cloud.ibm.com/identity/tokenr    r   r   get_watsonx_iam_urlr*      s    ()W-Wr   returnc                    t         j                  |       }|i }d|d<   | 2t        d      xs% t        d      xs t        d      xs t        d      } | t        d      d|d	<   d
| d}t	               }t        j                  d|||       t        j                  j                  |||      }|j                          |j                         }|d   }t         j                  | ||d   dz
         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)
grant_typeapikeyzNcalling ibm `/identity/token` to retrieve IAM token.
URL=%s
headers=%s
data=%s)urldatar   access_token
expires_in
   )keyvaluettl)iam_token_cache	get_cacher   
ValueErrorr*   r   debuglitellmmodule_level_clientpostraise_for_statusjson	set_cacher   r#   )api_keyparamsresultr   r7   iam_token_urlresponse	json_datas           r   generate_iam_tokenrN   "   s.   +55g>F~"E?|, 7!"347!"237 ""56	  ?233.B
 ,-_		
 ..33D' 4 
 	!!#MMO	>*!!,'", 	" 	
 Vr   rH   tokenc                 $    ||S t        |       }|S r   )rN   rH   rO   s     r   _generate_watsonx_tokenrR   M   s    w'ELr   rI   modelc                 ^   | j                  d| j                  dd            }| j                  dd      }| j                  d| j                  dd            }|"| j                  d| j                  dd            }|%t        d	      xs t        d
      xs t        d      }|%t        d      xs t        d      xs t        d      }|2t        d      xs% t        d      xs t        d      xs t        d      }|"| ||j                  d      st        dd      t	        |||      S )zw
    Find watsonx.ai credentials in the params or environment variables and return the headers for authentication.
    
project_idwatsonx_projectNspace_idregion_nameregionwatsonx_region_namewatsonx_regionWATSONX_PROJECT_IDWX_PROJECT_ID
PROJECT_IDWATSONX_REGION	WX_REGIONREGIONWATSONX_DEPLOYMENT_SPACE_IDWATSONX_SPACE_IDWX_SPACE_ID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   )rU   rW   rX   )popr   
startswithr   r   )rI   rS   rU   rW   rX   s        r   _get_api_paramsrk   T   se   
 fjj!2D9J zz*d+H**]FJJx,FGKjj!6::.>#E

 /0 ,o.,l+ 	
 +, (k*(h' 	
 89 *01*m,* j)	 	 	  / [
 	

  r   messagesprovidercustom_prompt_dictc                   K   ddl m} | |v r||    }t        j                  ||j	                  d|j	                  d            |j	                  dd      |j	                  dd      |j	                  dd      |j	                  d	d      
      S ||j
                  j                  k(  rt        j                  |      S  || |       d{   }|r|S t        j                  | |d      S 7  w)z:Async core logic for converting watsonx messages to promptr   WatsonXModelPattern	role_dictrolesinitial_prompt_value final_prompt_value	bos_token	eos_tokenrl   rr   rt   rv   rw   rx   rl   rS   rl   NwatsonxrS   rl   custom_llm_provider	litellm.types.llms.watsonxrq   ptfcustom_promptgetIBM_MISTRALAIr<   mistral_instruct_ptprompt_factoryrS   rl   rm   rn   apply_template_fnrq   model_prompt_dictrJ   s           r   _aconvert_watsonx_messages_corer      s      ? "".u5  '++.227; "3!6!67Mr!R0445I2N'++K<'++K<	
 		
 
(66<<	<&&99 )uxHHM!!(	
 	
	 Is   CC+C)	!C+c                    ddl m} | |v r||    }t        j                  ||j	                  d|j	                  d            |j	                  dd      |j	                  dd      |j	                  dd      |j	                  d	d      
      S ||j
                  j                  k(  rt        j                  |      S  || |      }|r|S t        j                  | |d      S )z9Sync core logic for converting watsonx messages to promptr   rp   rr   rs   rt   ru   rv   rw   rx   ry   rz   r{   r|   r}   r   r   s           r   _convert_watsonx_messages_corer      s     ? "".u5  '++.227; "3!6!67Mr!R0445I2N'++K<'++K<	
 		
 
(66<<	<&&99 #BM!!(	
 	
r   c                 ^   K   ddl m} t        | ||||j                         d{   S 7 w)z3Async version of convert_watsonx_messages_to_promptr   IBMWatsonXChatConfigrS   rl   rm   rn   r   N)(litellm.llms.watsonx.chat.transformationr   r   aapply_prompt_templaterS   rl   rm   rn   r   s        r   #aconvert_watsonx_messages_to_promptr      s8      N0-.EE   s   $-+-c                 B    ddl m} t        | ||||j                        S )z2Sync version of convert_watsonx_messages_to_promptr   r   r   )r   r   r   apply_prompt_templater   s        r   "convert_watsonx_messages_to_promptr      s*     N)-.DD r   c                       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
Z	dee   d	efdZ
dedee   d	efdZdededeeej                  f   d	efdZededee   dee   d	efd       Zdeded	efdZy)IBMWatsonXMixinNr   rS   rl   optional_paramslitellm_paramsrH   api_baser+   c                 P   ddd}d|v ri ||S t        t        t           |j                  d      xs t	        d            }	t        t        t           |j                  dd       xs t	        d            }
|	r	d|	 |d<   n |
r	d	|
 |d<   nt        ||	
      }	d|	 |d<   i ||S )Nr2   )r-   r3   AuthorizationrO   WATSONX_TOKENzen_api_keyr1   zBearer z
ZenApiKey rQ   )r   r   r#   r   r   ri   rR   )r   r   rS   rl   r   r   rH   r   default_headersrO   r   s              r   validate_environmentz$IBMWatsonXMixin.validate_environment   s     /(

 g%1o111SM(KN?,K
 SMt4 312

 )0'8GO$)3K='AGO$+G5IE)0'8GO$-/-W--r   c                     |xs2 t        d      xs% t        d      xs t        d      xs t        d      }|t        dd      |S )NWATSONX_API_BASEWATSONX_URLWX_URLWML_URLrg   zpError: Watsonx URL not set. Set WATSONX_API_BASE in environment variables or pass in as parameter - 'api_base='.rh   )r   r   )r   r   r6   s      r   _get_base_urlzIBMWatsonXMixin._get_base_url  sg     )01)m,) h') i( 	 ;  K  
r   r6   api_versionc                 >    |xs t         j                  }|d| z   }|S )Nz	?version=)rB   WATSONX_DEFAULT_API_VERSION)r   r6   r   s      r   _add_api_version_to_urlz'IBMWatsonXMixin._add_api_version_to_url,  s(    !HW%H%Hi}--
r   error_messager   c                     t        |||      S r   )r   )r   r   r   r   s       r   get_error_classzIBMWatsonXMixin.get_error_class2  s     #]G
 	
r   c           
      $   |xsF | j                  dd       xs2 t        d      xs% t        d      xs t        d      xs t        d      }|xsf | j                  d| j                  d| j                  dd                   xs2 t        d	      xs% t        d
      xs t        d      xs t        d      }| j                  d| j                  dd             }d }|V|j                  d|      }|j                  d|j                  d|            }|j                  d|j                  dd             }|t        |t              st        dd      |t        |t              st        dd      t        ||t        t        t           |            S )Nr5   r0   r/   r.   r1   r6   r   base_urlr   r   r   r   wx_credentialswatsonx_credentialsrH   rO   watsonx_tokenrg   zrError: Watsonx API key not set. Set WATSONX_API_KEY in environment variables or pass in as parameter - 'api_key='.rh   zuError: Watsonx API base not set. Set WATSONX_API_BASE in environment variables or pass in as parameter - 'api_base='.)rH   r   rO   )	ri   r   r   
isinstancer#   r   r   r   r   )r   rH   r   r   rO   s        r   get_watsonx_credentialsz'IBMWatsonXMixin.get_watsonx_credentials9  s   
  3""8T23./3 /03 l+	3
 12 	  )""##J0C0CJPT0UV)
 01) m,) h') i( 	 ),,%t
  $%%))%:H$((.,,Y@G #&&""#TE ?*Wc":  M  :h#<  P  "hd8C=%6P
 	
r   
api_paramsc                 h    i }|j                  d      ri S ||d<   |d   
|d   |d<   |S |d   |d<   |S )Nrf   model_idrU   rW   )rj   )r   rS   r   payloads       r   _prepare_payloadz IBMWatsonXMixin._prepare_payloadt  s`    M* $
l#/$.|$<GL!  #-Z"8GJr   )NN)r   r    r!   r   r#   r   r   dictr   r   r   r   r"   r   r$   r%   r   r   staticmethodr   r   r   r   r)   r   r   r   r      s,    "&"&".". ". '(	".
 ". ". #". 3-". 
".Hhsm   3 Xc] s 
 
/2
=B4CV=W
	
 8
8
(08
AI#8
	8
 8
tc 7G D r   r   r   )$typingr   r   r   r   r   r$   rB   r   litellm.cachingr	   +litellm.litellm_core_utils.prompt_templatesr
   r   )litellm.llms.base_llm.chat.transformationr   litellm.secret_managers.mainr   litellm.types.llms.openair   r   r   r   r   r>   r*   r#   rN   rR   r   rk   r   r   r   r   r   r)   r   r   <module>r      s   4 4   " ) F F 7 6 KT% T  /(# (VXc] 8C= S 3D 3# 3BR 3l!
!
#$!
 !
 	!
 	!
H!
!
#$!
 !
 	!
 	!
H#$  	
 	$#$  	
 	&H Hr   