o
    پiFX                  	   @   s   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 ddlm	Z	m
Z
mZmZ G dd dZG dd	 d	ZG d
d dZG dd dZG dd dZG dd dZG dd dZG dd dZeeeeeeeedZdddddddddZdS )z
ComfyUI nodes for SGLang Diffusion integration.
Provides nodes for connecting to SGLang Diffusion server and generating images/videos.
    N   )SGLDiffusionGeneratorSGLDiffusionServerAPI)convert_b64_to_tensor_imageconvert_video_to_comfy_videoget_image_pathis_empty_imagec                   @   sv   e Zd Zedd ZdZdZdZdZ					
	
	
	
						dde	de
dededededededede
de	fddZdS )SGLDOptionsc                 C   s   i g dddifdddifdddddfdd	d	ddfdd	d	ddfdd	d	ddfdd	d	ddfdddddfdddddfdddifd
ddifddS )N)auto-detect
qwen_imageqwen_image_editfluxlumina2defaultr
   BOOLEANFINTr   )r   minstepSTRING 
model_typeenable_torch_compilenum_gpustp_size	sp_degreeulysses_degreering_degreedp_size	dp_degreeenable_cfg_parallelattention_backendrequiredoptional clsr&   r&   i/home/ubuntu/.local/lib/python3.10/site-packages/sglang/multimodal_gen/apps/ComfyUI_SGLDiffusion/nodes.pyINPUT_TYPES   s@   	zSGLDOptions.INPUT_TYPESSGLD_OPTIONS)sgld_optionscreate_optionsSGLDiffusionr
   Fr   r   r   r   r   r   r   r   r   r   r   r    r!   r"   c                 C   sd   |dkrdn|}|dkrdn|}|dkrdn|}|||||||||	|
|d}dd |  D }|fS )zI
        Build a dictionary of SGLang Diffusion runtime options.
        r   Nr   r   c                 S   s   i | ]\}}|d ur||qS Nr&   ).0kvr&   r&   r)   
<dictcomp>m   s    z.SGLDOptions.create_options.<locals>.<dictcomp>)items)selfr   r   r   r   r   r   r   r   r    r!   r"   optionsr&   r&   r)   r.   H   s"   zSGLDOptions.create_optionsN)r
   Fr   r   r   r   r   r   r   Fr   )__name__
__module____qualname__classmethodr*   RETURN_TYPESRETURN_NAMESFUNCTIONCATEGORYstrboolintr.   r&   r&   r&   r)   r	      sR    
,	
r	   c                   @   s0   e Zd Zedd ZdZdZdZ	dd	d
ZdS )SGLDLoraLoaderc              	   C   s>   ddt dfdddddd	fd
ddifg dddifdiS )Nr$   MODELlorasFLOAT      ?r   
   g{Gz?r   r   maxr   r   r   r   alltransformertransformer_2criticrM   )model	lora_namestrength_modelnicknametargetfolder_pathsget_filename_listr'   r&   r&   r)   r*   r   s   

zSGLDLoraLoader.INPUT_TYPESrD   	load_lorar/   rH   r   rM   c           
      C   s   t d|}|dusJ | }|dkr|n	tdtt  }|||f|j|< g g g g d}|j D ]&\}}	|d | |d |	d  |d	 |	d
  |d |	d  q4|j	j
