
    g2&              
       &   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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       V/var/www/openai/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<   | 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_KEYz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   r5   iam_token_urlresponse	json_datas           r   generate_iam_tokenrL   "   s   +55g>F~"E?$\2WnEV6WG?233.B
 ,-_		
 ..33D' 4 
 	!!#MMO	>*!!,'", 	" 	
 Vr   rF   tokenc                 $    ||S t        |       }|S r   )rL   rF   rM   s     r   _generate_watsonx_tokenrP   H   s    w'ELr   rG   c                 4   | 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      }|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  zhError: Watsonx project_id not set. Set WX_PROJECT_ID in environment variables or pass in as a parameter.r   r   )rR   rT   rU   )popr   r   r   )rG   rR   rT   rU   s       r   _get_api_paramsrf   O   sH    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   modelmessagesprovidercustom_prompt_dictc                 z   | |v r||    }t        j                  ||j                  d|j                  d            |j                  dd      |j                  dd      |j                  dd      |j                  dd            }|S |d	k(  rt        j                  |
      }|S t        j                  | |d      }|S )N	role_dictrolesinitial_prompt_value final_prompt_value	bos_token	eos_token)rh   rl   rn   rp   rq   rr   zibm-mistralai)rh   watsonx)rg   rh   custom_llm_provider)ptfcustom_promptgetmistral_instruct_ptprompt_factory)rg   rh   ri   rj   model_prompt_dictprompts         r   "convert_watsonx_messages_to_promptr|      s     "".u5""'++.227; "3!6!67Mr!R0445I2N'++K<'++K<	
 	_	$(((;
 M (((	
 Mr   c                       e Zd Z	 	 ddedede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y)IBMWatsonXMixinNr   rg   rh   optional_paramsrF   api_baser+   c                     ddd}d|v ri ||S t        t        t           |j                  d      xs t	        d      xs t	        d            }|r	d| |d<   nt        ||      }d| |d<   i ||S )	Nr0   )r-   r1   AuthorizationrM   WATSONX_ZENAPIKEYWATSONX_TOKENzBearer rO   )r   r   r#   rw   r   rP   )	r   r   rg   rh   r   rF   r   default_headersrM   s	            r   validate_environmentz$IBMWatsonXMixin.validate_environment   s     /(

 g%1o111SM( /12/o.	
 )0'8GO$+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_URLrc   zpError: Watsonx URL not set. Set WATSONX_API_BASE in environment variables or pass in as parameter - 'api_base='.rd   )r   r   )r   r   r4   s      r   _get_base_urlzIBMWatsonXMixin._get_base_url   sg     )01)m,) h') i( 	 ;  K  
r   r4   api_versionc                 >    |xs t         j                  }|d| z   }|S )Nz	?version=)r@   WATSONX_DEFAULT_API_VERSION)r   r4   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_class   s     #]G
 	
r   c           
      
   |xs9 | j                  d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 )Nr3   WATSONX_APIKEYr/   r.   r4   r   base_urlr   r   r   r   wx_credentialswatsonx_credentialsrF   rM   watsonx_tokenrc   zrError: Watsonx API key not set. Set WATSONX_API_KEY in environment variables or pass in as parameter - 'api_key='.rd   zuError: Watsonx API base not set. Set WATSONX_API_BASE in environment variables or pass in as parameter - 'api_base='.)rF   r   rM   )	re   r   rw   
isinstancer#   r   r   r   r   )r   rF   r   r   rM   s        r   get_watsonx_credentialsz'IBMWatsonXMixin.get_watsonx_credentials   s   
  ,""8T2,./, /0, l+ 	  )""##J0C0CJPT0UV)
 01) m,) h') i( 	 ),,%t
  $%%))%:H$((.,,Y@G #&&""#TE ?*Wc":  M  :h#<  P  "hd8C=%6P
 	
r   )NN)r   r    r!   r   r#   r   r   r   r   r   r   r"   r   r$   r%   r   r   staticmethoddictr   r   r)   r   r   r~   r~      s    "&"&.. . '(	.
 . #. 3-. 
.<hsm   3 Xc] s 
 
/2
=B4CV=W
	
 7
7
(07
AI#7
	7
 7
r   r~   r   )!typingr   r   r   r   r   r$   r@   r   litellm.cachingr	   +litellm.litellm_core_utils.prompt_templatesr
   ru   )litellm.llms.base_llm.chat.transformationr   litellm.secret_managers.mainr   litellm.types.llms.openair   litellm.types.llms.watsonxr   r   r   r<   r*   r#   rL   rP   r   rf   r|   r~   r)   r   r   <module>r      s    4 4   " ) F F 7 6 KT% T  /## #LXc] 8C= S 000f#$  	
 	>t
 t
r   