Ë
    l^(h9d  ã                  ó  — d dl mZ d dlZd dlZd dlZd dlmZ d dlmZ d dlm	Z	m
Z
mZ d dlZd dlZd dlmZ d dlmZmZmZmZmZmZ d dlmZ d d	lmZ  ej4                  e«      Ze	r e«       rd d
lmZ dd„Z G d„ dej@                  «      Z!y)é    )ÚannotationsN)Úfnmatch)ÚPath)ÚTYPE_CHECKINGÚAnyÚCallable)Únn)Ú
AutoConfigÚ	AutoModelÚAutoTokenizerÚ	MT5ConfigÚPretrainedConfigÚT5Config)Úis_peft_available)Úfind_adapter_config_file©Ú
PeftConfigc                ó   ‡ ‡— dˆ ˆfd„}|S )Nc                ót   •— t        j                  t        | «      ‰z  d¬«        ‰t        | «      ‰z  fi |¤ŽS )NT)Úexist_ok)ÚosÚmakedirsr   )Úsave_directoryÚkwargsÚ_save_pretrained_fnÚ	subfolders     €€úf/var/www/skyplay_api_hub/venv/lib/python3.12/site-packages/sentence_transformers/models/Transformer.pyÚwrapperz)_save_pretrained_wrapper.<locals>.wrapper   s5   ø€ Ü
�‰”D˜Ó(¨9Ñ4¸tÕDÙ"¤4¨Ó#7¸)Ñ#CÑNÀvÑNÐNó    )r   z
str | PathÚreturnÚNone© )r   r   r   s   `` r   Ú_save_pretrained_wrapperr#      s   ù€ öOð €Nr   c                  ón  ‡ — e Zd ZU dZdZded<   	 	 	 	 	 	 	 	 d	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 dˆ fd„Z	 	 	 	 	 	 	 	 	 	 dd„Z	 	 	 	 	 	 	 	 	 	 	 	 dd„Zdd„Z		 	 	 	 	 	 	 	 dd	„Z
	 	 	 	 	 	 	 	 dd
„Z	 	 	 	 	 	 	 	 	 	 	 	 	 	 dd„Zdd„Zdd„Zdd„Zdd„Zdd„Zd d„Z	 d!	 	 	 	 	 d"d„Zd#d„Zd!d$d„Zed%d„«       Zˆ xZS )&ÚTransformera  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`.
    TÚboolÚsave_in_rootc
                óº  •— t         ‰| �  «        ddg| _        || _        |	| _        |€i }|€i }|€i }| j                  |||	|«      \  }
} | j                  ||
||	|fi |¤Ž |�	d|vr||d<   t        j                  |�|n|fd|i|¤Ž| _	        |€Št        | j                  d«      rtt        | j                  j                  d«      rTt        | j                  d«      r>t        | j                  j                  j                  | j                  j                  «      }|| _        |�:| j                  j"                  j$                  | j                  j                  _        y y )NÚmax_seq_lengthÚdo_lower_caseÚmodel_max_lengthÚ	cache_dirÚconfigÚmax_position_embeddings)ÚsuperÚ__init__Úconfig_keysr*   ÚbackendÚ_load_configÚ_load_modelr   Úfrom_pretrainedÚ	tokenizerÚhasattrÚ
auto_modelr-   Úminr.   r+   r)   Ú	__class__Ú__name__Útokenizer_class)ÚselfÚmodel_name_or_pathr)   Ú
model_argsÚtokenizer_argsÚconfig_argsr,   r*   Útokenizer_name_or_pathr2   r-   Úis_peft_modelr:   s               €r   r0   zTransformer.__init__9   sk  ø€ ô 	‰ÑÔØ,¨oÐ>ˆÔØ*ˆÔØˆŒØÐØˆJØÐ!ØˆNØÐØˆKà $× 1Ñ 1Ð2DÀiÐQXÐZeÓ fÑˆ�Øˆ×ÑÐ+¨V°YÀÈÑeÐZdÒeàÐ%Ð*<ÀNÑ*RØ1?ˆNÐ-Ñ.Ü&×6Ñ6Ø&<Ð&HÑ"ÐN`ñ
àð
ð ñ
ˆŒð Ð!ä˜Ÿ™¨Ô2Ü˜DŸO™O×2Ñ2Ð4MÔNÜ˜DŸN™NÐ,>Ô?ä!$ T§_¡_×%;Ñ%;×%SÑ%SÐUY×UcÑUc×UtÑUtÓ!u�à,ˆÔà!Ð-Ø59·^±^×5MÑ5M×5VÑ5VˆD�O‰O×"Ñ"Õ2ð .r   c           
     ó@  — t        |||j                  d«      |j                  d«      |j                  dd«      ¬«      	 �Dt        «       st        d«      ‚|dk7  rt	        d«      ‚d	d
