
    +j&                         U d 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mZmZmZ ddlmZmZmZmZmZmZ dZdZdZd	d
ddZeeef         ed<   ddddZeeeeeef         f         ed<   eefde de fdZ!dedededz  fdZ"dedefdZ#de$ej%                 de&ej'                 de&e         fdZ(de$ej%                 de&ej)                 de&e         fd Z* G d! d"ej%                  Z+ G d# d$e          Z,de,fd%Z-dS )&zAPI Nodes for ByteDance Seed LLM via the BytePlus ModelArk Responses API.

See: https://docs.byteplus.com/en/docs/ModelArk/1585128
    )override)IOComfyExtensionInput)BytePlusInputImageBytePlusInputMessageBytePlusInputTextBytePlusInputVideoBytePlusMessageContentBytePlusResponseCreateRequestBytePlusResponseObject)ApiEndpointget_number_of_imagessync_opupload_images_to_comfyapiupload_video_to_comfyapivalidate_stringz /proxy/byteplus/api/v3/responses      seed-2-0-pro-260328seed-2-0-lite-260228seed-2-0-mini-260215)zSeed 2.0 ProzSeed 2.0 LitezSeed 2.0 MiniSEED_MODELS)g      ?皙?g      @)g      ?g?       @)r   g{Gz?g?)r   r   r   _SEED_PRICES_PER_MILLION
max_images
max_videosc                 D   t           j                            dt           j                            t           j                            d          d t          d| dz             D             d          d|  d	          t           j                            d
t           j                            t           j                            d          d t          d|dz             D             d          d| d	          t           j                            ddddddd          gS )Nimagesimagec                     g | ]}d | S )image_ .0is     C/home/wildlama/comfy/ComfyUI/comfy_api_nodes/nodes_bytedance_llm.py
<listcomp>z&_seed_model_inputs.<locals>.<listcomp>3       FFF|||FFF       r   )namesminz9Optional image(s) to use as context for the model. Up to z images.)templatetooltipvideosvideoc                     g | ]}d | S )video_r$   r%   s     r(   r)   z&_seed_model_inputs.<locals>.<listcomp><   r*   r+   z9Optional video(s) to use as context for the model. Up to z videos.temperatureg      ?g        r   g{Gz?zIControls randomness. 0.0 is deterministic, higher values are more random.T)defaultr.   maxstepr0   advanced)r   Autogrowr   TemplateNamesImagerangeVideoFloat)r   r   s     r(   _seed_model_inputsr@   -   s5   
[..w''FFU1j1n-E-EFFF /  
 ePZddd 	 	
 	
 	[..w''FFU1j1n-E-EFFF /  
 ePZddd 	 	
 	
 	_ 	 	
 	
' r+   model_idresponsereturnNc                 (   |j         sdS t                              |           }|dS |\  }}}|j         j        pd}|j         j        pd}d}|j         j        r|j         j        j        pd}t          d||z
            }	|	|z  ||z  z   ||z  z   }
|
dz  S )z2Compute approximate USD price from response usage.Nr   g    .A)usager   getinput_tokensoutput_tokensinput_tokens_detailscached_tokensr7   )rA   rB   rates
input_ratecache_hit_rateoutput_raterG   rH   cachedfresh_inputtotals              r(   _calculate_pricerR   M   s    > t$((22E}t.3+J>.3!LN05AMF~* H4BGaa.//K*$v'>>Q\A\\E;r+   c                 <   | j         sdS g }| j         D ]u}|j        dk    s|j        s|j        D ]X}|j        dk    r"|j        r|                    |j                   /|j        dk    r|j        rt          d|j                   Yvd                    |          S )zHExtract concatenated text from all assistant message output_text blocks. messageoutput_textrefusalzModel refused to respond: 
)outputtypecontenttextappendrW   
ValueErrorjoin)rB   chunksitemblocks       r(   _get_text_from_responserc   _   s    ? rF O O9	!!!\ 	O 	OEz]**uz*ej))))y((U]( !Mem!M!MNNN		O
 99Vr+   clsimage_tensorsc                 Z   K   t          | |t          d           d {V }d |D             S )NzUploading reference images)r   
