
    g7                         d dl Z d dlmZ d dlmZmZ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mZ d dlmZ d dlmZmZmZ d dlmZ d	d
lmZ ddlmZmZmZmZ er	d dl m!Z" e"Z#neZ# G d dee      Z$ G d de      Z%y)    N)datetime)TYPE_CHECKINGAnyAsyncIteratorDictIteratorListOptionalUnion)BaseModelResponseIterator)AllMessageValuesChatCompletionUsageBlock)WatsonXAIEndpoint)GenericStreamingChunkModelResponseUsage)map_finish_reason   )
BaseConfig   )IBMWatsonXMixinWatsonXAIError_get_api_params"convert_watsonx_messages_to_prompt)Loggingc            !           e Zd ZU dZdZee   ed<   dZee	   ed<   dZ
ee   ed<   dZee   ed<   dZee   ed<   dZeee      ed	<   dZee   ed
<   dZee	   ed<   dZee	   ed<   dZee   ed<   dZee   ed<   dZeeeef      ed<   dZee   ed<   dZee   ed<   dZee   ed<   	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 d4dee   dee	   dee   dee   dee   d	eee      d
ee   dee	   dee	   dee   dee   dee   dee   dee   dee   ddf dZe fd       ZdedefdZdefdZ dededededef
dZ!defdZ"dedefd Z#dee   fd!Z$dee   fd"Z%ded#ee&   ded$ed%edefd&Z'	 	 d5ded'e(jR                  d(e*d)e+d*ed#ee&   ded$ed+ed,ee   d-ee   de*fd.Z,	 d6d/edededee   def
d0Z-	 d7d1e.e/e   e0e   e*f   d2ed-ee   fd3Z1 xZ2S )8IBMWatsonXAIConfiga  
    Reference: https://cloud.ibm.com/apidocs/watsonx-ai#text-generation
    (See ibm_watsonx_ai.metanames.GenTextParamsMetaNames for a list of all available params)

    Supported params for all available watsonx.ai foundational models.

    - `decoding_method` (str): One of "greedy" or "sample"

    - `temperature` (float): Sets the model temperature for sampling - not available when decoding_method='greedy'.

    - `max_new_tokens` (integer): Maximum length of the generated tokens.

    - `min_new_tokens` (integer): Maximum length of input tokens. Any more than this will be truncated.

    - `length_penalty` (dict): A dictionary with keys "decay_factor" and "start_index".

    - `stop_sequences` (string[]): list of strings to use as stop sequences.

    - `top_k` (integer): top k for sampling - not available when decoding_method='greedy'.

    - `top_p` (integer): top p for sampling - not available when decoding_method='greedy'.

    - `repetition_penalty` (float): token repetition penalty during text generation.

    - `truncate_input_tokens` (integer): Truncate input tokens to this length.

    - `include_stop_sequences` (bool): If True, the stop sequence will be included at the end of the generated text in the case of a match.

    - `return_options` (dict): A dictionary of options to return. Options include "input_text", "generated_tokens", "input_tokens", "token_ranks". Values are boolean.

    - `random_seed` (integer): Random seed for text generation.

    - `moderations` (dict): Dictionary of properties that control the moderations, for usages such as Hate and profanity (HAP) and PII filtering.

    - `stream` (bool): If True, the model will return a stream of responses.
    sampledecoding_methodNtemperaturemax_new_tokensmin_new_tokenslength_penaltystop_sequencestop_ktop_prepetition_penaltytruncate_input_tokensFinclude_stop_sequencesreturn_optionsrandom_seedmoderationsstreamreturnc                     t               }|j                         D ]%  \  }}|dk7  s|t        | j                  ||       ' y )Nself)localsitemssetattr	__class__)r0   r   r    r!   r"   r#   r$   r%   r&   r'   r(   r)   r*   r+   r,   r-   kwargslocals_keyvalues                       c/var/www/openai/venv/lib/python3.12/site-packages/litellm/llms/watsonx/completion/transformation.py__init__zIBMWatsonXAIConfig.__init__\   s;    & (!--/JCf}!2U3 *    c                      t         |          S N)super
get_config)clsr4   s    r9   r?   zIBMWatsonXAIConfig.get_configt   s    w!##r;   paramc                     g d}||v S )zP
        Determine if user passed in a watsonx.ai text generation param
        )r   r!   r"   r#   r$   r%   r'   r(   r)   r*   r+   r,   r   
