o
    پi*                     @   s  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mZ d dl	Z	d dl
mZ d dlmZmZ d dlmZmZmZmZmZmZmZ d dlmZ d dlmZ d dlmZ d d	lmZmZm Z  g d
Z!ee"Z#dddddZ$dZ%dZ&de'de(e)e)f e(d B fddZ*dee' dee' de'fddZ+de'defddZ,deee'f de'de'fd d!Z-d"ede'de'fd#d$Z.d%e'de'de'dB fd&d'Z/d(e'de'de'fd)d*Z0d+e'de'de'fd,d-Z1d.ede(e2e' ef fd/d0Z3d1eeedf defd2d3Z4d4e5de'd5ede5fd6d7Z6d<d8e'd9ede)fd:d;Z7dS )=    N)AnyListOptionalUnion)
UploadFile)DataTypeSamplingParams)ListLorasReqMergeLoraWeightsReq
SetLoraReqShutdownReqUnmergeLoraWeightsReqformat_lora_messagesave_outputs)OutputBatch)AsyncSchedulerClient)get_global_server_args)init_loggerlog_batch_completionlog_generation_timer)r   r
   r   r	   r   r   d   Z   7   #   )maximumhighmediumlow      sizereturnNNc                 C   s`   z%|   ddd}t|dkrtt|d t|d }}||fW S  ty/   Y dS w )N  x   r      r"   )lowerreplacesplitlen
ValueErrorint	Exception)r    partswh r2   j/home/ubuntu/.local/lib/python3.10/site-packages/sglang/multimodal_gen/runtime/entrypoints/openai/utils.py_parse_size2   s   
r4   output_format
backgroundc                 C   s<   | pd  }|dv r|dkrdS |S |pd  dkrdS dS )Nr$   >   jpgpngjpegwebpr9   r7   autotransparentr8   )r(   )r5   r6   fmtr2   r2   r3   choose_output_image_ext=   s   r>   
request_idc           
      K   s   t  }|dd}|ddu}|dd}|r.t|\}}|dur.|d| |d| dd | D }|d	d
 tjd|j|| d|}|s]|dur]t	||j
}	|	dur]|	|_|S )aE  Build SamplingParams from request parameters.

    Handles size parsing, output_quality resolution, and None filtering before
    delegating to SamplingParams.from_user_sampling_params_args. Callers pass
    only the parameters they have; None values are stripped automatically so
    that SamplingParams defaults apply.
    output_qualityNoutput_compressionr    widthheightc                 S   s   i | ]\}}|d ur||qS Nr2   ).0kvr2   r2   r3   
<dictcomp>`   s    z)build_sampling_params.<locals>.<dictcomp>save_outputT)
model_pathserver_argsr?   r2   )r   popgetr4   
setdefaultitemsr   from_user_sampling_params_argsrJ   adjust_output_quality	data_typerA   )
r?   kwargsrK   r@   has_explicit_compressionr    r0   r1   sampling_paramsresolvedr2   r2   r3   build_sampling_paramsH   s.   
rW   imagetarget_pathc                    s.   t | |I d H }|d u rt| |I d H }|S rD   )_maybe_url_image_save_upload_to_path)rX   rY   
input_pathr2   r2   r3   save_image_to_pathu   s
   r]   uploadc                    s`   t jt j|dd |  I d H }t|d}|| W d    |S 1 s)w   Y  |S )NTexist_okwb)osmakedirspathdirnamereadopenwrite)r^   rY   contentfr2   r2   r3   r[   }   s   
r[   img_urlc                    sX   t | tsd S |  drt| |I d H }|S | dr(t| |I d H }|S td)N)zhttp://zhttps://z
data:imagezUnsupported image url format)
isinstancestrr(   
startswith_save_url_image_to_path_save_base64_image_to_pathr,   )rk   rY   r\   r2   r2   r3   rZ      s   

rZ   	image_urlc              
      s  t jt j|dd ztjdd4 I dH }|j| ddI dH }|  t j|d s|j	dd	
 }| d
d }t j|\}}|
 }|dv rW|dkrTdn|}n/|drxd|v sdd|v rgd}nd|v rnd}nd|v rud}nd}n|dkrd}ntd| | | }t|d}	|	|j W d   n1 sw   Y  |W  d  I dH  W S 1 I dH sw   Y  W dS  ty }
 z	tdt|
 d}