jdi | |fS )z-Load LoRA adapter using SGLang Diffusion API.rF   Nr   lora)lora_nickname	lora_pathstrengthrU   r[   r\   r   r]   r   rU      r&   )rW   get_full_pathcloner@   uuiduuid4patchesr5   appendrQ   diffusion_modelset_lora)
r6   rQ   rR   rS   rT   rU   r\   bi
lora_input	lora_infor&   r&   r)   rY      s"    zSGLDLoraLoader.load_loraN)rH   r   rM   )	r8   r9   r:   r;   r*   r<   r>   r?   rY   r&   r&   r&   r)   rC   q   s    
rC   c                   @   s<   e Zd Zdd Zedd ZdZdZdZdd	e	fd
dZ
dS )SGLDUNETLoaderc                 C   s   t  | _d S r0   )r   	generator)r6   r&   r&   r)   __init__   s   zSGLDUNETLoader.__init__c                 C   s"   t dfg dfdddidS )Ndiffusion_models)r   
fp8_e4m3fnfp8_e5m2)	unet_nameweight_dtyper-   r+   r#   rV   )sr&   r&   r)   r*      s   
zSGLDUNETLoader.INPUT_TYPESrD   	load_unetr/   Nr-   c                 C   sN   i }|dkrt j|d< n	|dkrt j|d< td|}| jj|||d}|fS )Nrn   dtypero   rm   )model_optionsr-   )torchfloat8_e4m3fnfloat8_e5m2rW   r_   rk   
load_model)r6   rp   rq   r-   ru   	unet_pathrQ   r&   r&   r)   rs      s   
zSGLDUNETLoader.load_unetr0   )r8   r9   r:   rl   r;   r*   r<   r>   r?   dictrs   r&   r&   r&   r)   rj      s    
rj   c                   @   s>   e Zd ZdZedd ZdZdZdZdZ	de
d	e
fd
dZdS )SGLDiffusionServerModelz;Node to load and manage SGLang Diffusion server connection.c                 C   s"   dddddfddddfdiS )Nr$   r   zhttp://localhost:3000/v1F)r   	multilinezsk-proj-1234567890base_urlapi_keyr&   r'   r&   r&   r)   r*      s   z#SGLDiffusionServerModel.INPUT_TYPES)SGLD_CLIENTr   )sgld_client
model_infoload_serverr/   r   r   c           
   
   C   s   t ||d}z$| }dg}| D ]\}}|| d|  qd|}W ||fS  tyF }	 zdt|	 }W Y d}	~	||fS d}	~	ww )z5Initialize OpenAI client for SGLang Diffusion server.r~   z=== SGLDiffusion Model Info ===z: 
zFailed to get model info: N)r   get_model_infor5   rd   join	Exceptionr@   )
r6   r   r   clientr   
info_lineskeyvaluemodel_info_strer&   r&   r)   r      s   z#SGLDiffusionServerModel.load_serverN)r8   r9   r:   __doc__r;   r*   r<   r=   r>   r?   r@   r   r&   r&   r&   r)   r|      s    
r|   c                   @   sv   e Zd ZdZedd ZdZdZdZdZ	dZ
			
						ddedededejdedededededefddZd
S )SGLDiffusionGenerateImagez/Node to generate images using SGLang Diffusion.c                 C   s   dddddfdddddfdd d	dfd
ddddfd
dddddfddddddfd
dddddfd
dddddfdddifddS ) Nr   r   r   z Text prompt for image generationr   tooltipr   positive_prompt)Negative prompt to avoid certain elementsIMAGEzinput image to use for editingr      r       r   r   rK      r   d   rJ   rG         @rH         4@皙?      @   r   r   F)negative_promptimageseedstepscfgwidthheightenable_teacacher#   r&   r'   r&   r&   r)   r*      sr   	



z%SGLDiffusionGenerateImage.INPUT_TYPES)r   )r   generate_imager/   Fr   Nr   r   r   r   r   r   r   r   r   r   r   r   r   c              
   C   s>  |st d| d|	 }||dd}|r||d< |dur!||d< |dur)||d< |dur5|d	kr5||d
