o
    ưi;                     @   s   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rcd dl m!Z" e"Z#neZ#G dd deeZ$G dd deZ%dS )    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                !       sh  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< 															dFd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dZe fddZdedefddZdefddZ ded eded!edef
d"d#Z!defd$d%Z"ded efd&d'Z#dee fd(d)Z$dee fd*d+Z%ded,ed edefd-d.Z&ded/ee' d ed0ed1edefd2d3Z(ded/ee' d ed0ed1edefd4d5Z)		dGded6e*j+d7e,d8e-d9ed/ee' d ed0ed:ed;ee d<ee de,fd=d>Z.	dHd?ee d;ee ded ed0edee defd@dAZ/	dIdBe0e1e e2e e,f dCed<ee fdDdEZ3  Z4S )J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                 K   s>   t   }| D ]\}}|dkr|d urt| j|| q	d S )Nself)localscopyitemssetattr	__class__)r-   r   r   r   r    r!   r"   r#   r$   r%   r&   r'   r(   r)   r*   r+   kwargsZlocals_keyvalue r6   e/home/app/Keep/.python/lib/python3.10/site-packages/litellm/llms/watsonx/completion/transformation.py__init__\   s   
zIBMWatsonXAIConfig.__init__c                    s
   t   S N)super
get_config)clsr2   r6   r7   r;   t   s   
zIBMWatsonXAIConfig.get_configparamc                 C   s   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_tokensr6   )r-   r>   Ztext_generation_paramsr6   r6   r7   is_watsonx_text_paramx   s   z(IBMWatsonXAIConfig.is_watsonx_text_parammodelc                 C   s   g dS )N)r   
max_tokensr$   frequency_penaltystopseedr+   r6   )r-   rA   r6   r6   r7   get_supported_openai_params   s   z.IBMWatsonXAIConfig.get_supported_openai_paramsnon_default_paramsoptional_paramsdrop_paramsc                 C   s   i }|  D ]\}}|dkr||d< q|dkr||d< q|dkr%||d< q|dkr.||d< q|dkr7||d< q|dkr@||d	< q|d
krI||d< q|dkrR||d< q|dkr[||d< q|dkrd||d< q|dkrm||d< q|dkrv||d< q|dkr||d< q|dkr||d< q|r||d< |S )NrB   r   r+   r   r$   rC   r%   rE   r)   rD   r"   r   r?   r    r#   r&   r!   Z
time_limitr(   
extra_body)r0   )r-   rG   rH   rA   rI   rJ   kvr6   r6   r7   map_openai_params   sD   












z$IBMWatsonXAIConfig.map_openai_paramsc                 C   s   ddddS )zK
        Common auth params across bedrock/vertex_ai/azure/watsonx
        Zwatsonx_projectZwatsonx_region_nameZwatsonx_token)projectZregion_nametokenr6   r-   r6   r6   r7   get_mapped_special_auth_params   s   z1IBMWatsonXAIConfig.get_mapped_special_auth_paramsc                 C   s2   |   }| D ]\}}||v r|||| < q|S r9   )rQ   r0   )r-   rG   rH   Zmapped_paramsr>   r5   r6   r6   r7   map_special_auth_params   s   z*IBMWatsonXAIConfig.map_special_auth_paramsc                 C   s   ddgS )k
        Source: https://www.ibm.com/docs/en/watsonx/saas?topic=integrations-regional-availability
        zeu-dezeu-gbr6   rP   r6   r6   r7   get_eu_regions   s   z!IBMWatsonXAIConfig.get_eu_regionsc                 C   s   dgS )rS   zus-southr6   rP   r6   r6   r7   get_us_regions   s   z!IBMWatsonXAIConfig.get_us_regionspromptc                 C   sH   | di }|| t||d}| j||d}|| di |d|S )z%Shared logic to build request payloadrJ   )paramsrA   )rA   Z
api_paramsr*   )inputr*   
parameters)popupdater   Z_prepare_payload)r-   rA   rV   rH   Zextra_body_paramsZwatsonx_api_paramsZwatsonx_auth_payloadr6   r6   r7   _build_request_payload   s   

