
     `iV                        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mZ d dlm	Z	 d dl
mZ d dlmZmZmZmZ ddlmZmZ ddlmZ dd	lmZ dd
lmZ ddlmZ ddlmZ ddlmZ ddl m!Z! ddl"m"Z"  e            rd dl#Z$d dl#m%Z% d dl#m&Z'  G d de%          Z( e	j)                    j*        Z+ ee,          j-        j-        a.t\          j-        j-        a/de+ d0                                Z1 G d d          Z2dee3ej4        f         de3de3fdZ5de2de3de3d e6e7e3e8f                  fd!Z9d"e3d#e6e3         fd$Z:d%e3de3de3fd&Z;d%e3de3d e6e7e3e8f                  fd'Z<d(e3d)e=fd*Z>d(e3de2d+e3d)e7e3e3e6f         fd,Z?de2de3d e6e7e3e8f                  d)e3fd-Z@de2d e6e7e3e8f                  fd.ZAde2de3de3d e6e7e3e8f                  d/e8f
d0ZB	 	 	 d=d1e3d2ee3         d3ee         d4ee3         d)ef
d5ZCd6e3d)e8fd7ZDd8 ZEd9efd:ZF G d; d<e!          ZGdS )>    N)ArgumentParser	Namespace)date)Path)AnyCallableOptionalUnion   )CONFIG_MAPPING_NAMESMODEL_NAMES_MAPPING)FEATURE_EXTRACTOR_MAPPING_NAMES)IMAGE_PROCESSOR_MAPPING_NAMES)PROCESSOR_MAPPING_NAMES)TOKENIZER_MAPPING_NAMES)VIDEO_PROCESSOR_MAPPING_NAMES)is_libcst_available   )BaseTransformersCLICommand)add_fast_image_processor)
CSTVisitor)matchersc                   ^    e Zd ZdZd Zdej        ddfdZdej        fdZdej	        fdZ
dS )	ClassFinderzC
        A visitor to find all classes in a python module.
        c                 0    g | _         g | _        d| _        d S NF)classespublic_classesis_in_classselfs    |/home/jaya/work/projects/VOICE-AGENT/VIET/agent-env/lib/python3.11/site-packages/transformers/commands/add_new_model_like.py__init__zClassFinder.__init__/   s    !#DL(*D$D    nodereturnNc                 \    | j                             |j        j                   d| _        dS )zwRecord class names. We assume classes always only appear at top-level (i.e. no class definition in function or similar)TN)r   appendnamevaluer   r!   r%   s     r"   visit_ClassDefzClassFinder.visit_ClassDef4   s*    L	000#Dr$   c                     d| _         d S r   )r   r+   s     r"   leave_ClassDefzClassFinder.leave_ClassDef9   s    $Dr$   c                    t          j        t          j        t          j        t          j                              g          g          }| j        sgt          j        ||          rT|j        d         j        d         j	        j
        }|dk    r.|j        d         j
        j        }d |D             | _        dS dS dS dS )z:Record all public classes inside the `__all__` assignment.)target)targets)bodyr   __all__c                 &    g | ]}|j         j         S  )r*   ).0elements     r"   
<listcomp>z9ClassFinder.visit_SimpleStatementLine.<locals>.<listcomp>E   s    *W*W*W77=+>*W*W*Wr$   N)mSimpleStatementLineAssignAssignTargetNamer   matchesr2   r1   r0   r*   elementsr   )r!   r%   !simple_top_level_assign_structureassigned_variabler?   s        r"   visit_SimpleStatementLinez%ClassFinder.visit_SimpleStatementLine<   s    010Ehafhh(G(G(G'HIIIJ1 1 1- # X	$8Y(Z(Z X$(IaL$8$;$B$H!$	11#y|1:H*W*Wh*W*W*WD'''	X X X X11r$   )__name__
__module____qualname____doc__r#   cstClassDefr,   r.   r:   rB   r5   r$   r"   r   r   *   s        	 		% 	% 	%
	$s| 	$ 	$ 	$ 	$ 	$
	%s| 	% 	% 	% 	%		X#2I 		X 		X 		X 		X 		X 		Xr$   r   z
# coding=utf-8
# Copyright aN   the HuggingFace Team. All rights reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
c                       e Zd ZdZdefdZdS )
ModelInfoszI
    Retrieve the basic information about an existing model classes.
    lowercase_namec                 j   |                                                     dd                              dd          | _        | j        t          vr| j                            dd           | j        t          vrt	          | d          t
          | j                 | _        t          | j                 | _        | j                            dd          | _        | j        t          v r9t          | j                 \  | _
        | _        | j        dk    rd n| j        | _        nd\  | _
        | _        t          j        | j        d          \  | _        | _        t!          j        | j        d           | _        t%          j        | j        d           | _        t)          j        | j        d           | _        d S )	N _-z is not a valid model nameConfig PreTrainedTokenizerFast)NN)lowerreplacerK   r   
ValueErrorr   
paper_nameconfig_classcamelcase_namer   tokenizer_classfast_tokenizer_classr   getimage_processor_classfast_image_processor_classr   video_processor_classr   feature_extractor_classr   processor_class)r!   rK   s     r"   r#   zModelInfos.__init__c   s   ,2244<<S#FFNNsTWXX&:::''S111&:::JJJKKK-d.AB01DE"/77"EE "999>UVZVi>j;D $";15NNNTXTm %% ?I;D $";FcFgG
 G
C"D$C &C%FtGZ\`%a%a"'F'J4K^`d'e'e$6:4;NPTUUr$   N)rC   rD   rE   rF   strr#   r5   r$   r"   rJ   rJ   ^   s@         Vs V V V V V Vr$   rJ   	file_namenew_content	add_afterc                 J   t          | dd          5 }|                                }ddd           n# 1 swxY w Y   |                    |d          \  }}||z   |z   |z   }t          | dd          5 }|                    |           ddd           dS # 1 swxY w Y   dS )ac  
    A utility to add some content inside a given file.

    Args:
        file_name (`str` or `os.PathLike`):
            The name of the file in which we want to insert some content.
        new_content (`str`):
            The content to add.
       add_after (`str`):
           The new content is added just after the first instance matching it.
    rutf-8encodingNr   w)openreadsplitwrite)rb   rc   rd   fold_contentbeforeafters          r"   add_content_to_filers      s/    
