o
    ip                     @   s  d dl mZ d dlmZ d dlmZmZ d dlmZ d dl	Z
d dlZd dlmZmZmZmZmZ d dlmZmZmZmZmZ i dd	d
dddddddddddddddddddddd d!d"d#d$d%d&d'd(d)i d*d+d,d-d.d/d0d1d2d3d4d5d6d7d8d9d:d;d<d=d>d?d@dAdBdCdDdEdFdGdHdIdJdKi dLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd[d\d]d^d_d`dadbdcdddedfdgdhdidjdkdldmi dndodpdqdrdsdtdudvdwdxdydzd{d|d}d~dddddddddddddddddddddddddddddZddddddddddddZddddddddddddddddZg dZdd ZG dd dejZG dd dejZG dd dejZ G dd deZ!de!fddńZ"dS )    )BytesIO)override)IOComfyExtension)ImageN)IdeogramGenerateRequestIdeogramGenerateResponseImageRequestIdeogramV3RequestIdeogramV3EditRequest)ApiEndpointbytesio_to_image_tensordownload_url_as_bytesioresize_mask_to_imagesync_opAutoAUTOz
512 x 1536RESOLUTION_512_1536z
576 x 1408RESOLUTION_576_1408z
576 x 1472RESOLUTION_576_1472z
576 x 1536RESOLUTION_576_1536z
640 x 1024RESOLUTION_640_1024z
640 x 1344RESOLUTION_640_1344z
640 x 1408RESOLUTION_640_1408z
640 x 1472RESOLUTION_640_1472z
640 x 1536RESOLUTION_640_1536z
704 x 1152RESOLUTION_704_1152z
704 x 1216RESOLUTION_704_1216z
704 x 1280RESOLUTION_704_1280z
704 x 1344RESOLUTION_704_1344z
704 x 1408RESOLUTION_704_1408z
704 x 1472RESOLUTION_704_1472z
720 x 1280RESOLUTION_720_1280z
736 x 1312RESOLUTION_736_1312z
768 x 1024RESOLUTION_768_1024z
768 x 1088RESOLUTION_768_1088z
768 x 1152RESOLUTION_768_1152z
768 x 1216RESOLUTION_768_1216z
768 x 1232RESOLUTION_768_1232z
768 x 1280RESOLUTION_768_1280z
768 x 1344RESOLUTION_768_1344z	832 x 960RESOLUTION_832_960z
832 x 1024RESOLUTION_832_1024z
832 x 1088RESOLUTION_832_1088z
832 x 1152RESOLUTION_832_1152z
832 x 1216RESOLUTION_832_1216z
832 x 1248RESOLUTION_832_1248z
864 x 1152RESOLUTION_864_1152z	896 x 960RESOLUTION_896_960z
896 x 1024RESOLUTION_896_1024z
896 x 1088RESOLUTION_896_1088z
896 x 1120RESOLUTION_896_1120z
896 x 1152RESOLUTION_896_1152z	960 x 832RESOLUTION_960_832z	960 x 896RESOLUTION_960_896z
960 x 1024RESOLUTION_960_1024z
960 x 1088RESOLUTION_960_1088z
1024 x 640RESOLUTION_1024_640z
1024 x 768RESOLUTION_1024_768z
1024 x 832RESOLUTION_1024_832z
1024 x 896RESOLUTION_1024_896z
1024 x 960RESOLUTION_1024_960z1024 x 1024RESOLUTION_1024_1024z
1088 x 768RESOLUTION_1088_768z
1088 x 832RESOLUTION_1088_832z
1088 x 896RESOLUTION_1088_896z
1088 x 960RESOLUTION_1088_960z
1120 x 896RESOLUTION_1120_896z
1152 x 704RESOLUTION_1152_704z
1152 x 768RESOLUTION_1152_768z
1152 x 832RESOLUTION_1152_832z
1152 x 864RESOLUTION_1152_864z
1152 x 896RESOLUTION_1152_896z
1216 x 704RESOLUTION_1216_704z
1216 x 768RESOLUTION_1216_768z
1216 x 832RESOLUTION_1216_832z
1232 x 768RESOLUTION_1232_768z
1248 x 832RESOLUTION_1248_832z
1280 x 704RESOLUTION_1280_704z
1280 x 720RESOLUTION_1280_720z
1280 x 768RESOLUTION_1280_768z
1280 x 800RESOLUTION_1280_800z
1312 x 736RESOLUTION_1312_736z
1344 x 640RESOLUTION_1344_640RESOLUTION_1344_704RESOLUTION_1344_768RESOLUTION_1408_576RESOLUTION_1408_640RESOLUTION_1408_704RESOLUTION_1472_576RESOLUTION_1472_640RESOLUTION_1472_704RESOLUTION_1536_512RESOLUTION_1536_576RESOLUTION_1536_640)z
1344 x 704z
1344 x 768z
1408 x 576z
1408 x 640z
1408 x 704z
1472 x 576z
1472 x 640z
1472 x 704z
1536 x 512z
1536 x 576z
1536 x 640
ASPECT_1_1
ASPECT_4_3
ASPECT_3_4ASPECT_16_9ASPECT_9_16
ASPECT_2_1
ASPECT_1_2
ASPECT_3_2
ASPECT_2_3
ASPECT_4_5
ASPECT_5_4)1:14:33:416:99:162:11:23:22:34:55:41x33x11x22x19x1616x910x1616x102x33x23x44x34x55x41x1)z1:3z3:1rr   rq   rp   ro   z10:16z16:10rt   rs   rn   rm   ru   rv   rl   )Fr   512x1536576x1408576x1472576x1536640x1344640x1408640x1472640x1536704x1152704x1216704x1280704x1344704x1408704x1472736x1312768x1088768x1216768x1280768x1344800x1280832x960832x1024832x1088832x1152832x1216832x1248864x1152896x960896x1024896x1088896x1120896x1152960x832960x896960x1024960x10881024x8321024x8961024x960	1024x10241088x7681088x8321088x8961088x9601120x8961152x7041152x8321152x8641152x8961216x7041216x7681216x8321248x8321280x7041280x7681280x8001312x7361344x6401344x7041344x7681408x5761408x6401408x7041472x5761472x6401472x7041536x5121536x5761536x640c                    sR   g }| D ]}t |I dH }t|dd}|| q|r%tj|dd}|S td)zAHelper function to download and process multiple images from URLsNRGB)moder   )dimzNo valid images were processed)r   r   appendtorchcat	Exception)
image_urlsimage_tensors	image_urlimage_bytesio
img_tensorstacked_tensors r   </mnt/c/Users/fbmor/ComfyUI/comfy_api_nodes/nodes_ideogram.pydownload_and_process_images   s   r   c                   @   s2   e Zd Zedd Ze						dd	d
ZdS )
IdeogramV1c                 C   s   t jddddt jjddddd	t jjd
dddt jjdtt ddddt jjdg ddddddt j	jddddddt j
jddt jjddddddt j	jdddd dt j
jdd!g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 )&Nr   zIdeogram V1api node/image/Ideogramz-Generates images using the Ideogram V1 model.promptT Prompt for the image generation	multilinedefaulttooltipturboFHWhether to use turbo mode (faster generation, potentially lower quality)r   r   aspect_ratiorl   z&The aspect ratio for image generation.optionsr   r   optionalmagic_prompt_optionr   ONOFFr   5Determine if MagicPrompt should be used in generationr   r   r   r   advancedseedr      r   minmaxstepcontrol_after_generatedisplay_moder   negative_prompt-Description of what to exclude from the imager   r   r   r   
num_images   r   r   r   r   r   r   widgetsz
                (
                  $n := widgets.num_images;
                  $base := (widgets.turbo = true) ? 0.0286 : 0.0858;
                  {"type":"usd","usd": $round($base * $n, 2)}
                )
                