lm}  |j                  |fi |¤d|i¤ŽdfS t        j                  |fi |¤d|i¤ŽdfS )a°  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)r,   rE   rF   rG   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[0].auto_model.merge_and_unload()`, save that model with `model.save_pretrained()` and then load the model with the desired backend.r   r   r,   T)	r   Úgetr   Ú	ExceptionÚ
ValueErrorÚpeftr   r5   r
   )r=   r>   r,   r2   rA   r   s         r   r3   zTransformer._load_configi   sÅ   € ô  %Ø"Ø#Ø!—o‘o gÓ.Ø$Ÿ™¨Ó4Ø!,§¡Ð1CÀUÓ!Kôð ðô %Ô&ÜØ}óð ð ˜'Ò!ä ðwóð õ
 (à-�:×-Ñ-Ð.@ÑeÀKÑeÐ[dÒeÐgkÐkÐkä×)Ñ)Ð*<ÑaÀÑaÐW`ÒaÐchÐhÐhr   c                óè  — |dk(  r©i }|r dD ]  }||v sŒ|j                  |«      ||<   Œ t        |t        «      r | j                  |||fi |¤Ž nDt        |t        «      r | j
                  |||fi |¤Ž nt        j                  |f||dœ|¤Ž| _        |r | j                  |||fi |¤|¤Ž yy|dk(  r | j                  |||fi |¤Ž y|dk(  r | j                  |||fi |¤Ž yt        d|› d�«      ‚)	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.
        rH   )rF   ©r-   r,   ÚonnxÚopenvinozUnsupported backend 'z6'. `backend` should be `torch`, `onnx`, or `openvino`.N)ÚpopÚ
