o
    i>                     @   s   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	B fd
dZdd Zdeded	B fddZdedd	fddZdee dee fddZG dd dejZG dd dejZG dd dejZ G dd deZ!de!fd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                 C   sB   g }| d dkr| td| d d |r| tdd |p d S )Nr   enabledupscale_factor)processr   r   )r   )appendr
   )r   r   ops r   8/mnt/c/Users/fbmor/ComfyUI/comfy_api_nodes/nodes_reve.py_build_postprocessing   s   r   c                   C   sR   t jjdt jdg t jdt jjddddddd	ggd
dt jjd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Booleanr   r   r   r   _postprocessing_inputs#   s0   r*   headersc                 C   s"   |  d}|d urt|d S d S )Nzx-reve-credits-usedgp=
c@)getfloat)r+   credits_usedr   r   r   _reve_price_extractorA   s   
r/   c                 C   s<   |  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.)r,   
ValueErrorlower)r+   
error_coder   r   r   _reve_response_header_validatorH   s   
r5   versionsaspect_ratiosc                    s    fdd| D S )Nc                    sB   g | ]}t j|t jjd  ddt jjddddddddgqS )	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versionr7   r   r   
<listcomp>Q   s*    z!_model_inputs.<locals>.<listcomp>r   )r6   r7   r   r?   r   _model_inputsP   s   
rA   c                   @   s@   e Zd Zedd Zedededededede	j
fd	d
ZdS )ReveImageCreateNodec                 C   s   t jddddt jjddddd	t jjd
tdgg ddddgt t jjd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ddd	S )NrB   zReve Image Createapi node/image/Revez2Generate images from text descriptions using Reve.promptTr0   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:1r?   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&   rA   r*   r(   ImageOutputHiddenauth_token_comfy_orgapi_key_comfy_org	unique_id
PriceBadgePriceBadgeDependsclsr   r   r   define_schemak   sX   
z!ReveImageCreateNode.define_schemarD   rG   r   r   rO   r   c                    sj   t |ddd t| tddddidd	ttt||d
 |d |d t||ddI d H }tt	t
|S )Nr    
  
min_length
max_lengthz/proxy/reve/v1/image/createPOSTAccept
image/webppathmethodr+   Tr8   rG   r9   )rD   r8   r>   r9   postprocessing	as_binaryprice_extractorresponse_header_validatordata)r   r   r   r/   r5   r   r   r   
NodeOutputr   r   )ro   rD   rG   r   r   rO   responser   r   r   execute   s*   	zReveImageCreateNode.executeN)__name__
__module____qualname__classmethodrp   strdictboolintr   r   r   r   r   r   r   rB   i   s"    
9rB   c                   @   sF   e Zd Zedd Zedejdededede	de
d	ejfd
dZdS )ReveImageEditNodec                 C   s   t jddddt jjdddt jjdd	d
ddt jjdtddgg ddddgt t jjd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ddd	S )Nr   zReve Image EditrC   z:Edit images using natural language instructions with Reve.imagezThe image to edit.)r#   edit_instructionTr0   zCText description of how to edit the image. Maximum 2560 characters.rE   rG   zreve-edit@20250915zreve-edit-fast@20251030autorI   rJ   rH   rK   rL   rM   rN   r?   z!Model version to use for editing.r$   rO   r   rP   rQ   rR   rG   r   rT   rU     
                (
                    $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}
                )
                rW   rZ   )r   rd   rf   r   re   r&   rA   r*   r(   rg   rh   ri   rj   rk   rl   rm   rn   r   r   r   rp      sZ   
zReveImageEditNode.define_schemar   r   rG   r   r   rO   r   c           
         s   t |ddd |d }|d }t| tdddd	id
dttt|t||dkr(|nd |d |r4|dkr4|nd t||ddI d H }	t	t
t|	S )Nr   rq   rr   r9   r8   z/proxy/reve/v1/image/editru   rv   rw   rx   Tr   rG   )r   reference_imager8   r>   r9   r{   r|   )r   r   r   r/   r5   r   r   r   r   r   r   r   )
ro   r   r   rG   r   r   rO   ttsarr   r   r   r   r     s0   
zReveImageEditNode.executeN)r   r   r   r   rp   r   rf   r   r   r   r   r   r   r   r   r   r   r   r      s&    
>r   c                   @   sH   e Zd Zedd Zedejjdede	de	de
ded	ejfd
dZdS )ReveImageRemixNodec                 C   s   t jddddt jjdt jjt jdddd	d
dt jjdddddt jjdtddgg ddddgt	 t j
jd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dd d!	S )"Nr   zReve Image RemixrC   zKCombine reference images with text prompts to create new images using Reve.reference_imagesr   image_r      )prefixr    r!   )templaterD   Tr0   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.rE   rG   zreve-remix@20250915zreve-remix-fast@20251030r   r?   z"Model version to use for remixing.r$   rO   r   rP   rQ   rR   r   rU   r   rW   rZ   )r   rd   Autogrowr   TemplatePrefixrf   re   r&   rA   r*   r(   rg   rh   ri   rj   rk   rl   rm   rn   r   r   r   rp   *  sj   
	
%z ReveImageRemixNode.define_schemar   rD   rG   r   r   rO   r   c                    s   t |ddd |stdg }|D ]}|t||  qt|dkr(td|d }	|d }
t| td	d
ddiddttt	|||
dkrF|
nd |d |	rR|	dkrR|	nd t
||ddI d H }ttt|S )Nr   rq   rr   z)At least one reference image is required.r   z'Maximum 6 reference images are allowed.r9   r8   z/proxy/reve/v1/image/remixru   rv   rw   rx   Tr   rG   )rD   r   r8   r>   r9   r{   r|   )r   r2   r   r   lenr   r   r/   r5   r	   r   r   r   r   r   )ro   r   rD   rG   r   r   rO   ref_base64_listkeyr   r   r   r   r   r   r   s  s>   
zReveImageRemixNode.executeN)r   r   r   r   rp   r   r   Typer   r   r   r   r   r   r   r   r   r   r   (  s&    
Hr   c                   @   s(   e Zd Zedeeej  fddZdS )ReveExtensionr   c                    s   t ttgS N)rB   r   r   )selfr   r   r   get_node_list  s
   zReveExtension.get_node_listN)	r   r   r   r   listtyper   	ComfyNoder   r   r   r   r   r     s    r   c                      s   t  S r   )r   r   r   r   r   comfy_entrypoint  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*   r-   r/   r5   r   rA   r   rB   r   r   r   r   r   r   r   r   <module>   s    	[du
