
    ChH                    D   S SK Jr  S SKrS SKrS SKJr  S SKJrJrJ	r	  S SK
JrJr   S SKJr  S SKrS SKJrJrJrJrJrJr  S SKJr  S S	KJr  S S
KJr  \R<                  " \5      r \(       a  \" 5       (       a  S SK!J"r"  SS jr# " S S\5      r$g! \ a	    S SKJr   Npf = f)    )annotationsN)Path)TYPE_CHECKINGAnyCallable)load_onnx_modelload_openvino_model)Self)
AutoConfig	AutoModelAutoTokenizer	MT5ConfigPretrainedConfigT5Config)is_peft_available)find_adapter_config_file)InputModule
PeftConfigc                   ^ ^ SU U4S jjnU$ )Nc                p   > [         R                  " [        U 5      T-  SS9  T" [        U 5      T-  40 UD6$ )NT)exist_ok)osmakedirsr   )save_directorykwargs_save_pretrained_fn	subfolders     `/var/www/html/shao/venv/lib/python3.13/site-packages/sentence_transformers/models/Transformer.pywrapper)_save_pretrained_wrapper.<locals>.wrapper   s5    
D(94tD"4#7)#CNvNN    )r   z
str | PathreturnNone )r   r   r    s   `` r   _save_pretrained_wrapperr&      s    O O Nr"   c                  0  ^  \ rS rSr% SrSrS\S'   SS/rS\S	'   S
rS\S'           S                   SU 4S jjjr	          SS jr
            SS jrSS jrSS jrS S jrS!S jrS"S jr S#     S$S jjrS#S%S jjr\          S&                       S'S jj5       r\          S&                       S(S jj5       r\      S)               S*U 4S jjj5       rSrU =r$ )+Transformer$   a  Hugging Face AutoModel to generate token embeddings.
Loads the correct class, e.g. BERT / RoBERTa etc.

Args:
    model_name_or_path: Hugging Face models name
        (https://huggingface.co/models)
    max_seq_length: Truncate any inputs longer than max_seq_length
    model_args: Keyword arguments passed to the Hugging Face
        Transformers model
    tokenizer_args: Keyword arguments passed to the Hugging Face
        Transformers tokenizer
    config_args: Keyword arguments passed to the Hugging Face
        Transformers config
    cache_dir: Cache dir for Hugging Face Transformers to store/load
        models
    do_lower_case: If true, lowercases the input (independent if the
        model is cased or not)
    tokenizer_name_or_path: Name or path of the tokenizer. When
        None, then model_name_or_path is used
    backend: Backend used for model inference. Can be `torch`, `onnx`,
        or `openvino`. Default is `torch`.
sentence_bert_config.jsonstrconfig_file_namemax_seq_lengthdo_lower_casez	list[str]config_keysTboolsave_in_rootc
                  > [         TU ]  5         Xpl        Xl        Uc  0 nUc  0 nUc  0 nU R	                  XX5      u  pU R
                  " XXiU40 UD6  Ub
  SU;  a  X$S'   [        R                  " Ub  UOU4SU0UD6U l        Uc  [        U R                  S5      (       a~  [        U R                  R                  S5      (       aY  [        U R                  S5      (       a>  [        U R                  R                  R                  U R                  R                  5      nX l        Ub:  U R                  R                   R"                  U R                  R                  l        g g )Nmodel_max_length	cache_dirconfigmax_position_embeddings)super__init__r.   backend_load_config_load_modelr   from_pretrained	tokenizerhasattr
auto_modelr5   minr6   r3   r-   	__class____name__tokenizer_class)selfmodel_name_or_pathr-   
model_argstokenizer_argsconfig_argsr4   r.   tokenizer_name_or_pathr9   r5   is_peft_modelrA   s               r   r8   Transformer.__init__@   sR    	*J!NK $ 1 12DQX f+YeZde%*<N*R1?-.&66&<&H"N`

 
 !22DOO224MNNDNN,>??!$T__%;%;%S%SUYUcUcUtUt!u,!-59^^5M5M5V5VDOO""2 .r"   c           
     J   [        UUUR                  S5      UR                  S5      UR                  SS5      S9 bJ  [        5       (       d  [        S5      eUS:w  a  [	        S5      eS	S
KJn  UR                  " U40 UDSU0D6S4$ [        R                  " U40 UDSU0D6S4$ )ah  Loads the transformers or PEFT configuration

Args:
    model_name_or_path (str): The model name on Hugging Face (e.g. 'sentence-transformers/all-MiniLM-L6-v2')
        or the path to a local model directory.
    cache_dir (str | None): The cache directory to store the model configuration.
    backend (str): The backend used for model inference. Can be `torch`, `onnx`, or `openvino`.
    config_args (dict[str, Any]): Keyword arguments passed to the Hugging Face Transformers config.

Returns:
    tuple[PretrainedConfig, bool]: The model configuration and a boolean indicating whether the model is a PEFT model.
tokenrevisionlocal_files_onlyF)r4   rM   rN   rO   zgLoading a PEFT model requires installing the `peft` package. You can install it via `pip install peft`.torcha  PEFT models can currently only be loaded with the `torch` backend. To use other backends, load the model with `backend="torch"`, call `model.transformers_model.merge_and_unload()`, save that model with `model.save_pretrained()` and then load the model with the desired backend.r   r   r4   T)	r   getr   	Exception
ValueErrorpeftr   r<   r   )rD   rE   r4   r9   rH   r   s         r   r:   Transformer._load_configo   s      %"#!oog.$4!,1CU!K  %&&}  '! w 
 (--.@eKe[degkkk))*<aaW`achhhr"   c                   US:X  a  U(       a  S H  nUR                  US5        M     [        U[        5      (       a  U R                  " XU40 UD6  g[        U[        5      (       a  U R
                  " XU40 UD6  g[        R                  " U4X#S.UD6U l        gUS:X  a  [        SUUSS.UD6U l        gUS:X  a  [        SUUSS.UD6U l        g[        S	U S
35      e)a  Loads the transformers or PEFT model into the `auto_model` attribute

Args:
    model_name_or_path (str): The model name on Hugging Face (e.g. 'sentence-transformers/all-MiniLM-L6-v2')
        or the path to a local model directory.
    config ("PeftConfig" | PretrainedConfig): The model configuration.
    cache_dir (str | None): The cache directory to store the model configuration.
    backend (str): The backend used for model inference. Can be `torch`, `onnx`, or `openvino`.
    is_peft_model (bool): Whether the model is a PEFT model.
    model_args (dict[str, Any]): Keyword arguments passed to the Hugging Face Transformers model.
rP   )rN   Nr5   r4   onnxzfeature-extraction)rE   r5   	task_nameopenvinozUnsupported backend 'z6'. `backend` should be `torch`, `onnx`, or `openvino`.r%   )pop
isinstancer   _load_t5_modelr   _load_mt5_modelr   r<   r?   r   r	   rS   )rD   rE   r5   r4   r9   rJ   rF   adapter_only_kwargs           r   r;   Transformer._load_model   s   ( g *6&NN#5t< +7 &(++##$6	XZXFI..$$%7YjY"+";";&#/5#NX# - #5. 	DO 
"1 #5. 	DO 4WI=stuur"   c                T    SSK Jn  S/Ul        UR                  " U4X#S.UD6U l        g)Loads the encoder model from T5r   )T5EncoderModel	decoder.*rW   N)transformersrc   "_keys_to_ignore_on_load_unexpectedr<   r?   )rD   rE   r5   r4   rF   rc   s         r   r]   Transformer._load_t5_model   s4    /=HM9(88
'-
FP
r"   c                T    SSK Jn  S/Ul        UR                  " U4X#S.UD6U l        g)rb   r   )MT5EncoderModelrd   rW   N)re   ri   rf   r<   r?   )rD   rE   r5   r4   rF   ri   s         r   r^   Transformer._load_mt5_model   s4    0>I]:)99
'-
FP
r"   c                v    S[        U R                  5       U R                  R                  R                  S9 S3$ )NzTransformer()architecture))dictget_config_dictr?   rA   rB   rD   s    r   __repr__Transformer.__repr__   s3    d4#7#7#9HaHaHjHjkllmnnr"   c                   UR                  5        VVs0 sH  u  p4US;   d  M  X4_M     nnnU R                  " S0 UDUDSS0D6nUS   nXqS'   [        5       (       a  SSKJn  [        U R                  U5      (       a  U R                  R                  R                  (       al  UR                  S5      n	US   n
[        R                  " XR                  R                  R                  U
R                  S9n[        R                  " X4S	S
9US'   U R                  R                  R                  (       a  SU;   a  US   US'   U$ s  snnf )z#Returns token_embeddings, cls_token)	input_idsattention_masktoken_type_idsinputs_embedsreturn_dictTr   token_embeddings)PeftModelForFeatureExtractionru   )device   )dimhidden_statesall_layer_embeddingsr%   )itemsr?   r   rT   rz   r\   active_peft_configis_prompt_learningsizerP   onesnum_virtual_tokensr{   catr5   output_hidden_states)rD   featuresr   keyvaluetrans_featuresoutputsry   rz   
batch_sizeru   prefix_attention_masks               r   forwardTransformer.forward   s6    'nn.
.
XX CJ. 	 
 //ONOfO$O"1:'7#$ : 4??,IJJOO66II-2215
!)*:!;(-

 B B U U^l^s^s)% .3YY8M7^de-f)*??!!66?g;U/6/GH+,;
s
   EEc                B    U R                   R                  R                  $ )N)r?   r5   hidden_sizerp   s    r   get_word_embedding_dimension(Transformer.get_word_embedding_dimension  s    %%111r"   c           
        0 n[        US   [        5      (       a  U/nO[        US   [        5      (       a]  / n/ US'   U HL  n[        [	        UR                  5       5      5      u  pgUR                  U5        US   R                  U5        MN     U/nO7/ / pU H+  n
UR                  U
S   5        U	R                  U
S   5        M-     X/nU VVs/ sH+  o Vs/ sH  n[        U5      R                  5       PM     snPM-     nnnU R                  (       a/  U VVs/ sH!  o Vs/ sH  oR                  5       PM     snPM#     nnnUR                  U R                  " UUSSU R                  S.65        U$ s  snf s  snnf s  snf s  snnf )z-Tokenizes a text and maps tokens to token-idsr   	text_keysr|   longest_firstpt)padding
truncationreturn_tensors
max_length)r\   r+   rn   nextiterr   appendstripr.   lowerupdater=   r-   )rD   textsr   outputto_tokenizelookuptext_keytextbatch1batch2
text_tuplecolss                r   tokenizeTransformer.tokenize  sn    eAh$$ 'Ka$''K"$F;!%d6<<>&:!;""4({#**84   '-KF#
jm,jm, $ "*K ALL41A4L ?JK{s3s!GGIs3{KKNN*#..	
  5L 4Ks0   E9"E4:E9F"E?:F4E9?Fc                    U R                   R                  XS9  U R                  R                  U5        U R                  U5        g )N)safe_serialization)r?   save_pretrainedr=   save_config)rD   output_pathr   r   s       r   saveTransformer.save.  s7    '''[&&{3%r"   c                H    U R                  UUUUUUUUU	U
US9nU " SSU0UD6$ )N)rE   r   rM   cache_folderrN   rO   trust_remote_codemodel_kwargstokenizer_kwargsconfig_kwargsr9   rE   r%   )_load_init_kwargs)clsrE   r   rM   r   rN   rO   r   r   r   r   r9   r   init_kwargss                 r   loadTransformer.load3  sP    $ ++1%-/%-' , 
 H&8HKHHr"   c           	        U R                  UUUUUUS9nUUUUUS.nSU;  a  0 US'   SU;  a  0 US'   SU;  a  0 US'   US   R                  U5        US   R                  U5        US   R                  U5        U(       a  US   R                  U5        U	(       a  US   R                  U	5        U
(       a  US   R                  U
5        0 UEXKS.E$ )N)rE   r   rM   r   rN   rO   )r   rM   rN   rO   r   rF   rG   rH   )r4   r9   )load_configr   )r   rE   r   rM   r   rN   rO   r   r   r   r   r9   r   r5   
hub_kwargss                  r   r   Transformer._load_init_kwargsT  s   $ 1%- ! 
 #  0!2

 v%#%F< 6)')F#$&$&F=! 	|##J/ ''
3}$$Z0 < ''5#$++,<==!((7H&H|HHr"   c                @  > U(       a  U/O/ SQnU H  n[         T
U ]  UUUUUUUS9n	U	(       d  M    O   SW	;   a  SU	S   ;   a  U	S   R                  S5        SU	;   a  SU	S   ;   a  U	S   R                  S5        SU	;   a  SU	S   ;   a  U	S   R                  S5        U	$ )N)r*   zsentence_roberta_config.jsonzsentence_distilbert_config.jsonzsentence_camembert_config.jsonzsentence_albert_config.jsonz sentence_xlm-roberta_config.jsonzsentence_xlnet_config.json)rE   r   config_filenamerM   r   rN   rO   rF   r   rG   rH   )r7   r   r[   )r   rE   r   r   rM   r   rN   rO   config_filenamesr5   rA   s             r   r   Transformer.load_config  s       	  0OW(#5# /)!!1 ) F v  0 6!&9VL=Q&Q< $$%89v%*=HXAY*Y#$(()<=F"':f]>S'S=!%%&9:r"   )r?   r9   r.   r-   r=   )NNNNNFNrP   )rE   r+   r-   z
int | NonerF   dict[str, Any] | NonerG   r   rH   r   r4   
str | Noner.   r0   rI   r   r9   r+   r#   r$   )
rE   r+   r4   r   r9   r+   rH   dict[str, Any]r#   z*tuple[PeftConfig | PretrainedConfig, bool])rE   r+   r5   zPeftConfig | PretrainedConfigr4   r+   r9   r+   rJ   r0   r#   r$   )rE   r+   r5   r   r4   r+   r#   r$   )r#   r+   )r   dict[str, torch.Tensor]r#   r   )r#   int)T)r   z.list[str] | list[dict] | list[tuple[str, str]]r   z
str | boolr#   r   )r   r+   r   r0   r#   r$   )
 NNNFFNNNrP   )rE   r+   r   r+   rM   bool | str | Noner   r   rN   r   rO   r0   r   r0   r   r   r   r   r   r   r9   r+   r#   r
   )rE   r+   r   r+   rM   r   r   r   rN   r   rO   r0   r   r0   r   r   r   r   r   r   r9   r+   r#   r   )r   NNNNF)rE   r+   r   r+   r   r   rM   r   r   r   rN   r   rO   r0   r#   r   )rB   
__module____qualname____firstlineno____doc__r,   __annotations__r/   r1   r8   r:   r;   r]   r^   rq   r   r   r   r   classmethodr   r   r   __static_attributes____classcell__)rA   s   @r   r(   r(   $   si   . 8c7.@K@L$
 &*,004-1 $#-1-W-W #-W *	-W
 .-W +-W -W -W !+-W -W 
-W -W^(i"%(i2<(iGJ(iYg(i	3(iT2v2v .2v 	2v
 2v 2v 
2vh

oB2 \`&C&NX&	 &P&
 
 #'#'#!&"'.226/3II 	I
 !I !I I I  I ,I 0I -I I  
!I I@ 
 #'#'#!&"'.226/37I7I 	7I
 !7I !7I 7I 7I  7I ,7I 07I -7I 7I  
!7I 7Ir  &*#'#'#!&++ + $	+
 !+ !+ + + 
+ +r"   r(   )r   r   r   r+   r#   zCallable[..., None])%
__future__r   loggingr   pathlibr   typingr   r   r   sentence_transformers.backendr   r	   r
   ImportErrortyping_extensionsrP   re   r   r   r   r   r   r   transformers.utils.import_utilsr   transformers.utils.peft_utilsr   (sentence_transformers.models.InputModuler   	getLoggerrB   loggerrT   r   r&   r(   r%   r"   r   <module>r      s|    "  	  / / N'  d d = B @			8	$&((V+ V1  '&'s   B BB