Ë
    uPêjº  ã            
       ód  — U d Z ddlZddlZddlZddlZddlm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 d	Zeed
<   i Zeeeef      ed<   dedefd„Zdedeeeef   dz  fd„Zdedeeeef   fd„Zdedeeeef   fd„Z	 	 ddededz  dedz  dedz  fd„Z	 	 ddededz  dedz  dedz  fd„Zy)z�
GigaChat File Handler

Handles file uploads to GigaChat API for image processing.
GigaChat requires files to be uploaded first, then referenced by file_id.
é    N)ÚFinal)Úverbose_logger)Ú_get_httpx_clientÚget_async_httpx_client)ÚLlmProvidersé   )Úget_access_tokenÚget_access_token_asyncz+https://gigachat.devices.sberbank.ru/api/v1ÚGIGACHAT_BASE_URLÚ_file_cacheÚurlÚreturnc                 ód   — t        j                  | j                  «       «      j                  «       S )z*Generate hash for URL to use as cache key.)ÚhashlibÚsha256ÚencodeÚ	hexdigest)r   s    úg/home/oem/CyberBrain26-unified/.venv/lib/python3.12/site-packages/litellm/llms/gigachat/file_handler.pyÚ_get_url_hashr      s    € ä�>‰>˜#Ÿ*™*›,Ó'×1Ñ1Ó3Ð3ó    Údata_urlc                 ó   — t        j                  d| «      }|sy|j                  d«      }|j                  d«      }t        j                  |«      }|j                  d«      d   j                  d«      d   xs d	}|||fS )
zx
    Parse data URL (base64 image).

    Returns:
        Tuple of (content_bytes, content_type, extension) or None
    zdata:([^;]+);base64,(.+)Nr   é   ú/éÿÿÿÿú;r   Újpg)ÚreÚmatchÚgroupÚbase64Ú	b64decodeÚsplit)r   r   Úcontent_typeÚbase64_dataÚcontent_bytesÚexts         r   Ú_parse_data_urlr(   #   s|   € ô —8‘8Ð7¸ÓB€EÙØàŸ+™+ a›.€LØŸ™ Q›€KÜ!×+Ñ+¨KÓ8€MØ×#Ñ# CÓ(¨Ñ,×2Ñ2°3Ó7¸Ñ:ÒC¸e€Cà˜,¨Ð+Ð+r   c                 ó
  — t        ddi¬«      }|j                  | «      }|j                  «        |j                  j                  dd«      }|j	                  d«      d   j	                  d«      d	   xs d
}|j
                  ||fS )z&Download image from URL synchronously.Ú
ssl_verifyF©Úparamsúcontent-typeú
image/jpegr   r   r   r   r   )r   ÚgetÚraise_for_statusÚheadersr#   Úcontent©r   ÚclientÚresponser$   r'   s        r   Ú_download_image_syncr6   6   s   € ä%¨l¸EÐ-BÔC€FØ—j‘j “o€HØ×ÑÔà"×*Ñ*×.Ñ.¨~¸|ÓL€LØ×#Ñ# CÓ(¨Ñ,×2Ñ2°3Ó7¸Ñ:ÒC¸e€Cà×Ñ˜\¨3Ð.Ð.r   c              ƒ   óD  K  — t        t        j                  ddi¬«      }|j                  | «      ƒ d{  –—† }|j	                  «        |j
                  j                  dd«      }|j                  d«      d   j                  d	«      d
   xs d}|j                  ||fS 7 Œi­w)z'Download image from URL asynchronously.r*   F©Úllm_providerr,   Nr-   r.   r   r   r   r   r   )r   r   ÚGIGACHATr/   r0   r1   r#   r2   r3   s        r   Ú_download_image_asyncr;   B   s™   è ø€ ä*Ü!×*Ñ*Ø˜eÐ$ô€Fð #ŸJ™J s›O×+€HØ×ÑÔà"×*Ñ*×.Ñ.¨~¸|ÓL€LØ×#Ñ# CÓ(¨Ñ,×2Ñ2°3Ó7¸Ñ:ÒC¸e€Cà×Ñ˜\¨3Ð.Ð.ð ,ús   ‚2B ´BµA*B Ú	image_urlÚcredentialsÚapi_basec                 óÖ  — t        | «      }|t        v r"t        j                  d|dd «       t        |   S 	 t	        | «      }|r|\  }}}t        j                  d«       n(t        j                  d| dd «       t        | «      \  }}}t        j                  «       › d|› �}t        |«      }	|xs t        }
|
› d�}t        d	d
i¬«      }|j                  |dd|	› �id|||fiddid¬«      }|j                  «        |j                  «       }|j                  d«      }|r|t        |<   t        j                  d|«       |S # t        $ r }t        j                   d|«       Y d}~yd}~ww xY w)a  
    Upload file to GigaChat and return file_id (sync).

    Args:
        image_url: URL or base64 data URL of the image
        credentials: GigaChat credentials for auth
        api_base: Optional custom API base URL

    Returns:
        file_id string or None if upload failed
    úImage found in cache: %s...Né   úDecoded base64 imageú!Downloading image from URL: %s...éP   ú.ú/filesr*   Fr+   ÚAuthorizationúBearer ÚfileÚpurposeÚgeneralé<   ©r1   ÚfilesÚdataÚtimeoutÚidú'File uploaded successfully, file_id: %sú$Error uploading file to GigaChat: %s)r   r   r   Údebugr(   r6   ÚuuidÚuuid4r	   r   r   Úpostr0   Újsonr/   Ú	ExceptionÚerror©r<   r=   r>   Úurl_hashÚparsedr&   r$   r'   ÚfilenameÚaccess_tokenÚbase_urlÚ
