o
    iP1                     @   s~  d dl mZ d dlZ d dlZ d dlZ d dlZ d dlmZmZm	Z	 d dl
Z
d dlZd dlZd dlZG dd dejZG dd dZG dd	 d	e
jjZd*d
dZdd ZG d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jZd+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"G d#d$ d$ejZ#G d%d& d&ejZ$d,d(d)Z%dS )-    )sd1_clipN)T5TokenizerFastLlamaTokenizerFastQwen2Tokenizerc                       "   e Zd Zdi f fdd	Z  ZS )T5XXLTokenizerNc                    sD   t jt jt jtd}t j||dddtdddd|d d S )Nt5_tokenizerF   t5xxl   )
embedding_directorypad_with_endembedding_sizeembedding_keytokenizer_classhas_start_tokenpad_to_max_length
max_length
min_lengthtokenizer_data)	ospathjoindirnamerealpath__file__super__init__r   selfr   r   tokenizer_path	__class__ 6/mnt/c/Users/fbmor/ComfyUI/comfy/text_encoders/flux.pyr      s   &zT5XXLTokenizer.__init____name__
__module____qualname__r   __classcell__r$   r$   r"   r%   r          r   c                   @   s:   e Zd Zdi fddZddefddZdd	 Zd
d ZdS )FluxTokenizerNc                 C   s"   t j||d| _t||d| _d S )N)r   r   )r   SDTokenizerclip_lr   r
   r    r   r   r$   r$   r%   r      s   zFluxTokenizer.__init__Ftextc                 K   s<   i }| j j||fi ||d< | jj||fi ||d< |S Nlr
   )r.   tokenize_with_weightsr
   )r    r0   return_word_idskwargsoutr$   r$   r%   r3      s   z#FluxTokenizer.tokenize_with_weightsc                 C   s   | j |S N)r.   
untokenize)r    token_weight_pairr$   r$   r%   r8      s   zFluxTokenizer.untokenizec                 C   s   i S r7   r$   r    r$   r$   r%   
state_dict    s   zFluxTokenizer.state_dict)F)r'   r(   r)   r   strr3   r8   r;   r$   r$   r$   r%   r,      s
    r,   c                       sF   e Zd Zdddi f fdd	Zdd Zdd Zd	d
 Zdd Z  ZS )FluxClipModelNcpuc                    sV   t    tj|||}tj||d|d| _tjj	j
|||d| _t||g| _d S )NF)devicedtypereturn_projected_pooledmodel_optionsr?   r@   rB   )r   r   comfymodel_managementpick_weight_dtyper   SDClipModelr.   text_encoderssd3_clip
T5XXLModelr
   setdtypes)r    dtype_t5r?   r@   rB   r"   r$   r%   r   %   s
   
zFluxClipModel.__init__c                 C   s   | j | | j| d S r7   )r.   set_clip_optionsr
   )r    optionsr$   r$   r%   rN   ,   s   zFluxClipModel.set_clip_optionsc                 C   s   | j   | j  d S r7   )r.   reset_clip_optionsr
   r:   r$   r$   r%   rP   0   s   
z FluxClipModel.reset_clip_optionsc                 C   s8   |d }|d }| j |\}}| j|\}}||fS r1   )r
   encode_token_weightsr.   )r    token_weight_pairstoken_weight_pairs_ltoken_weight_pairs_t5t5_out	t5_pooledl_outl_pooledr$   r$   r%   rQ   4   s
   z"FluxClipModel.encode_token_weightsc                 C   s    d|v r
| j |S | j|S )Nz*text_model.encoder.layers.1.mlp.fc1.weight)r.   load_sdr
   )r    sdr$   r$   r%   rY   <   s   zFluxClipModel.load_sd)	r'   r(   r)   r   rN   rP   rQ   rY   r*   r$   r$   r"   r%   r=   $   s    r=   c                    s   G  fdddt }|S )Nc                       s(   e Zd Zddi f fdd	Z  ZS )z!flux_clip.<locals>.FluxClipModel_r>   Nc                    s0   d ur|  }|d< t j|||d d S )Nt5xxl_quantization_metadata)rM   r?   r@   rB   copyr   r   r    r?   r@   rB   )r#   rM   t5_quantization_metadatar$   r%   r   D   s   z*flux_clip.<locals>.FluxClipModel_.__init__r&   r$   rM   r_   r"   r%   FluxClipModel_C   s     ra   )r=   )rM   r_   ra   r$   r`   r%   	flux_clipB   s   rb   c           
      C   s   t | r|   } zddlm} W n ty"   ddlm} Y nw t	| }i }i }|d d }|t
