
    +j&                        % S r SSKJr  SSKJrJrJr  SSKJrJ	r	J
r
JrJrJrJr  SSKJrJrJrJrJrJr  SrSrSrS	S
SS.r\\\4   \S'   SSSS.r\\\\\\4   4   \S'   \\4S\ S\ 4S jjr!S\S\S\S-  4S jr"S\S\4S jr#S\$\RJ                     S\&\RN                     S\&\   4S jr(S\$\RJ                     S\&\RR                     S\&\   4S  jr* " S! S"\RJ                  5      r+ " S# S$\5      r,S\,4S% jr-g)&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                 R   [         R                  R                  S[         R                  R                  [         R                  R                  S5      [        SU S-   5       Vs/ s H  nSU 3PM
     snSS9SU  S3S	9[         R                  R                  S
[         R                  R                  [         R                  R                  S5      [        SUS-   5       Vs/ s H  nSU 3PM
     snSS9SU S3S	9[         R                  R                  SSSSSSSS9/$ s  snf s  snf )Nimagesimage   image_r   )namesminz9Optional image(s) to use as context for the model. Up to z images.)templatetooltipvideosvideovideo_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stepr'   advanced)r   Autogrowr   TemplateNamesImagerangeVideoFloat)r   r   is      C/home/wildlama/comfy/ComfyUI/comfy_api_nodes/nodes_bytedance_llm.py_seed_model_inputsr8   -   s:   
[[..w'-21j1n-EF-Es|-EF / 
 PPZ|[cd 	 	
 	[[..w'-21j1n-EF-Es|-EF / 
 PPZ|[cd 	 	
 	_ 	 	
' 
 G Gs   #D D$model_idresponsereturnNc                    UR                   (       d  g[        R                  U 5      nUc  gUu  p4nUR                   R                  =(       d    SnUR                   R                  =(       d    SnSnUR                   R
                  (       a)  UR                   R
                  R                  =(       d    Sn[        SXh-
  5      n	X-  X-  -   Xu-  -   n
U
S-  $ )z2Compute approximate USD price from response usage.Nr   g    .A)usager   getinput_tokensoutput_tokensinput_tokens_detailscached_tokensr-   )r9   r:   rates
input_ratecache_hit_rateoutput_rater?   r@   cachedfresh_inputtotals              r7   _calculate_pricerJ   M   s    >>$((2E}.3+J>>..3!LNN005AMF~~**44BBGaa./K$v'>>A\\E;    c                    U R                   (       d  g/ nU R                    H  nUR                  S:w  d  UR                  (       d  M&  UR                   H|  nUR                  S:X  a.  UR                  (       a  UR	                  UR                  5        MA  UR                  S:X  d  MS  UR
                  (       d  Mf  [        SUR
                   35      e   M     SR                  U5      $ )zHExtract concatenated text from all assistant message output_text blocks. messageoutput_textrefusalzModel refused to respond: 
)outputtypecontenttextappendrP   
ValueErrorjoin)r:   chunksitemblocks       r7   _get_text_from_responser\   _   s    ??F99	!\\Ezz]*uzzejj)y(U]]] #=emm_!MNN	 "   99VrK   clsimage_tensorsc                 |   #    [        U U[        SS9I S h  vN nU Vs/ s H  n[        US9PM     sn$  Ns  snf 7f)NzUploading reference images)r   
wait_label)	image_url)r   SEED_MAX_IMAGESr   )r]   r^   urlsurls       r7   _build_image_content_blocksre   o   sI      +"/	 D :>>#->> ?s   <5<7<<r(   c                    #    / n[        U5      n[        U5       HE  u  pESnUS:  a  U SUS-    SU S3n[        XUS9I S h  vN nUR                  [	        US95        MG     U$  N"7f)NzUploading reference videor"   z (/))r`   )	video_url)len	enumerater   rV   r
   )r]   r(   blocksrI   idxr)   labelrd   s           r7   _build_video_content_blocksro   |   s|      (*FKE'
+19gRay%2E,SEJJ(378 ( M Ks   AA(A&#A(c                   j    \ rS rSrSr\S 5       r\ SS\S\S\	S\S\
R                  4
S	 jj5       rS
rg)ByteDanceSeedNode   z8Generate text responses from a ByteDance Seed 2.0 model.c                    [         R                  " SSSSS[         R                  R                  SSSS	S
9[         R                  R                  S[
         Vs/ s H+  n[         R                  R                  U[        5       5      PM-     snSS9[         R                  R                  SSSSSSS9[         R                  R                  SSSSSSS9/[         R                  R                  5       /[         R                  R                  [         R                  R                  [         R                  R                  /S[         R                  " [         R                  " S/S9SS9S9
$ s  snf )Nrq   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.promptTrM   zText input to the model.)	multiliner,   r'   modelz-The Seed model used to generate the response.)optionsr'   seedr   iz_Seed controls whether the node should re-run; results are non-deterministic regardless of seed.)r,   r%   r-   control_after_generater'   system_promptz<Foundational instructions that dictate the model's behavior.)ru   r,   optionalr/   r'   )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   DynamicCombor   Optionr8   IntOutputHiddenauth_token_comfy_orgapi_key_comfy_org	unique_id
PriceBadgePriceBadgeDepends)r]   rn   s     r7   define_schemaByteDanceSeedNode.define_schema   s[   yy')- 1h 		"6	    %%^ij^iUZR__33E;M;OP^ijK & 
 "+/H   		#"!!Z   +< YY%%'(		..		++		##
 //	BYD
 D	
  ks   2E&rt   rv   rx   rz   r;   c                 `  ^#    [        USSS9  US   nUS   n[        U   mUR                  S5      =(       d    0 R                  5        Vs/ s H	  owc  M  UPM     nn[	        S U 5       5      [
        :  a  [        S[
         S	35      eUR                  S
5      =(       d    0 R                  5        V	s/ s H	  oc  M  U	PM     n
n	[        U
5      [        :  a  [        S[         S35      e/ nU(       a"  UR                  [        X5      I S h  vN 5        U
(       a"  UR                  [        X
5      I S h  vN 5        UR                  [        US95        [        U [        [         SS9["        [%        T['        SUS9/U=(       d    S USSS9U4S jS9I S h  vN nUR(                  (       a9  [        SUR(                  R*                   SUR(                  R,                   35      e[/        U5      nU(       d  [        S5      e[0        R2                  " U5      $ s  snf s  sn	f  GN N N7f)NTr"   )strip_whitespace
min_lengthrv   r+   r    c              3   8   #    U  H  n[        U5      v   M     g 7fN)r   ).0ts     r7   	<genexpr>,ByteDanceSeedNode.execute.<locals>.<genexpr>   s     >1#A&&s   zUp to z" images are supported per request.r(   z" videos are supported per request.)rU   POST)pathmethoduser)rolerT   F)rv   inputinstructionsr+   storestreamc                    > [        TU 5      $ r   )rJ   )rr9   s    r7   <lambda>+ByteDanceSeedNode.execute.<locals>.<lambda>   s    &6x&CrK   )response_modeldataprice_extractorzSeed API error (z): zEmpty response from Seed model.)r   r   r>   valuessumrb   rW   rj   SEED_MAX_VIDEOSextendre   ro   rV   r	   r   r   BYTEPLUS_RESPONSES_ENDPOINTr   r   r   errorcoderN   r\   r   
NodeOutput)r]   rt   rv   rx   rz   model_labelr+   r   r^   vvideo_inputsrT   r:   resultr9   s                 @r7   executeByteDanceSeedNode.execute   s     	!DGnM*{+8=		(8K8Qr7Y7Y7[+m7[!A7[+m>>>Pvo%66XYZZ7<yy7J7Pb6X6X6Z*l6Z16Z*l|.vo%66XYZZ02NN!<S!PPQNN!<S!OOP(f56 8H1.+IJ*2d' D
 
 >>/0C0C/DCH^H^G_`aa(2>??}}V$$E ,n +m QO
s^   A	H.HHAH.5H"?H"A
H.H'(H.8H*9A"H.H,BH.*H.,H. N)rM   )__name__
__module____qualname____firstlineno____doc__classmethodr   strdictintr   r   r   __static_attributes__r   rK   r7   rq   rq      sg    BE
 E
N   .%.% .% 	.%
 .% 
.% .%rK   rq   c                   L    \ rS rSr\S\\\R                        4S j5       r	Sr
g)ByteDanceLLMExtensioni  r;   c                    #    [         /$ 7fr   )rq   )selfs    r7   get_node_list#ByteDanceLLMExtension.get_node_list	  s     !""s   
r   N)r   r   r   r   r   listrS   r   	ComfyNoder   r   r   rK   r7   r   r     s)    #T$r||*<%= # #rK   r   c                     #    [        5       $ 7fr   )r   r   rK   r7   comfy_entrypointr     s      ""s   ).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   rb   r   r   r   r   __annotations__r   tuplefloatr   r8   rJ   r\   rS   r   r   r2   re   r4   ro   rq   r   r   r   rK   r7   <module>r      s|  
 ' 6 6    A  *++T#s(^  ...C $sE%*=$>>?  *9O 3 c @s .D QU $&<   
?	bll	
?$
? 

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

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