depends_onexpr	node_iddisplay_namecategorydescriptioninputsoutputshiddenis_api_nodeprice_badge)r   SchemaStringInputBooleanCombolistV1_V2_RATIO_MAPkeysIntNumberDisplaynumberr   OutputHiddenauth_token_comfy_orgapi_key_comfy_org	unique_id
PriceBadgePriceBadgeDependsclsr   r   r   define_schema   s   

7zIdeogramV1.define_schemaFrl   r   r   r   r   c                    s   t |d }|rdnd}t| tdddttt|||||dkr!|nd |dkr(|nd |r-|nd dd	d
dI d H }	|	jrCt|	jdkrGt	ddd |	jD }
|
sUt	dt
t|
I d H S )N	V_1_TURBOV_1/proxy/ideogram/generatePOSTpathmethodra   r   )r   modelr   r   r   r   r   image_requestr   )response_modeldatamax_retriesr   (No images were generated in the responsec                 S      g | ]}|j r|j qS r   url.0
image_datar   r   r   
<listcomp>^      z&IdeogramV1.execute.<locals>.<listcomp>,No image URLs were generated in the response)r  getr   r   r   r   r	   r0  lenr   r   
NodeOutputr   )r#  r   r   r   r   r   r   r   r,  responser   r   r   r   execute:  s4   