iw	/	/	/ 1ffhh                %%i33MFE9${2U:K	iw	/	/	/ 1	                 s   4885BBBold_model_infosnew_lowercase_namenew_model_paper_namefilenames_to_addc           	         d                     d |                    dd                              d          D                       }| j        | j        }fd|dd         D             }g }|D ]F\  }}t          j        d|          r|d	         \  }	}
|	|
p|f|d	<   /|                    ||f           Gt          t          d
z  dz  dz  d| d| dd           t          t          d
z  dz  dz  d| d| dd           |D ]\  }}|r|                    dd          }t          t          d
z  dz  |z            5 }|                                }ddd           n# 1 swxY w Y   t          j        d d|t
          j                  }|D ]J}t          t          d
z  dz  |z  |                    |                              ||          |           KdS )a  
    Add a model to all the relevant mappings in the auto module.

    Args:
        old_model_infos (`ModelInfos`):
            The structure containing the class information of the old model.
        new_lowercase_name (`str`):
            The new lowercase model name.
        new_model_paper_name (`str`):
            The fully cased name (as in the official paper name) of the new model.
        filenames_to_add (`list[tuple[str, bool]]`):
            A list of tuples of all potential filenames to add for a new model, along a boolean flag describing if we
            should add this file or not. For example, [(`modeling_xxx.px`, True), (`configuration_xxx.py`, True), (`tokenization_xxx.py`, False),...]
    rQ   c              3   >   K   | ]}|                                 V  d S Ntitler6   xs     r"   	<genexpr>z-add_model_to_auto_mappings.<locals>.<genexpr>   *      ``1QWWYY``````r$   rO   rN   c                 F    g | ]\  }}|                     d           |fS )autorT   )r6   filenameto_addold_lowercase_names      r"   r8   z.add_model_to_auto_mappings.<locals>.<listcomp>   s@       CS8V		,f	5	5v>  r$   r   Nz2(?:tokenization)|(?:image_processing)_auto_fast.pymodelsr   zconfiguration_auto.pyz
        ("z", "z
Config"),
zOCONFIG_MAPPING_NAMES = OrderedDict[str, str](
    [
        # Add configs here
rc   rd   z"),
zcMODEL_NAMES_MAPPING = OrderedDict[str, str](
    [
        # Add full (and cased) model names here
_fast.py.pyz( {8,12}\(\s*"z",.*?\),\n)(?: {4,12}\(|\]))joinrT   rm   rK   rX   researchr(   rs   TRANSFORMERS_PATHrk   rl   findallDOTALL)rt   ru   rv   rw   new_cased_nameold_cased_namecorrected_filenames_to_addfiler   previous_fileprevious_to_addr   ro   matching_linesmatchr   s                  @r"   add_model_to_auto_mappingsr      s   ( WW``0B0J0J3PS0T0T0Z0Z[^0_0_`````N(7$3N   WghihjhjWk   "$( > >f9JDQQ 	>-G-K*M?.;_=VPV-W&r**&--tVn==== H$v-0GGT!3TTTTTf   
 H$v-0GGT!3TT9MTTTz    7  & 	''
E::H'(2V;hFGG  1vvxx                               ZU$6UUUW[]_]f N (  #%069HD %.@BT U U ] ]&! ! $     s   E""E&	)E&	new_paper_namer   c                 4   d}t          j        ddt                                        dd          |z   }t	          j        d|  d|  d          }g }|D ](}d	| d
| }d|v r|dz  }|                    |           )d                    |          }||z   |z   S )a4  
    Create a new doc file to fill for the new model.

    Args:
        new_paper_name (`str`):
            The fully cased name (as in the official paper name) of the new model.
        public_classes (`list[str]`):
            A list of all the public classes that the model will have in the library.
    u   