upload_urlr4   r5   ÚresultÚfile_idÚes                    r   Úupload_file_syncre   Q   sˆ  € ô  $ IÓ.€Hð ”;ÑÜ×ÑÐ:¸HÀSÀb¸MÔJÜ˜8Ñ$Ð$ð'ä'¨	Ó2ˆÙØ/5Ñ,ˆM˜<¨Ü× Ñ Ð!7Õ8ä× Ñ Ð!DÀiÐPSÐQSÀnÔUÜ/CÀIÓ/NÑ,ˆM˜<¨ä!ŸZ™Z›\˜N¨!¨C¨5Ð1ˆô /¨{Ó;ˆð #Ò7Ô&7ˆØ'˜j¨Ð/ˆ
ä)°,ÀÐ1FÔGˆØ Ÿ+™+ØØ$¨°¨~Ð&>Ð?Ø˜H m°\ÐBÐCØ˜YÐ'Øð &ó 
ˆð 	×!Ñ!Ô#Ø Ÿ™›ˆàŸ™ DÓ)ˆÙØ$+ŒK˜Ñ!Ü× Ñ Ð!JÈGÔTàˆøäò Ü×ÑÐCÀQÔGÜûðús   ·DD? Ä?	E(ÅE#Å#E(c              ƒ   ó8  K  — t        | «      }|t        v r"t        j                  d|dd «       t        |   S 	 t	        | «      }|r|\  }}}t        j                  d«       n0t        j                  d| dd «       t        | «      ƒ d{  –—† \  }}}t        j                  «       › d|› �}t        |«      ƒ d{  –—† }	|xs t        }
|
› d�}t        t        j                  d	d
i¬«      }|j                  |dd|	› �id|||fiddid¬«      ƒ d{  –—† }|j                  «        |j                  «       }|j!                  d«      }|r|t        |<   t        j                  d|«       |S 7 ŒÞ7 Œ°7 Œ\# t"        $ r }t        j$                  d|«       Y d}~yd}~ww xY w­w)a  
    Upload file to GigaChat and return file_id (async).

    Args:
        image_url: URL or base64 data URL of the image
        credentials: GigaChat credentials for auth
        api_base: Optional custom API base URL

    Returns:
        file_id string or None if upload failed
    r@   NrA   rB   rC   rD   rE   rF   r*   Fr8   rG   rH   rI   rJ   rK   rL   rM   rQ   rR   rS   )r   r   r   rT   r(   r;   rU   rV   r
   r   r   r   r:   rW   r0   rX   r/   rY   rZ   r[   s                    r   Úupload_file_asyncrg   ’   s¹  è ø€ ô  $ IÓ.€Hð ”;ÑÜ×ÑÐ:¸HÀSÀb¸MÔJÜ˜8Ñ$Ð$ð*ä'¨	Ó2ˆÙØ/5Ñ,ˆM˜<¨Ü× Ñ Ð!7Õ8ä× Ñ Ð!DÀiÐPSÐQSÀnÔUÜ5JÈ9Ó5U×/UÑ,ˆM˜<¨ä!ŸZ™Z›\˜N¨!¨C¨5Ð1ˆô %;¸;Ó$G×Gˆð #Ò7Ô&7ˆØ'˜j¨Ð/ˆ
ä.Ü%×.Ñ.Ø  %Ð(ô
ˆð !'§¡ØØ$¨°¨~Ð&>Ð?Ø˜H m°\ÐBÐCØ˜YÐ'Øð !,ó !
÷ 
ˆð 	×!Ñ!Ô#Ø Ÿ™›ˆàŸ™ DÓ)ˆÙØ$+ŒK˜Ñ!Ü× Ñ Ð!JÈGÔTàˆð= 0Vøð
 Høð
ùô" ò Ü×ÑÐCÀQÔGÜûðüsg   ‚6F¹AE. Â	E(Â
/E. Â9E*Â:AE. ÄE,ÄAE. Å'FÅ(E. Å*E. Å,E. Å.	FÅ7FÆFÆFÆF)NN)Ú__doc__r!   r   r   rU   Útypingr   Úlitellm._loggingr   Ú&litellm.llms.custom_httpx.http_handlerr   r   Úlitellm.types.utilsr   Úauthenticatorr	   r
   r   Ú__annotations__r   ÚdictÚstrr   ÚtupleÚbytesr(   r6   r;   re   rg   © r   r   ú<module>rt      sD  ðòó Û Û 	Û Ý å +÷õ -ç Cð IÐ �5Ó Hð &(€ˆU�4˜˜S˜‘>Ñ"Ó 'ð4�sð 4˜só 4ð
,˜cð , e¨E°3¸¨OÑ&<¸tÑ&Có ,ð&	/˜cð 	/ e¨E°3¸¨OÑ&<ó 	/ð/ Sð /¨U°5¸#¸s°?Ñ-Có /ð" #Øñ>Øð>à�t‘ð>ð �D‰jð>ð 	ˆ4�Zó	>ðF #ØñAØðAà�t‘ðAð �D‰jðAð 	ˆ4�Zô	Ar   