o
    ưiG                     @   s   d Z ddlZddlZddlZddl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 ddlmZmZmZmZ d	d
lmZ d	dlmZ eraddlm Z! e!Z"neZ"dZ#de$de%fddZ&G dd deZ'G dd deZ(dS )z^
GigaChat Chat Transformation

Transforms OpenAI-format requests to GigaChat format and back.
    N)TYPE_CHECKINGAnyAsyncIteratorIteratorListOptionalUnion)verbose_logger)
BaseConfigBaseLLMException)get_secret_str)AllMessageValues)ChoicesMessageModelResponseUsage   )get_access_token)upload_file_sync)Loggingz+https://gigachat.devices.sberbank.ru/api/v1valuereturnc                 C   s(   zt |  W dS  t jy   Y dS w )zAChecks whether the value passed is a valid serialized JSON stringFT)jsonloadsJSONDecodeError)r    r   `/home/app/Keep/.python/lib/python3.10/site-packages/litellm/llms/gigachat/chat/transformation.pyis_valid_json"   s   r   c                   @   s   e Zd ZdZdS )GigaChatErrorzGigaChat API error.N)__name__
__module____qualname____doc__r   r   r   r   r   ,   s    r   c                   @   s  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;dee dee dee
 dee dee ddfd	d
Z	d<dee dee dedededee defddZ		d=dededee dededee dee defddZdedee fddZdededededef
ddZdee dee fddZd eeef deeeef  fd!d"Zd#edee fd$d%Zdedee dedededefd&d'Zdee dee fd(d)Z		d=ded*ejd+ed,e d-edee deded.e!dee d/ee defd0d1Z"d2ed3e
deeej#f de$fd4d5Z%	6d>d7ee&e e'e ef d8ed/ee fd9d:Z(dS )?GigaChatConfiga  
    Configuration class for GigaChat API.

    GigaChat is Sber's (Russia's largest bank) LLM API.

    Supported parameters:
        temperature: Sampling temperature (0-2, default 0.87)
        top_p: Nucleus sampling parameter
        max_tokens: Maximum tokens to generate
        repetition_penalty: Repetition penalty factor
        profanity_check: Enable content filtering
        stream: Enable streaming
    Ntemperaturetop_p
max_tokensrepetition_penaltyprofanity_checkr   c           	      C   sJ   t   }| D ]\}}|dkr|d urt| j|| q	d | _d | _d S )Nself)localscopyitemssetattr	__class___current_credentials_current_api_base)	r)   r$   r%   r&   r'   r(   Zlocals_keyr   r   r   r   __init__G   s   

zGigaChatConfig.__init__api_baseapi_keymodeloptional_paramslitellm_paramsstreamc                 C   s   |pt dpt}| dS )z*Get complete API URL for chat completions.ZGIGACHAT_API_BASEz/chat/completions)r   GIGACHAT_BASE_URL)r)   r3   r4   r5   r6   r7   r8   baser   r   r   get_complete_urlW   s   

zGigaChatConfig.get_complete_urlheadersmessagesc           
      C   sL   |p	t dp	t d}t|d}	|| _|| _d|	 |d< d|d< d|d< |S )	z2
        Set up headers with OAuth token.
        ZGIGACHAT_CREDENTIALSZGIGACHAT_API_KEY)credentialszBearer Authorizationzapplication/jsonzContent-TypeAccept)r   r   r/   r0   )
r)   r<   r5   r=   r6   r7   r4   r3   r>   Zaccess_tokenr   r   r   validate_environmentd   s   
z#GigaChatConfig.validate_environmentc                 C   s   g dS )z+Return list of supported OpenAI parameters.)r8   r$   r%   r&   max_completion_tokensstoptoolstool_choice	functionsfunction_callresponse_formatr   )r)   r5   r   r   r   get_supported_openai_params   s   z*GigaChatConfig.get_supported_openai_paramsnon_default_paramsdrop_paramsc                 C   sX  |  D ]\}}|dkr||d< q|dkr#|dkrd|d< q||d< q|dkr,||d< q|dv r5||d< q|dkr:q|dkrF| ||d	< q|d
krX| |}|durW||d< q|d	kra||d	< q|dkrj||d< q|dkr|ddkr|di }|dd}	|di }
|	d|	 |
d}d	|vrg |d	< |d	 | d|	i|d< d|d< q|S )z-Map OpenAI parameters to GigaChat parameters.r8   r$   r   r%   )r&   rB   r&   rC   rD   rF   rE   NrG   rH   typejson_schemanameZstructured_outputschemazOutput structured response: rN   description
parametersT_structured_output)r,   _convert_tools_to_functions_map_tool_choicegetappend)r)   rJ   r6   r5   rK   paramr   Zmapped_choicerM   Zschema_namerO   Zfunction_defr   r   r   map_openai_params   sP   







z GigaChatConfig.map_openai_paramsrD   c              	   C   sV   g }|D ]$}| ddkr(| di }|| dd| dd| di d q|S )z9Convert OpenAI tools format to GigaChat functions format.rL   functionrN    rQ   rR   rP   )rV   rW   )r)   rD   rF   toolfuncr   r   r   rT      s   


z*GigaChatConfig._convert_tools_to_functionsrE   c                 C   s^   |dkrdS |dkrdS |dkrdS t |tr-|ddkr-|di d}|r-d|iS dS )a  
        Map OpenAI tool_choice to GigaChat function_call format.

        OpenAI format:
        - "auto": Call zero, one, or multiple functions (default)
        - "required": Call one or more functions
        - "none": Don't call any functions
        - {"type": "function", "function": {"name": "get_weather"}}: Force specific function

        GigaChat format:
        - "none": Disable function calls
        - "auto": Automatic mode (default)
        - {"name": "get_weather"}: Force specific function

        Args:
            tool_choice: OpenAI tool_choice value

        Returns:
            GigaChat function_call value or None
        noneautorequiredrL   rZ   rN   N)
