📄 images.cpython-312.pyc
/home/palash/git/local-ai/server/features/__pycache__/images.cpython-312.pyc
Language: pyc • Lines: 709
�

O�j�Z���dZddlZddlZddlZddlZddlZddlZddlZddlm	Z	ddl
mZdddd�Zd	�Z
d
�Zd�Zd�Zd
�Zd�Zdd�Z				dd�Zd�Zd�Zd�Zd�Zy)z%ComfyUI image generation and editing.�N)�M)�_safe_username)��8)rr)�r)�	landscape�portrait�squarec�<�tj|td�S)Nr)�ASPECT_SIZES�get)�aspect_ratios �3/home/palash/git/local-ai/server/features/images.py�_aspect_dimsrs�����L�,�{�*C�D�D�c�p�tjjtjt|��S�N)�os�path�joinr�COMFYUI_OUTPUTr��users r�_output_dirrs"��
�7�7�<�<��(�(�.��*>�?�?rc�p�tjjtjt|��Sr)rrrr�
COMFYUI_INPUTrrs r�
_input_dirr#s ��
�7�7�<�<������)=�>�>rc���tjj|�r/	tjj|tj
�S|S#t$r"tjj|�cYSwxYwr)rr�isabs�relpathrr�
ValueError�basename)�targets r�_output_relr$'s_��	�w�w�}�}�V��	,��7�7�?�?�6�1�+;�+;�<�<��M���	,��7�7�#�#�F�+�+�	,�s�-A�(A<�;A<c�v�d}||vr|j|d�dStjj|�S)N�/output/������)�splitrrr")�url�markers  r�_image_url_relr,0s9��
�F�
��}��y�y���#�B�'�'�
�7�7���C� � rc�~�td�	tjtj�d�ddd�d��}|j
dk(r"td�	t
jd	�y	t
jd	�y#t$r}td
|���Yd}~�2d}~wwxYw#t
jd	�wxYw)Nz[comfyui] Freeing VRAM...z/freeT)�
unload_models�free_memory���json�timeout��z[comfyui] VRAM freed�
z[comfyui] Free error: F)	�print�requests�postr�COMFYUI_URL�status_code�time�sleep�	Exception)�r�es  r�free_comfyui_vramr@7s���	�
%�&���M�M��}�}�o�U�#�#'��=��
��

�=�=�C���(�)��	
�
�
�2��
 �	