isinstancer   Ú_load_t5_modelr   Ú_load_mt5_modelr   r5   r8   Ú_load_peft_modelÚ_load_onnx_modelÚ_load_openvino_modelrK   )	r=   r>   r-   r,   r2   rC   r?   Úadapter_only_kwargsÚadapter_only_kwargs	            r   r4   zTransformer._load_model“   s<  € ð( �gÒð #%ÐÙØ*6ò eÐ&Ø)¨ZÒ7ØBLÇ.Á.ÐQcÓBdÐ+Ð,>Ò?ðeô ˜&¤(Ô+Ø#�×#Ñ#Ð$6¸À	ÑXÈZÓXÜ˜F¤IÔ.Ø$�×$Ñ$Ð%7¸ÀÑYÈjÓYä"+×";Ñ";Ø&ð#Ø/5Àñ#ØNXñ#�”ñ Ø%�×%Ñ%Ð&8¸&À)ÑqÈzÐqÐ]pÓqð à˜ÒØ!ˆD×!Ñ!Ð"4°f¸iÑVÈ:ÓVØ˜
Ò"Ø%ˆD×%Ñ%Ð&8¸&À)ÑZÈzÓZäÐ4°W°IÐ=sÐtÓuÐur   c                ó\   — ddl m}  |j                  | j                  |f||dœ|¤Ž| _        y )Nr   )Ú	PeftModelrN   )rL   r[   r5   r8   )r=   r>   r-   r,   r?   r[   s         r   rU   zTransformer._load_peft_modelÂ   s5   € Ý"à3˜)×3Ñ3Ø�O‰OÐ/ð
Ø8>È)ñ
ØWañ
ˆ�r   c                ó  — t        |t        «      st        |t        «      rt        d«      ‚	 ddlm} ddlm} t        |«      }|j                  «       }d}	d}
| j                  |||||
|	«      \  }}|r|j                  dd «       d	|v rh|d	   }t        |t        «      sXt        |«      j                  «       st        d
«      ‚t        |d¬«      5 }t!        j"                  |«      |d	<   d d d «       ni |d	<    |j$                  |f|||dœ|¤Ž| _        t)        | j&                  j*                  | j,                  «      | j&                  _        |r| j/                  |||	«       y y # t        $ r t        d«      ‚w xY w# 1 sw Y   Œ�xY w)Nz8T5 models are not yet supported by the OpenVINO backend.r   )ÚOVModelForFeatureExtraction)ÚOV_XML_FILE_NAMEz„Using the OpenVINO backend requires installing Optimum and OpenVINO. You can install them with pip: `pip install optimum[openvino]`.ÚOpenVINOzopenvino*.xmlÚ	file_nameÚ	ov_configzXov_config should be a dictionary or a path to a .json file containing an OpenVINO configzutf-8)Úencoding©r-   r,   Úexport)rR   r   r   rK   Úoptimum.intelr]   Úoptimum.intel.openvinor^   ÚModuleNotFoundErrorrJ   r   ÚexistsÚ_backend_should_exportrQ   ÚdictÚopenÚjsonÚloadr5   r8   r#   Ú_save_pretrainedr2   Ú_backend_warn_to_save)r=   r>   r-   r,   r?   r]   r^   Ú	load_pathÚis_localÚbackend_nameÚtarget_file_globrd   ra   Úfs                 r   rW   z Transformer._load_openvino_modelÉ   s®  € ô �fœhÔ'¬:°f¼iÔ+HÜÐWÓXÐXð	ÝAÝ?ô Ð+Ó,ˆ	Ø×#Ñ#Ó%ˆØ!ˆØ*Ðð "×8Ñ8Ø�x Ð-=Ð?OÐQ]ó
Ñˆ�
ñ
 Ø�N‰N˜;¨Ô-ð ˜*Ñ$Ø" ;Ñ/ˆIÜ˜i¬Ô.Ü˜I“×-Ñ-Ô/Ü$Øróð ô ˜)¨gÔ6ð ;¸!Ü.2¯i©i¸«l�J˜{Ñ+÷;ð ;ð ')ˆJ�{Ñ#ð 8cÐ7R×7bÑ7bØð8
àØØñ	8
ð
 ñ8
ˆŒô ,DÀDÇOÁO×DdÑDdÐfj×frÑfrÓ+sˆ�‰Ô(ñ Ø×&Ñ&Ð'9¸8À\ÕRð øô[ #ò 	ÜðRóð ð	ú÷8;ð ;ús   ­E" ÃE:Å"E7Å:Fc                ó  — 	 dd l }ddlm}m} |j                  d|j                  «       d   «      |d<   t        |«      }|j                  «       }	d}
d}| j                  ||	||||
«      \  }}|r|j                  dd «        |j                  |f|||dœ|¤Ž| _        t        | j                  j                  | j                  «      | j                  _        |r| j!                  ||	|
«       y y # t        $ r t        d«      ‚w xY w)	Nr   )ÚONNX_WEIGHTS_NAMEÚORTModelForFeatureExtractionz°Using the ONNX backend requires installing Optimum and ONNX Runtime. You can install them with pip: `pip install optimum[onnxruntime]` or `pip install optimum[onnxruntime-gpu]`ÚproviderÚONNXz*.onnxr`   rc   )ÚonnxruntimeÚoptimum.onnxruntimerv   rw   rg   rJ   rQ   Úget_available_providersr   rh   ri   r5   r8   r#   rn   r2   ro   )r=   r>   r-   r,   r?   Úortrv   rw   rp   rq   rr   rs   rd   s                r   rV   zTransformer._load_onnx_model  s,  € ð	Û%ß[ð ",§¡°
¸C×<WÑ<WÓ<YÐZ[Ñ<\Ó!]ˆ
�:ÑäÐ+Ó,ˆ	Ø×#Ñ#Ó%ˆØˆØ#Ðð "×8Ñ8Ø�x Ð->Ð@PÐR^ó
Ñˆ�
ñ
 Ø�N‰N˜;¨Ô-ð 9eÐ8T×8dÑ8dØð9
