
    Ti3                        d dl Z d dlZd dlmZ d dlZd dlZd dlZd dlZd dl	Z	d dl
mZ d dlZd dlZd dlZd dlZd dlmZ d dlmZmZmZmZmZ d dlmZ d dlmZ d Zd	d
d
di fdedefdZ G d de      Z  G d d      Z!ddZ"y)    Ntimeout)	timedelta)print)	BarColumnColumnProgressTableTimeElapsedColumn)
HttpClient)send_to_websocketc                    K   t        j                  d      4 d {   }|  d}|j                  |       d {   }|j                  dk(  cd d d       d {    S 7 B7 &7 	# 1 d {  7  sw Y   y xY ww)N
   r   z/api/prompt   )r   creategetstatus_code)base_urlclienturlresponses       S/home/jay/workspace/tools/ai-image-gen/jaaz-app/server/routers/comfyui_execution.pycheck_comfy_server_runningr      ss       , + +
+&C(##s*+ + +(+ + + +sT   A;A A;A&A"A&A;A$A;"A&$A;&A8,A/-A84A;TFi,  workflowctxc           	      2  K   t        |       d {   s%t        d| d       t        j                  d      d }t	        j                         }|rt        d       t               }nt        d       t        | ||||||      }		 |r|	j                          d {    |	j                          d {    |r|	j                          d {    t	        j                         }
|j                          d }t        |	j                        dkD  r't        d	       |	j                  D ]  }t        |        t        |
|z
  
      }t        d| d       nt        d       |r|j                          |	S 7 e7 7 7 # |r|j                          w w xY ww)Nz4[bold red]ComfyUI not running on specified address (z)[/bold red]   )codezExecuting comfyui workflowzQueuing comfyui workflow)r   r   z"[bold green]
Outputs:[/bold green])secondsz+[bold green]
Workflow execution completed (z)[/bold green]z([bold green]Workflow queued[/bold green])r   pprinttyperExittimeExecutionProgressr   WorkflowExecutionconnectqueuewatch_executionstoplenoutputsr   )r   r   waitverboselocal_pathsr   r   progressstart	executionendfelapseds                r   executer5      s|     ,H555B8*LY	
 jja  HIIKE+,$& 	()!(GX{GI##%%%oo++---))+CMMOH9$$%)<="** A1I  e4G>wi~V =>MMO[ 6, &-$ MMO s_   FE6A4FE? E9E? 4E;5E? E=BE? "F9E? ;E? =E? ?FFc                       e Zd Zd Zy)r$   c              #     K   d | j                   D        }| j                  D ]  }dj                  |      }|j                  j	                  d      dk(  rft        j                  |d| j                  d}|j                  t               j                  |      |t               j                  |             | | j                  |g        y w)Nc              3      K   | ]>  }t        |t              rt        d       n|j                         j	                          @ yw)T)no_wrapN)
isinstancestrr   get_table_columncopy).0_columns     r   	<genexpr>z4ExecutionProgress.get_renderables.<locals>.<genexpr>X   sE      
  gs+ t$--/4467
s   AAz-[progress.percentage]{task.percentage:>3.0f}%)taskprogress_typeoverall)r   r   )paddingexpand)columnstasksformatfieldsr   r
   gridrE   add_rowr   renderr   make_tasks_table)selftable_columnsrA   percentoverall_tables        r   get_renderablesz!ExecutionProgress.get_renderablesW   s     
  <<
 JJ 	4DELLRVLWG{{/9< %

"F4;;! %%K&&t,g7H7J7Q7QRV7W $#++TF33	4s   CCN)__name__
__module____qualname__rR        r   r$   r$   V   s    4rW   r$   c                   r    e Zd Zdi fdefdZd Zd Zd Zd Zd Z	d	 Z
d
 Zd Zd Zd Zd Zd Zd Zd Zy)r%      r   c                    || _         || _        || _        || _        t	        t        j                               | _        g | _        || _	        t        | j                   j                               | _        t        | j                        | _        |r-| j                  j                  d| j                  d      | _        d | _        d | _        d | _        d | _        d | _        || _        || _        y )N rC   totalrB   )r   r   r-   r.   r;   uuiduuid4	client_idr+   r/   setkeysremaining_nodesr*   total_nodesadd_taskoverall_taskcurrent_nodeprogress_taskprogress_node	prompt_idwsr   r   )rN   r   r   r-   r/   r.   r   r   s           r   __init__zWorkflowExecution.__init__p   s     ! &TZZ\* "4==#5#5#78t334 $ 6 6$**) !7 !D !!!rW   c                 J  K   | j                   j                  d      rd| _        nd| _        | j                   j                  d      d   }d|v r|j                  d      d   }t	        j
                  | j                   | d| j                          d {   | _        y 7 
w)	Nhttpszwss://zws://z//r   /r   z/ws?clientId=)r   
startswithws_coresplit
websocketsr&   r`   rk   )rN   ws_urls     r   r&   zWorkflowExecution.connect   s     ==##G,#DL"DL$$T*1-&=\\#&q)F"**||nVHM$..1AB
 
 
s   BB#B!B#c                 z  K   | j                   | j                  d}t        j                         4 d {   }	 |j	                  | j
                   d|       d {   }|j                         }|d   | _        d d d       d {    y 7 X7 1# t        j                  $ r}d}|j                  j                  dk(  r|j                  j                  }n`|j                  j                  dk(  rG|j                  j                         }|d   j                         rt        j                  |d   d	
      }| j                  j!                          t#        d| d       t%        | j&                  j)                  d      d|d       d {  7   t+        |      d }~ww xY w7 # 1 d {  7  sw Y   y xY ww)N)promptr`   z/prompt)jsonrj   An unknown error occurred    node_errors   indent![bold red]Error running workflow
