o
    ưi                  
   @   sP  U d Z ddlZddlZddlZddlZddlmZmZ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i Zeeef ed
< dedefddZdedeeeeef  fddZdedeeeef fddZdedeeeef fddZ		ddedee dee dee fddZ		ddedee dee dee fddZdS )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)DictOptionalTuple)verbose_logger)_get_httpx_clientget_async_httpx_client)LlmProviders   )get_access_tokenget_access_token_asyncz+https://gigachat.devices.sberbank.ru/api/v1_file_cacheurlreturnc                 C   s   t |   S )z*Generate hash for URL to use as cache key.)hashlibsha256encode	hexdigest)r    r   Y/home/app/Keep/.python/lib/python3.10/site-packages/litellm/llms/gigachat/file_handler.py_get_url_hash   s   r   data_urlc                 C   sX   t d| }|s
dS |d}|d}t|}|dd dd p&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_typeZbase64_datacontent_bytesextr   r   r   _parse_data_url#   s   



r%   c                 C   sV   t ddid}|| }|  |jdd}|dd dd	 p$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$   r   r   r   _download_image_sync6   s   
r2   c                    sb   t tjddid}|| I dH }|  |jdd}|dd d	d
 p*d}|j||fS )z'Download image from URL asynchronously.r&   FZllm_providerr(   Nr)   r*   r   r   r   r   r   )r   r   GIGACHATr+   r,   r-   r!   r.   r/   r   r   r   _download_image_asyncB   s   r5   	image_urlcredentialsapi_basec              
   C   sV  t | }|tv rtd|dd  d t| S zvt| }|r+|\}}}td ntd| dd  d t| \}}}t  d| }t|}	|pOt	}
|
 d	}t
d
did}|j|dd|	 id|||fiddidd}|  | }|d}|r|t|< td|  |W S  ty } ztd|  W Y d}~dS d}~w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: N   ...Decoded base64 imageDownloading image from URL: P   ./filesr&   Fr'   AuthorizationBearer filepurposegeneral<   r-   filesdatatimeoutid%File uploaded successfully, file_id: "Error uploading file to GigaChat: )r   r   r   debugr%   r2   uuiduuid4r
   GIGACHAT_BASE_URLr   postr,   jsonr+   	Exceptionerrorr6   r7   r8   Zurl_hashparsedr#   r"   r$   filenameZaccess_tokenbase_urlZ
upload_urlr0   r1   resultZfile_ider   r   r   upload_file_syncQ   sF   


r\   c              
      sn  t | }|tv rtd|dd  d t| S zt| }|r,|\}}}td ntd| dd  d t| I dH \}}}t  d| }t|I dH }	|pVt	}
|
 d	}t
tjd
did}|j|dd|	 id|||fiddiddI dH }|  | }|d}|r|t|< td|  |W S  ty } ztd|  W Y d}~dS d}~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
    r9   Nr:   r;   r<   r=   r>   r?   r@   r&   Fr3   rA   rB   rC   rD   rE   rF   rG   rK   rL   rM   )r   r   r   rN   r%   r5   rO   rP   r   rQ   r   r   r4   rR   r,   rS   r+   rT   rU   rV   r   r   r   upload_file_async   sN   


r]   )NN)__doc__r   r   r   rO   typingr   r   r   Zlitellm._loggingr   Z&litellm.llms.custom_httpx.http_handlerr   r   Zlitellm.types.utilsr   Zauthenticatorr
   r   rQ   r   str__annotations__r   bytesr%   r2   r5   r\   r]   r   r   r   r   <module>   sL     
C