àØØñ	9
ð
 ñ9
ˆŒô ,DÀDÇOÁO×DdÑDdÐfj×frÑfrÓ+sˆ�‰Ô(ñ Ø×&Ñ&Ð'9¸8À\ÕRð øôK #ò 	Üð<óð ð	ús   ‚C, Ã,Dc                ó&  — |j                  dd«      }|r||fS |j                  d|«      }|j                  dd«      }	|	rt        |	|«      j                  «       nt        |«      j                  «       }
|	r%t        |	| j                  |«      j                  «       n#t        | j                  |«      j                  «       }|	r|	› d|› �nd|› �}|r<|j                  |«      D �cg c]!  }|j                  |«      j                  «       ‘Œ# }}nct        j                  |j                  «       d|j                  dd«      |j                  d	d«      ¬
«      }|D �cg c]  }t        ||«      sŒ|‘Œ }}|
|v }|s`d|vr\||v }|rVt        |«      dkD  r4d|vr0t        j                  d|› d|j                  «       ›d|› d|›d�	«       | j                  |d<   ||d<   |€| }t        |«      j                  }t        |«      dkD  r8|d   |d<   t        |j                  dd«      g|dd ¢­Ž j                  «       |d<   |rQt        j                  d|›d|j                  «       ›d|› d�«       |r"t        j                  d|› d|› d|d   › d�«       ||fS c c}w c c}w )a  
        Determines whether the model should be exported to the backend, or if it can be loaded directly.
        Also update the `file_name` and `subfolder` model_args if necessary.

        These are the cases:

        1. If export is set in model_args, just return export
        2. If `<subfolder>/<file_name>` exists; set export to False
        3. If `<backend>/<file_name>` exists; set export to False and set subfolder to the backend (e.g. "onnx")
        4. If `<file_name>` contains a folder, add those folders to the subfolder and set the file_name to the last part

        We will warn if:

        1. The expected file does not exist in the model directory given the optional file_name and subfolder.
           If there are valid files for this backend, but they're don't align with file_name, then we give a useful warning.
        2. Multiple files are found in the model directory that match the target file name and the user did not
           specify the desired file name via `model_kwargs={"file_name": "<file_name>"}`

        Args:
            load_path: The model repository or directory, as a Path instance
            is_local: Whether the model is local or remote, i.e. whether load_path is a local directory
            model_args: The model_args dictionary. Notable keys are "export", "file_name", and "subfolder"
            target_file_name: The expected file name in the model directory, e.g. "model.onnx" or "openvino_model.xml"
            target_file_glob: The glob pattern to match the target file name, e.g. "*.onnx" or "openvino*.xml"
            backend_name: The human-readable name of the backend for use in warnings, e.g. "ONNX" or "OpenVINO"

        Returns:
            Tuple[bool, dict[str, Any]]: A tuple of the export boolean and the updated model_args dictionary.
        rd   Nr`   r   z/**/z**/ÚmodelrF   rE   )Ú	repo_typerF   rE   é   z	Multiple z files found in z: z, defaulting to zW. Please specify the desired file name via `model_kwargs={"file_name": "<file_name>"}`.éÿÿÿÿÚ zNo z
 found in z. Exporting the model to ú.z#If you intended to load one of the ú zN files, please specify the desired file name via `model_kwargs={"file_name": "r   z"}`.)rQ   rI   r   Úas_posixr2   ÚglobÚrelative_toÚhuggingface_hubÚlist_repo_filesr   ÚlenÚloggerÚwarningÚparts)r=   rp   rq   r?   Útarget_file_namers   rr   rd   r`   r   Úprimary_full_pathÚsecondary_full_pathÚglob_patternÚpathÚmodel_file_namesÚ	all_filesÚfnameÚmodel_foundÚfile_name_partss                      r   ri   z"Transformer._backend_should_export0  sõ  € ðN —‘ ¨$Ó/ˆÙØ˜:Ð%Ð%à—N‘N ;Ð0@ÓAˆ	Ø—N‘N ;°Ó5ˆ	ÙENœD ¨IÓ6×?Ñ?ÔAÔTXÐYbÓTc×TlÑTlÓTnÐñ ô �˜DŸL™L¨)Ó4×=Ñ=Ô?ä�d—l‘l IÓ.×7Ñ7Ó9ð 	ñ
 @I˜)˜ DÐ)9Ð(:Ñ;ÐPSÐTdÐSeÐNfˆñ ØS\×SaÑSaÐbnÓSoÖpÈ4 × 0Ñ 0°Ó ;× DÑ DÕ FÐpÐÑpä'×7Ñ7Ø×"Ñ"Ó$Ø!Ø#Ÿ™¨
°DÓ9Ø —n‘n W¨dÓ3ô	ˆIð 4=Ö]¨%ÄÈÈ|Õ@\¢Ð]ÐÐ]ð
 (Ð+;Ð;ˆÙ˜{°*Ñ<Ø-Ð1AÐAˆKÙÜÐ'Ó(¨1Ò,°ÀJÑ1NÜ—N‘NØ# L >Ð1AÀ)×BTÑBTÓBVÐAYÐY[Ð\lÐ[mÐm}ð  Rð  ~Uð Urð sôð +/¯,©,�
˜;Ñ'Ø*3�
˜;Ñ'Øˆ>Ø$�_ˆFô ˜y›/×/Ñ/ˆÜˆÓ !Ò#Ø&5°bÑ&9ˆJ�{Ñ#Ü&*¨:¯>©>¸+ÀrÓ+JÐ&bÈ_Ð]`Ð^`ÐMaÒ&b×&kÑ&kÓ&mˆJ�{Ñ#áÜ�N‰NØ�i�] *¨Y×-?Ñ-?Ó-AÐ,DÐD]Ð^jÐ]kÐklÐmôñ  Ü—‘Ø9Ð:JÐ9KÈ1È\ÈNð [^Ø^nÐopÑ^qÐ]rÐrwðyôð
 �zÐ!Ð!ùòY  qùò  ^s   Ã &J	ÅJÅ&Jc                ód   — d|› d�}|r
|d|›d�z  }n	|d|›d�z  }t         j                  |«       y )NzSaving the exported zA model is heavily recommended to avoid having to export it again.z# Do so with `model.save_pretrained(z)`.z Do so with `model.push_to_hub(z, create_pr=True)`.)rŒ   r�   )r=   r>   rq   rr   Úto_logs        r   ro   z!Transformer._backend_warn_to_save•  sN   € Ø'¨ ~Ð5vÐwˆÙØÐ;Ð<NÐ;QÐQTÐUÑU‰FàÐ7Ð8JÐ7MÐM`ÐaÑaˆFÜ�‰�vÕr   c                óV   — ddl m} dg|_         |j                  |f||dœ|¤Ž| _        y)úLoads the encoder model from T5r   )ÚT5EncoderModelú	decoder.*rN   N)Útransformersr�   Ú"_keys_to_ignore_on_load_unexpectedr5   r8   )r=   r>   r-   r,   r?   r�   s         r   rS   zTransformer._load_t5_model�  s8   € å/à=H¸MˆÔ9Ø8˜.×8Ñ8Øð
Ø'-¸ñ
ØFPñ
ˆ�r   c                óV   — ddl m} dg|_         |j                  |f||dœ|¤Ž| _        y)rœ   r   )ÚMT5EncoderModelrž   rN   N)rŸ   r¢   r    r5   r8   )r=   r>   r-   r,   r?   r¢   s         r   rT   zTransformer._load_mt5_model¦  s8   € å0à>I¸]ˆÔ:Ø9˜/×9Ñ9Øð
Ø'-¸ñ
ØFPñ
ˆ�r   c                ól   — d| j                  «       › d| j                  j                  j                  › d�S )NzTransformer(z) with Transformer model: r…   )Úget_config_dictr8   r:   r;   ©r=   s    r   Ú__repr__zTransformer.__repr__¯  s7   € Ø˜d×2Ñ2Ó4Ð5Ð5OÐPT×P_ÑP_×PiÑPi×PrÑPrÐOsÐstÐuÐur   c                ól  — |j                  «       D ��ci c]  \  }}|dv r||“Œ }}} | j                  di |¤|¤ddi¤Ž}|d   }||d<   t        «       r®ddlm} t        | j                  |«      r’| j                  j                  j                  rr|j                  d«      }	|d   }
t        j                  |	| j                  j                  j                  |
j                  ¬«      }t        j                  ||
fd	¬
«      |d<   | j                  j                  j                  rd|v r|d   |d<   |S c c}}w )z#Returns token_embeddings, cls_token)Ú	input_idsÚattention_maskÚtoken_type_idsÚinputs_embedsÚreturn_dictTr   Útoken_embeddings)ÚPeftModelForFeatureExtractionr©   )Údevicer�   )ÚdimÚhidden_statesÚall_layer_embeddingsr"   )Úitemsr8   r   rL   r®   rR   Úactive_peft_configÚis_prompt_learningÚsizerH   ÚonesÚnum_virtual_tokensr¯   Úcatr-   Úoutput_hidden_states)r=   Úfeaturesr   ÚkeyÚvalueÚtrans_featuresÚoutputsr­   r®   Ú
batch_sizer©   Úprefix_attention_masks               r   ÚforwardzTransformer.forward²  s7  € ð 'Ÿn™nÓ.÷
á��UØÐXÑXð �‰Jð
ˆñ 
ð "�$—/‘/ÑO NÐO°fÑOÈ$ÒOˆØ" 1™:ÐØ'7ˆÐ#Ñ$ô ÔÝ:ô ˜4Ÿ?™?Ð,IÔJØ—O‘O×6Ñ6×IÒIà-×2Ñ2°1Ó5�
Ø!)Ð*:Ñ!;�Ü(-¯
©
Ø §¡× BÑ B× UÑ UÐ^l×^sÑ^sô)Ð%ô .3¯Y©YÐ8MÈ~Ð7^ÐdeÔ-f�Ð)Ñ*à�?‰?×!Ñ!×6Ò6¸?ÈgÑ;UØ/6°Ñ/GˆHÐ+Ñ,àˆùó;
s   ”D0c                óB   — | j                   j                  j                  S ©N)r8   r-   Úhidden_sizer¥   s    r   Úget_word_embedding_dimensionz(Transformer.get_word_embedding_dimensionÓ  s   € Ø�‰×%Ñ%×1Ñ1Ð1r   c           
     óê  — i }t        |d   t        «      r|g}n¦t        |d   t        «      r\g }g |d<   |D ]L  }t        t	        |j                  «       «      «      \  }}|j                  |«       |d   j                  |«       ŒN |g}n7g g }	}|D ]*  }