[/bold red]
session_iderrortyper   )r   r`   r   r   postr   rw   rj   httpxHTTPStatusErrorr   r   textrb   dumpsr/   r)   r    r   r   r   	Exception)rN   datar   r   bodyemessages          r   r'   zWorkflowExecution.queue   sp    --dnnE$$& 	) 	)&)!'g-FT!RR}}!%k!2		) 	) 	)R (( )5::))S0jjooGZZ++s2::??,DM*//1"&**T--@"K""$;G9KPQ'HHLL.70S    (()	) 	) 	) 	)s   2F;BF;F&#BBB<F;F#F;BF $C&F
FFF  F&#F;&F8,F/-F84F;c           	         K   | j                   2 3 d {   }t        |t              st        j                  |      }|j                  di       j                  d      | j                  k7  r^| j                  |       d {   rxt        j                         4 d {   }	 |j                  | j                   d| j                          d {   }|j                  dk7  rt        |      |j                         }| j                  |v r	 d d d       d {     y 	 d d d       d {    &7 "7 7 7 i7 "7 # t        $ r(}t        dt        |       d       t        |      d }~ww xY w# 1 d {  7  sw Y   zxY w6 y w)Nr   rj   z	/history/r   z [bold red]Error getting history
r   )rk   r:   r;   rw   loadsr   rj   
on_messager   r   r   r   r   r    )rN   r   r   r   response_bodyr   s         r   r(   z!WorkflowExecution.watch_execution   sl    !WW 	5 	5''3'**W-;;vr*..{;t~~M!__W555)002 5 5f5-3ZZ4==/SWSaSaRb8c-d'dH'33s:&/&9 9,4MMOM#~~> %5 5 5 !)5 5 5	5
 65'd5 5  ) 5"%Fs1vhk#Z["+G"4455 5 5 %s   FFD5FFAFD8FFD: F#E6%-ED<<EFD>F#F.E /F5F8F:F<E>F F	E3#E..E33E66F		<E?=F		
Fc                     | j                   j                  | j                  | j                  t	        | j
                        z
         y )N	completed)r/   updaterf   rd   r*   rc   )rN   s    r   update_overall_progressz)WorkflowExecution.update_overall_progress   s:    )9)9C@T@T<U)U 	 	
rW   c                 P    | j                   |   }d|v rd|d   v r|d   d   S |d   S )N_metatitle
class_type)r   )rN   node_idnodes      r   get_node_titlez WorkflowExecution.get_node_title   s<    }}W%d?w$w-7=))L!!rW   c                     | j                   sy | j                  |   }|d   }| j                  |      }||k7  r	|d| dz  }|d| dz  }t        | d|        y )Nr   z[bright_black] - z[/]z[bright_black] (z)[/]z : )r-   r   r   r    )rN   r   r   r   r   r   s         r   log_nodezWorkflowExecution.log_node   sw    ||}}W%,'
##G,J(C88E#G9D11$s5'"#rW   c                 b    t         j                  j                  |      }| j                   d| S )Nz/view?)urllibparse	urlencoder   )rN   imgquerys      r   format_image_pathz#WorkflowExecution.format_image_path   s+    &&s+--ug..rW   c                   K   d|v r|d   ni }d|vs|d   | j                   k7  ry|d   dk(  r| j                  |       d {   S |d   dk(  r| j                  |       d {   S |d   dk(  r| j                  |       d {    y|d   dk(  r| j	                  |       d {    y|d   d	k(  r| j                  |       d {    y|d   d
k(  r| j                  |       d {    y7 7 7 o7 O7 /7 w)Nr   rj   Tr   status	executingexecution_cachedr/   executedexecution_error)rj   	on_statuson_executing	on_cachedon_progresson_executedon_error)rN   r   r   s      r   r   zWorkflowExecution.on_message   s     "(G"3wvd"d;&74>>&I6?h&---V_+**4000V_ 22..&&&  V_
*""4(((  V_
*""4(((  V_ 11--%%% .0&((%sk   ?C;C/ C;"C1# C;C3!C;%C5&!C;C7!C;)C9*C;1C;3C;5C;7C;9C;c           	         K   |d   d   d   d   }t        | j                  j                  d      d| j                  j                  d      | j                  j                  d      d| d	d
       d {    y 7 w)Nr   r   	exec_infoqueue_remainingr   tool_call_progresstool_call_idzIn queue, there's z works ahead...r   r   r   r   )r   r   r   )rN   r   r'   s      r   r   zWorkflowExecution.on_status   su     VX&{34EFHHLL&, $^ <"hhll<8.ug_E	
 	
 	
s   A2A<4A:5A<c           
        K   | j                   r,| j                  j                  | j                          d | _         |d   y| j                  r5| j                  j                  | j                         | j                          |j                  d|j                  d            }|| _        | j                  d|       | j                  j                  d      rvt        | j                  j                  d      d| j                  j                  d      | j                  j                  d      d| j                  |       d	       d {    y
7 w)Nr   Fdisplay_node	Executingr   r   r   
Executing r   T)rh   r/   remove_taskrg   rc   discardr   r   r   r   r   r   )rN   r   r   s      r   r   zWorkflowExecution.on_executing  s    MM%%d&8&89!%D<  $$,,T->->?,,.hh~txx/?@G 'DMM+w/xx||L)'HHLL. 4(,^(D&*hhll<&@$.t/B/B7/K.L"M	   s   EEE	Ec                    K   |d   }|D ]/  }| j                   j                  |       | j                  d|       1 | j                          y w)NnodesCached)rc   r   r   r   )rN   r   r   ns       r   r   zWorkflowExecution.on_cached"  sN     W 	'A  ((+MM(A&	' 	$$&s   AAc                   K   |d   }| j                   j                  d      rt        | j                   j                  d      d| j                   j                  d      | j                   j                  d      d| j                  |       dt	        |d   |d   z  d	z         d
d       d {    | j
                  |k7  rm|| _        | j                  r%| j                  j                  | j                         | j                  j                  | j                  |      |d   d      | _        | j                  j                  | j                  |d          y 7 w)Nr   r   r   r   r    valuemaxd   %r   r\   r   )r   r   r   r   roundri   rh   r/   r   re   r   )rN   r   r   s      r   r   zWorkflowExecution.on_progress)  s8    F|88<<%#\*0$(HHLL$@"&((,,|"< *4+>+>t+D*EQuTRY]]abg]hMhknMnGoFppqr	   %!%D!!))$*<*<=!%!7!7##D)eF "8 "D 	T//4=I%s   B+E-E.B,Ec                 R  K   | j                   j                  |d          | j                          d|vry |d   }|y |j                  dg       D ],  }| j                  j                  | j                  |             . |j                  dg       D ],  }| j                  j                  | j                  |             . t        | j                  j                  d      d| j                  j                  d      | j                  j                  d      dd	       d {    y 7 w)
Nr   outputimagesgifsr   r   r   r[   r   )	rc   r   r   r   r+   appendr   r   r   )rN   r   r   r   gifs        r   r   zWorkflowExecution.on_executed@  s    $$T&\2$$&4h>::h+ 	=CLL 6 6s ;<	= ::fb) 	=CLL 6 6s ;<	=  HHLL&, $^ <"hhll<8	
 	
 	
s   DD'D% D'c                    K   t        dt        j                  |d       d       t        | j                  j                  d      dt        j                  |d      d       d {    t        t        j                  |d            7 $w)Nr   r|   r}   r   r   r   r   )r    rw   r   r   r   r   r   )rN   r   s     r   r   zWorkflowExecution.on_error\  sz     0D1K0LKX	
  HHLL&tzz$q'AB
 	
 	
 

4233		
s   A%B'B(%BN)rS   rT   rU   dictrl   r&   r'   r(   r   r   r   r   r   r   r   r   r   r   r   rV   rW   r   r%   r%   o   s`      >

)05,

