
    ^(j1=                     l   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"y	)    )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|j                  t        d| d                |r|j                  t        d             |xs d S )Nr   enabledupscale_factor)processr   r   )r   )appendr   )r   r   opss      D/Users/danicosta/Desktop/Flux2/ComfyUI/comfy_api_nodes/nodes_reve.py_build_postprocessingr      sV    
CyY&

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

.7JKL;$    c                  N   t         j                  j                  dt         j                  j                  dg       t         j                  j                  dt         j                  j                  dddddd	      g      gd
      t         j
                  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&&,$% ! !!"$E % 	  L% 	 	
( 	

^ 	 	
+ r   headersc                 F    | j                  d      }|t        |      dz  S y )Nzx-reve-credits-usedgp=
c@)getfloat)r/   credits_useds     r   _reve_price_extractorr4   A   s*    ;;45L\"V++r   c                     | j                  d      }|rt        d|       | j                  dd      j                         dk(  rt        d      y )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   sV    01J+J<899{{-r288:fDXYY Er   versionsaspect_ratiosc                     | D cg c]h  }t         j                  j                  |t         j                  j	                  d|d      t         j
                  j	                  ddddddd	      g      j c}S c c}w )
N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+   )r<   r=   versions      r   _model_inputsrE   P   s    *  )(  G' 	")?  
 'X!  	
&  )  s   A-A5c                   Z    e Zd Zed        Zedededededede	j                  fd       Zy	)
ReveImageCreateNodec                 d   t        j                  ddddt         j                  j                  dddd	      t         j                  j                  d
t        dgg d      d      gt               t         j                  j                  dddddd      t         j                  j                         gt         j                  j                  t         j                  j                  t         j                  j                  gdt        j                  t        j                  ddg      d      	      S )NrG   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)   rE   r.   r+   ImageOutputHiddenauth_token_comfy_orgapi_key_comfy_org	unique_id
PriceBadgePriceBadgeDependsclss    r   define_schemaz!ReveImageCreateNode.define_schemak   s#   yy),)L		"]	    %%)/0&Y C &  ()  "+/H  !4 XX__&'		..		++		##
 //&(@A
	M6
 6	
r   rJ   rM   r   r   rV   r   c                   K   t        |dd       t        | t        ddddi      d	t        t        t        ||d
   |d   |d   t        ||                   d {   }t        j                  t        t        |                  S 7 +w)Nr!    
  
min_length
max_lengthz/proxy/reve/v1/image/createPOSTAccept
image/webppathmethodr/   Tr?   rM   r@   )rJ   r?   rD   r@   postprocessing	as_binaryprice_extractorresponse_header_validatordata)r   r   r   r4   r;   r   r   r   
NodeOutputr   r   )rv   rJ   rM   r   r   rV   responses          r   executezReveImageCreateNode.execute   s      	1>$2!<0
 1&E'">2g"'(;"<4W>OP
 
$ }}4WX5FGHH%
s   AB
B,B
N)__name__
__module____qualname__classmethodrw   strdictboolintr   r   r   r-   r   r   rG   rG   i   so    7
 7
r II I 	I
  I I 
I Ir   rG   c                   r    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y
)ReveImageEditNodec                    t        j                  ddddt         j                  j                  dd      t         j                  j                  dd	d
d      t         j
                  j                  dt        ddgg d      d      gt               t         j                  j                  ddddd	d      t         j                  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 EditrI   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.rK   rM   zreve-edit@20250915zreve-edit-fast@20251030autorO   rP   rN   rQ   rR   rS   rT   rU   z!Model version to use for editing.r'   rV   r   rW   rX   rY   rM   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}
                )
                r^   ra   )r   rk   rm   r   rl   r)   rE   r.   r+   rn   ro   rp   rq   rr   rs   rt   ru   s    r   rw   zReveImageEditNode.define_schema   s5   yy'*)Tw0DE		&"a	    %%)-/HI&a @ &   ()!" "+/H  #6 XX__&'		..		++		##
 //J	O;
 ;	
