a
    h                     @   s  d Z ddlZddlZddlZddlZddlZddlZddlZddlZddl	Z	ddl
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m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"m#Z# e $e%Z&e' Z(dd Z)ee*ej+f ddddZ,ee*ej+f e-e* dddZ.ee*ej+f e-e* dddZ/ee*ej+f e-e* dddZ0ee*ej+f e-e* dddZ1dde*ee*ej+f e2e3dddZ4d0ee*ej+f e*eee*ej+f  e2ee2 ee5e*e*f  eee2e*f  ee* e2ee* ee* e*dd d!Z6d1e*ee*ej+f eee*ej+f  e2ee2 ee5e*e*f  eee2e*f  ee* e2ee* ee* e3d"d#d$Z7d2eee*ej+f ee5 e-e* d%d&d'Z8d(d) Z9d*Z:d3d+d,Z;d4d.d/Z<dS )5z3Utilities to dynamically load objects from the Hub.    N)Path)
ModuleType)AnyOptionalUnion)try_to_load_from_cache)version   )HF_MODULES_CACHE TRANSFORMERS_DYNAMIC_MODULE_NAMEcached_fileextract_commit_hashis_offline_modelogging)VersionComparisonsplit_package_versionc                  C   sP   t tjv rdS tjt  tjt dd tt d } |  sL|   t	
  dS )z_
    Creates the cache directory for modules with an init, and adds it to the Python path.
    NTexist_ok__init__.py)r
   syspathappendosmakedirsr   existstouch	importlibinvalidate_caches)	init_path r   ]/var/www/html/assistant/venv/lib/python3.9/site-packages/transformers/dynamic_module_utils.pyinit_hf_modules3   s    
r!   )namereturnc                 C   s\   t   tt|   }|j s*t|j tj|dd |d }| sX|	  t
  dS )z
    Creates a dynamic module in the cache directory for modules.

    Args:
        name (`str` or `os.PathLike`):
            The name of the dynamic module to create.
    Tr   r   N)r!   r   r
   resolveparentr   create_dynamic_moduler   r   r   r   r   )r"   Zdynamic_module_pathr   r   r   r    r&   C   s    

r&   )module_filer#   c                 C   sh   t | dd}| }W d   n1 s*0    Y  tjd|tjd}|tjd|tjd7 }tt|S )z
    Get the list of modules that are relatively imported in a module file.

    Args:
        module_file (`str` or `os.PathLike`): The module file to inspect.

    Returns:
        `list[str]`: The list of relative imports in the module.
    utf-8encodingNz^\s*import\s+\.(\S+)\s*$)flagsz^\s*from\s+\.(\S+)\s+import)openreadrefindall	MULTILINElistset)r'   fcontentZrelative_importsr   r   r    get_relative_importsY   s
    
&r5   c                    sx   d}| g}g  |stg }|D ]}| t| qt| jfdd|D } fdd|D }t|dk}  | q S )a  
    Get the list of all files that are needed for a given module. Note that this function recurses through the relative
    imports (if a imports b and b imports c, it will return module files for b and c).

    Args:
        module_file (`str` or `os.PathLike`): The module file to inspect.

    Returns:
        `list[str]`: The list of all relative imports a given module needs (recursively), which will give us the list
        of module files a given module needs.
    Fc                    s   g | ]}t  |  d qS ).py)str).0m)module_pathr   r    
<listcomp>       z-get_relative_import_files.<locals>.<listcomp>c                    s   g | ]}| vr|qS r   r   r8   r3   )all_relative_importsr   r    r;      r<   r   )extendr5   r   r%   len)r'   Z	no_changeZfiles_to_checkZnew_importsr3   Znew_import_filesr   )r>   r:   r    get_relative_import_filesn   s    
rA   )filenamer#   c                    sl   t | dd}| }W d   n1 s*0    Y  t  ddl fddt|}| t S )a  
    Extracts all the libraries (not relative imports this time) that are imported in a file.

    Args:
        filename (`str` or `os.PathLike`): The module file to inspect.

    Returns:
        `list[str]`: The list of all packages required to use the input module.
    r(   r)   Nr   c                    s  t | tjrd S t | tjrv| j}t|D ]F}t |tjr,t|jdd}|	dr^|