|d 8 }|d D ]}|d }||krIq>||t|d < q>|d D ]}d|v ri|d |t|d < qW|d ||d	 < qWg }|D ]}	||	 qv|| |}|||d
 ddS )Nr   )MistralConverterconfigdefault_vocab_sizespecial_tokensvocabranktoken_bytes	token_str)rg   additional_special_tokensF)tokenizer_objectlegacy)torch	is_tensornumpytobytes!transformers.integrations.mistralrc   ModuleNotFoundError9transformers.models.pixtral.convert_pixtral_weights_to_hfjsonloadslenbase64	b64decodeappendupdate	converted)
datarc   mistral_vocabrf   rg   	max_vocabwrall_specialvr$   r$   r%   load_mistral_tokenizerK   s6   


r   c                   @   s   e Zd Zedd ZdS )MistralTokenizerClassc                 K   s   t di |S )Nr$   )r   )r   r5   r$   r$   r%   from_pretrainedr   s   z%MistralTokenizerClass.from_pretrainedN)r'   r(   r)   staticmethodr   r$   r$   r$   r%   r   q   s    r   c                       s*   e Zd Zdi f fdd	Zdd Z  ZS )Mistral3TokenizerNc                    sB   | dd | _t jdd|ddtddddddd	t| j|d
 d S )Ntekken_model Fi   mistral3_24b      r   T)r   r   r   r   r   has_end_tokenr   	pad_tokenstart_tokenr   r   pad_lefttokenizer_argsr   )gettekken_datar   r   r   r   r/   r"   r$   r%   r   w   s   4zMistral3Tokenizer.__init__c                 C   s
   d| j iS )Nr   )r   r:   r$   r$   r%   r;   {   s   
zMistral3Tokenizer.state_dict)r'   r(   r)   r   r;   r*   r$   r$   r"   r%   r   v   s    r   c                       s0   e Zd Zdi f fdd	Zd fdd	Z  ZS )Flux2TokenizerNc                    s   t  j||dtd d| _d S )Nr   r   r   name	tokenizerz[SYSTEM_PROMPT]You are an AI that reasons about image descriptions. You give structured responses focusing on object relationships, object
attribution and actions without speculation.[/SYSTEM_PROMPT][INST]{}[/INST])r   r   r   llama_templater/   r"   r$   r%   r      s   
zFlux2Tokenizer.__init__Fc                    >   |d u r| j |}n||}t j|f|dd|}|S NT)r4   disable_weightsr   formatr   r3   r    r0   r4   r   r5   
llama_texttokensr"   r$   r%   r3      
   
z$Flux2Tokenizer.tokenize_with_weightsFNr'   r(   r)   r   r3   r*   r$   r$   r"   r%   r   ~   s    r   c                       .   e Zd Zdg ddddi f fdd	Z  ZS )Mistral3_24BModelr>   )
         NTc           	         sb   i }| dd }|d ur||d< |dk rd|d< t j|||||ddddtjjj|||d	 d S )
N
num_layersnum_hidden_layers(   F
final_normr   r   )startpadr?   layer	layer_idxtextmodel_json_configr@   rf   layer_norm_hidden_statemodel_classenable_attention_masksreturn_attention_masksrB   )r   r   r   rD   rH   llamaMistral3Small24B)	r    r?   r   r   r@   attention_maskrB   r   r   r"   r$   r%   r      s   2zMistral3_24BModel.__init__r&   r$   r$   r"   r%   r          &r   c                       s4   e Zd Zddi def fdd	Z fddZ  ZS )Flux2TEModelr>   Nr   c                    s   t  j|||||d d S )N)r?   r@   r   
clip_modelrB   r   r   )r    r?   r@   rB   r   r   r"   r$   r%   r      s   zFlux2TEModel.__init__c                    sz   t  |\}}}tj|d d df |d d df |d d df fdd}|dd}||jd |jd d}|||fS )Nr   r      )dim)r   rQ   rn   stackmovedimreshapeshape)r    rR   r6   pooledextrar"   r$   r%   rQ      s
   8