�
�
�2����	�,�
�&�q�c�*�+�+��,��	
�
�
�2��s0�AB�*B%�	B"�
B�B%�B"�"B%�%B<c���td|�d|���tj|d�tjd�t	|�\}}tj
|�}t
tj��dd}t|��d|�d�}	tjj|tjd�}
|dk(r�td	�d
|
ddd
�d�dd|
did�d|
ddd�d�d|ddgd�d�d||dd�d�ddddgd �d�d|ddgd�d�d!tjdd"�dd#d$d%d#d&dgd'dgd(dgd)dgd*�
d�d+d,dgd-dgd.�d�d/|	d0dgd1�d�d2�
}n�|d3k(r�td4�d5d6|
did�d7|
d|
d8|
d9d:d;�d�d|d<dgd�d�d|d<dgd�d�d||dd�d�d!tjdd"�d=d>d?d@d#dAdgdBdgdCdgdDdgd*�
d�dd|
did�d+dEdgdFdgd.�d�d/|	dGdgd1�d�dH�	}ntdI�tj5dJt_|tj |dK<|tj |dL<|tj |dM<ddd�tj"�|ddNt%|�dNkDrdOndPz}tj|dQ|�dR|���	t'j(tj*�dS�dTidU�V�}
|
j-�}dW|vrt-j.dWdX|dW��i�}�nT|dY}d}t1dZ�D]�}t3j4d�	t'jtj*�d[|��d\�]�}|j-�}||vr�||jd^i�}|j7�D]c\}}|jd_g�D]I}|d`}t8j:j=tj>|jdadP�|�}|}�c�e|rn��|�r1tj5tCtj j|i�jdb�dck(�}ddd�r^	t8j:jE|�r&t9jF|�tdd|�de|���t-j.dWdfi�}n�tjJ|�tj |dg<tj|dh|���tdi|���t-j.||tjJ|�dj��}n&tdk|�dl��t-j.dWdmi�}tj|dn�tjL�tj|do�tjNd�|S#1swY��\xYw#t@$rY���wxYw#1swY���xYw#tH$rY��HwxYw#t@$r*}t-j.dWt
|�i�}Yd}~��d}~wwxYw#tj|dn�tjL�tj|do�tjNd�wxYw)pNz#
[image] Generating image for task z with the prompt: z$Freeing VRAM for image generation...�gpu�z/gen_�_�z_imagez(Chose Z-Image Turbo for image generation�
CLIPLoader�clip1�lumina2��	clip_name�type��
class_type�inputs�	VAELoader�vae_name�vae�
UNETLoader�unet�default��	unet_name�weight_dtype�CLIPTextEncode�62r��text�clip�EmptySD3LatentImager')�width�height�
batch_size�ModelSamplingAuraFlow��66��shift�model�KSampler���?�
res_multistep�simple�69�67�71�68�
�seed�steps�cfg�sampler_name�	scheduler�denoiserf�positive�negative�latent_image�	VAEDecode�70�63��samplesrQ�	SaveImage�65��filename_prefix�images)
rYr|rcrmrorlrnr{r��9�sd3_5_mediumz!Chose SD 3.5 for image generation�UnetLoaderGGUFrV�TripleCLIPLoaderGGUF�clip2�t5�sd3)�
clip_name1�
clip_name2�
clip_name3rK�2�g@�euler�sgm_uniform�1�3�4�5�6�7�8)	r�r�r�r�r�r�r�r�r�z!No Image Model Selected Perfectly�image_active�
gen_prompt�_image_model�negative_promptr4z...�zGenerating image (�
)... Prompt: �/prompt�prompt�xr1�error�	ComfyUI: �	prompt_id�,�	/history/r5�r3�outputsr��filename�	subfolder�status�	cancelledz2[image] Deleted orphaned image for cancelled task �: �!Cancelled — session was deleted�
image_filezImage saved as z[generate_image] SUCCESS: �r��file�relz"[generate_image] TIMEOUT for task z after 300szImage generation timeout� Freeing image generation VRAM...�Loading chat model...)(r6r�
set_status�unload_llama_modelr�
_task_user�str�uuid�uuid4r�IMAGE_MODELSr
�random�randint�
_data_lock�model_status�tasks�ensure_comfyui_running�lenr7r8r9r2�dumps�ranger;r<�itemsrrrrr=�bool�exists�remove�OSErrorr$r@�load_llama_model)r��task_idr�rfrr^r_r�gen_tag�prefixrs�workflow�p_shortr>�data�resultr��
found_filerD�hr�histr��node_id�node_out�img�fname�fpathr�r?s                             r�generate_imager�Is���	�0��	�9K�F�8�
T�U��L�L��@�A������ ��.�M�E�6��<�<�� �D��$�*�*�,����#�G��t�$�%�U�7�)�1�
5�F�
�.�.�
�
�U�A�N�N�9�$=�
>�C��	��
�8�9�+�(+�G��i�H��"-��S��Z�8P�Q�*�(+�F��Y�O��
/�#)�D�!�9�=��
4�$)�V�1�M��
6�$%��q�	�:��
/�#2�T�1�I�F��
)�"�N�N�1�e�4���$3�!)�"�"�A�Y�!%�q�	�!%�q�	�%)�1�I��� *�'+�Q�i��q�	�B��
*�.4��q�	�J��[1
��d
�.�	 �
�1�2� 0�[�#�f�+�<V�W�4�"%�g�,�"%�g�,�"%�d�)�!�	��/�#)�C��8�<��
/�#2�S�!�H�E��
4�$)�V�1�M��
)�"�N�N�1�e�4���$+�!.�"�!�1�X�!$�a��!$�a��%(�!�H���!,�
�C��J�7O�P�)�'*�A�h��Q�x�@��
*�.4��a��I��W/
��b	�1�2�	
���>�'���)/�������&�+0�������(�.=������*�+�	>�
�����T�c�l�s�6�{�S�'8�e�b�A�G��L�L��.�u�g�]�7�)�L�M�>"��M�M��}�}�o�W�%�X�x�,@�#�
���v�v�x���d�?��Z�Z��I�d�7�m�_�*E� F�G�F��[�)�I��J��3�Z�
���
�
�1�
��!�������y���&L�VX�Y�B��7�7�9�D� �D�(�"&�y�/�"5�"5�i��"D��18����&�-�G�X�'/�|�|�H�b�'A�&��(+�J���(*�����$%�$4�$4�c�g�g�k�2�6N�PU�)"��.3�
� %�
&�&�&�!��#
�(��\�\�\� $�Q�W�W�[�[��"�%=�%A�%A�(�%K�{�%Z� [�I�\����7�7�>�>�*�5��I�I�j�1�!�$V�W^�V_�_a�bl�am�"n�o�"�Z�Z��2U�(V�W�F�56�]�]�:�5N�A�G�G�G�$�\�2��L�L��O�J�<�*H�I��6�z�l�C�D�!�Z�Z�)2�$.�#$�=�=��#<���F��:�7�)�;�O�P����W�.H�$I�J��	
���W�@�A�	����	���W�5�6�	���5�!��M�O>�>��J!�����\�\��#�����"�/����W�c�!�f�-�.���/��	
���W�@�A�	����	���W�5�6�	���5�!�s��AV)� BW#�)CV6�4W#�<W�
W#�AW�B;W#�)V3�6	W�?W#�W�W#�W�W#�	W �W#�W � W#�#	X�, X�X�X�X�AY0c���td|�tj|�}|�s�|�r�tj5t	tj
j
|g��}ddd�tdt��d��t|�D�]N}	|	j
d�xsdj�}
|
r�tjjtjtj|
��}|}td|�dtjj|����tjj|�rIt!|d�5}
t#j$|
j'��j)�}ddd��nP|	j
d	�}t+|t�s��%t|�D�]}t+|t,�s�|j
d
�dk(s�*|j
di�j
dd�}|j/d
�r"|j1dd�d}td�n�tj2|�}|s��tjj|�s��t!|d�5}
t#j$|
j'��j)�}ddd�td|�dt|��d��n|s��On|s"td�t5j6ddi�Stdt|��d��td|�d|���tj8|d�tj:d�t=t?j@��dd}tC|��d|�d �}tC|��d!|�d"�}tjD}tjFtjjItjj||��d#�$�tjj||�}t!|d%�5}
|
jKt#jL|��ddd�tjNj
|tjNd&�}d'|d(d)d*�d+�d,d-|d.id+�d/|d0d1d2�d+�d3|d4d5gd6�d+�d3|d4d5gd6�d+�d7d8d9d5gd:�d+�d;d<|id+�d=d>d5gd?d@ddA�d+�dBdCd5gdDd5gdE�d+�dFtQjRd5dG�ddHdIdJtU|�dKd5gdLd5gdMd5gdNd5gdO�
d+�dPdQd5gdDd5gdR�d+�dS|dTd5gdU�d+�dV�}tj5dWt_+|tjX|dX<|tjX|dY<|tjX|dZ<ddd�tjZ�tj8|d[|�d\|dd]���	t]j^tj`�d^�d_|id`�a�}|j5�}d|vrt5j6ddb|d��i�}�n5|dc}d}tcdd�D]�}tejfd�	t]jtj`�de|��df�g�}|j5�}||vr�||j
dhi�} | ji�D]a\}!}"|"j
dig�D]G}#|#dj}tjjtj|#j
dkd�|�}�a�c|rn��|�r#tj5tmtjXj
|i�j
dl�dmk(�}$ddd�$r^	tjj|�r&tjn|�tdn|�do|���t5j6ddpi�}n�tjr|�tjX|dq<tj8|dr|���t5j6||tjr|�ds��}nt5j6ddti�}tjj|�r$	tjn|�tdu|���tj8|dw�tjt�tj8|dx�tjvd�|S#1swY���xYw#1swY��vxYw#1swY��UxYw#1swY���xYw#1swY���xYw#tj$rY��
wxYw#1swY���xYw#tp$rY���wxYw#tj$r+}%t5j6dt=|%�i�}Yd}%~%��7d}%~%wwxYw#tj$r}%tdv|%���Yd}%~%��d}%~%wwxYw#tjj|�rI	tjn|�tdu|���n$#tj$r}%tdv|%���Yd}%~%nd}%~%wwxYwtj8|dw�tjt�tj8|dx�tjvd�wxYw)yNzImage edit called with denoisez[edit_image] Scanning z# session messages for image sources�
_image_urlr�z&[edit_image] Checking _image_url path=z exists=�rb�contentrK�	image_urlr*z
data:image�,r'r(z=[edit_image] Extracted base64 image from user message contentz[edit_image] Loaded image from z (z bytes base64)z,[edit_image] FAILED to find an image to editr�zNo image provided for editing.z[edit_image] Found image (z$ bytes base64), proceeding with editz%
[image_edit] Editing image for task z with prompt: z!Freeing VRAM for image editing...rBrCz/edit_rDz/input_z.pngT)�exist_ok�wbrErFrGrHrIrLrOrPrQrRrSrTrUrXrYrrZrarbrcrd�	LoadImage�image�ImageScaleToTotalPixels�5_loadgbX9���?�bicubic)r��
megapixels�upscale_method�resolution_steps�	VAEEncode�5_scaler|)�pixelsrQrgrhrirjrkrlrmrn�5_encoderprzr{r}rr�r�)rYr|rcrmrnrlr�r�r�r{r�r�r�r�r�r�zEditing image (r��r�r�r�r1r�r�r�r�r5r�r�r�r�r�r�r�z9[image] Deleted orphaned edited image for cancelled task r�r�r�zEdited image saved as r�zImage editing timeoutz$[edit_image] Cleaned up input file: z+[edit_image] Failed to cleanup input file: r�r�)<r6rr�r��list�sessionsr
r��reversed�striprrr�IMG_PATHr,r��open�base64�	b64encode�read�decode�
isinstance�dict�
startswithr)�resolve_image_pathr2r�r�r�r�r�r�rr�makedirs�dirname�write�	b64decoder�r�r��floatr�r�r�r7r8r9r�r;r<r�r=r�r�r�r$r@r�)&r�r��	image_b64r�rvrf�sidr�msgs�msgr*r�r��fr��part�img_urlr�r��input_filename�	input_dir�input_filepathrsr�r>r�r�r�r�rDr�r�r�r�r�r�r�r?s&                                      r�
edit_imager
	s�	��
�
*�G�4��<�<�� �D���
�\�\�	1���
�
���s�B�/�0�D�	1�
�&�s�4�y�k�1T�U�V��D�>�$	�C��7�7�<�(�.�B�5�5�7�C�������Q�Z�Z��1A�1A�#�1F�G�����<�U�G�8�B�G�G�N�N�[`�La�Kb�c���7�7�>�>�%�(��e�T�*�H�a�$*�$4�$4�Q�V�V�X�$>�$E�$E�$G�	�H���g�g�i�(�G��'�4�(�$�W�-�"�D�!�$��-�$�(�(�6�2B�k�2Q�"&�(�(�;��";�"?�"?��r�"J��"�-�-�l�;�(/�
�
�c�1�(=�b�(A�I�!� _��"� !� 4� 4�W� =�� �R�W�W�^�^�E�%:�!%�e�T�!2�P�a�,2�,<�,<�Q�V�V�X�,F�,M�,M�,O�	�P�!�"A�'��"�S�QZ�^�L\�\j� k��"�#"�$��I$	�L�
�<�=��z�z�7�$D�E�F�F�	�
$�S��^�$4�4X�Y��
�2�7�)�>�&��
R�S��L�L��=�>�������$�*�*�,����#�G��t�$�%�V�G�9�A�
6�F�&�t�,�-�W�W�I�T�B�N����I��K�K�����������Y�� G�H�SW�X��W�W�\�\�)�^�<�N�	
�n�d�	#�-�q�	���� � ��+�,�-��.�.�
�
�U�A�N�N�9�$=�
>�C�'�$'��L�)�D�
�)�Z��U��4L�M�&�$'��K��K�
�
+�%��a�y�9�
�
+�.��q�	�B�
�
2� !�T�1�I�6�
�"-��.�8Q�R�3�"�A��#�"+�$%�	�
�&�"+�Q���q�	�B�
�
%����q�%�0��� /�%� ��>����!�1�I�!�1�I�!+�Q���
� &�#'��)�T�1�I�>�
�
&�*0�T�1�I�F�
�q<�H�z
���>�'���)/�������&�+0�������(�.=������*�+�	>������L�L��O�E�7�-��t���~�N�O�A"��M�M��}�}�o�W�%�X�x�,@�#�
���v�v�x���d�?��Z�Z��I�d�7�m�_�*E� F�G�F��[�)�I��J��3�Z�
���
�
�1�
��!�������y���&L�VX�Y�B��7�7�9�D� �D�(�"&�y�/�"5�"5�i��"D��18����&�-�G�X�'/�|�|�H�b�'A�&��(+�J���-/�W�W�\�\�$%�J�J�����R�0H�%�."�
�!&�&�&�&�!��
�&��\�\�\� $�Q�W�W�[�[��"�%=�%A�%A�(�%K�{�%Z� [�I�\����7�7�>�>�*�5��I�I�j�1�!�$]�^e�]f�fh�is�ht�"u�v�"�Z�Z��2U�(V�W�F�56�]�]�:�5N�A�G�G�G�$�\�2��L�L��,B�:�,�*O�P�!�Z�Z�)2�$.�#$�=�=��#<���F����W�.E�$F�G���7�7�>�>�.�)�
I��	�	�.�)��<�^�<L�M�N�	
���W�@�A�	����	���W�5�6�	���5�!��M�]	1�	1��H�H��&P�P��>-�-��D>�>��H!�����\�\��#������/����W�c�!�f�-�.���/���
I��C�A�3�G�H�H��
I��	�7�7�>�>�.�)�
I��	�	�.�)��<�^�<L�M�N���
I��C�A�3�G�H�H��
I��	���W�@�A�	����	���W�5�6�	���5�!�s
�*c+�2c8�2d�'%d�4Ad�>Be�C	d,�e�'<d<�#
e�.Ae	�3Be�1#f�+c5�8d	�d�d�d)�,	d9�5e�8d9�9e�<e�e�		e�e�e�e�	f
�" f�f5�f
�
f5�	f2�f-�-f2�5 i4�#g:�9i4�:	h�h�i4�h�Ai4c�X�tj5tjj|i�jd�}ddd�tj|d�tj
j
|||||d||d��td|�d|�d|�d	��y#1swY�`xYw)
a�Queue an image generation/edit job for the single image worker thread.

    Image work is serialized so the VRAM choreography (llama unload / ComfyUI
    / free / reload) and the ``image_active`` model status never race, even when
    CPU and GPU chat lanes process tasks concurrently. The job carries its
    originating session so the finished image lands in the right conversation.
    �_original_imageNzQueued for image generation...�id)r�r�	tool_name�args�tc_id�round�
tool_indexrz[image_worker] Queued z
 for task z (sid �))rr�r�r
r��_image_queue�putr6)r�rrr�tc�	round_numrrs        r�_enqueue_image_jobr�s���
���D��G�G�K�K���,�0�0�1B�C�	�D��L�L��:�;��N�N�����"����X��$�"�		
��
�"�9�+�Z��y��s�e�1�
M�N�D�D�s�0B � B)c	���tj|jdd�||jdd�|jd�xsd|jd�xsd��}tj|�}d	|vr�|jd
�xs"t
jj|d	�}d|��}|jd�xsd}tj5tjj|�}|r@|jdg�jd
�||d<|jdd�|d<||d<ddd�tj||jdd�|d��S|S#1swY�4xYw)Nr�r�r�rfrErr)r�r�r�rfrr�r�r&�_tools_usedr�r�r�r��r�r�rf)
rr�r
r2�loadsrrr"r�r��
setdefault�appendr�)r�rr��res_datar�r��
image_model_s�ts        r�_run_generate_imager%sW��
�
�
��x�x��"�%�����!2�B�7��h�h�w��,�9��X�X�n�-�<���F��z�z�&�!�H�
����l�l�5�!�G�R�W�W�%5�%5�h�v�6F�%G���s�e�$�	�����)�6�Y�
�
�\�\�	2������G�$�A�����]�B�/�6�6�7G�H�"%��,��"&�(�(�8�R�"8��,��$1��.�!�
	2��z�z�&��(�(�8�R�0�&�
�
�	
��M�	2�	2�s
�A"E.�.E7c
��tj|jdd�|||jdd�|jdd�d|��}tj|�}d|vr�|jd	�xs"t
jj|d�}d
|��}tj5tjj|�}|r@|jdg�jd�||d
<|jdd�|d<d|d<ddd�tj||jdd�dd��S|S#1swY�4xYw)Nr�r�r�rv皙�����?rE)r�r�rr�rvrfrr�r�r&rr
r�r�r�r)
rr
r
r2rrrr"r�r�r r!r�)	r�rrrr�r"r�r�r$s	         r�_run_edit_imager(s6��
�\�\��x�x��"�%������!2�B�7�����C�(����F��z�z�&�!�H�
����l�l�5�!�G�R�W�W�%5�%5�h�v�6F�%G���s�e�$�	�
�\�\�	)������G�$�A�����]�B�/�6�6�|�D�"%��,��"&�(�(�8�R�"8��,��$(��.�!�
	)��z�z�&��(�(�8�R�0��
�
�	
��M�	)�	)�s
�0A"E�Ec
�V�	tjj�}|jd�dk(ry|d}tj5tjj|�}|�|jd�dvr
	ddd���	ddd�|d}|d}|d}	|d	k(r-t||�}t