dsltjj|r, d S q,nrt | tjr| jD ]"}|jdd }|r | qn:t | tjr| jdkr| jr| jdd }|r | t| D ]}| qd S )Nid 	availableZis_flash_attn.r   )
isinstanceastTryIftestwalkCallgetattrfuncendswith
startswithhasattrutilsZimport_utilsImportnamesr"   splitadd
ImportFromlevelmoduleiter_child_nodes)noderK   Zcondition_nodeZcheck_functionaliasZ
top_modulechildZimported_modulesrecursive_look_for_importsZtransformersr   r    r`      s4    


z/get_imports.<locals>.recursive_look_for_imports)r,   r-   r2   Ztransformers.utilsrH   parsesorted)rB   r3   r4   treer   r_   r    get_imports   s    
&!
rd   c                 C   s   t | }g }|D ]h}zt| W q tyv } z<td| d|  dt|v r`|| n W Y d}~qd}~0 0 qt|dkrtdd	| dd		| d
t
| S )a.  
    Check if the current Python environment contains all the libraries that are imported in a file. Will raise if a
    library is missing.

    Args:
        filename (`str` or `os.PathLike`): The module file to check.

    Returns:
        `list[str]`: The list of relative imports in the file.
    z&Encountered exception while importing z: zNo module namedNr   z\This modeling file requires the following packages that were not found in your environment: z, z. Run `pip install  `)rd   r   import_moduleImportErrorloggerwarningr7   r   r@   joinr5   )rB   ZimportsZmissing_packagesimp	exceptionr   r   r    check_imports   s&    rn   Fforce_reload)
class_namer:   rp   r#   c          
      C   s$  t j|}|dr"|dd }|t jjd}tt| }t |r^t	j
|d t  t	j
|}tjj||d}|gtttt| }tddd |D  }|du rtj|}	|	t	j
|< n|}	t|	d	d
|kr|j|	 ||	_t|	| W  d   S 1 s0    Y  dS )a  
    Import a module on the cache directory for modules and extract a class from it.

    Args:
        class_name (`str`): The name of the class to import.
        module_path (`str` or `os.PathLike`): The path to the module to import.
        force_reload (`bool`, *optional*, defaults to `False`):
            Whether to reload the dynamic module from file if it already exists in `sys.modules`.
            Otherwise, the module is only reloaded if the file has changed.

    Returns:
        `typing.Type`: The class looked for.
    r6   NrF   )locationr<   c                 s   s   | ]}t ||  V  qd S )N)bytes
read_bytesr=   r   r   r    	<genexpr>	  r<   z&get_class_in_module.<locals>.<genexpr>__transformers_module_hash__rD   )r   r   normpathrP   replacesepr   r
   _HF_REMOTE_CODE_LOCKr   modulespopr   r   getutilspec_from_file_locationrb   maprA   hashlibsha256rk   	hexdigestmodule_from_specrN   loaderexec_modulerw   )