|j                  |
d   «       |	j                  |
d   «       Œ, ||	g}|D ��cg c])  }|D �cg c]  }t        |«      j                  «       ‘Œ c}‘Œ+ }}}| j                  r-|D ��cg c]   }|D �cg c]  }|j                  «       ‘Œ c}‘Œ" }}}|j                   | j                  ||dd| j                  dœŽ«       |S c c}w c c}}w c c}w c c}}w )z-Tokenizes a text and maps tokens to token-idsr   Ú	text_keysr�   Úlongest_firstÚpt)ÚpaddingÚ
truncationÚreturn_tensorsÚ
max_length)rR   Ústrrj   ÚnextÚiterr³   ÚappendÚstripr*   ÚlowerÚupdater6   r)   )r=   ÚtextsrË   ÚoutputÚto_tokenizeÚlookupÚtext_keyÚtextÚbatch1Úbatch2Ú
text_tupleÚcolÚss                r   ÚtokenizezTransformer.tokenizeÖ  sr  € ð ˆÜ�e˜A‘h¤Ô$Ø ˜'‰KÜ˜˜a™¤$Ô'ØˆKØ"$ˆF�;ÑØò 5�Ü!%¤d¨6¯<©<«>Ó&:Ó!;‘�˜$Ø×"Ñ" 4Ô(Ø�{Ñ#×*Ñ*¨8Õ4ð5ð '˜-‰Kà �FˆFØ#ò -�
Ø—‘˜j¨™mÔ,Ø—‘˜j¨™mÕ,ð-ð " 6Ð*ˆKð AL×L¸°Ö4¨1œ˜A›Ÿ™�Ô4ÐLˆÑLð ×ÒØ?J×K¸¨sÖ3¨!˜AŸG™G�IÔ3ÐKˆKÑKà�‰ØˆD�N‰NØØØ*Ø#Ø×.Ñ.òô	
ð ˆùò 5ùÓLùò 4ùÓKs0   Ã	E$Ã EÃ.E$Ä	E/ÄE*Ä'E/ÅE$Å*E/c                ó\   — | j                   D �ci c]  }|| j                  |   “Œ c}S c c}w rÄ   )r1   Ú__dict__)r=   r¼   s     r   r¤   zTransformer.get_config_dictþ  s*   € Ø37×3CÑ3CÖD¨C��T—]‘] 3Ñ'Ñ'ÒDÐDùÒDs   �)c                ó>  — | j                   j                  ||¬«       | j                  j                  |«       t        t        j
                  j                  |d«      d«      5 }t        j                  | j                  «       |d¬«       d d d «       y # 1 sw Y   y xY w)N)Úsafe_serializationúsentence_bert_config.jsonÚwé   )Úindent)
