Ë
    uPêj¹G  ã                   ó  — U d Z ddlZddlZddlZddlmZmZ ddl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rddlZddlm Z! e!Z"ne	Z"dZ#e
e$d<   de%de&fd„Z' G d„ de«      Z( G d„ de«      Z)y)z^
GigaChat Chat Transformation

Transforms OpenAI-format requests to GigaChat format and back.
é    N)ÚAsyncIteratorÚIterator)ÚTYPE_CHECKINGÚAnyÚFinal)Ú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ÚGIGACHAT_BASE_URLÚvalueÚreturnc                 ób   — 	 t        j                  | «       y# t         j                  $ r Y yw xY w)zAChecks whether the value passed is a valid serialized JSON stringTF)ÚjsonÚloadsÚJSONDecodeError)r   s    ún/home/oem/CyberBrain26-unified/.venv/lib/python3.12/site-packages/litellm/llms/gigachat/chat/transformation.pyÚis_valid_jsonr   %   s2   € ðÜ�
‰
�5Ôð øô ×Ñò Ùðús   ‚ ˜.­.c                   ó   — e Zd ZdZy)ÚGigaChatErrorzGigaChat API error.N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__© ó    r   r   r   /   s   „ Úr%   r   c                   óÎ  — e Zd ZU dZdZedz  ed<   dZedz  ed<   dZe	dz  ed<   dZ
edz  ed<   dZedz  ed<   	 	 	 	 	 d.dedz  dedz  de	dz  dedz  dedz  ddfd	„Z	 d/d
edz  dedz  dededededz  defd„Z	 	 d0dededee   dedededz  d
edz  defd„Zdedee   fd„Zdededededef
d„Zdee   dee   fd„Zdeez  deez  dz  fd„Zdededz  fd„Zdedee   dedededefd„Zdee   dee   fd„Z	 	 d0ded ej8                  d!ed"ed#edee   deded$d%dedz  d&edz  defd'„Zd(ed)e	deej@                  z  de!fd*„Z"	 d1d+e#e   e$e   z  ez  d,ed&edz  fd-„Z%y)2Ú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                 óÀ   — t        «       j                  «       }|j                  «       D ]%  \  }}|dk7  sŒ|€Œt        | j                  ||«       Œ' d | _        d | _        y )NÚself)ÚlocalsÚcopyÚitemsÚsetattrÚ	__class__Ú_current_credentialsÚ_current_api_base)	r.   r(   r)   r*   r+   r,   Úlocals_Úkeyr   s	            r   Ú__init__zGigaChatConfig.__init__H   sX   € ô  ›Ÿ™›ˆØ!Ÿ-™-›/ò 	4‰JˆC�Ø�f‹} Ñ!2Ü˜Ÿ™¨¨UÕ3ð	4ð 15ˆÔ!Ø-1ˆÕr%   Úapi_baseÚapi_keyÚmodelÚoptional_paramsÚlitellm_paramsÚstreamc                 ó:   — |xs t        d«      xs t        }|› d�S )z*Get complete API URL for chat completions.ÚGIGACHAT_API_BASEz/chat/completions)r   r   )r.   r9   r:   r;   r<   r=   r>   Úbases           r   Úget_complete_urlzGigaChatConfig.get_complete_urlX   s(   € ð ÒZ¤.Ð1DÓ"EÒZÔIZˆØ�Ð(Ð)Ð)r%   ÚheadersÚmessagesc                 ó–   — |xs t        d«      xs t        d«      }t        |¬«      }	|| _        || _        d|	› �|d<   d|d<   d|d<   |S )	z2
        Set up headers with OAuth token.
        ÚGIGACHAT_CREDENTIALSÚGIGACHAT_API_KEY)ÚcredentialszBearer ÚAuthorizationzapplication/jsonzContent-TypeÚAccept)r   r   r4   r5   )
r.   rC   r;   rD   r<   r=   r:   r9   rH   Úaccess_tokens
             r   Úvalidate_environmentz#GigaChatConfig.validate_environmente   sf   € ð %Òt¬Ð7MÓ(NÒtÔR`ÐasÓRtˆÜ.¸;ÔGˆð %0ˆÔ!Ø!)ˆÔà%,¨\¨NÐ#;ˆ�Ñ Ø"4ˆ�ÑØ.ˆ�Ñàˆr%   c                 ó
   — g d¢S )z+Return list of supported OpenAI parameters.)r>   r(   r)   r*   Úmax_completion_tokensÚstopÚtoolsÚtool_choiceÚ	functionsÚfunction_callÚresponse_formatr$   )r.   r;   s     r   Úget_supported_openai_paramsz*GigaChatConfig.get_supported_openai_params€   s   € ò