~
ww )z0Download image from URL and save to target path.Tr_   )follow_redirectsNg      $@)timeoutr'   zcontent-typer$   ?r   >   .bmp.gif.jpg.png.jpeg.webpry   rw   image/r9   r7   r8   rx   r:   rz   zapplication/octet-streamz.URL does not point to an image. Content-Type: ra   z#Failed to download image from URL: )rb   rc   rd   re   httpxAsyncClientrM   raise_for_statussplitextheadersr(   r*   rn   r,   rg   rh   ri   r.   rm   )rq   rY   clientresponsecontent_typeurl_path_url_extextrj   er2   r2   r3   ro      sH   
4$ro   base64_datac              
      s*  d}d}t || }|st||d}|d}|s$t| d|d}|s2t| d|drG|d	d
  }|dkrFd}nd}| d| }tjtj	
|dd z$t|}	t|d}
|
|	 W d   |W S 1 sxw   Y  |W S  ty } z	tdt| d}~ww )z1Decode base64 image data and save to target path.zSFailed to decode base64 image. Expected format: `data:[<media-type>];base64,<data>`zdata:(.*?)(;base64)?,(.*)r'   r&   z (missing ;base64 marker)   z (empty data payload)r{   /r9   r7   .Tr_   ra   NzFailed to decode base64 image: )rematchr,   grouprn   r*   r(   rb   rc   rd   re   base64	b64decoderg   rh   r.   rm   )r   rY   _B64_FMT_HINTpatternr   
media_type	is_base64datar   
image_datarj   r   r2   r2   r3   rp      sD   





rp   scheduler_clientc                    s  t  }tt jK |  gI d H }|jd u r+|jd u r+|jp#d}t	d| |jr2|j}nt
|jt|j j j j fdd|j|j jd}W d    n1 sYw   Y  t  | }ttd| |jr}|jdkr}td|jd	d
 ||fS )NzUnknown errorz;Model generation returned no output. Error from scheduler: c                    s   t  | S rD   )rm   output_file_path)idxbatchnum_outputsr2   r3   <lambda>  s    z*process_generation_batch.<locals>.<lambda>)audioaudio_sample_raterA   r'   r   zPeak memory usage: z.2fz MB)timeperf_counterr   loggerpromptforwardoutputoutput_file_pathserrorRuntimeErrorr+   r   rR   fpsrI   r   r   rA   r   peak_memory_mbinfo)r   r   total_start_timeresult	error_msgsave_file_path_list
total_timer2   r   r3   process_generation_batch   s:   

r   inputsc                  G   s:   g }| D ]}|durt |tr|| q|| q|S )a4  
    Merge multiple image input sources into a single list.

    This function handles both single items and lists of items, merging them
    into a single flattened list. Useful for processing images, URLs, or other
    multimedia inputs that can come as either single items or lists.

    Args:
        *inputs: Variable number of inputs, each can be None, single item, or list

    Returns:
        List: Flattened list of all non-None inputs

    Example:
        >>> merge_image_input_list(["img1", "img2"], "img3", None)
        ["img1", "img2", "img3"]
    N)rl   listextendappend)r   r   
input_itemr2   r2   r3   merge_image_input_list  s   

r   r   r   c                 C   sD   |j r|j dkr|j | d< |jr|jjdkr|jj| d< || d< | S )Nr   r   inference_time_sid)r   metricstotal_duration_s)r   r?   r   r2   r2   r3   add_common_data_to_response-  s   
r   r@   rR   c                 C   s&   | dkr|t jkrdS dS t| d S )Ndefault2   K   )r   VIDEOOUTPUT_QUALITY_MAPPERrM   )r@   rR   r2   r2   r3   rQ   ;  s   rQ   rD   )8r   rb   r   r   typingr   r   r   r   r|   fastapir   4sglang.multimodal_gen.configs.sample.sampling_paramsr   r   /sglang.multimodal_gen.runtime.entrypoints.utilsr	   r
   r   r   r   r   r   ;sglang.multimodal_gen.runtime.pipelines_core.schedule_batchr   .sglang.multimodal_gen.runtime.scheduler_clientr   )sglang.multimodal_gen.runtime.server_argsr   1sglang.multimodal_gen.runtime.utils.logging_utilsr   r   r   __all____name__r   r   DEFAULT_FPSDEFAULT_VIDEO_SECONDSrm   tupler-   r4   r>   rW   r]   r[   rZ   ro   rp   r   r   r   dictr   rQ   r2   r2   r2   r3   <module>   s`   $		"
-.(
&