⚠️ Note that this file is in Markdown but contain specific syntax for our doc-builder (similar to MDX) that may not be rendered properly in your Markdown viewer.

-->

z# ?rQ   zcoding=utf-8
z<!--z
        # z#

        ## Overview

        The a<   model was proposed in [<INSERT PAPER NAME HERE>](<INSERT PAPER LINK HERE>) by <INSERT AUTHORS HERE>.
        <INSERT SHORT SUMMARY HERE>

        The abstract from the paper is the following:

        <INSERT PAPER ABSTRACT HERE>

        Tips:

        <INSERT TIPS ABOUT MODEL HERE>

        This model was contributed by [INSERT YOUR HF USERNAME HERE](https://huggingface.co/<INSERT YOUR HF USERNAME HERE>).
        The original code can be found [here](<INSERT LINK TO GITHUB REPO HERE>).

        ## Usage examples

        <INSERT SOME NICE EXAMPLES HERE>

        z## z

[[autodoc]] Modelz
    - forward

)r   sub	COPYRIGHTrT   textwrapdedentr(   r   )	r   r   
added_notecopyright_for_markdowndoc_templatedoc_for_classesclass_doc	class_docs	            r"   create_doc_filer      s    	K   VFB	::BBCSU[\\_ii?		 	
 	 	 	 L8 O  $ $4F44F44f$$Cs####O,,I!L09<<r$   r   c                 T   t           dz  dz  dz  dz  }t          |d          5 }|                                }ddd           n# 1 swxY w Y   t          j        d|  d|                              d	          }d
| d| d}t          t           dz  dz  dz  dz  ||           dS )a  
    Insert the new model in the doc `_toctree.yaml`, in the same section as the old model.

    Args:
        old_lowercase_name (`str`):
            The old lowercase model name.
        new_lowercase_name (`str`):
            The old lowercase model name.
        new_model_paper_name (`str`):
            The fully cased name (as in the official paper name) of the new model.
    docssourceenz_toctree.ymlrf   Nz- local: model_doc/z\n {8}title: .*?\nr   z      - local: model_doc/z
        title: 