ð 	
r%   Únon_default_paramsÚdrop_paramsc                 óV  — |j                  «       D �]  \  }}|dk(  r||d<   Œ|dk(  r|dk(  rd|d<   Œ"||d<   Œ(|dk(  r||d<   Œ3|dv r||d<   Œ=|dk(  rŒC|dk(  r| j                  |«      |d	<   Œ]|d
k(  r| j                  |«      }|€Œv||d<   Œ||d	k(  r||d	<   Œ‡|dk(  r||d<   Œ’|dk(  sŒ˜|j                  d«      dk(  sŒ­|j                  di «      }|j                  dd«      }	|j                  di «      }
|	d|	› �|
dœ}d	|vrg |d	<   |d	   j	                  |«       d|	i|d<   d|d<   �Œ |S )z-Map OpenAI parameters to GigaChat parameters.r>   r(   r   r)   )r*   rN   r*   rO   rP   rR   rQ   rS   rT   ÚtypeÚjson_schemaÚnameÚstructured_outputÚschemazOutput structured response: ©r[   ÚdescriptionÚ
parametersTÚ_structured_output)r1   Ú_convert_tools_to_functionsÚ_map_tool_choiceÚgetÚappend)r.   rV   r<   r;   rW   Úparamr   Úmapped_choicerZ   Úschema_namer]   Úfunction_defs               r   Úmap_openai_paramsz GigaChatConfig.map_openai_params�   sŸ  € ð /×4Ñ4Ó6ó -	A‰LˆE�5Ø˜Ò Ø,1� Ò)Ø˜-Ò'à˜A’:Ø/0�O GÒ,à5:�O MÒ2Ø˜'Ò!Ø+0� Ò(ØÐAÑAØ05� Ò-Ø˜&’àØ˜'Ò!à/3×/OÑ/OÐPUÓ/V� Ò,Ø˜-Ò'à $× 5Ñ 5°eÓ <�Ø Ñ,Ø7D�O OÒ4Ø˜+Ò%Ø/4� Ò,Ø˜/Ò)Ø38� Ò0ØÐ+Ó+à—9‘9˜VÓ$¨Ó5Ø"'§)¡)¨M¸2Ó">�KØ"-§/¡/°&Ð:MÓ"N�KØ(Ÿ_™_¨X°rÓ:�Fð !,Ø)EÀkÀ]Ð'SØ&,ñ$�Lð #¨/Ñ9Ø79˜¨Ñ4Ø# KÑ0×7Ñ7¸ÔEØ8>ÀÐ7L�O OÑ4Ø<@�OÐ$8Ó9ð[-	Að^ Ðr%   rP   c           	      óð   — g }|D ]n  }|j                  d«      dk(  sŒ|j                  di «      }|j                  |j                  dd«      |j                  dd«      |j                  di «      dœ«       Œp |S )z9Convert OpenAI tools format to GigaChat functions format.rY   Úfunctionr[   Ú r_   r`   r^   )rd   re   )r.   rP   rR   ÚtoolÚfuncs        r   rb   z*GigaChatConfig._convert_tools_to_functionsÉ   s|   € àˆ	Øò 		ˆDØ�x‰x˜Ó :Ó-Ø—x‘x 
¨BÓ/�Ø× Ñ à $§¡¨°Ó 4Ø'+§x¡x°¸rÓ'BØ&*§h¡h¨|¸RÓ&@ñõð		ð Ðr%   rQ   c                 ó¾   — |dk(  ry|dk(  ry|dk(  ryt        |t        «      r;|j                  d«      dk(  r'|j                  di «      j                  d«      }|rd|iS y)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ÚrequiredrY   rl   r[   N)Ú
isinstanceÚdictrd   )r.   rQ   Ú	func_names      r   rc   zGigaChatConfig._map_tool_choiceØ   sr   € ð* ˜&Ò ØØ˜FÒ"ØØ˜JÒ&ð Ü˜¤TÔ*ð �‰˜vÓ&¨*Ò4Ø#.§?¡?°:¸rÓ#B×#FÑ#FÀvÓ#N�	ÙØ" IÐ.Ð.ð r%   Ú	image_urlc                 ó    — 	 t        || j                  | j                  ¬«      S # t        $ r }t	        j
                  d|«       Y d}~yd}~ww xY 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
        )rw   rH   r9   zFailed to upload image: %sN)r   r4   r5   Ú	Exceptionr   Úerror)r.   rw   Úes      r   Ú_upload_imagezGigaChatConfig._upload_image   sO   € ð	Ü#Ø#Ø ×5Ñ5Ø×/Ñ/ôð øô
 ò 	Ü× Ñ Ð!=¸qÔAÜûð	ús   ‚!$ ¤	A­AÁAc                 óª   — | j                  |«      }|j                  dd«      |dœ}dD ]  }||v sŒ||   ||<   Œ d|v r|d   |d<   d|v r|d   |d<   |S )z,Transform OpenAI request to GigaChat format.z	gigachat/rm   )r;   rD   )r(   r)   r*   r>   r+   r,   rR   rS   )Ú_transform_messagesÚreplace)	r.   r;   rD   r<   r=   rC   Úgiga_messagesÚrequest_datar7   s	            r   Útransform_requestz GigaChatConfig.transform_request  sŽ   € ð  $×7Ñ7¸ÓAˆð —]‘] ;°Ó3Ø%ñ