min_tokens )r0   rA   text_generation_paramss      r9   is_watsonx_text_paramz(IBMWatsonXAIConfig.is_watsonx_text_paramx   s    "
" ...r;   modelc                 
    g dS )N)r    
max_tokensr&   frequency_penaltystopseedr-   rD   )r0   rG   s     r9   get_supported_openai_paramsz.IBMWatsonXAIConfig.get_supported_openai_params   s    
 	
r;   non_default_paramsoptional_paramsdrop_paramsc                 |   i }|j                         D ]  \  }}|dk(  r||d<   |dk(  r||d<   |dk(  r||d<   '|dk(  r||d<   2|dk(  r||d<   =|dk(  r||d	<   H|d
k(  r||d<   S|dk(  r||d<   ^|dk(  r||d<   i|dk(  r||d<   t|dk(  r||d<   |dk(  r||d<   |dk(  r||d<   |dk(  s||d<    |r||d<   |S )NrI   r!   r-   r    r&   rJ   r'   rL   r+   rK   r$   r   rC   r"   r%   r(   r#   
time_limitr*   
extra_body)r2   )r0   rN   rO   rG   rP   rS   kvs           r9   map_openai_paramsz$IBMWatsonXAIConfig.map_openai_params   s9    
&,,.DAqL 45 01h,-)m#12.g+,())89 45f12.f45 01''01
,-l"/0
+,g&'
7#--67
23&&/0
+,l"+,
<(&&/0
+,9 /< ,6OL)r;   c                     ddddS )zK
        Common auth params across bedrock/vertex_ai/azure/watsonx
        watsonx_projectwatsonx_region_namewatsonx_token)projectregion_nametokenrD   r0   s    r9   get_mapped_special_auth_paramsz1IBMWatsonXAIConfig.get_mapped_special_auth_params   s    
 )0$
 	
r;   c                 p    | j                         }|j                         D ]  \  }}||v s||||   <    |S r=   )r_   r2   )r0   rN   rO   mapped_paramsrA   r8   s         r9   map_special_auth_paramsz*IBMWatsonXAIConfig.map_special_auth_params   sF    ;;=.446LE5%8=e 45 7 r;   c                 
    ddgS )k
        Source: https://www.ibm.com/docs/en/watsonx/saas?topic=integrations-regional-availability
        zeu-dezeu-gbrD   r^   s    r9   get_eu_regionsz!IBMWatsonXAIConfig.get_eu_regions   s    
 
 	
r;   c                     dgS )rd   zus-southrD   r^   s    r9   get_us_regionsz!IBMWatsonXAIConfig.get_us_regions   s    
 
 	
r;   messageslitellm_paramsheadersc                    |j                  d      d   }t        |||i       }|j                  di       }|j                  |       t	        |      }	||j                  di       |d}
|j                  d      s||
d	<   |	d
   |
d
<   |
S )N/r   )rG   rh   providercustom_prompt_dictrS   )paramsr,   )inputr,   
parametersdeployment/model_id
project_id)splitr   popupdater   
startswith)r0   rG   rh   rO   ri   rj   rm   promptextra_body_paramswatsonx_api_paramspayloads              r9   transform_requestz$IBMWatsonXAIConfig.transform_request   s     ;;s#A&3!	
 ,//bA01,OD *..}bA)
 ."'GJ$6|$DGL!r;   raw_responsemodel_responselogging_objrequest_dataencodingapi_key	json_modec                    |j                  |d|j                         |j                         }d|vrt        dd|       |t	        |j                  dd             }|d   d	   d
   }|d   d	   d   }|d   d	   d   }||j                  d	   j                  _        t        |d   d	   d         |j                  d	   _
        |j                  d      r5t        t        j                  |d         j                               |_        n"t        t!        j                                |_        t#        ||||z         }t%        |d|       |S )N )rp   r   original_responseresultsi  z-Error: Invalid response from Watsonx.ai API: status_codemessagers   )rG   r   generated_textinput_token_countgenerated_token_countstop_reason