< |
r;d|d< |dur`t|rZ|jd |jd }}	| d|	 }||d< nt||d< z
|jdi |}W n ty } z	tdt| d}~ww |d r|d d	 d std|d d	 d }t|}|fS )z*Generate image using SGLang Diffusion API.Prompt cannot be emptyxb64_json)promptsizeresponse_formatr   Nguidance_scalenum_inference_stepsr   r   Tr   r^   r   r   
image_pathzFailed to generate image: datazNo image data in responser&   )	
ValueErrorr   shaper   r   r   RuntimeErrorr@   r   )r6   r   r   r   r   r   r   r   r   r   r   r   request_paramsresponser   
image_datar&   r&   r)   r   P  sD   
z(SGLDiffusionGenerateImage.generate_image)r   Nr   r   r   r   r   F)r8   r9   r:   r   r;   r*   r<   r=   r>   r?   OUTPUT_NODEr   r@   rv   TensorrB   floatrA   r   r&   r&   r&   r)   r      sL    
P	
r   c                   @   s   e Zd ZdZedd ZdZdZdZdZ	dZ
			
									d"dedededejdededededededededefd d!Zd
S )#SGLDiffusionGenerateVideoz/Node to generate videos using SGLang Diffusion.c                 C   s   dddddfdddddfdd d	dfd
ddddfd
dddddfddddddfd
dddddfd
dddddfd
dddddfd
dddddfd
d ddddfd!d"d#ifd$d%S )&Nr   r   r   z Text prompt for video generationr   r   r   r   z%input image to use for image-to-videor   r   r   r   r   r   r   r   rJ   rG   r   rH   r   r      r   r     x   i     <      r   r   F)r   r   r   r   r   r   r   
num_framesfpssecondsr   r#   r&   r'   r&   r&   r)   r*     s   	






z%SGLDiffusionGenerateVideo.INPUT_TYPES)VIDEOr   )video
video_pathgenerate_videor/   Fr   Nr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   c              
   C   s:  |st d| d|	 }t }|||||d}|r||d< |dur'||d< |dur/||d< |dur;|dkr;||d	< |rAd
|d< |
durI|
|d< |durnt|rh|jd |jd }}	| d|	 }||d< nt||d< z|jdi |}|dd}t||	|}W ||fS  t	y } z	t
dt| d}~ww )z*Generate video using SGLang Diffusion API.r   r   )r   r   r   r   output_pathr   Nr   r   r   r   Tr   r   r^   r   r   input_reference	file_pathr   zFailed to generate video: r&   )r   rW   get_temp_directoryr   r   r   r   getr   r   r   r@   )r6   r   r   r   r   r   r   r   r   r   r   r   r   r   r   
output_dirr   r   r   r   r   r&   r&   r)   r     sJ   	
z(SGLDiffusionGenerateVideo.generate_video)r   Nr   r   r   r   r   r   r   r   F)r8   r9   r:   r   r;   r*   r<   r=   r>   r?   r   r   r@   rv   r   rB   r   rA   r   r&   r&   r&   r)   r     s^    
k	
r   c                	   @   sR   e Zd ZdZedd ZdZdZdZdZ	dZ
					
ddedededefddZdS )SGLDiffusionServerSetLoraz5Node to set LoRA adapter for SGLang Diffusion server.c                 C   s8   dddddfdddddfg dd	d
dfddS )Nr   r   r   zThe name of the LoRA adapterr   )r   rR   z The nickname of the LoRA adapterrL   rM   z)Which transformer(s) to apply the LoRA to)r[   rU   r#   r&   r'   r&   r&   r)   r*   F  s&   z%SGLDiffusionServerSetLora.INPUT_TYPESr   r   rf   r/   Fr   rM   r   rR   r[   rU   c              
   C   sh   |dkrt j|d }|||d}z|jdi |}|fW S  ty3 } z	tdt| d}~ww )z,Set LoRA adapter using SGLang Diffusion API.r   r   )r[   r\   rU   zFailed to set LoRA adapter: Nr&   )ospathsplitextrf   r   r   r@   )r6   r   rR   r[   rU   r   r   r   r&   r&   r)   rf   p  s   z"SGLDiffusionServerSetLora.set_loraN)r   r   rM   )r8   r9   r:   r   r;   r*   r<   r=   r>   r?   r   r   r@   rf   r&   r&   r&   r)   r   C  s*    
#r   c                   @   sF   e Zd ZdZedd ZdZdZdZdZ	dZ
		dd
edefddZdS )SGLDiffusionServerUnsetLoraz7Node to unset LoRA adapter for SGLang Diffusion server.c                 C   s    ddidg ddddfidS )	Nr   r   rU   rL   rM   z+Which transformer(s) to unset the LoRA fromr   r#   r&   r'   r&   r&   r)   r*     s   z'SGLDiffusionServerUnsetLora.INPUT_TYPESr   r   
unset_lorar/   FrM   r   rU   c              
   C   s@   z
|j |d}|fW S  ty } z	tdt| d}~ww )z.Unset LoRA adapter using SGLang Diffusion API.)rU   zFailed to unset LoRA adapter: N)r   r   r   r@   )r6   r   rU   r   r   r&   r&   r)   r     s   z&SGLDiffusionServerUnsetLora.unset_loraN)rM   )r8   r9   r:   r   r;   r*   r<   r=   r>   r?   r   r   r@   r   r&   r&   r&   r)   r     s    
r   )r|   r   r   r   r   rj   r	   rC   zSGLDiffusion Server ModelzSGLDiffusion Generate ImagezSGLDiffusion Generate VideozSGLDiffusion Server Set LoRAzSGLDiffusion Server Unset LoRAzSGLDiffusion UNET LoaderzSGLDiffusion OptionszSGLDiffusion LoRA Loader)r   r   ra   rW   rv   corer   r   utilsr   r   r   r   r	   rC   rj   r|   r   r   r   r   NODE_CLASS_MAPPINGSNODE_DISPLAY_NAME_MAPPINGSr&   r&   r&   r)   <module>   sF    \5$,  7G.