ˆð
ò 		9ˆCð �oÒ%Ø$3°CÑ$8�˜SÒ!ð		9ð ˜/Ñ)Ø(7¸Ñ(DˆL˜Ñ%Ø˜oÑ-Ø,;¸OÑ,LˆL˜Ñ)àÐr%   c                 óN  — g }t        |«      D �]x  \  }}t        |«      }|j                  dd«       |j                  dd«      }|dk(  rd|d<   na|dk(  r|dkD  rd|d<   nQ|dk(  rLd	|d<   |j                  d
d«      }t	        |t
        «      rt        |«      st        j                  |d¬«      |d
<   |j                  d
«      €d|d
<   |j                  d
«      }t	        |t        «      råg }g }	|D ]½  }
t	        |
t        «      sŒ|
j                  d«      dk(  r"|j                  |
j                  dd«      «       ŒJ|
j                  d«      dk(  sŒ_|
j                  di «      }t	        |t
        «      r|}n|j                  dd«      }|sŒ™| j                  |«      }|sŒ­|	j                  |«       Œ¿ |rdj                  |«      nd|d
<   |	r|	|d<   |j                  d«      }|r—t	        |t        «      r‡t        |«      dkD  ry|d   }|j                  d	i «      }|j                  dd«      }t	        |t
        «      r	 t        j                  |«      }|j                  dd«      |dœ|d<   |j                  dd«       |j                  |«       �Œ{ |S # t        j                  $ r i }Y ŒWw xY w)z-Transform OpenAI messages to GigaChat format.r[   NÚroleÚuserÚ	developerÚsystemr   rn   rl   Úcontentrm   F©Úensure_asciirY   Útextrw   Úurlú
ÚattachmentsÚ
tool_callsÚ	argumentsz{}©r[   r�   rS   )Ú	enumerateru   Úpoprd   rt   Ústrr   r   ÚdumpsÚlistre   r|   ÚjoinÚlenr   r   )r.   rD   ÚtransformedÚiÚmsgÚmessager„   rˆ   ÚtextsrŽ   Úpartrw   rŒ   Úfile_idr�   Ú	tool_callro   Úargss                     r   r~   z"GigaChatConfig._transform_messages:  s—  € àˆä Ó)ó @	(‰FˆAˆsÜ˜3“iˆGð �K‰K˜ Ô%ð —;‘;˜v vÓ.ˆDØ�{Ò"Ø"*�˜’Ø˜Ò! a¨!¢eà"(�˜’Ø˜’Ø",�˜‘Ø!Ÿ+™+ i°Ó4�Ü! '¬3Ô/´}ÀWÔ7MÜ)-¯©°GÈ%Ô)P�G˜IÑ&ð �{‰{˜9Ó%Ð-Ø%'�˜	Ñ"ð —k‘k )Ó,ˆGÜ˜'¤4Ô(Ø�Ø �Ø#ò @�DÜ! $¬Õ-ØŸ8™8 FÓ+¨vÒ5Ø!ŸL™L¨¯©°&¸"Ó)=Õ>Ø!ŸX™X fÓ-°Ó<à(,¯©°¸bÓ(A˜IÜ)¨)´SÔ9Ø&/¡à&/§m¡m°E¸2Ó&> Ú"Ø*.×*<Ñ*<¸SÓ*A Ú#*Ø$/×$6Ñ$6°wÕ$?ð@ñ :? T§Y¡Y¨uÔ%5ÀB�˜	Ñ"ÙØ-8�G˜MÑ*ð !Ÿ™ \Ó2ˆJÙœj¨´TÔ:¼sÀ:»ÐQRÒ?RØ& q™M�	Ø —}‘} Z°Ó4�Ø—x‘x ¨TÓ2�Ü˜d¤CÔ(ð"Ü#Ÿz™z¨$Ó/˜ð !ŸH™H V¨RÓ0Ø!%ñ,�˜Ñ(ð —‘˜L¨$Ô/à×Ñ˜wÖ'ðA@	(ðD Ðøô  ×/Ñ/ò "Ø!šð"ús   È7JÊJ$Ê#J$Úraw_responseÚmodel_responseÚlogging_objr�   Úencodingztiktoken.Encoding | NoneÚ	json_modec                 óÜ  — 	 |j                  «       }|j                  dd«      }g }|j                  dg «      D �]©  }|j                  di «      }|j                  dd«      }|d	k(  �r|j                  d	«      rò|d	   }|j                  d
i «      }|r_t        |t        «      rt        j                  |d¬«      }nt        |«      }||d<   |j                  d	d«       |j                  dd«       d}nzt        |t        «      rt        j                  |d¬«      }dt        j                  «       j                  dd › �d|j                  dd«      |dœdœg|d<   |j                  d	d«       d}|j                  dd«       |j                  t        |j                  dd«      t!        |j                  dd«      |j                  d«      |j                  d«      ¬«      |¬«      «       �Œ¬ |j                  di «      }t#        |j                  dd«      |j                  dd«      |j                  d d«      ¬!«      }|j                  d"d#t        j                  «       j                  dd$ › �«      |_        |j                  d%t'        t)        j(                  «       «      «      |_        ||_        ||_        t1        |d|«       |S # t        $ r% t        |j                  d|j                  › �¬«      ‚w xY w)&z-Transform GigaChat response to OpenAI format.zInvalid JSON response: )Ústatus_coderœ   ra   FÚchoicesrœ   Úfinish_reasonrO   rS   r�   r‰   rˆ   NÚfunctions_state_idÚcall_é   rl   r[   rm   r‘   )ÚidrY   rl   r�   Úindexr   r„   Ú	assistant)r„   rˆ   r�   )r¯   rœ   rª   ÚusageÚprompt_tokensÚcompletion_tokensÚtotal_tokens)r²   r³   r´   r®   z	chatcmpl-é   Úcreated)r   ry   r   r¨   r‹   rd   rt   ru   r•   r”   r“   ÚuuidÚuuid4Úhexre   r   r   r   r®   ÚintÚtimer¶   r;   r©   r2   )r.   r;   r¢   r£   r¤   r�   rD   r<   r=   r¥   r:   r¦   Úresponse_jsonÚis_structured_outputr©   ÚchoiceÚmessage_datarª   Ú	func_callr¡   rˆ   Ú
usage_datar±   s                          r   Útransform_responsez!GigaChatConfig.transform_response‚  sÙ  € ð	Ø#/×#4Ñ#4Ó#6ˆMð '6×&9Ñ&9Ð:NÐPUÓ&VÐàˆØ#×'Ñ'¨	°2Ó6ó 1	ˆFØ!Ÿ:™: i°Ó4ˆLØ"ŸJ™J ¸Ó?ˆMð  Ó/°L×4DÑ4DÀ_Ô4UØ(¨Ñ9�	Ø —}‘} [°"Ó5�á'ä! $¬Ô-Ü"&§*¡*¨TÀÔ"F™ä"% d£)˜Ø.5�L Ñ+Ø ×$Ñ$ _°dÔ;Ø ×$Ñ$Ð%9¸4Ô@Ø$*‘Mô " $¬Ô-Ü#Ÿz™z¨$¸UÔC˜ð %*¬$¯*©*«,×*:Ñ*:¸3¸BÐ*?Ð)@Ð"AØ$.à(1¯©°f¸bÓ(AØ-1ñ)ñð	2�L Ñ.ð !×$Ñ$ _°dÔ;Ø$0�Mð ×ÑÐ1°4Ô8à�N‰NÜØ Ÿ*™* W¨aÓ0Ü#Ø)×-Ñ-¨f°kÓBØ ,× 0Ñ 0°Ó ;Ø#/×#3Ñ#3°LÓ#Aôð
 #0ôö