wait_labelc                 .    g | ]}t          |           S ))	image_url)r   )r&   urls     r(   r)   z/_build_image_content_blocks.<locals>.<listcomp>y   s$    >>>#--->>>r+   )r   SEED_MAX_IMAGES)rd   re   urlss      r(   _build_image_content_blocksrm   o   s\       +"/	        D ?>>>>>r+   r1   c                    K   g }t          |          }t          |          D ]V\  }}d}|dk    r| d|dz    d| d}t          | ||           d {V }|                    t	          |                     W|S )NzUploading reference videor,   z (/))rg   )	video_url)len	enumerater   r]   r
   )rd   r1   blocksrQ   idxr2   labelrj   s           r(   _build_video_content_blocksrw   |   s       (*FKKE'' 9 9
U+19922a22%222E,S%EJJJJJJJJJ(37778888Mr+   c                   b    e Zd ZdZed             Ze	 ddedededede	j
        f
d	            Zd
S )ByteDanceSeedNodez8Generate text responses from a ByteDance Seed 2.0 model.c                 \   t          j        dddddt           j                            dddd	
          t           j                            dd t
          D             d          t           j                            dddddd          t           j                            dddddd          gt           j                                        gt           j        j	        t           j        j
        t           j        j        gdt          j        t          j        dg          d          
  
        S )Nry   zByteDance Seedzpartner/text/ByteDancezText GenerationzGenerate text responses with ByteDance's Seed 2.0 models. Provide a text prompt and optionally one or more images or videos for multimodal context.promptTrT   zText input to the model.)	multiliner6   r0   modelc                 f    g | ].}t           j                            |t                                /S r$   )r   DynamicComboOptionr@   )r&   rv   s     r(   r)   z3ByteDanceSeedNode.define_schema.<locals>.<listcomp>   s2    jjjUZR_33E;M;O;OPPjjjr+   z-The Seed model used to generate the response.)optionsr0   seedr   iz_Seed controls whether the node should re-run; results are non-deterministic regardless of seed.)r6   r.   r7   control_after_generater0   system_promptz<Foundational instructions that dictate the model's behavior.)r|   r6   optionalr9   r0   )widgetsa  
                (
                  $m := widgets.model;
                  $contains($m, "mini") ? {
                    "type": "list_usd",
                    "usd": [0.00025, 0.0009],
                    "format": { "approximate": true, "separator": "-", "suffix": " per 1K tokens" }
                  }
                  : $contains($m, "lite") ? {
                    "type": "list_usd",
                    "usd": [0.0003, 0.002],
                    "format": { "approximate": true, "separator": "-", "suffix": " per 1K tokens" }
                  }
                  : $contains($m, "pro") ? {
                    "type": "list_usd",
                    "usd": [0.0005, 0.003],
                    "format": { "approximate": true, "separator": "-", "suffix": " per 1K tokens" }
                  }
                  : {"type":"text", "text":"Token-based"}
                )
                )
depends_onexpr)
node_iddisplay_namecategoryessentials_categorydescriptioninputsoutputshiddenis_api_nodeprice_badge)r   SchemaStringr   r   r   IntOutputHiddenauth_token_comfy_orgapi_key_comfy_org	unique_id
PriceBadgePriceBadgeDepends)rd   s    r(   define_schemazByteDanceSeedNode.define_schema   sP   y')- 1h 	"6	     %%jj^ijjjK &  
 "+/H    	#"!!Z    +< Y%%''(	.	+	#
 /	BBB  YD
 D
 D
 D	
r+   rT   r{   r}   r   r   rC   c                 z  K   t          |dd           |d         }|d         }t          |         d |                    d          pi                                 D             }t	          d |D                       t
          k    rt          d	t
           d
          d |                    d          pi                                 D             }t          |          t          k    rt          d	t           d          g }	|r)|		                    t          | |           d {V            |r)|		                    t          | |           d {V            |	                    t          |                     t          | t          t           d          t"          t%          t'          d|	          g|pd |dd          fd           d {V }
|
j        r)t          d|
j        j         d|
j        j                   t/          |
          }|st          d          t1          j        |          S )NTr,   )strip_whitespace