created_atprompt_tokenscompletion_tokenstotal_tokensusage)	post_calltextjsonr   r   getchoicesr   contentr   finish_reasonintr   fromisoformat	timestampcreatedtimer   r3   )r0   rG   r~   r   r   r   rh   rO   ri   r   r   r   	json_respr   r   r   r   s                    r9   transform_responsez%IBMWatsonXAIConfig.transform_response  sq    	*// 	 	
 !%%'	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"'/&)::

 	/r;   api_basec                    | j                  |      }|j                  d      r|j                  d      t        dd      dj	                  |j                  d      dd        }|rt        j                  j                  nt        j                  j                  }|j                  |	      }n"|rt        j                  nt        j                  }|j                  d      |z   }| j                  ||j                  d
d             }|S )N)r   rr   space_idi  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.r   rl      )deployment_idapi_version)urlr   )_get_base_urlrx   r   r   joinru   r   !DEPLOYMENT_TEXT_GENERATION_STREAMr8   DEPLOYMENT_TEXT_GENERATIONformatTEXT_GENERATION_STREAMTEXT_GENERATIONrstrip_add_api_version_to_urlrv   )r0   r   rG   rO   r-   r   r   endpoints           r9   get_complete_urlz#IBMWatsonXAIConfig.get_complete_url9  s
      ( 3M*"":.6$ # E   HHU[[%5ab%9:M  "CCII&AAGG 
  ]CH  "88&66 
 jjo( **!4!4]D!I + 
 
r;   streaming_responsesync_streamc                     t        |||      S )N)r   r   r   )%WatsonxTextCompletionResponseIterator)r0   r   r   r   s       r9   get_model_response_iteratorz.IBMWatsonXAIConfig.get_model_response_iterator]  s     51#
 	
r;   )NNNNNNNNNNNNNNN)NNr=   )F)3__name__
__module____qualname____doc__r   r
   str__annotations__r    floatr!   r   r"   r#   dictr$   r	   r%   r&   r'   r(   r)   boolr*   r   r+   r,   r-   r:   classmethodr?   rF   rM   rV   r_   rb   re   rg   r   r}   httpxResponser   LiteLLMLoggingObjr   r   r   r   r   r   __classcell__)r4   s   @r9   r   r   &   s   #J &.OXc]-#'K%'$(NHSM($(NHSM(%)NHTN)*.NHT#Y'.E8C=!E8E?!*..+/8C=/-2HTN204NHT#t)_-4!%K#%"&K$&"FHTN" *.'+(,(,)-.2#!%.2/315)-%)&*!%!4!#4 e_4 !	4
 !4 !4 !c+4 }4 4 %UO4  (}4 !)4 !4 c]4 d^4  !4$ 
%40 $ $/3 /4 /.	
 	
( ( ( 	(
 ( 
(T
 
$ QU 
S	 

S	 
 '( 	
   
T "&$(11 nn1 &	1
 '1 1 '(1 1 1 1 #1 D>1 
1p "&"" " 	"
 " 
"P %*	

!(3-s1C]"RS

 

 D>	

r;   r   c                       e Zd ZdedefdZy)r   chunkr.   c                    	 |j                  dg       }t        |      dkD  r|d   j                  dd      }|d   j                  d      }|dk7  }t        |||t        |d   j                  dd      |d   j                  dd      |d   j                  dd      |d   j                  dd      z   	      
      S t        dddd 
      S # t        $ r}|d }~ww xY w)Nr   r   r   r   r   not_finishedr   r   r   )r   is_finishedr   r   FrK   )r   lenr   r   	Exception)r0   r   r   r   r   r   es          r9   chunk_parserz2WatsonxTextCompletionResponseIterator.chunk_parsern  s    	ii	2.G7|aqz~~&6; '
} =+~=, +"/2&-ajnn5H!&L*1!*..9PRS*T%,QZ^^4G%K!!*..)@!D&E	
 
 )!$	   	G	s   B7C	 :C	 		CCCN)r   r   r   r   r   r   rD   r;   r9   r   r   j  s    $ +@ r;   r   )&r   r   typingr   r   r   r   r   r	   r
   r   r   )litellm.llms.base_llm.base_model_iteratorr   litellm.types.llms.openair   r   litellm.types.llms.watsonxr   litellm.types.utilsr   r   r   litellm.utilsr   base_llm.chat.transformationr   common_utilsr   r   r   r   *litellm.litellm_core_utils.litellm_loggingr   _LiteLLMLoggingObjr   r   r   rD   r;   r9   <module>r      sp     	 	 	  O P 8 K K + 6  X*A
* A
H
,E r;   