ðO1	ðh *×-Ñ-¨g°rÓ:ˆ
ÜØ$Ÿ.™.¨¸!Ó<Ø(Ÿn™nÐ-@À!ÓDØ#Ÿ™¨¸Ó:ô
ˆð *×-Ñ-¨d°iÄÇ
Á
Ã×@PÑ@PÐQTÐRTÐ@UÐ?VÐ4WÓXˆÔØ!.×!2Ñ!2°9¼cÄ$Ç)Á)Ã+Ó>NÓ!OˆÔØ$ˆÔØ!(ˆÔÜ� ¨Ô/àÐøôU ò 	ÜØ(×4Ñ4Ø1°,×2CÑ2CÐ1DÐEôð ð	ús   ‚J= Ê=.K+Úerror_messager¨   c                 ó   — t        |||¬«      S )zReturn GigaChat error class.)r¨   rœ   rC   )r   )r.   rÃ   r¨   rC   s       r   Úget_error_classzGigaChatConfig.get_error_classß  s   € ô Ø#Ø!Øô
ð 	
r%   Ústreaming_responseÚsync_streamc                 ó$   — ddl m}  ||||¬«      S )z#Return streaming response iterator.é   )ÚGigaChatModelResponseIterator)rÆ   rÇ   r¦   )Ú	streamingrÊ   )r.   rÆ   rÇ   r¦   rÊ   s        r   Úget_model_response_iteratorz*GigaChatConfig.get_model_response_iteratorì  s   € õ 	=á,Ø1Ø#Øô
ð 	
r%   )NNNNN)N)NN)F)&r    r!   r"   r#   r(   ÚfloatÚ__annotations__r)   r*   rº   r+   r,   Úboolr8   r”   ru   rB   r–   r   rL   rU   rj   rb   rc   r|   r‚   r~   ÚhttpxÚResponser   ÚLiteLLMLoggingObjrÂ   ÚHeadersr
   rÅ   r   r   rÌ   r$   r%   r   r'   r'   3   s’  … ñð !%€K�˜‘Ó$Ø€Eˆ5�4‰<ÓØ!€J��d‘