min_lengthr}   r5   c                     g | ]}||S Nr$   r&   ts     r(   r)   z-ByteDanceSeedNode.execute.<locals>.<listcomp>   s    +m+m+m!_`_lA_l_l_lr+   r    c              3   4   K   | ]}t          |          V  d S r   )r   r   s     r(   	<genexpr>z,ByteDanceSeedNode.execute.<locals>.<genexpr>   s+      >>1#A&&>>>>>>r+   zUp to z" images are supported per request.c                     g | ]}||S r   r$   )r&   vs     r(   r)   z-ByteDanceSeedNode.execute.<locals>.<listcomp>   s    *l*l*l^_^k1^k^k^kr+   r1   z" videos are supported per request.)r\   POST)pathmethoduser)roler[   F)r}   inputinstructionsr5   storestreamc                 $    t          |           S r   )rR   )rrA   s    r(   <lambda>z+ByteDanceSeedNode.execute.<locals>.<lambda>   s    &6x&C&C r+   )response_modeldataprice_extractorzSeed API error (z): zEmpty response from Seed model.)r   r   rF   valuessumrk   r^   rr   SEED_MAX_VIDEOSextendrm   rw   r]   r	   r   r   BYTEPLUS_RESPONSES_ENDPOINTr   r   r   errorcoderU   rc   r   
NodeOutput)rd   r{   r}   r   r   model_labelr5   re   video_inputsr[   rB   resultrA   s               @r(   executezByteDanceSeedNode.execute   s      	!DDDDGnM*{++m+m		(8K8K8Qr7Y7Y7[7[+m+m+m>>>>>>>PPYoYYYZZZ*l*luyy7J7J7Pb6X6X6Z6Z*l*l*l|..YoYYYZZZ02 	RNN!<S-!P!PPPPPPPQQQ 	QNN!<S,!O!OOOOOOOPPP(f555666 8HHH1.+IIIJ*2d'   DCCC
 
 
 
 
 
 
 
 
 > 	b`0C``H^``aaa(22 	@>???}V$$$r+   N)rT   )__name__
__module____qualname____doc__classmethodr   strdictintr   r   r   r$   r+   r(   ry   ry      s        BBE
 E
 [E
N   .% .%.% .% 	.%
 .% 
.% .% .% [.% .% .%r+   ry   c                   L    e Zd Zedeeej                          fd            ZdS )ByteDanceLLMExtensionrC   c                    K   t           gS r   )ry   )selfs    r(   get_node_listz#ByteDanceLLMExtension.get_node_list	  s      !""r+   N)	r   r   r   r   listrZ   r   	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+   ).r   typing_extensionsr   comfy_api.latestr   r   r   "comfy_api_nodes.apis.bytedance_llmr   r   r	   r
   r   r   r   comfy_api_nodes.utilr   r   r   r   r   r   r   rk   r   r   r   r   __annotations__r   tuplefloatr   r@   rR   rc   rZ   r   r   r<   rm   r>   rw   ry   r   r   r$   r+   r(   <module>r      s    
 ' & & & & & 6 6 6 6 6 6 6 6 6 6                                 A  *++ T#s(^    ...C C $sE%*=$>>?    *9O  3 c    @s .D QU    $&<      
?	bl	
?$
? 


? 
? 
? 
?	bl	 

   z% z% z% z% z% z% z% z%z# # # # #N # # ## 5 # # # # # #r+   