
    ^h"P                     0   S SK r S SKrS SKrS SKJrJr  S SKJr  S SKJrJ	r	J
r
JrJrJrJrJrJr  S SKrS SKrS SKrS SKJr  S SKJr  S SKJr  S SKJr  S S	KJr  S S
KJ r J!r!J"r"J#r#  SSK$J%r%  SSK&J'r'J(r(  SSK)J*r*  S\+4S jr, " S S\%5      r- " S S5      r.g)    N)asynccontextmanagercontextmanager)datetime)	AnyAsyncGeneratorAsyncIteratorCallable	GeneratorIteratorListOptionalUnion)factory)CustomStreamWrapper)get_async_httpx_client)AllMessageValues)WatsonXAIEndpoint)EmbeddingResponseModelResponseUsagemap_finish_reason   )BaseLLM   )WatsonXAIError_get_api_params   )IBMWatsonXAIConfigreturnc                 n   X;   a~  X0   n[         R                  " UUR                  SUR                  S5      5      UR                  SS5      UR                  SS5      UR                  SS5      UR                  SS5      S9nU$ US	:X  a  [         R                  " US
9nU$ [         R                  " XSS9nU$ )N	role_dictrolesinitial_prompt_value final_prompt_value	bos_token	eos_token)messagesr!   r#   r%   r&   r'   zibm-mistralai)r(   watsonx)modelr(   custom_llm_provider)ptfcustom_promptgetmistral_instruct_ptprompt_factory)r*   r(   providercustom_prompt_dictmodel_prompt_dictprompts         a/home/james-whalen/.local/lib/python3.13/site-packages/litellm/llms/watsonx/completion/handler.pyconvert_messages_to_promptr6   "   s    ".5""'++.227; "3!6!67Mr!R0445I2N'++K<'++K<	
 	_	$(((;
 M ((	
 M    c                   <  ^  \ rS rSrSrSrSU 4S jjr SS\S\\	   S	\S
\
S\S\\   S\4S jjr SS\S\\S4   S\4S jjr    S S\S\S\S\S\S\S\4S jjr SS\S\\   S\4S jjr   S!S\S\\\4   S\S\\   S\S\S\4S jjrSS.S\
4S jjrSrU =r$ )"IBMWatsonXAI;   z
Class to interface with IBM watsonx.ai API for text generation and embeddings.

Reference: https://cloud.ibm.com/apidocs/watsonx-ai
z
2024-03-13r   Nc                 "   > [         TU ]  5         g N)super__init__)self	__class__s    r5   r>   IBMWatsonXAI.__init__D   s    r7   model_idr(   r4   streamoptional_paramsprint_verbosec                    [        XVS9nUR                  S5      nXl        [        5       R	                  0 UUUUS9n	UR                  S0 5      n
UR                  U
5        UUR                  S0 5      US.n[        US   S9nUR                  S	5      (       a  UR                  S
5      c
  [        SSS9eSR                  UR                  S5      SS 5      nU(       a  [        R                  R                  O[        R                  R                  nUR!                  US9nO3XS'   US   US'   U(       a  [        R"                  O[        R$                  nUS   R'                  S5      U-   n[        SXXS9$ )z1
Get the request parameters for text generation.
)rE   token)headersr*   r(   rD   api_key
extra_bodymoderations)inputrK   
parametersapi_versionversionzdeployment/space_idNi  zError: space_id is required for models called using the 'deployment/' endpoint. Pass in the space_id as a parameter or set it in the WX_SPACE_ID environment variable.status_codemessage/r   )deployment_idrB   
project_idurlPOSTmethodrX   rH   jsonparams)r   r.   rG   r   validate_environmentpopupdatedict
startswithr   joinsplitr   !DEPLOYMENT_TEXT_GENERATION_STREAMvalueDEPLOYMENT_TEXT_GENERATIONformatTEXT_GENERATION_STREAMTEXT_GENERATIONrstrip)r?   rB   r(   r4   rC   rD   rE   
api_params	api_tokenrH   extra_body_paramspayloadrequest_paramsrV   endpointrX   s                   r5   _prepare_text_generation_req)IBMWatsonXAI._prepare_text_generation_reqG   s    %_R
NN7+	
$&;;+ < 
 ,//bA01 *..}bA)

 j&?@}--~~j)1$ # E   HHX^^C%8%<=M  "CCII&AAGG 
  ]CH"*J$.|$<GL!  "88&66 
 &&s+h6s'
 	
r7   	json_respmodel_responsec                 >   SU;  a  [        SSU 3S9eUc  [        UR                  SS 5      S9nUS   S   S   nUS   S   S	   nUS   S   S
   nX2R                  S   R                  l        [        US   S   S   5      UR                  S   l        UR                  S5      (       a6  [        [        R                  " US   5      R                  5       5      Ul        O#[        [        R                  " 5       5      Ul        [        UUXE-   S9n[        USU5        U$ )Nresults  z-Error: Invalid response from Watsonx.ai API: rR   rB   r*   r   generated_textinput_token_countgenerated_token_countstop_reason
created_atprompt_tokenscompletion_tokenstotal_tokensusage)r   r   r.   choicesrT   contentr   finish_reasonintr   fromisoformat	timestampcreatedtimer   setattr)r?   rt   ru   rz   r   r   r   s          r5   _process_text_gen_response'IBMWatsonXAI._process_text_gen_response   s=    I% G	{S  !*z41PQN"9-a01AB!),Q/0CD%i034KL4Bq!))12Ci #M23
q!/ ==&&%(&&y'>?IIK&N" &)%5N"'/&:

 	/r7   r*   r2   logging_objc           	      &  ^ ^^^^^^ UR                  SS5      n[        R                  " 5       nUR                  5        H  u  nnX;  d  M  UX'   M     TR	                  S5      S   n[        TUUU5      mTTl        S[        [        [           [        4   S[        4UU4S jjm[        T5      T l        S[        S[        4UUU U4S	 jjnS[        S[        4UUU U4S
 jjnS[        S[        4UUU U4S jjnS[        S[        4UUU U4S jjn T R!                  TTUUUUS9nU(       a  U	SL a  U" U5      $ U(       a  U" U5      $ U	SL a  U" U5      $ U" U5      $ ! ["         a  nUeSnAf[$         a  n[#        S[        U5      S9eSnAff = f)z
Send a text generation request to the IBM Watsonx.ai API.
Reference: https://cloud.ibm.com/apidocs/watsonx-ai#text-generation
rC   FrU   r   stream_respr   c                 6   > [         R                  " U TSTS9nU$ )Nr)   )r*   r+   r   )litellmr   )r   streamwrapperr   r*   s     r5   process_stream_response8IBMWatsonXAI.completion.<locals>.process_stream_response   s)     $77$-'	M ! r7   rp   c                    > TR                   R                  U TTS9 nUR                  5       nS S S 5        TR                  WT5      $ ! , (       d  f       N = fN)rL   timeout)request_managerrequestr\   r   rp   resprt   ru   r4   r?   r   s      r5   handle_text_request4IBMWatsonXAI.completion.<locals>.handle_text_request   sZ    %%-- .   IIK	 229nMM s   A
Ac                    >#    TR                   R                  U TTS9 IS h  vN nUR                  5       nS S S 5      IS h  vN   TR                  WT5      $  N6 N! , IS h  vN  (       d  f       N-= f7fr   )r   async_requestr\   r   r   s      r5   handle_text_request_async:IBMWatsonXAI.completion.<locals>.handle_text_request_async   sp     ++99 :    IIK	  229nMM   sC    A8AA8AA8AA8A8A5$A'%A51A8c                    > TR                   R                  U STTS9 nT" UR                  5       5      nS S S 5        U$ ! , (       d  f       W$ = fNT)rC   rL   r   )r   r   
iter_linesrp   r   r   r   r4   r?   r   s      r5   handle_stream_request6IBMWatsonXAI.completion.<locals>.handle_stream_request   s`     %%--	 . 
  78I J !   ! s	   ?
Ac                    >#    TR                   R                  U STTS9 IS h  vN nT" UR                  5       5      nS S S 5      IS h  vN   U$  N, N! , IS h  vN  (       d  f       W$ = f7fr   )r   r   aiter_linesr   s      r5   handle_stream_request_async<IBMWatsonXAI.completion.<locals>.handle_stream_request_async   sx     
 ++99	 :  
  78H8H8J K  !     ! sC   !A0AA0AA0
AA0A0A-AA-(A0)rB   r4   r(   rC   rD   rE   TNrx   rR   )r_   r   
get_configitemsrd   r6   r*   r   r   strr   r   RequestManagerr   ra   r   rr   r   	Exception)r?   r*   r(   r2   ru   rE   encodingr   rD   acompletionlitellm_params	logger_fnr   rC   configkvr1   r   r   r   r   
req_paramser   r4   s   ``  `  `    `           @@r5   
completionIBMWatsonXAI.completion   s   & !$$Xu5 $..0LLNDAq'%&" #
 ;;s#A&+8X'9
  %		!x}m;<		! 		! 		!  .k:	N 	N 	N 	N	ND 	N] 	N 	N
	!$ 
	!;N 
	! 
	!	! 	! 	! 	!	B::! /+ ; J ;$.2:>>,Z88$0<< +:66 	G 	B S#a&AA	Bs6   'E ;E 
E E 
F)E++F8FFc           
      (   Uc  [        UR                  SS 5      S9nUR                  S/ 5      n/ n[        U5       H  u  pVUR                  SUUS   S.5        M     SUl        XBl        UR                  SS5      n[        US	[        USUS
95        U$ )NrB   ry   rw   	embedding)objectindexr   listr{   r   r   r   )r   r.   	enumerateappendr   datar   r   )r?   rt   ru   rw   embedding_responseidxresultinput_tokenss           r5   _process_embedding_response(IBMWatsonXAI._process_embedding_response  s     !.Y]]:t5TUN--	2.$W-KC%%) !'!4 . !'0 }}%8!<*"#)	
 r7   rL   rI   c
                   ^ ^^^ Uc  0 n[         R                  " 5       n
U
R                  5        H  u  pX;  d  M  XU'   M     UTl        [	        T[
        5      (       a  T/mUb  XFS'   [        U5      nUR                  S5      nUT l        SU 3SSS.nTUUS   US.n[        US	   S
9nUS   R                  S5      [        R                  -   nSUUUUS.n[        U5      mS[        S[        4UUUU 4S jjnS[        S[        4UUUU 4S jjn U	SL a  U" U5      $ U" U5      $ ! [         a  nUeSnAf[          a  n[        S[        U5      S9eSnAff = f)z:
Send a text embedding request to the IBM Watsonx.ai API.
NrI   rG   Bearer application/jsonAuthorizationzContent-TypeAcceptrW   )inputsrB   rW   rM   rN   rO   rX   rU   rY   rZ   rp   r   c                    > TR                  U TS9 nUR                  5       nS S S 5        TR                  WT5      $ ! , (       d  f       N = fN)rL   )r   r\   r   rp   r   rt   rL   ru   r   r?   s      r5   handle_embedding0IBMWatsonXAI.embedding.<locals>.handle_embeddingq  sF     ((u(E IIK	 F33I~NN FEs	   =
Ac                    >#    TR                  U TS9 IS h  vN nUR                  5       nS S S 5      IS h  vN   TR                  WT5      $  N6 N! , IS h  vN  (       d  f       N-= f7fr   )r   r\   r   r   s      r5   handle_aembedding1IBMWatsonXAI.embedding.<locals>.handle_aembeddingv  sd     &44e 5   IIK	  33I~NN	   sA   A-AA-AA-AA-A-A*AA*&A-Trx   rR   )r   r   r   r*   
isinstancer   r   r.   rG   ra   rk   r   
EMBEDDINGSr   r   r   r   )r?   r*   rL   ru   rI   r   rD   r   rE   
aembeddingr   r   r   rl   rm   rH   ro   rp   rX   r   r   r   r   r   s   ` ``                   @r5   r   IBMWatsonXAI.embedding8  s    " O#..0LLNDA'%&" #  % eS!!GE)0I&$_5
NN7+	
&yk2.(
 $\2)	
 j&?@&&s+.?.J.JJ$

 )5	OT 	O6G 	O 	O
	OD 	O=N 	O 	O	BT!(44'
33 	G 	B S#a&AA	Bs*   D' D' '
E1D33E EET)ids_onlyr   c                   [        U5      nUS   U l        SUS    3SSS.n[        US   S9nUS   R                  S5      [        R
                  -   n[        S	XdUS
9n[        S S9R                  U5       nUR                  5       n	S S S 5        U(       d  W	$ W	S    V
s/ s H  oS   PM	     sn
$ ! , (       d  f       N/= fs  sn
f )NrG   r   r   r   rN   rO   rX   rU   GET)r[   rX   rH   r]   r   	resourcesrB   )	r   rG   ra   rk   r   AVAILABLE_MODELSr   r   r\   )r?   r   r]   rl   rH   rp   rX   r   r   rt   ress              r5   get_available_models!IBMWatsonXAI.get_available_models  s    $V,
(
&z'':&;<.(

 j&?@&&s+.?.P.PPCX
-55jAT		I B+4[+AB+ACJ+ABB	 BA Cs   6B0C0
B>)r   rG   )r   Nr<   )NNNN)NNN)__name__
__module____qualname____firstlineno____doc__rN   r>   r   r   r   boolra   r   r	   rr   r   r   r   r   r   r   r   r   r   r   __static_attributes____classcell__)r@   s   @r5   r9   r9   ;   s    K -1:
:
 '(:
 	:

 :
 :
  ):
 
:
z MQ/4]D5H/I	R wBwB wB !	wB
 &wB  wB wB wBt NR/78I/J	J MBMB T3YMB *	MB
 #MB MB MB 
MB^ 8< C C Cr7   r9   c                       \ rS rSrSrSS jr  SS\S\\   S\\	   4S jjr
S	 r\   SS\S
\	S\\   S\\R                  SS4   4S jj5       r\   SS\S
\	S\\   S\\R                  S4   4S jj5       rSrg)r   i  a  
A class to handle sync/async HTTP requests to the IBM Watsonx.ai API.

Usage:
```python
request_params = dict(method="POST", url="https://api.example.com", headers={"Authorization" : "Bearer token"}, json={"key": "value"})
request_manager = RequestManager(logging_obj=logging_obj)
with request_manager.request(request_params) as resp:
    ...
# or
async with request_manager.async_request(request_params) as resp:
    ...
```
Nc                     Xl         g r<   r   )r?   r   s     r5   r>   RequestManager.__init__  s    &r7   rp   rL   is_asyncc           	          U R                   c  g SU(       a  SOS US    SUS    SUR                  S5       S	3nU R                   R                  UUS
   R                  S5      UR                  S5      US.S9  g )Nzresponse = zawait r$   r[   z(
	url=rX   z,
	json=r\   z,
)rH   r   )complete_input_dictrequest_str)rL   rI   additional_args)r   r.   pre_call)r?   rp   rL   r   r   s        r5   r   RequestManager.pre_call  s     #h(B7x8P7Q R#E*+ ,$((01 2 	 	!!"9-11/B'5'9'9&'A* 	" 	
r7   c                     U R                   c  g U R                   R                  [        US   R                  S5      [        R
                  " UR	                  5       5      UR                  UR                  SUR                  S5      5      S.S9  g )NrH   r   r   r\   )rS   r   )rL   rI   original_responser   )r   	post_callrL   r.   r\   dumpsrS   )r?   r   rp   s      r5   r   RequestManager.post_call  s~    #"""9-11/B"jj5#//'5'9'9N..v6(	 	# 
	
r7   rC   r   c           	   #     #    U R                  X5        U(       a  XAS'   U(       a  X!S'    [        R                  " S	0 UD6nUR                  (       d;  [	        UR
                  SUR
                   SUR                   SUR                   3S9eUv   U(       d  U R                  XQ5        gg! [         a  n[	        S[        U5      S9eSnAff = f7f)
zF
Returns a context manager that yields the response from the request.
r   rC   Error  (): rR   rx   N )r   requestsr   okr   rS   reasontextr   r   r   )r?   rp   rC   rL   r   r   r   s          r5   r   RequestManager.request  s      	n,(/9%'-8$		B##5n5D77$ $ 0 0$T%5%5$6bST  J NN40   	B S#a&AA	Bs)   (CA&B+ C+
C5CCCc           
       #    U R                  XSS9  U(       a  XAS'   U(       a  X!S'    [        [        R                  R                  S[
        R                  " UR                  SS5      SS90S9U l        S	U;   a)  [        R                  " UR                  S	0 5      5      US
'   UR                  S5      nSnS nUS:  a  UR                  5       S:X  a%  U R                  R                  " S0 UD6I S h  vN nO$U R                  R                  " S0 UD6I S h  vN nUb7  UR                  S;   a'  [        R                   " SU-  5      I S h  vN   US-  nOOUS:  a  M  Uc
  [#        SSS9eUR$                  (       a>  ['        USS5      n[#        UR                  SUR                   SU SUR(                   3S9eU7v   U(       d  U R/                  Xq5        g g  N N N! [*         a  n	U	eS n	A	ff = f7f)NT)r   r   rC   g     @g      @)r   connect)llm_providerr]   r\   r   r[   r   r   rY   )i  i  i  i  r   r   rx   zNo response from the serverrR   r  r$   r   r  r  r  )r   r   r   LlmProvidersWATSONXhttpxTimeoutr_   async_handlerr\   r   upperpostr.   rS   asynciosleepr   is_errorgetattrr  r   r   r   )
r?   rp   rC   rL   r   r[   retriesr   error_reasonr   s
             r5   r   RequestManager.async_request  s     	nd;(/9%'-8$)	B!7$1199u}} . 2 29e Dc "D ')-N4F4Fvr4R)Sv&#''1FG-1DA+<<>V+!%!3!3!8!8!J>!JJD!%!3!3!7!7!I.!IID#(8(8<P(P "--7
333qLG A+ |$ #9  }}&tXr:$ $ 0 0$T%5%5$6bc$))U  J
 NN40 5 KI 4"  	BG	Bsf   'G5C	G! 3G4$G! G3G! GG!  A!G! G5G! G! G! !
G2+G--G22G5)r  r   r<   )NF)FNN)r   r   r   r   r   r>   ra   r   r   r   r   r   r   r
   r  Responser   r   r   r  r   r   r  r7   r5   r   r     s    '  $#(	

 }
 4.	
.
  #11 1 }	1 
8$$dD0	11 18  #7171 71 }	71 
,	-71 71r7   r   )/r  r\   r   
contextlibr   r   r   typingr   r   r   r	   r
   r   r   r   r   r  r  r   +litellm.litellm_core_utils.prompt_templatesr   r,   ,litellm.litellm_core_utils.streaming_handlerr   &litellm.llms.custom_httpx.http_handlerr   litellm.types.llms.openair   litellm.types.llms.watsonxr   litellm.utilsr   r   r   r   baser   common_utilsr   r   transformationr   r   r6   r9   r   r  r7   r5   <module>r&     sv       : 
 
 
    F L I 6 8 T T  : .QT 2[C7 [C|
N1 N1r7   