z!Flux2TEModel.encode_token_weights)r'   r(   r)   r   r   rQ   r*   r$   r$   r"   r%   r      s    r   Fc                    s   G  fdddt }|S )Nc                       s*   e Zd Zddi f fdd	Z  ZS )zflux2_te.<locals>.Flux2TEModel_r>   Nc                    sN   d ur}d ur|  }|d< r|  }d|d< t j|||d d S )Nquantization_metadatar   r   rC   r\   r^   )r#   dtype_llamallama_quantization_metadataprunedr$   r%   r      s   z(flux2_te.<locals>.Flux2TEModel_.__init__r&   r$   r   r   r   r"   r%   Flux2TEModel_   s    "r   )r   )r   r   r   r   r$   r   r%   flux2_te   s   r   c                       r   )Qwen3TokenizerNc                    H   t jt jt jtd}t j|d|ddtdddddd|d d S )	Nqwen25_tokenizerFi 
  qwen3_4br      [P r   r   r   r   r   r   r   r   r   r   r   r   	r   r   r   r   r   r   r   r   r   r   r"   r$   r%   r         *zQwen3Tokenizer.__init__r&   r$   r$   r"   r%   r      r+   r   c                       r   )Qwen3Tokenizer8BNc                    r   )	Nr   Fr	   qwen3_8br   r   r   r   r   r   r"   r$   r%   r      r   zQwen3Tokenizer8B.__init__r&   r$   r$   r"   r%   r      r+   r   c                       s2   e Zd Zdi df fdd	Zd fdd	Z  ZS )	KleinTokenizerNr   c                    s8   |dkrt }n|dkrt}t j||||d d| _d S )Nr   r   r   zG<|im_start|>user
{}<|im_end|>
<|im_start|>assistant
<think>

</think>

)r   r   r   r   r   )r    r   r   r   r   r"   r$   r%   r      s   
zKleinTokenizer.__init__Fc                    r   r   r   r   r"   r$   r%   r3      r   z$KleinTokenizer.tokenize_with_weightsr   r   r$   r$   r"   r%   r      s    	r   c                       s$   e Zd Zdi df fdd	Z  ZS )KleinTokenizer8BNr   c                    s   t  j|||d d S )N)r   r   r   r   )r    r   r   r   r"   r$   r%   r      s   zKleinTokenizer8B.__init__r&   r$   r$   r"   r%   r      s    r   c                       r   )Qwen3_4BModelr>   	         NTc                    0   t  j|||i |ddidtjjj|||d d S Nr   r   Fr   )r   r   rD   rH   r   Qwen3_4Br    r?   r   r   r@   r   rB   r"   r$   r%   r         0zQwen3_4BModel.__init__r&   r$   r$   r"   r%   r      r   r   c                       r   )Qwen3_8BModelr>   r   NTc                    r   r   )r   r   rD   rH   r   Qwen3_8Br   r"   r$   r%   r      r   zQwen3_8BModel.__init__r&   r$   r$   r"   r%   r      r   r   r   c                    s8   dkrt ndkrtG  fdddt}|S )Nr   r   c                       s,   e Zd Zddi f fdd	Z  ZS )zklein_te.<locals>.Flux2TEModel_r>   Nc                    s>   d ur|  }|d< d ur}t j|||d d S )Nr   )r?   r@   r   rB   r   r\   r^   )r#   r   r   model
model_typer$   r%   r      s   z(klein_te.<locals>.Flux2TEModel_.__init__r&   r$   r   r   r   r   r"   r%   r      s    $r   )r   r   r   )r   r   r   r   r$   r   r%   klein_te   s   r   )NN)NNF)NNr   )&rD   r   comfy.text_encoders.t5comfy.text_encoders.sd3_clipcomfy.text_encoders.llamacomfy.model_managementtransformersr   r   r   rn   r   ru   rx   r-   r   r,   nnModuler=   rb   r   r   r   SD1Tokenizerr   rG   r   SD1ClipModelr   r   r   r   r   r   r   r   r   r$   r$   r$   r%   <module>   s8    
	&