z)IBMWatsonXAIConfig._build_request_payloadmessageslitellm_paramsheadersc           	         sB   ddl m} |dd }||||i dI dH }| j|||dS )z"Async version of transform_requestr   )#aconvert_watsonx_messages_to_prompt/rA   r]   providerZcustom_prompt_dictNrA   rV   rH   )Z!litellm.llms.watsonx.common_utilsr`   splitr\   )	r-   rA   r]   rH   r^   r_   r`   rc   rV   r6   r6   r7   atransform_request   s   	z%IBMWatsonXAIConfig.atransform_requestc                 C   s.   | dd }t|||i d}| j|||dS )z!Sync version of transform_requestra   r   rb   rd   )re   r   r\   )r-   rA   r]   rH   r^   r_   rc   rV   r6   r6   r7   transform_request  s   	z$IBMWatsonXAIConfig.transform_requestraw_responsemodel_responselogging_objrequest_dataencodingapi_key	json_modec                 C   s2  |j |d|jd | }d|vrtdd| d|d u r't|dd d}|d d	 d
 }|d d	 d }|d d	 d }||jd	 j_t	|d d	 d |jd	 _
|drz	t|d }W n tyx   t|d d d}Y nw t| |_ntt |_t|||| d}t|d| |S )N )rX   rm   original_responseresultsi  z-Error: Invalid response from Watsonx.ai API: )status_codemessageZmodel_id)rA   r   generated_textinput_token_countgenerated_token_countstop_reasonZ
created_atZz+00:00prompt_tokenscompletion_tokensZtotal_tokensusage)Z	post_calltextjsonr   r   getchoicesrs   contentr   finish_reasonr   fromisoformat
ValueErrorrstripint	timestampcreatedtimer   r1   )r-   rA   rh   ri   rj   rk   r]   rH   r^   rl   rm   rn   Z	json_resprt   rz   r{   Zcreated_datetimer|   r6   r6   r7   transform_response  sJ   
z%IBMWatsonXAIConfig.transform_responseapi_basec           
      C   s   | j |d}|dr(d|ddd  }|rtjjntjj}	|	j|d}	n|r-tj	ntj
}	|d|	 }| j||dd d}|S )N)r   zdeployment/ra      )deployment_idapi_version)urlr   )Z_get_base_url
startswithjoinre   r   Z!DEPLOYMENT_TEXT_GENERATION_STREAMr5   ZDEPLOYMENT_TEXT_GENERATIONformatZTEXT_GENERATION_STREAMZTEXT_GENERATIONr   Z_add_api_version_to_urlrZ   )
r-   r   rm   rA   rH   r^   r+   r   r   Zendpointr6   r6   r7   get_complete_urlW  s"   	

z#IBMWatsonXAIConfig.get_complete_urlstreaming_responsesync_streamc                 C   s   t |||dS )N)r   r   rn   )%WatsonxTextCompletionResponseIterator)r-   r   r   rn   r6   r6   r7   get_model_response_iteratorx  s
   z.IBMWatsonXAIConfig.get_model_response_iterator)NNNNNNNNNNNNNNN)NNr9   )F)5__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+   r8   classmethodr;   r@   rF   rM   rQ   rR   rT   rU   r\   r   rf   rg   httpxResponser   LiteLLMLoggingObjr   r   r
   r   r   r   __classcell__r6   r6   r=   r7   r   &   sT  
 %
	


*
	


	

?
%r   c                   @   s   e Zd ZdedefddZdS )r   chunkr,   c                 C   s   zP| dg }t|dkrH|d  dd}|d  d}|dk}t|||t|d  dd|d  dd|d  dd|d  dd d	d
W S tdddd d
W S  ty^ } z|d }~ww )Nrq   r   rt   ro   rw   Znot_finishedru   rv   ry   )r}   is_finishedr   r|   FrD   )r   lenr   r   	Exception)r-   r   rq   r}   r   r   er6   r6   r7   chunk_parser  s8   z2WatsonxTextCompletionResponseIterator.chunk_parserN)r   r   r   r   r   r   r6   r6   r6   r7   r     s    r   )&r   r   typingr   r   r   r   r   r   r	   r
   r   Z)litellm.llms.base_llm.base_model_iteratorr   Zlitellm.types.llms.openair   r   Zlitellm.types.llms.watsonxr   Zlitellm.types.utilsr   r   r   Zlitellm.utilsr   Zbase_llm.chat.transformationr   Zcommon_utilsr   r   r   r   Z*litellm.litellm_core_utils.litellm_loggingr   Z_LiteLLMLoggingObjr   r   r   r6   r6   r6   r7   <module>   s&    (  a