r8   Úsave_pretrainedr6   rk   r   r“   Újoinrl   Údumpr¤   )r=   Úoutput_pathrå   ÚfOuts       r   ÚsavezTransformer.save  sw   € Ø�‰×'Ñ'¨ÐHZÐ'Ô[Ø�‰×&Ñ& {Ô3ä”"—'‘'—,‘,˜{Ð,GÓHÈ#ÓNð 	>ÐRVÜ�I‰I�d×*Ñ*Ó,¨d¸1Õ=÷	>÷ 	>ñ 	>ús   Á#'BÂBc                óÊ  — dD ]C  }t         j                  j                  ||«      }t         j                  j                  |«      sŒC n t	        «      5 }t        j                  |«      }d d d «       dv rd|d   v r|d   j                  d«       d|v rd|d   v r|d   j                  d«       d|v rd|d   v r|d   j                  d«        | dd|i|¤ŽS # 1 sw Y   ŒpxY w)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.jsonr?   Útrust_remote_coder@   rA   r>   r"   )r   r“   rë   rh   rk   rl   rm   rQ   )ÚclsÚ
input_pathÚconfig_nameÚsbert_config_pathÚfInr-   s         r   rm   zTransformer.load  sÿ   € ð
ò 	ˆKô !#§¡§¡¨Z¸Ó EÐÜ�w‰w�~‰~Ð/Õ0Ùð	ô Ð#Ó$ð 	$¨Ü—Y‘Y˜s“^ˆF÷	$ð ˜6Ñ!Ð&9¸VÀLÑ=QÑ&QØ�<Ñ ×$Ñ$Ð%8Ô9Ø˜vÑ%Ð*=ÀÐHXÑAYÑ*YØÐ#Ñ$×(Ñ(Ð)<Ô=Ø˜FÑ"Ð':¸fÀ]Ñ>SÑ'SØ�=Ñ!×%Ñ%Ð&9Ô:ÙÑ; jÐ;°FÑ;Ð;÷	$ð 	$ús   ÁCÃC")NNNNNFNrH   )r>   rÏ   r)   z
int | Noner?   údict[str, Any] | Noner@   r÷   rA   r÷   r,   ú
str | Noner*   r&   rB   rÏ   r2   rÏ   r    r!   )
r>   rÏ   r,   rø   r2   rÏ   rA   údict[str, Any]r    z*tuple[PeftConfig | PretrainedConfig, bool])r>   rÏ   r-   zPeftConfig | PretrainedConfigr,   rÏ   r2   rÏ   rC   r&   r    r!   )r>   rÏ   r-   r   r,   rÏ   r    r!   )r>   rÏ   r-   r   r,   rÏ   r    r!   )rp   r   rq   r&   r?   rù   r�   rÏ   rs   rÏ   rr   rÏ   r    ztuple[bool, dict[str, Any]])r>   rÏ   rq   rÏ   rr   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í   rÏ   rå   r&   r    r!   )ró   rÏ   r    r%   )r;   Ú
__module__Ú__qualname__Ú__doc__r'   Ú__annotations__r0   r3   r4   rU   rW   rV   ri   ro   rS   rT   r¦   rÂ   rÆ   rá   r¤   rï   Úclassmethodrm   Ú__classcell__)r:   s   @r   r%   r%      s-  ø… ñð. €L�$Óð
 &*Ø,0Ø04Ø-1Ø $Ø#Ø&*Øð.Wàð.Wð #ð.Wð *ð	.Wð
 .ð.Wð +ð.Wð ð.Wð ð.Wð !$ð.Wð ð.Wð 
