
    +j1=                     z   d dl mZ d dlmZ d dlmZmZmZ d dlm	Z	m
Z
mZmZ d dlmZmZmZmZmZ dededee         d	z  fd
Zd Zdeded	z  fdZdedd	fdZdee         dee         fdZ G d dej                  Z G d dej                  Z G d dej                  Z  G d de          Z!de!fdZ"d	S )    )BytesIO)override)IOComfyExtensionInput)ReveImageCreateRequestReveImageEditRequestReveImageRemixRequestRevePostprocessingOperation)ApiEndpointbytesio_to_image_tensorsync_op_rawtensor_to_base64_stringvalidate_stringupscaleremove_backgroundreturnNc                     g }| d         dk    r*|                     t          d| d                              |r#|                     t          d                     |pd S )Nr   enabledupscale_factor)processr   r   )r   )appendr   )r   r   opss      :/home/wildlama/comfy/ComfyUI/comfy_api_nodes/nodes_reve.py_build_postprocessingr      s    
CyY&&

'!&'78  	
 	
 	
  M

.7JKKKLLL;$    c                  N   t           j                            dt           j                            dg           t           j                            dt           j                            dddddd	          g          gd
          t           j                            ddd          gS )Nr   disabledr   r            zUpscale factor (2x, 3x, or 4x).)defaultminmaxsteptooltipz5Upscale the generated image. May add additional cost.optionsr&   r   FzHRemove the background from the generated image. May add additional cost.)r"   r&   )r   DynamicCombor   OptionIntBoolean r   r   _postprocessing_inputsr.   #   s    
&&z266&&,$% ! !!"$E %  	   L% 	 	
 	