rq   r:   rp   r"   r'   cached_moduleZmodule_specZmodule_filesZmodule_hashrZ   r   r   r    get_class_in_module   s*    
r   )pretrained_model_name_or_pathr'   	cache_dirforce_downloadresume_downloadproxiestokenrevisionlocal_files_only	repo_type_commit_hashr#   c                 K   s&  | dd}|dur4tdt |dur0td|}t rL|sLtd d}t| } t	j
| }|rrt	j
| }n"| dt	j
j}t| |||
|	d}g }z8t| |||||||||	|
d	}|s||kr|| W n, ty   td
| d|  d  Y n0 t|}tt	j
j | }t| tt| }|t	j
| kr||  r`t|t|| s|| jjddd t|||  t   |D ]d}t|j| d }t	j
!| |}||  rt|t|| st|||  t   qnt"||
}|| }|t	j
j | }t	j
!||}tt|j ||  s\t|||  t   |D ]L}|| d  s`t#| | d||||||||d
 || d q`t$|dkr|du rd!dd |D }|	du rdn|	 d}d| |  }t%d| d| d t	j
!||S )a	  
    Prepares Downloads a module from a local folder or a distant repo and returns its path inside the cached
    Transformers module.

    Args:
        pretrained_model_name_or_path (`str` or `os.PathLike`):
            This can be either:

            - a string, the *model id* of a pretrained model configuration hosted inside a model repo on
              huggingface.co.
            - a path to a *directory* containing a configuration file saved using the
              [`~PreTrainedTokenizer.save_pretrained`] method, e.g., `./my_model_directory/`.

        module_file (`str`):
            The name of the module file containing the class to look for.
        cache_dir (`str` or `os.PathLike`, *optional*):
            Path to a directory in which a downloaded pretrained model configuration should be cached if the standard
            cache should not be used.
        force_download (`bool`, *optional*, defaults to `False`):
            Whether or not to force to (re-)download the configuration files and override the cached versions if they
            exist.
        resume_download:
            Deprecated and ignored. All downloads are now resumed by default when possible.
            Will be removed in v5 of Transformers.
        proxies (`dict[str, str]`, *optional*):
            A dictionary of proxy servers to use by protocol or endpoint, e.g., `{'http': 'foo.bar:3128',
            'http://hostname': 'foo.bar:4012'}.` The proxies are used on each request.
        token (`str` or *bool*, *optional*):
            The token to use as HTTP bearer authorization for remote files. If `True`, will use the token generated
            when running `hf auth login` (stored in `~/.huggingface`).
        revision (`str`, *optional*, defaults to `"main"`):
            The specific model version to use. It can be a branch name, a tag name, or a commit id, since we use a
            git-based system for storing models and other artifacts on huggingface.co, so `revision` can be any
            identifier allowed by git.
        local_files_only (`bool`, *optional*, defaults to `False`):
            If `True`, will only try to load the tokenizer configuration from local files.
        repo_type (`str`, *optional*):
            Specify the repo type (useful when downloading from a space for instance).

    <Tip>

    Passing `token=True` is required when you want to use a private model.

    </Tip>

    Returns:
        `str`: The path to the module inside the cache.
    use_auth_tokenNrThe `use_auth_token` argument is deprecated and will be removed in v5 of Transformers. Please use `token` instead.V`token` and `use_auth_token` are both specified. Please set only the argument `token`.z+Offline mode: forcing local_files_only=TrueT/)r   r   r   )	r   r   r   r   r   r   r   r   r   zCould not locate the z inside rF   )parentsr   r6   )r   r   r   r   r   r   r   r   r   
c                 S   s   g | ]}d | qS )z- r   r=   r   r   r    r;     r<   z*get_cached_module_file.<locals>.<listcomp>rD   zs/zhttps://huggingface.co/z9A new version of the following files was downloaded from z:
z
. Make sure to double-check they do not contain any added malicious code. To avoid downloading new versions of the code file, you can pin a revision.)&r}   warningswarnFutureWarning
ValueErrorr   ri   infor7   r   r   isdirbasenamery   rz   r   r   r   OSErrorrn   r   r&   r   r
   r   filecmpcmpr%   mkdirshutilcopyr   r   rk   r   get_cached_module_filer@   rj   )r   r'   r   r   r   r   r   r   r   r   r   Zdeprecated_kwargsr   is_local	submoduler   Z	new_filesZresolved_module_fileZmodules_neededZfull_submoduleZsubmodule_pathZmodule_neededZmodule_needed_fileZcommit_hashZfull_submodule_module_file_pathZrepo_type_strurlr   r   r    r     s    >



r   )class_referencer   r   r   r   r   r   r   r   r   code_revisionr#   c                 K   s   | dd}|dur4tdt |dur0td|}d| v rL| d\}} n|}| d\}}|
du rr||krr|}
t||d ||||||
||	d
}t|||d	S )
a6  
    Extracts a class from a module file, present in the local folder or repository of a model.

    <Tip warning={true}>

    Calling this function will execute the code in the module file found locally or downloaded from the Hub. It should
    therefore only be called on trusted repos.

    </Tip>



    Args:
        class_reference (`str`):
            The full name of the class to load, including its module and optionally its repo.
        pretrained_model_name_or_path (`str` or `os.PathLike`):
            This can be either:

            - a string, the *model id* of a pretrained model configuration hosted inside a model repo on
              huggingface.co.
            - a path to a *directory* containing a configuration file saved using the
              [`~PreTrainedTokenizer.save_pretrained`] method, e.g., `./my_model_directory/`.

            This is used when `class_reference` does not specify another repo.
        module_file (`str`):
            The name of the module file containing the class to look for.
        class_name (`str`):
            The name of the class to import in the module.
        cache_dir (`str` or `os.PathLike`, *optional*):
            Path to a directory in which a downloaded pretrained model configuration should be cached if the standard
            cache should not be used.
        force_download (`bool`, *optional*, defaults to `False`):
            Whether or not to force to (re-)download the configuration files and override the cached versions if they
            exist.
        resume_download:
            Deprecated and ignored. All downloads are now resumed by default when possible.
            Will be removed in v5 of Transformers.
        proxies (`dict[str, str]`, *optional*):
            A dictionary of proxy servers to use by protocol or endpoint, e.g., `{'http': 'foo.bar:3128',
            'http://hostname': 'foo.bar:4012'}.` The proxies are used on each request.
        token (`str` or `bool`, *optional*):
            The token to use as HTTP bearer authorization for remote files. If `True`, will use the token generated
            when running `hf auth login` (stored in `~/.huggingface`).
        revision (`str`, *optional*, defaults to `"main"`):
            The specific model version to use. It can be a branch name, a tag name, or a commit id, since we use a
            git-based system for storing models and other artifacts on huggingface.co, so `revision` can be any
            identifier allowed by git.
        local_files_only (`bool`, *optional*, defaults to `False`):
            If `True`, will only try to load the tokenizer configuration from local files.
        repo_type (`str`, *optional*):
            Specify the repo type (useful when downloading from a space for instance).
        code_revision (`str`, *optional*, defaults to `"main"`):
            The specific revision to use for the code on the Hub, if the code leaves in a different repository than the
            rest of the model. It can be a branch name, a tag name, or a commit id, since we use a git-based system for
            storing models and other artifacts on huggingface.co, so `revision` can be any identifier allowed by git.

    <Tip>

    Passing `token=True` is required when you want to use a private model.

    </Tip>

    Returns:
        `typing.Type`: The class, dynamically imported from the module.

    Examples:

    ```python
    # Download module `modeling.py` from huggingface.co and cache then extract the class `MyBertModel` from this
    # module.
    cls = get_class_from_dynamic_module("modeling.MyBertModel", "sgugger/my-bert-model")

    # Download module `modeling.py` from a given repo and cache then extract the class `MyBertModel` from this
    # module.
    cls = get_class_from_dynamic_module("sgugger/my-bert-model--modeling.MyBertModel", "sgugger/another-bert-model")
    ```r   Nr   r   z--rF   r6   )r   r   r   r   r   r   r   r   ro   )r}   r   r   r   r   rV   r   r   )r   r   r   r   r   r   r   r   r   r   r   kwargsr   Zrepo_idr'   rq   Zfinal_moduler   r   r    get_class_from_dynamic_module  s8    Zr   )objfolderconfigr#   c           	         s    j dkr&td  d| d dS  fdd}t|ttfrT|D ]}|| qDn|durd|| g }tj j  j}t	|t	|j
 }t|| || t|D ],}t	|t	|j
 }t|| || q|S )a  
    Save the modeling files corresponding to a custom model/configuration/tokenizer etc. in a given folder. Optionally
    adds the proper fields in a config.

    Args:
        obj (`Any`): The object for which to save the module files.
        folder (`str` or `os.PathLike`): The folder where to save.
        config (`PretrainedConfig` or dictionary, `optional`):
            A config in which to register the auto_map corresponding to this custom object.

    Returns:
        `list[str]`: The list of files saved.
    __main__z We can't save the code defining z in z as it's been defined in __main__. You should put this code in a separate module so we can include it in the saved folder and make it easier to share via the Hub.Nc           
         s
   j j}|dd }| d j j }d|v rd }d } j jdr| d j j }t dd d urt d}|j}|dd }| d|j }n| d j j }||f}t| tr| di }	||	 j	< |	| d< n*t| dd d ur|| j
 j	< n j	|i| _
d S )NrF   	TokenizerZFastslow_tokenizer_classauto_map)	__class__
__module__rV   __name__rP   rN   rG   dictr~   Z_auto_classr   )
_configmodule_nameZlast_moduleZ	full_namer   Zfast_tokenizer_classZslow_tokenizerZslow_tok_module_nameZlast_slow_tok_moduler   r   r   r    _set_auto_map_in_config^  s,    



z3custom_object_save.<locals>._set_auto_map_in_config)r   ri   rj   rG   r1   tupler   r|   __file__r   r"   r   r   r   rA   )	r   r   r   r   cfgresultZobject_file	dest_fileZneeded_filer   r   r    custom_object_saveH  s*    
 
r   c                 C   s   t dd S )NzLoading this model requires you to execute custom code contained in the model repository on your local machine. Please set the option `trust_remote_code=True` to permit loading of this model.)r   )signumframer   r   r    _raise_timeout_error  s    r      c              
   C   s  |du rd|dur*d| d| d| d}n:t j|rRd| dt j| d}nd| d| d}| du r||rzd} n|rltd	krld}zzfttjt}tt | du rt	| d
| d}|
 dv rd} q|
 dv rd} qtd	 W n( ty   t| d
| dY n0 W |durjttj| td	 n$|durhttj| td	 0 n|r|tdd |r|s| st| d
| d| S )a  
    Resolves the `trust_remote_code` argument. If there is remote code to be loaded, the user must opt-in to loading
    it.

    Args:
        trust_remote_code (`bool` or `None`):
            User-defined `trust_remote_code` value.
        model_name (`str`):
            The name of the model repository in huggingface.co.
        has_local_code (`bool`):
            Whether the model has local code.
        has_remote_code (`bool`):
            Whether the model has remote code.
        error_message (`str`, *optional*):
            Custom error message to display if there is remote code to load and the user didn't opt-in. If unset, the error
            message will be regarding loading a model with custom code.

    Returns:
        The resolved `trust_remote_code` value.
    NzThe repository z% references custom code contained in zm which must be executed to correctly load the model. You can inspect the repository content at https://hf.co/z .
zt contains custom code which must be executed to correctly load the model. You can inspect the repository content at z contains custom code which must be executed to correctly load the model. You can inspect the repository content at https://hf.co/Fr   z9 You can inspect the repository content at https://hf.co/z.
You can avoid this prompt in future by passing the argument `trust_remote_code=True`.

Do you wish to run the custom code? [y/N] )yesy1T)non0rD   zS.
Please pass the argument `trust_remote_code=True` to allow custom code to be run.)r   r   r   abspathTIME_OUT_REMOTE_CODEsignalSIGALRMr   alarminputlower	Exceptionr   )Ztrust_remote_codeZ
model_nameZhas_local_codeZhas_remote_codeerror_messageZupstream_repoZprev_sig_handlerZanswerr   r   r    resolve_trust_remote_code  sb    





r   requirements.txtc              	   K   sj  g }z*t f | |d|}t|d}| }W d   n1 sD0    Y  |D ]}| }|rR|drnqRzt|\}}}	W n ty   |}d\}}	Y n0 ztj	|}
W n* tjj
y   || d Y qRY n0 |dur|	durt|t	|
t	|	}nd}|sR|| d|
 d	 qRW n tyD   Y n0 |rftd
|  dd| dS )a  
    Tries to locate `requirements_file` in a local folder or repo, and confirms that the environment has all the
    python dependencies installed.

    Args:
        path_or_repo_id (`str` or `os.PathLike`):
            This can be either:
            - a string, the *model id* of a model repo on huggingface.co.
            - a path to a *directory* potentially containing the file.
        kwargs (`dict[str, Any]`, *optional*):
            Additional arguments to pass to `cached_file`.
    )path_or_repo_idrB   rN#)NNz (installed: None)Tz (installed: )z4Missing requirements in your local environment for `z`:
r   )r   r,   	readlinesstriprQ   r   r   r   metadatar   PackageNotFoundErrorr   r   Zfrom_stringra   r   rh   rk   )r   Zrequirements_filer   failedrequirementsr3   requirementpackage_name	delimiterZversion_numberZlocal_package_versionZis_satisfiedr   r   r    check_python_requirements  s@    &
r   )	NFNNNNFNN)	NFNNNNFNN)N)NN)r   )=__doc__rH   r   r   r   importlib.metadataimportlib.utilr   r.   r   r   r   	threadingr   pathlibr   typesr   typingr   r   r   Zhuggingface_hubr   	packagingr   rS   r
   r   r   r   r   r   Zutils.import_utilsr   r   Z
get_loggerr   ri   Lockr{   r!   r7   PathLiker&   r1   r5   rA   rd   rn   booltyper   r   r   r   r   r   r   r   r   r   r   r   r    <module>   s    
 7'4          6         }(L 
U