zIdeogramV1.executeN)Frl   r   r   r   r   __name__
__module____qualname__classmethodr$  r@  r   r   r   r   r      s    
Qr   c                   @   s8   e Zd Zedd Ze									
		dddZdS )
IdeogramV2c                 C   s(  t jddddt jjddddd	t jjd
dddt jjdtt ddddt jjdtt	 ddddt jjdg ddddddt j
jddddddt jjddt jjdg d d!d"dddt jjd#ddd$dd%t j
jd&ddd'dt jjdd(g	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 )-NrF  zIdeogram V2r   z-Generates images using the Ideogram V2 model.r   Tr   r   r   r   Fr   r   r   rl   zPThe aspect ratio for image generation. Ignored if resolution is not set to AUTO.r   
resolutionr   zaThe resolution for image generation. If not set to AUTO, this overrides the aspect_ratio setting.r   r   r   r   r   r   r   r   r   r   
style_type)r   GENERAL	REALISTICDESIGN	RENDER_3DANIMENONEz#Style type for generation (V2 only)r   r   r   r   r   r   r  z
                (
                  $n := widgets.num_images;
                  $base := (widgets.turbo = true) ? 0.0715 : 0.1144;
                  {"type":"usd","usd": $round($base * $n, 2)}
                )
                r  r  )r   r  r  r  r  r  r  r  r  V1_V1_RES_MAPr  r  r  r   r  r  r  r  r  r   r!  r"  r   r   r   r$  f  s   


OzIdeogramV2.define_schemaFrl   r   r   r   rN  r   r   c                    s   t |d }t|d }|rdnd}d }d }|dkr|}n|dkr$|nd }t| tdddttt|||	||||dkr<|nd |dkrC|nd |rH|nd |
rM|
nd d	
d
ddI d H }|jrct	|jdkrgt
ddd |jD }|sut
dtt|I d H S )N	V_2_TURBOV_2r   ra   r'  r(  r)  rN  )
r   r,  r   r   r   rG  r   rH  r   color_paletter-  r   )endpointr/  r0  r1  r   r2  c                 S   r3  r   r4  r6  r   r   r   r9    r:  z&IdeogramV2.execute.<locals>.<listcomp>r;  )r  r<  rO  r   r   r   r   r	   r0  r=  r   r   r>  r   )r#  r   r   r   rG  r   r   rH  r   r   rR  r,  final_resolutionfinal_aspect_ratior?  r   r   r   r   r@    sF   


zIdeogramV2.executeN)	Frl   r   r   r   rN  r   r   r   rA  r   r   r   r   rF  d  s    
irF  c                   @   s:   e Zd Zedd Ze											dd
dZdS )
IdeogramV3c                 C   s@  t jddddt jjddddd	t jjd
dddt jjddddt jjdtt	 ddddt jjdt
ddddt jjdg ddddddt jjddddddt jjddt jjd ddd!dt jjdd"t jjd#g d$d%d&dddt jjd'd(ddt jjd)d*ddgt j gt jjt jjt jjgdt jt jd#d gd'gd+d,d-d.	S )/NrV  zIdeogram V3r   zGenerates images using the Ideogram V3 model. Supports both regular image generation from text prompts and image editing with mask.r   Tr   z*Prompt for the image generation or editingr   imagez+Optional reference image for image editing.)r   r   maskz;Optional mask for inpainting (white areas will be replaced)r   rl   zPThe aspect ratio for image generation. Ignored if resolution is not set to Auto.r   rG  r   zaThe resolution for image generation. If not set to Auto, this overrides the aspect_ratio setting.r   r   r   r   r   r   r   r   r   r   r   r   r   rendering_speed)DEFAULTTURBOQUALITYrZ  z;Controls the trade-off between generation speed and qualitycharacter_imagez$Image to use as character reference.character_maskz,Optional mask for character reference image.)r  r  a:  
                (
                  $n := widgets.num_images;
                  $speed := widgets.rendering_speed;
                  $hasChar := inputs.character_image.connected;
                  $base :=
                    $contains($speed,"quality") ? ($hasChar ? 0.286 : 0.1287) :
                    $contains($speed,"default") ? ($hasChar ? 0.2145 : 0.0858) :
                    $contains($speed,"turbo") ? ($hasChar ? 0.143 : 0.0429) :
                    0.0858;
                  {"type":"usd","usd": $round($base * $n, 2)}
                )
                r  r  )r   r  r  r  r   Maskr  r  V3_RATIO_MAPr  V3_RESOLUTIONSr  r  r  r  r  r  r  r  r   r!  r"  r   r   r   r$    s   

	OzIdeogramV3.define_schemaNr   rl   r   r   r   rZ  c              	      s  |	dkrd}	d }d }|