r   )	REPO_PATHrk   rl   r   r   grouprs   )r   ru   rv   toc_filero   contentold_model_tocnew_tocs           r"   insert_model_in_doc_tocr     s    6!H,t3nDH	h		 &&((               I]5G]]]_fggmmnoppMg*<ggOcgggGFX%,~=7^k     s   AA	A	c                       fd|D             }d                     d |D                       }t          t          j        d| d          z   }|S )a/  
    Create the `__init__.py` file to add in the new model folder.

    Args:
        old_lowercase_name (`str`):
            The old lowercase model name.
        new_lowercase_name (`str`):
            The new lowercase model name.
        filenames_to_add (`list[tuple[str, bool]]`):
            A list of tuples of all potential filenames to add for a new model, along a boolean flag describing if we
            should add this file or not. For example, [(`modeling_xxx.px`, True), (`configuration_xxx.py`, True), (`tokenization_xxx.py`, False),...]
    c                 n    g | ]1\  }}|                                                    d d          |f2S )r   rQ   r   r6   r   r   ru   r   s      r"   r8   z$create_init_file.<locals>.<listcomp>5  sV       Hf 
		,.@	A	A	I	I%QS	T	TV\]  r$   
            c              3   ,   K   | ]\  }}|d | dV  dS )zfrom .z	 import *Nr5   )r6   r   r   s      r"   r   z#create_init_file.<locals>.<genexpr>9  s8      #l#lvek#l$<T$<$<$<#l#l#l#l#l#lr$   z
        from typing import TYPE_CHECKING

        from ...utils import _LazyModule
        from ...utils.import_utils import define_import_structure


        if TYPE_CHECKING:
            z
        else:
            import sys

            _file = globals()["__file__"]
            sys.modules[__name__] = _LazyModule(__name__, _file, define_import_structure(_file), module_spec=__spec__)
        )r   r   r   r   )r   ru   rw   imports	init_files   ``   r"   create_init_filer   (  s         0   ###l#lQa#l#l#lllGHO	 	 	 	  I" r$   module_namer&   c                    t          | dd          5 }|                                }ddd           n# 1 swxY w Y   t          j        |          }t	                      }|                    |           |j        |j        fS )z
    Find the name of all classes defined in `module_name`, including public ones (defined in `__all__`).

    Args:
        module_name (`str`):
            The full path to the python module from which to extract classes.
    rf   rg   rh   N)rk   rl   rG   parse_moduler   visitr   r   )r   r   source_codemodulevisitors        r"   find_all_classes_from_filer   N  s     
k3	1	1	1 "Tiikk" " " " " " " " " " " " " " "k**FmmG
LL?G222s   488r   c                 Z   t          |           \  }}d                    | j        dd                                       dd          }|j        d| dd                    d	 |D                        }d
                    fd|D                       }fd|D             }|||fS )a  
    Extract the modular structure that will be needed to copy a file `module_name` using modular.

    Args:
        module_name (`str`):
            The full path to the python module to copy with modular.
        old_model_infos (`ModelInfos`):
            The structure containing the class information of the old model.
        new_cased_name (`str`):
            The new cased model name.
    .Nr   rQ   zfrom ..z import z, c              3      K   | ]}|V  d S rz   r5   )r6   r   s     r"   r   z)find_modular_structure.<locals>.<genexpr>o  s"      :\:\f6:\:\:\:\:\:\r$   r   c              3   R   K   | ]!}d |                                d| dV  "dS )zclass (z):
    passNr   r6   r   r   r   s     r"   r   z)find_modular_structure.<locals>.<genexpr>p  sV       " "[aV??VV&VVV" " " " " "r$   c                 <    g | ]}|                               S r5   r   r   s     r"   r8   z*find_modular_structure.<locals>.<listcomp>s  s'    bbbfnn^^DDbbbr$   )r   r   partsrT   rX   )	r   rt   r   all_classesr   import_locationr   modular_classesr   s	     `     @r"   find_modular_structurer   ^  s     #=["I"IKhh{0566>>ubIIO$3N^^^:\:\P[:\:\:\1\1\^^Gkk " " " " "ep" " "  O cbbbbSabbbNO^33r$   c                    d                     d |                    dd                              d          D                       }| j        }t          dz  |z  }d}d}g }|D ]D\  }	}