isinstancedictrV   )r)   rE   	func_namer   r   r   rU      s   
zGigaChatConfig._map_tool_choice	image_urlc              
   C   sL   z
t || j| jdW S  ty% } ztd|  W Y d}~dS d}~ww )z
        Upload image to GigaChat and return file_id.

        Args:
            image_url: URL or base64 data URL of the image

        Returns:
            file_id string or None if upload failed
        )rd   r>   r3   zFailed to upload image: N)r   r/   r0   	Exceptionr	   error)r)   rd   er   r   r   _upload_image  s   
zGigaChatConfig._upload_imagec           	      C   sf   |  |}|dd|d}dD ]}||v r|| ||< qd|v r'|d |d< d|v r1|d |d< |S )z,Transform OpenAI request to GigaChat format.z	gigachat/r[   )r5   r=   )r$   r%   r&   r8   r'   r(   rF   rG   )_transform_messagesreplace)	r)   r5   r=   r6   r7   r<   Zgiga_messagesrequest_datar1   r   r   r   transform_request  s   


z GigaChatConfig.transform_requestc              	   C   s,  g }t |D ]\}}t|}|dd |dd}|dkr$d|d< n-|dkr1|dkr1d|d< n |dkrQd	|d< |d
d}t|trHt|sQtj|dd|d
< |d
du r\d|d
< |d
}t|t	rg }g }	|D ]A}
t|
tr|
ddkr|
|
dd ql|
ddkr|
di }t|tr|}n|dd}|r| |}|r|	
| ql|rd|nd|d
< |	r|	|d< |d}|rt|t	rt|dkr|d }|d	i }|dd}t|trzt|}W n tjy   i }Y nw |dd|d|d< |dd |
| q|S )z-Transform OpenAI messages to GigaChat format.rN   NroleuserZ	developersystemr   r\   rZ   contentr[   Fensure_asciirL   textrd   url
attachments
tool_calls	argumentsz{}rN   rx   rG   )	enumeraterb   poprV   ra   strr   r   dumpslistrW   rh   joinlenr   r   )r)   r=   Ztransformedimsgmessagerm   rp   Ztextsrv   partrd   rt   Zfile_idrw   Z	tool_callr]   argsr   r   r   ri   ?  sl   








 


z"GigaChatConfig._transform_messagesraw_responsemodel_responselogging_objrk   encoding	json_modec                 C   s  z|  }W n ty   t|jd|j dw |dd}g }|dg D ]}|di }|dd}|d	kr|d	r|d	 }|d
i }|rnt|trWt j|dd}nt	|}||d< |
d	d |
dd d}n.t|trzt j|dd}dt jdd  d|dd|ddg|d< |
d	d d}|
dd |t|ddt|dd|d|dd|d q'|di }t|dd|dd|d dd!}|d"d#t jdd$  |_|d%tt |_||_||_t|d| |S )&z-Transform GigaChat response to OpenAI format.zInvalid JSON response: )status_coder   rS   Fchoicesr   finish_reasonrC   rG   rx   rq   rp   NZfunctions_state_idZcall_   rZ   rN   r[   ry   )idrL   rZ   rw   indexr   rm   Z	assistant)rm   rp   rw   )r   r   r   usageprompt_tokenscompletion_tokenstotal_tokens)r   r   r   r   z	chatcmpl-   created)r   re   r   r   rs   rV   ra   rb   r}   r|   r{   uuiduuid4hexrW   r   r   r   r   inttimer   r5   r   r-   )r)   r5   r   r   r   rk   r=   r6   r7   r   r4   r   Zresponse_jsonZis_structured_outputr   choiceZmessage_datar   	func_callr   rp   Z
usage_datar   r   r   r   transform_response  sv   









"z!GigaChatConfig.transform_responseerror_messager   c                 C   s   t |||dS )zReturn GigaChat error class.)r   r   r<   )r   )r)   r   r   r<   r   r   r   get_error_class  s
   zGigaChatConfig.get_error_classFstreaming_responsesync_streamc                 C   s   ddl m} ||||dS )z#Return streaming response iterator.   )GigaChatModelResponseIterator)r   r   r   )Z	streamingr   )r)   r   r   r   r   r   r   r   get_model_response_iterator  s   z*GigaChatConfig.get_model_response_iterator)NNNNN)N)NN)F))r   r    r!   r"   r$   r   float__annotations__r%   r&   r   r'   r(   boolr2   r|   rb   r;   r   r   rA   rI   rY   rT   r   rU   rh   rl   ri   httpxResponser   LiteLLMLoggingObjr   r   ZHeadersr   r   r   r   r   r   r   r   r   r#   2   s  
 

	

9

*
&S	

]
r#   ))r"   r   r   r   typingr   r   r   r   r   r   r   r   Zlitellm._loggingr	   Z)litellm.llms.base_llm.chat.transformationr
   r   Zlitellm.secret_managers.mainr   Zlitellm.types.llms.openair   Zlitellm.types.utilsr   r   r   r   Zauthenticatorr   file_handlerr   Z*litellm.litellm_core_utils.litellm_loggingr   Z_LiteLLMLoggingObjr   r9   r|   r   r   r   r#   r   r   r   r   <module>   s*    $