d ur|
   }|d ur]t||
dd}d| }|jdd  |
jdd kr6td|    d	 tj}t	
|}t }|j|d
d |d |}d|_| d	 tj}t	
|}t }|j|d
d |d |}d|_n|d urtd|d urD|d urD|   }t||dd}d| }|jdd  |jdd krtd| d	 tj}t	
|}t }|j|d
d |d |}d|_|    d	 tj}t	
|}t }|j|d
d |d |}d|_t||	d}|dkr||_|dkr||_|dkr||_||d}|r*||d< |r1||d< t| tdddt||dddI d H }nr|d usN|d urRtdt||	d}|dkra||_n|dkrqt|}|rq||_|dkry||_|dkr||_|dkr||_i }|r||d< |r||d< |rd|_t| tdddt||r|nd dddI d H }|jrt|jdkrtd d!d" |jD }|std#tt |I d H S )$NBALANCEDrZ  F)allow_gradientg      ?r   z.Character mask and image must be the same size   PNG)formatr   zmask.pngz	image.pngz5Character mask requires character image to be presentz$Mask and Image must be the same size)r   rY  r   )rW  rX  character_reference_imagescharacter_mask_binaryz /proxy/ideogram/ideogram-v3/editr(  r)  zmultipart/form-data)r/  r0  filescontent_typer1  z;Ideogram V3 image editing requires both an image AND a maskr   rl   z$/proxy/ideogram/ideogram-v3/generate)rS  r/  r0  rj  rk  r1  r2  c                 S   r3  r   r4  r6  r   r   r   r9    r:  z&IdeogramV3.execute.<locals>.<listcomp>r;  )!squeezecpur   shaper   numpyastypenpuint8r   	fromarrayr   saveseeknamer   magic_promptr   r   r   r   r   r
   rG  r`  r<  r   rH  r0  r=  r   r>  r   )r#  r   rW  rX  rG  r   r   r   r   rY  r]  r^  character_img_binaryri  input_tensormask_npmask_imgmask_byte_arrimg_npimgimg_byte_arr
img_binarymask_binaryedit_requestrj  r?  gen_request	v3_aspectr   r   r   r   r@  }  s   




















zIdeogramV3.execute)
NNr   rl   r   r   r   rZ  NNrA  r   r   r   r   rV  
  s    
prV  c                   @   s(   e Zd Zedeeej  fddZdS )IdeogramExtensionreturnc                    s   t ttgS N)r   rF  rV  )selfr   r   r   get_node_list"  s
   zIdeogramExtension.get_node_listN)	rB  rC  rD  r   r  typer   	ComfyNoder  r   r   r   r   r  !  s    r  r  c                      s   t  S r  )r  r   r   r   r   comfy_entrypoint+  s   r  )#ior   typing_extensionsr   comfy_api.latestr   r   PILr   ro  rq  r   comfy_api_nodes.apis.ideogramr   r   r	   r
   r   comfy_api_nodes.utilr   r   r   r   r   rO  r  r`  ra  r   r  r   rF  rV  r  r  r   r   r   r   <module>   s   	
 !"#$%&'()*+,-./0123456789:;<=>?@ABCDESI~ '  