|
r=t          ||	z  | |          \  }}}|d| z  }|d| z  }|                    |           Ed                     d	 |D                       }t          j        d
| d          }t          |z   |z   |z   }d |D             }||fS )a  
    Create a new modular file which will copy the old model, based on the new name and the different filenames
    (modules) to add.

    Args:
        old_model_infos (`ModelInfos`):
            The structure containing the class information of the old model.
        new_lowercase_name (`str`):
            The new lowercase model name.
        filenames_to_add (`list[tuple[str, bool]]`):
            A list of tuples of all potential filenames to add for a new model, along a boolean flag describing if we
            should add this file or not. For example, [(`modeling_xxx.px`, True), (`configuration_xxx.py`, True), (`tokenization_xxx.py`, False),...]
    rQ   c              3   >   K   | ]}|                                 V  d S rz   r{   r}   s     r"   r   z&create_modular_file.<locals>.<genexpr>  r   r$   rO   rN   r   r   r   r   c              3       K   | ]	}| d V  
dS ),Nr5   r6   public_classs     r"   r   z&create_modular_file.<locals>.<genexpr>  s+      4o4oL5G5G5G4o4o4o4o4o4or$   z"

        __all__ = [
            z
        ]
        c                 :    g | ]}|                     d d          S )"rQ   r   r   s     r"   r8   z'create_modular_file.<locals>.<listcomp>  s(    ___L,..sB77___r$   )
r   rT   rm   rK   r   r   extendr   r   r   )rt   ru   rw   r   r   old_folder_rootall_imports
all_bodiesall_public_classesr   r   r   r2   r   public_classes_formattedall_statementmodular_files                    r"   create_modular_filer   w  sl   $ WW``0B0J0J3PS0T0T0Z0Z[^0_0_`````N(7'(25GGO KJ, 6 6& 	6,B(*O^- -)GT> >>>)K---'J%%n555  0444o4o\n4o4o4oooO	 &	 	 	 M {*Z7-GL__L^___+++r$   c                    d                     d                     dd                              d          D                       }| j        | j        }fd|dd         D             }g }|D ]J\  }}t          j        d d	|          r|d
         \  }}	||	p|f|d
<   3|                    ||f           Ki }
|D ]\  }}|r
|                              }t          dz  dz  z  |z  }|	                                sGt          |d          5 }|                                }ddd           n# 1 swxY w Y   |                    d          }d}||                             d          r |dz  }||                             d           t          d                     ||d                   z   }|                    ||          |
|<   |
S )a  
    Create the test files for the new model. It basically copies over the old test files and adjust the class names.

    Args:
        old_model_infos (`ModelInfos`):
            The structure containing the class information of the old model.
        new_lowercase_name (`str`):
            The new lowercase model name.
        filenames_to_add (`list[tuple[str, bool]]`):
            A list of tuples of all potential filenames to add for a new model, along a boolean flag describing if we
            should add this file or not. For example, [(`modeling_xxx.px`, True), (`configuration_xxx.py`, True), (`tokenization_xxx.py`, False),...]
    rQ   c              3   >   K   | ]}|                                 V  d S rz   r{   r}   s     r"   r   z$create_test_files.<locals>.<genexpr>  r   r$   rO   rN   c                 L    g | ] \  }}d |                               z   |f!S )test_r   r   s      r"   r8   z%create_test_files.<locals>.<listcomp>  sI       Hf 