Ó!Ø'+Ð˜ ™Ó+Ø#'€O�T˜D‘[Ó'ð %)Ø"Ø!%Ø+/Ø'+ñ2à˜T‘\ð2ð �t‰|ð2ð ˜$‘Jð	2ð
 " D™Lð2ð  ™ð2ð 
ó2ð. #ñ*à˜‘*ð*ð �t‘ð*ð ð	*ð
 ð*ð ð*ð �t‘ð*ð 
ó*ð( #Ø#ñàðð ðð Ð'Ñ(ð	ð
 ðð ðð �t‘ðð ˜‘*ðð 
óð6
°ð 
¸¸c¹ó 
ð 7à ð7ð ð7ð ð	7ð
 ð7ð 
ó7ðr°°d±ð ÀÀTÁ
ó ð&¨C°$©Jð &¸3À¹:ÈÑ;Ló &ðP sð ¨s°T©zó ð($àð$ð Ð'Ñ(ð$ð ð	$ð
 ð$ð ð$ð 
ó$ðLF¨DÐ1AÑ,Bð FÀtÈDÁzó Fðf #Ø!%ñ[àð[ð —n‘nð[ð &ð	[ð
 'ð[ð ð[ð Ð'Ñ(ð[ð ð[ð ð[ð -ð[ð �t‘ð[ð ˜$‘;ð[ð 
ó[ðz
àð
ð ð
ð ˜Ÿ™Ñ%ð	
ð
 
ó
ð" "'ñ	
à$ S™M¨M¸#Ñ,>Ñ>ÀÑNð
ð ð
ð ˜$‘;ô	
r%   r'   )*r#   r   r»   r·   Úcollections.abcr   r   Útypingr   r   r   rÐ   Úlitellm._loggingr   Ú)litellm.llms.base_llm.chat.transformationr	   r
   Úlitellm.secret_managers.mainr   Úlitellm.types.llms.openair   Úlitellm.types.utilsr   r   r   r   Úauthenticatorr   Úfile_handlerr   ÚtiktokenÚ*litellm.litellm_core_utils.litellm_loggingr   Ú_LiteLLMLoggingObjrÒ   r   rÎ   r”   rÏ   r   r   r'   r$   r%   r   ú<module>rà      sŠ   ðòó Û Û ß 3ß ,Ñ ,ã å +ß RÝ 7Ý 6ß FÓ Få ,Ý +áÛåXà*ÑàÐð IÐ �5Ó Hð˜ð  ó ôÐ$ô ôF
�Zõ F
r%   