"$/(

8'J.
84rW   r%   c                   K   d|| fi}d|dd}t        j                         4 d {   }	 |j                  | d||       d {   }|j                         }|d   }	| d|	 cd d d       d {    S 7 Q7 37 	# t        j
                  $ r}
d	}|
j                  j                  d
k(  r|
j                  j                  }n`|
j                  j                  dk(  rG|
j                  j                         }|d   j                         rt        j                  |d   d      }t        d| d       t        |      d }
~
ww xY w# 1 d {  7  sw Y   y xY ww)Nimageinputfalse)r   	subfolder	overwritez/upload/image)filesr   namero   rx   ry   rz   r{   r|   r}   z [bold red]Error uploading image
r   )r   r   r   rw   r   r   r   r   r   rb   r   r    r   )r   r   filenamer   r   r   r   r   r   
image_namer   r   s               r   upload_imager   g  sS    x'(E)'JD  " % %f	%#[[*M*%d )  H ==?DfJ[*.% % %% $$ 		%1Gzz%%,**//''3.zz(&++-"jjm)<QGG6wi{KLG$$		%% % %st   %EA9EEA?A;A?'E3A=4E;A?=E?EB,D>>EEEEEE)Njaaz)#rw   ossocketr   sysr#   urllib.errorr   urllib.parser^   datetimer   asyncior   rs   r!   richr   r    rich.progressr   r   r	   r
   r   utils.http_clientr   services.websocket_servicer   r   r   r5   r$   r%   r   rV   rW   r   <module>r      s     	  
            O O ( 8+ 
66 
6r4 42u4 u4p%rW   