8##$68JKK	KVT  r$   r   Nz+test_(?:tokenization)|(?:image_processing)_r   r   testsr   rf   r   r   #)r   rT   rm   rK   rX   r   r   r(   r   is_filerk   rl   
startswithr   )rt   ru   rw   r   r   r   r   r   r   r   
test_filesnew_fileoriginal_test_fileoriginal_test_pathro   	test_code
test_linesidxr   s    `                @r"   create_test_filesr     s    WW``0B0J0J3PS0T0T0Z0Z[^0_0_`````N(7$3N     0 4  
 "$( > >f9`DV```bfgg 	>-G-K*M?.;_=VPV-W&r**&--tVn====J6 U U& 	U!)!1!12DFX!Y!Y!*W!4x!?BT!TWi!i%--// (#.. %!FFHH	% % % % % % % % % % % % % % % #..JCS/,,S11 q S/,,S11 !DIIj.>$?$??I#,#4#4^^#T#TJx s   D99D=	 D=	create_fast_image_processorc                    t                      st          d          | j        }t          dz  |z  }t	          j        |d           t          | ||          \  }}t          |d| dz  d          5 }	|	                    |           ddd           n# 1 swxY w Y   t          |||          }
t          |d	z  d          5 }	|	                    |
           ddd           n# 1 swxY w Y   t          t          dz  d	z  d
| dd           t          | |||           t          dz  dz  |z  }t	          j        |d           t          |d	z  d          5  	 ddd           n# 1 swxY w Y   t          | ||          }|                                D ]E\  }}t          ||z  d          5 }	|	                    |           ddd           n# 1 swxY w Y   Ft          ||          }t          t          dz  dz  dz  dz  | dz  d          5 }	|	                    |           ddd           n# 1 swxY w Y   t!          |||           |rt#          |           t          dz  d	z  }t%          j        dd|||dgt          t$          j                   t%          j        dd|||gt          t$          j                   t%          j        g dt          t$          j                   t%          j        ddgt          t$          j                   t%          j        dd|gt          t$          j                   dS )a{  
    Creates a new model module like a given model of the Transformers library.

    Args:
        old_model_infos (`ModelInfos`):
            The structure containing the class information of the old model.
        new_lowercase_name (`str`):
            The new lowercase model name.
        new_model_paper_name (`str`):
            The fully cased name (as in the official paper name) of the new model.
        filenames_to_add (`list[tuple[str, bool]]`):
            A list of tuples of all potential filenames to add for a new model, along a boolean flag describing if we
            should add this file or not. For example, [(`modeling_xxx.px`, True), (`configuration_xxx.py`, True), (`tokenization_xxx.py`, False),...]
        create_fast_image_processor (`bool`):
            If it makes sense, whether to add a fast processor as well, even if the old model does not have one.
    zHYou need to install `libcst` to run this command -> `pip install libcst`r   T)exist_okmodular_r   rj   Nz__init__.pyz
    from .z
 import *
zif TYPE_CHECKING:
r   r   r   r   r   	model_docz.md)
model_nameruffcheckz--fix)cwdstdoutformat)pythonzutils/check_doc_toc.pyz--fix_and_overwriter   zutils/sort_auto_mappings.pyz utils/modular_model_converter.py)r   rU   rK   r   osmakedirsr   rk   rn   r   rs   r   r   r   itemsr   r   r   
subprocessrunDEVNULL)rt   ru   rv   rw   r   r   new_module_folderr   r   ro   r   tests_folderr   r   r   doc_filemodel_init_files                    r"   create_new_model_liker    s   0    ecddd(7 *H47IIK!D1111 $7HZ\l#m#m L.	"D-?"D"D"DDc	J	J a	               !!35GIYZZI	-/	5	5 		               H$}4@!3@@@'    0BDXZjkkk w&14FFLKt,,,,	l]*C	0	0                "?4FHXYYJ'--//  ',)3// 	1GGG	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 3^DDH	i& 8+d2[@FXC]C]C]]_b	c	c gh	              .0BDXYYY # @ ,>???? ((2]BON	+\?GT!   
 N	,lOL!   
 NCCC[e[m    NH;<)T^Tfgggg N	57IJPYblbt     sZ   3BBBC&&C*-C*E++E/2E/3GG	G	H::H>H>questiondefault_value
convert_tofallback_messagec                    |                      d          s| dz   } ||  d| d} d}|s^t          |           }|t          |          dk    r|}|!	  ||          }d}n# t          $ r d}Y nw xY wd}|st	          |           |^|S )a4  
    A utility function that asks a question to the user to get an answer, potentially looping until it gets a valid
    answer.

    Args:
        question (`str`):
            The question to ask the user.
        default_value (`str`, *optional*):
            A potential default value that will be used when the answer is empty.
        convert_to (`Callable`, *optional*):
            If set, the answer will be passed to this function. If this function raises an error on the provided
            answer, the question will be asked again.
        fallback_message (`str`, *optional*):
            A message that will be displayed each time the question is asked again to the user.

    Returns:
        `Any`: The answer provided by the user (or the default), passed through the potential conversion function.
    rM   Nz [z] Fr   T)endswithinputlen	Exceptionprint)r  r  r  r  valid_answeranswers         r"   get_user_fieldr  >  s    0 S!! "c> 33-333L $x$V)9)9"F!%#F++# % % %$%  L 	$"###  $  Ms   A   A/.A/r~   c                     |                                  dv rdS |                                  dv rdS t          |  d          )z&
    Converts a string to a bool.
    )1yyestrueT)0nnofalseFz0 is not a value that can be converted to a bool.)rS   rU   )r~   s    r"   convert_to_boolr"  o  sM     	wwyy---twwyy---u