d
�tjd�n]|dk(r>t||||jd
��}t
d
�tjd�ntjdd|��i�}tjd||d|||d|d����V#1swY��xYw#t$r;}t
d|�d|�d|���tjdd|�d|��i�}Yd}~�rd}~wwxYw)awRun one image job at a time from the image queue.

    On completion the worker posts the same ``tool_ok`` event the tool worker
    would have, so the event loop, pending-tool counting and session attachment
    are unchanged. Matching to the originating session is preserved through the
    job's ``sid`` and the task-keyed ``image_file`` stored on ``tasks[task_id]``.
    r�__shutdown__r�Nr�)r�r�rrr�zWaiting 5s for GPU to cool down�r
rr�zUnknown image tool: z[image_worker] z crashed for task r�zTool z	 failed: �tool_okrrr)rr�rrr)rrr
r�r�r%r6r;r<r(r2r�r=�_event_post)�jobr�r$rrrr�r?s        r�
_image_workerr/=s�����n�n� � �"���7�7�;��>�1���i�.��
�\�\�	������G�$�A��y�A�E�E�(�O�/E�E��	�	�E�	��%�j����$�	��6�{��
	L��,�,�,�W�d�;���7�8��
�
�1�
��l�*�(��#�t�S�W�W�[�=Q�R���7�8��
�
�1�
����W�0D�Y�K�.P�$Q�R��	
�
�
����g�,����g�,��<�(�	
�5�
	�	��$�	L��O�I�;�.@��	��A�3�O�P��Z�Z��E�)��I�a�S�*I� J�K�F��	L�s%�
6E�"BE$�E!�$	F(�-1F#�#F()r�rEr)r�r'rEN)�__doc__r�r2rr�r;r�r7�server.features.stater�server.features.usersrrrrrr$r,r@r�r
rr%r(r/�rr�<module>r4s���+�
��	�
����#�0������E�@�?��!��$}�H��
��Z�zO�4�<�>*
r