r   r   r   rM   r   r   rV   r   c                 T  K   t        |dd       |d   }|d   }t        | t        dddd	i
      dt        t        t        |t        |      |dk7  r|nd |d   |r|dkD  r|nd t        ||                   d {   }	t        j                  t        t        |	                  S 7 +w)Nr!   ry   rz   r@   r?   z/proxy/reve/v1/image/editr}   r~   r   r   Tr   rM   )r   reference_imager?   rD   r@   r   r   )r   r   r   r4   r;   r	   r   r   r   r   r   r   )
rv   r   r   rM   r   r   rV   ttsarr   s
             r   r   zReveImageEditNode.execute  s      	(Q4H'(>"$0!<0
 1&E%!1 7 >#%<RTg),q#d4W>OP
 
& }}4WX5FGHH'
s   A8B(:B&;,B(N)r   r   r   r   rw   r   rm   r   r   r   r   r   r   r   r-   r   r   r   r      s~    <
 <
| I{{I I 	I
 I  I I 
I Ir   r   c                       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y
)ReveImageRemixNodec                 "   t        j                  ddddt         j                  j                  dt         j                  j	                  t         j
                  j                  d      ddd	
            t         j                  j                  dddd      t         j                  j                  dt        ddgg d      d      gt               t         j                  j                  dddddd      t         j
                  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 RemixrI   zKCombine reference images with text prompts to create new images using Reve.reference_imagesr   image_r!      )prefixr#   r$   )templaterJ   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.rK   rM   zreve-remix@20250915zreve-remix-fast@20251030r   rU   z"Model version to use for remixing.r'   rV   r   rW   rX   rY   r   r\   r   r^   ra   )r   rk   Autogrowr   TemplatePrefixrm   rl   r)   rE   r.   r+   rn   ro   rp   rq   rr   rs   rt   ru   s    r   rw   z ReveImageRemixNode.define_schema*  sq   yy(+)e!!&[[77w/'	 8  "  		"<	    %%).0JK&a A & %$4 ()5$6 "+/H  7$J XX__&'		..		++		##
 //J	cE
 E	
r   r   rJ   rM   r   r   rV   r   c                   K   t        |dd       |st        d      g }|D ]  }|j                  t        ||                ! t	        |      dkD  rt        d      |d   }	|d   }
t        | t        d	d
ddi      dt        t        t        |||
dk7  r|
nd |d   |	r|	dkD  r|	nd t        ||                   d {   }t        j                  t        t        |                  S 7 +w)Nr!   ry   rz   z)At least one reference image is required.r   z'Maximum 6 reference images are allowed.r@   r?   z/proxy/reve/v1/image/remixr}   r~   r   r   Tr   rM   )rJ   r   r?   rD   r@   r   r   )r   r8   r   r   lenr   r   r4   r;   r
   r   r   r   r   r   )rv   r   rJ   rM   r   r   rV   ref_base64_listkeyr   r   r   s               r   r   zReveImageRemixNode.executes  s     	1>HII#C""#:;KC;P#QR $!#FGG'(>"$1!<0
 1&E&!0#%<RTg),q#d4W>OP
 
& }}4WX5FGHH'
s   B;C+=C)>,C+N)r   r   r   r   rw   r   r   Typer   r   r   r   r   r   r-   r   r   r   r   (  s    F
 F
P &I++**&I &I 	&I
 &I  &I &I 
&I &Ir   r   c                   B    e Zd Zedeeej                        fd       Zy)ReveExtensionr   c                 ,   K   t         t        t        gS wN)rG   r   r   )selfs    r   get_node_listzReveExtension.get_node_list  s       
 	
s   N)	r   r   r   r   listtyper   	ComfyNoder   r-   r   r   r   r     s)    
T$r||*<%= 
 
r   r   c                     K   t               S wr   )r   r-   r   r   comfy_entrypointr     s     ?s   )#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   rE   r   rG   r   r   r   r   r-   r   r   <module>r      s     & 6 6  4 D TJeEfimEm <4 EDL ZT Zd ZDI d3i 2XI",, XIvaI aIHrI rIj
N 
 r   