( 	
^ 	 	
 	
+ r   headersc                 X    |                      d          }|t          |          dz  S d S )Nzx-reve-credits-usedgp=
c@)getfloat)r/   credits_useds     r   _reve_price_extractorr4   A   s2    ;;455L\""V++4r   c                     |                      d          }|rt          d|           |                      dd                                          dk    rt          d          d S )Nzx-reve-error-codezReve API error: zx-reve-content-violation truez=The generated image was flagged for content policy violation.)r1   
ValueErrorlower)r/   
error_codes     r   _reve_response_header_validatorr;   H   sq    011J :8J88999{{-r2288::fDDXYYY EDr   versionsaspect_ratiosc                      fd| D             S )Nc                     g | ]h}t           j                            |t           j                            d d          t           j                            ddddddd          g          iS )	aspect_ratioz!Aspect ratio of the output image.r'   test_time_scalingr!      z:Higher values produce better images but cost more credits.T)r"   r#   r$   r%   r&   advanced)r   r)   r*   Combor   r+   ).0versionr=   s     r   
<listcomp>z!_model_inputs.<locals>.<listcomp>Q   s       ( ' 	")?   
 'X!   	
 	
  r   r-   )r<   r=   s    `r   _model_inputsrH   P   s0       (  )   r   c                   ^    e Zd Zed             Zedededededede	j
        fd            Zd	S )
ReveImageCreateNodec                 8   t          j        ddddt           j                            dddd	          t           j                            d
t          dgg d          d          gt                      t           j                            dddddd          t           j        	                                gt           j
        j        t           j
        j        t           j
        j        gdt          j        t          j        ddg          d          	  	        S )NrJ   zReve Image Createpartner/image/Revez2Generate images from text descriptions using Reve.promptTr6   z?Text description of the desired image. Maximum 2560 characters.	multiliner"   r&   modelzreve-create@20250915)3:216:99:162:34:33:41:1r=   z$Model version to use for generation.r'   seedr   _Seed controls whether the node should re-run; results are non-deterministic regardless of seed.r"   r#   r$   control_after_generater&   r   upscale.upscale_factorwidgetsa6  
                (
                    $factor := $lookup(widgets, "upscale.upscale_factor");
                    $fmt := {"approximate": true, "note": "(base)"};
                    widgets.upscale = "enabled" ? (
                        $factor = 4 ? {"type": "usd", "usd": 0.0762, "format": $fmt}
                        : $factor = 3 ? {"type": "usd", "usd": 0.0591, "format": $fmt}
                        : {"type": "usd", "usd": 0.0457, "format": $fmt}
                    ) : {"type": "usd", "usd": 0.03432, "format": $fmt}
                )
                
depends_onexpr	node_iddisplay_namecategorydescriptioninputsoutputshiddenis_api_nodeprice_badge)r   SchemaStringr   r)   rH   r.   r+   ImageOutputHiddenauth_token_comfy_orgapi_key_comfy_org	unique_id
PriceBadgePriceBadgeDependsclss    r   define_schemaz!ReveImageCreateNode.define_schemak   sH   y),)L	"]	     %%)/0&Y&Y&Y   C &   ())  "+/H   !4 X__&&'	.	+	#
 /&(@A  
	  M6
 6
 6
 6	
r   rM   rP   r   r   rY   r   c                 X  K   t          |dd           t          | t          ddddi          d	t          t          t          ||d
         |d         |d         t          ||                               d {V }t          j        t          t          |                              S )Nr!    
  
min_length
max_lengthz/proxy/reve/v1/image/createPOSTAccept
image/webppathmethodr/   Tr@   rP   rA   )rM   r@   rF   rA   postprocessing	as_binaryprice_extractorresponse_header_validatordata)r   r   r   r4   r;   r   r   r   
NodeOutputr   r   )ry   rM   rP   r   r   rY   responses          r   executezReveImageCreateNode.execute   s       	1>>>>$2!<0  
 1&E'">2g"'(;"<4W>OPP  
 
 
 
 
 
 
 
 
$ }4WX5F5FGGHHHr   N)__name__
__module____qualname__classmethodrz   strdictboolintr   r   r   r-   r   r   rJ   rJ   i   s        7
 7
 [7
r II I 	I
  I I 
I I I [I I Ir   rJ   c                   l    e Zd Zed             Zedej        dededede	de
dej        fd	            Zd
S )ReveImageEditNodec                 z   t          j        ddddt           j                            dd          t           j                            dd	d
d          t           j                            dt          ddgg d          d          gt                      t           j                            ddddd	d          t           j        	                                gt           j
        j        t           j
        j        t           j
        j        gd	t          j        t          j        g d          d          	  	        S )Nr   zReve Image EditrL   z:Edit images using natural language instructions with Reve.imagezThe image to edit.)r&   edit_instructionTr6   zCText description of how to edit the image. Maximum 2560 characters.rN   rP   zreve-edit@20250915zreve-edit-fast@20251030autorR   rS   rQ   rT   rU   rV   rW   rX   z!Model version to use for editing.r'   rY   r   rZ   r[   r\   rP   r   r^   r_     
                (
                    $fmt := {"approximate": true, "note": "(base)"};
                    $isFast := $contains(widgets.model, "fast");
                    $enabled := widgets.upscale = "enabled";
                    $factor := $lookup(widgets, "upscale.upscale_factor");
                    $isFast
                        ? {"type": "usd", "usd": 0.01001, "format": $fmt}
                        : $enabled ? (
                            $factor = 4 ? {"type": "usd", "usd": 0.0991, "format": $fmt}
                            : $factor = 3 ? {"type": "usd", "usd": 0.0819, "format": $fmt}
                            : {"type": "usd", "usd": 0.0686, "format": $fmt}
                        ) : {"type": "usd", "usd": 0.0572, "format": $fmt}
                )
                ra   rd   )r   rn   rp   r   ro   r)   rH   r.   r+   rq   rr   rs   rt   ru   rv   rw   rx   s    r   rz   zReveImageEditNode.define_schema   sa   y'*)Tw0DEE	&"a	     %%)-/HI&a&a&a   @ &    ())!" "+/H   #6 X__&&'	.	+	#
 /JJJ  	  O;
 ;
 ;
 ;	
r   r   r   rP   r   r   rY   r   c                   K   t          |dd           |d         }|d         }t          | t          dddd	i
          dt          t          t          |t          |          |dk    r|nd |d         |r|dk    r|nd t          ||                               d {V }	t          j	        t          t          |	                              S )Nr!   r|   r}   rA   r@   z/proxy/reve/v1/image/editr   r   r   r   Tr   rP   )r   reference_imager@   rF   rA   r   r   )r   r   r   r4   r;   r	   r   r   r   r   r   r   )
ry   r   r   rP   r   r   rY   ttsarr   s
             r   r   zReveImageEditNode.execute  s      	(Q4HHHH'(>"$0!<0  
 1&E%!1 7 > >#%<<RRTg),"Bq##d4W>OPP  
 
 
 
 
 
 
 
 
& }4WX5F5FGGHHHr   N)r   r   r   r   rz   r   rp   r   r   r   r   r   r   r   r-   r   r   r   r      s        <
 <
 [<
| I{I I 	I
 I  I I 
I I I [I I Ir   r   c                   v    e Zd Zed             Zedej        j        dede	de	de
dedej        fd	            Zd
S )ReveImageRemixNodec                    t          j        ddddt           j                            dt           j                            t           j                            d          ddd	
                    t           j                            dddd          t           j                            dt          ddgg d          d          gt                      t           j
                            dddddd          t           j                                        gt           j        j        t           j        j        t           j        j        gdt          j        t          j        g d          d           !	  	        S )"Nr   zReve Image RemixrL   zKCombine reference images with text prompts to create new images using Reve.reference_imagesr   image_r!      )prefixr#   r$   )templaterM   Tr6   zText description of the desired image. May include XML img tags to reference specific images by index, e.g. <img>0</img>, <img>1</img>, etc.rN   rP   zreve-remix@20250915zreve-remix-fast@20251030r   rX   z"Model version to use for remixing.r'   rY   r   rZ   r[   r\   r   r_   r   ra   rd   )r   rn   Autogrowr   TemplatePrefixrp   ro   r)   rH   r.   r+   rq   rr   rs   rt   ru   rv   rw   rx   s    r   rz   z ReveImageRemixNode.define_schema*  s   y(+)e!!&[77w//'	 8   "   	"<	     %%).0JK&a&a&a   A &  %$4 ())5$6 "+/H   7$J X__&&'	.	+	#
 /JJJ  	  cE
 E
 E
 E	
r   r   rM   rP   r   r   rY   r   c                 J  K   t          |dd           |st          d          g }|D ]*}|                    t          ||                              +t	          |          dk    rt          d          |d         }	|d         }
t          | t          d	d
ddi          dt          t          t          |||
dk    r|
nd |d         |	r|	dk    r|	nd t          ||                               d {V }t          j        t          t          |                              S )Nr!   r|   r}   z)At least one reference image is required.r   z'Maximum 6 reference images are allowed.rA   r@   z/proxy/reve/v1/image/remixr   r   r   r   Tr   rP   )rM   r   r@   rF   rA   r   r   )r   r8   r   r   lenr   r   r4   r;   r
   r   r   r   r   r   )ry   r   rM   rP   r   r   rY   ref_base64_listkeyr   r   r   s               r   r   zReveImageRemixNode.executes  s{      	1>>>> 	JHIII# 	S 	SC""#:;KC;P#Q#QRRRR!##FGGG'(>"$1!<0  
 1&E&!0#%<<RRTg),"Bq##d4W>OPP  
 
 
 
 
 
 
 
 
& }4WX5F5FGGHHHr   N)r   r   r   r   rz   r   r   Typer   r   r   r   r   r   r-   r   r   r   r   (  s        F
 F
 [F
P &I+*&I &I 	&I
 &I  &I &I 
&I &I &I [&I &I &Ir   r   c                   L    e Zd Zedeeej                          fd            ZdS )ReveExtensionr   c                 .   K   t           t          t          gS N)rJ   r   r   )selfs    r   get_node_listzReveExtension.get_node_list  s        
 	
r   N)	r   r   r   r   listtyper   	ComfyNoder   r-   r   r   r   r     sE        
T$r|*<%= 
 
 
 X
 
 
r   r   c                  "   K   t                      S r   )r   r-   r   r   comfy_entrypointr     s      ??r   )#ior   typing_extensionsr   comfy_api.latestr   r   r   comfy_api_nodes.apis.rever   r	   r
   r   comfy_api_nodes.utilr   r   r   r   r   r   r   r   r   r.   r2   r4   r;   r   rH   r   rJ   r   r   r   r   r-   r   r   <module>r      s         & & & & & & 6 6 6 6 6 6 6 6 6 6                        4 D TJeEfimEm      <4 EDL    ZT Zd Z Z Z ZDI d3i    2XI XI XI XI XI", XI XI XIvaI aI aI aI aI aI aI aIHrI rI rI rI rI rI rI rIj
 
 
 
 
N 
 
 
      r   