o
    :/i                     @   s   d dl mZ d dlm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mZ G d
d deej ZG dd deej ZdS )    )BytesIO)PathN)Imagetensor2base64   )convert_image_modergba_to_rgb   )MediaIOMediaWithBytesc                       s   e Zd ZdZddeddf fddZdejeej B dejfd	d
Zde	deej fddZ
dededeej fddZdedeej fddZdddejdedefddZ  ZS )ImageMediaIOzConfiguration values can be user-provided either by --media-io-kwargs or
    by the runtime API field "media_io_kwargs". Ensure proper validation and
    error handling.
    RGB
image_modereturnNc                    sn   t    || _|| _|dd}t|trt|}t|tr.t|dkr.t	dd |D s2t
d|| _d S )Nrgba_background_color)   r   r      c                 s   s2    | ]}t |tod |  kodkn  V  qdS )r   r   N)
isinstanceint).0c r   h/lsinfo/ai/hellotax_ai/llm_service/venv_vllm/lib/python3.10/site-packages/vllm/multimodal/media/image.py	<genexpr>.   s   0 z(ImageMediaIO.__init__.<locals>.<genexpr>zRrgba_background_color must be a list or tuple of 3 integers in the range [0, 255].)super__init__r   kwargsgetr   listtuplelenall
ValueErrorr   )selfr   r   rgba_bg	__class__r   r   r      s   


zImageMediaIO.__init__imagec                 C   sL   t |tr|j}|j| jkr|S |jdkr | jdkr t|| jS t|| jS )z0Convert image mode with custom background color.RGBAr   )r   r   mediamoder   r	   r   r   )r$   r(   r   r   r   _convert_image_mode6   s   
z ImageMediaIO._convert_image_modedatac                 C   s   t t|}t| ||S N)r   openr   r   r,   )r$   r-   r(   r   r   r   
load_bytesC   s   zImageMediaIO.load_bytes
media_typec                 C      |  tj|ddS NT)validater0   pybase64	b64decoder$   r1   r-   r   r   r   load_base64G      zImageMediaIO.load_base64filepathc                 C   sP   t |d}| }W d    n1 sw   Y  t t|}t| ||S )Nrb)r/   readr   r   r   r,   )r$   r;   fr-   r(   r   r   r   	load_fileJ   s
   
zImageMediaIO.load_filePNG)image_formatr*   rA   c                C   sX   |}t  }| |}||| | }W d    n1 sw   Y  t|dS )Nzutf-8)r   r,   savegetvaluer6   	b64encodedecode)r$   r*   rA   r(   bufferr-   r   r   r   encode_base64P   s   

zImageMediaIO.encode_base64)r   )__name__
__module____qualname____doc__strr   r   r   r,   bytesr0   r9   r   r?   rG   __classcell__r   r   r&   r   r      s&    

r   c                       sv   e Zd ZdZd fddZdedejfddZd	e	de	dejfd
dZ
dedejfddZdejde	fddZ  ZS )ImageEmbeddingMediaIOzImage embedding MediaIO implementation.

    Configuration values can be user-provided either by --media-io-kwargs or
    by the runtime API field "media_io_kwargs". Ensure proper validation and
    error handling.
    r   Nc                    s   t    d S r.   )r   r   )r$   r&   r   r   r   h   s   zImageEmbeddingMediaIO.__init__r-   c                 C   sL   t |}tj  tj|dd}| W  d    S 1 sw   Y  d S NT)weights_only)r   torchsparsecheck_sparse_tensor_invariantsloadto_dense)r$   r-   rF   tensorr   r   r   r0   k   s
   $z ImageEmbeddingMediaIO.load_bytesr1   c                 C   r2   r3   r5   r8   r   r   r   r9   s   r:   z!ImageEmbeddingMediaIO.load_base64r;   c                 C   sD   t j  t j|dd}| W  d    S 1 sw   Y  d S rP   )rR   rS   rT   rU   rV   )r$   r;   rW   r   r   r   r?   v   s   $zImageEmbeddingMediaIO.load_filer*   c                 C   s   t |S r.   r   )r$   r*   r   r   r   rG   }   s   z#ImageEmbeddingMediaIO.encode_base64)r   N)rH   rI   rJ   rK   r   rM   rR   Tensorr0   rL   r9   r   r?   rG   rN   r   r   r&   r   rO   `   s    rO   )ior   pathlibr   r6   rR   PILr   vllm.utils.serial_utilsr   r(   r   r	   baser   r   r   rX   rO   r   r   r   r   <module>   s   O