KKK
L
LLr$   c                     t          t          j                              } d}|st          d          }|| v rd}nut	          | d           t          j        ||           }t          |          dk    r;t          |          dk    rd                    |          }t	          d| d           |t          |          }t          d	          }t          d
d                    d |                    d          D                                 }d}d}d}	d}
d}d}d}|j        t          d| dt          d          }|j        t          d| dt          d          }|j        t          d| dt          d          }	|j        t          d| dt          d          }
|j        t          d| dt          d          }|j        t          d| dt          d          }|j        t          d| dt          d          }|j        }d| ddfd| ddfd| d|fd| d|fd| d|	fd| d|
fd | d|fd!| d|fd"| d|ff	}d}|	r|
st          d#t          d$d%&          }|||||fS )'zE
    Ask the user for the necessary inputs to add the new model.
    FzWWhat model would you like to duplicate? Please provide it as lowercase, e.g. `llama`): Tz is not a valid model type.r   z or zDid you mean ?zSWhat is the new model name? Please provide it as snake lowercase, e.g. `new_model`?zUWhat is the fully cased name you would like to appear in the doc (e.g. `NeW ModEl`)? rQ   c              3   >   K   | ]}|                                 V  d S rz   r{   r}   s     r"   r   z!get_user_input.<locals>.<genexpr>  s*      OOAaggiiOOOOOOr$   rN   )r  NzHDo you want to create a new tokenizer? If `no`, it will use the same as z (y/n)?z.Please answer yes/no, y/n, true/false or 1/0. )r  r  zMDo you want to create a new fast tokenizer? If `no`, it will use the same as zNDo you want to create a new image processor? If `no`, it will use the same as zSDo you want to create a new fast image processor? If `no`, it will use the same as zNDo you want to create a new video processor? If `no`, it will use the same as zPDo you want to create a new feature extractor? If `no`, it will use the same as zHDo you want to create a new processor? If `no`, it will use the same as configuration_r   	modeling_tokenization_r   image_processing_video_processing_feature_extraction_processing_zA fast image processor can be created from the slow one, but modifications might be needed. Should we add a fast image processor class for this model (recommended) (y/n)? r  z-Please answer yes/no, y/n, true/false or 1/0.)r  r  r  )listr   keysr  r  difflibget_close_matchesr  r   rJ   r  rm   rY   r"  rZ   r\   r]   r^   r_   r`   rK   )model_typesvalid_model_typeold_model_typenear_choicesrt   ru   rv   add_tokenizeradd_fast_tokenizeradd_image_processorr   add_video_processoradd_feature_extractoradd_processorr   rw   r   s                    r"   get_user_inputr;  z  s    */1122K  7e
 
 [((#^@@@AAA"4^[QQL<  A%%|$$q((#);;|#<#<L5l555666  7 !00O (]  *_ggOO1C1I1I#1N1NOOOOO   M$!M&2&nWennn&M
 
 

 +7+s\jsss&M
 
 

 ,8,t]kttt&M
 
 

 1=#1ybpyyy&M$
 $
 $
 
 ,8,t]kttt&M
 
 

 .: .v_mvvv&M!
 !
 !

 &2&nWennn&M
 
 
 )7 
2,	1	1	148	,'	,	,	,d3	0+	0	0	0-@	5+	5	5	57IJ	4/	4	4	46IJ	9/	9	9	9;ST	4/	4	4	46IJ	61	6	6	68MN	.)	.	.	.>
 #( 
#; 
&4^&L'
 '
 '
# .0DFVXsssr$   argsc                 ,    t          | j                  S )N)path_to_repo)AddNewModelLikeCommandr>  )r<  s    r"   "add_new_model_like_command_factoryr@    s    !t/@AAAAr$   c                   8    e Zd Zedefd            ZddZd ZdS )r?  parserc                     |                      d          }|                    dt          d           |                    t                     d S )Nzadd-new-model-likez--path_to_repozFWhen not using an editable install, the path to the Transformers repo.)typehelp)func)
add_parseradd_argumentra   set_defaultsr@  )rB  add_new_model_like_parsers     r"   register_subcommandz*AddNewModelLikeCommand.register_subcommand  s\    $*$5$56J$K$K!!..3-u 	/ 	
 	
 	
 	"..4V.WWWWWr$   Nc                 n    t                      \  | _        | _        | _        | _        | _        || _        d S rz   )r;  rt   ru   rv   rw   r   r>  )r!   r>  kwargss      r"   r#   zAddNewModelLikeCommand.__init__  s>     	
 #%!,(r$   c                     | j         !t          | j                   at          dz  dz  at	          | j        | j        | j        | j        | j	                   d S )Nsrctransformers)rt   ru   rv   rw   r   )
r>  r   r   r   r  rt   ru   rv   rw   r   r    s    r"   r  zAddNewModelLikeCommand.run   sl    (
 T.//I )E 1N B 0#6!%!:!2(,(H	
 	
 	
 	
 	
 	
r$   rz   )rC   rD   rE   staticmethodr   rK  r#   r  r5   r$   r"   r?  r?    sa        XN X X X \X) ) ) )
 
 
 
 
r$   r?  )NNN)Hr/  r  r   r  r   argparser   r   datetimer   pathlibr   typingr   r   r	   r
   models.auto.configuration_autor   r   #models.auto.feature_extraction_autor   !models.auto.image_processing_autor   models.auto.processing_autor   models.auto.tokenization_autor   !models.auto.video_processing_autor   utilsr   rQ   r   r   libcstrG   r   r   r9   r   todayyearCURRENT_YEAR__file__parentr   r   lstripr   rJ   ra   PathLikers   r-  tupleboolr   r   r   r   setr   r   r   r   r  r  r"  r;  r@  r?  r5   r$   r"   <module>rh     s|    				 				      . . . . . . . .             1 1 1 1 1 1 1 1 1 1 1 1 V V V V V V V V Q Q Q Q Q Q M M M M M M A A A A A A C C C C C C M M M M M M ' ' ' ' ' ' ( ( ( ( ( ( > > > > > >
   X!!!!!!$$$$$$X X X X Xj X X X< tz|| DNN)0 $+	   FHH 
$V V V V V V V VD5bk)9#:  Y\    ,@@@ @ 5d+,	@ @ @ @F5=C 5=c 5= 5= 5= 5=p  dg    .# ## #Y]^cdgimdm^nYo # # # #L3C 3C 3 3 3 3 44'14CF4
3T>4 4 4 421,1,1, 5d+,1, 		1, 1, 1, 1,h/z /Y]^cdgimdm^nYo / / / /d^^^ ^ 5d+,	^
 "&^ ^ ^ ^F $(%)&*	. ..C=. ". sm	.
 	. . . .bMs Mt M M M Mlt lt lt^BY B B B B"
 "
 "
 "
 "
7 "
 "
 "
 "
 "
r$   