õ.Wð`(iØ"%ð(iØ2<ð(iØGJð(iØYgð(ià	3ó(iðT-vàð-vð .ð-vð ð	-vð
 ð-vð ð-vð 
ó-vó^
ð7SØ"%ð7SØ/?ð7SØLOð7Sà	ó7Sðr,SØ"%ð,SØ/?ð,SØLOð,Sà	ó,Sð\c"àðc"ð ðc"ð #ð	c"ð
 ðc"ð ðc"ð ðc"ð 
%óc"óJó
ó
óvóóB2ð \`ð&ØCð&ØNXð&à	 ó&óPEô>ð ò<ó ô<r   r%   )r   r   r   rÏ   r    zCallable[..., None])"Ú
__future__r   rl   Úloggingr   r   Úpathlibr   Útypingr   r   r   r‰   rH   r	   rŸ   r
   r   r   r   r   r   Útransformers.utils.import_utilsr   Útransformers.utils.peft_utilsr   Ú	getLoggerr;   rŒ   rL   r   r#   ÚModuler%   r"   r   r   ú<module>r
     sg   ðÝ "ã Û Û 	Ý Ý ß /Ñ /ã Û Ý ß d× dÝ =Ý Bà	ˆ×	Ñ	˜8Ó	$€áÑ&Ô(ÝóôB<�"—)‘)õ B<r   