wL i1ddlZddlZddlmZddlmZmZmZmZm Z m Z ddl Z ddl Z ddl mZddlmZddlmZmZmZmZmZmZmZddlmZmZmZdd lmZdd lm Z dd l!m"Z"m#Z#m$Z$e#jJe&Z'ee(jRd z d z Z*ee(jRd z dz Z+ejXdZ-GddZ.Gdde.Z/Gdde.Z0Gdde.Z1de2dedfdZ3de e2efdeefdZ4de e2efdeddfdZ5dd ddddd!d"e2d#e2d$e2d%e2d&e2d'ed(e2d)e2d*ee2d+e6d,ee2d-ee2d.ee2d/ee2defd0Z7e$dd ddddd dd1d2e2d3ed4ee2d5e6d6ee2d7ee2d8ee2d9ee2d:e6d;ee2de2fd<Z8y)=N)Path)AnyDictLiteralOptionalTypeUnion)hf_hub_download) upload_file)CardDataDatasetCardData EvalResult ModelCardData SpaceCardDataeval_results_to_model_indexmodel_index_to_eval_results) get_sessionis_jinja_available yaml_dump) constants)EntryNotFoundError)SoftTemporaryDirectoryloggingvalidate_hf_hub_args templateszmodelcard_template.mdzdatasetcard_template.mdz1^(\s*---[\r\n]+)([\S\s]*?)([\r\n]+---(\r\n|\n|$))cfeZdZeZeZdZddede fdZ e dZ e jdefdZ dZdeeeffd Ze dd eeefd eed eede fdZdd eefdZ dded eed eedeedeedeedee deefdZe ddedeedeefdZy ) RepoCardmodelcontentignore_metadata_errorsc ||_||_y)aInitialize a RepoCard from string content. The content should be a Markdown file with a YAML block at the beginning and a Markdown body. Args: content (`str`): The content of the Markdown file. Example: ```python >>> from huggingface_hub.repocard import RepoCard >>> text = ''' ... --- ... language: en ... license: mit ... --- ... ... # My repo ... ''' >>> card = RepoCard(text) >>> card.data.to_dict() {'language': 'en', 'license': 'mit'} >>> card.text '\n# My repo\n' ``` > [!TIP] > Raises the following error: > > - [`ValueError`](https://docs.python.org/3/library/exceptions.html#ValueError) > when the content of the repo card metadata is not a dictionary. N)r!r )selfr r!s ^/mnt/ssd/data/python-lab/Trading/venv/lib/python3.12/site-packages/huggingface_hub/repocard.py__init__zRepoCard.__init__+sD'=# ct|jxsd}d||jj||j|d||j S)zLThe content of the RepoCard, including the YAML block and the Markdown body. ---) line_breakoriginal_order)_detect_line_ending_contentdatato_yaml_original_ordertext)r#r*s r$r zRepoCard.contentPs})7?4 ZL!2!2jY]YmYm!2!n opzo{{~@JKLPLULUKVW Wr&c||_tj|}|r]|jd}||j d|_t j|}|i}t|ts)tdtjdi}||_|jdi|d|ji|_t!|j#|_y)z Set the content of the RepoCard.N)repo card metadata block should be a dictzBRepo card metadata block was not found. Setting CardData to empty.r!)r-REGEX_YAML_BLOCKsearchgroupendr1yaml safe_load isinstancedict ValueErrorloggerwarningcard_data_classr!r.listkeysr0)r#r match yaml_block data_dicts r$r zRepoCard.contentVs   ''0 QJ .DIz2I  i. !LMM NN_ `IDI(D((i9iTMhMhi #INN$45r&c|jSN)r )r#s r$__str__zRepoCard.__str__qs ||r&filepathct|}|jjddt|ddd5}|j t |dddy#1swYyxYw)a{Save a RepoCard to a file. Args: filepath (`Union[Path, str]`): Filepath to the markdown file to save. Example: ```python >>> from huggingface_hub.repocard import RepoCard >>> card = RepoCard("---\nlanguage: en\n---\n# This is a test repo card") >>> card.save("/tmp/test.md") ``` T)parentsexist_okwutf-8modenewlineencodingN)rparentmkdiropenwritestr)r#rJfs r$savez RepoCard.savetsY>dT: (b7 C q GGCI    s AA%Nrepo_id_or_path repo_typetokencxt|jr t|}nTt|tr5tt |t j |xs |j|}ntd|d|jddd5}||j|cd d d S#1swYy xYw) aInitialize a RepoCard from a Hugging Face Hub repo's README.md or a local filepath. Args: repo_id_or_path (`Union[str, Path]`): The repo ID associated with a Hugging Face Hub repo or a local filepath. repo_type (`str`, *optional*): The type of Hugging Face repo to push to. Defaults to None, which will use use "model". Other options are "dataset" and "space". Not used when loading from a local filepath. If this is called from a child class, the default value will be the child class's `repo_type`. token (`str`, *optional*): Authentication token, obtained with `huggingface_hub.HfApi.login` method. Will default to the stored token. ignore_metadata_errors (`str`): If True, errors while parsing the metadata section will be ignored. Some information might be lost during the process. Use it at your own risk. Returns: [`huggingface_hub.repocard.RepoCard`]: The RepoCard (or subclass) initialized from the repo's README.md file or filepath. Example: ```python >>> from huggingface_hub.repocard import RepoCard >>> card = RepoCard.load("nateraw/food") >>> assert card.data.tags == ["generated_from_trainer", "image-classification", "pytorch"] ``` )r]r^z.Cannot load RepoCard: path not found on disk (z).rrOrPrQ)r!N) ris_filer<rYr r REPOCARD_NAMEr]r>rWread)clsr\r]r^r! card_pathrZs r$loadz RepoCard.loadsH  ( ( *_-I  -#++'83== IMoM^^`ab b^^b7^ C Pqqvvx8NO P P Ps B00B9c8|xs |j}|t|d}ddi} tjd||}|j y#t j j$r+}jdk(rt|j|d}~wwxYw)aValidates card against Hugging Face Hub's card validation logic. Using this function requires access to the internet, so it is only called internally by [`huggingface_hub.repocard.RepoCard.push_to_hub`]. Args: repo_type (`str`, *optional*, defaults to "model"): The type of Hugging Face repo to push to. Options are "model", "dataset", and "space". If this function is called from a child class, the default will be the child class's `repo_type`. > [!TIP] > Raises the following errors: > > - [`ValueError`](https://docs.python.org/3/library/exceptions.html#ValueError) > if the card fails validation checks. > - [`HTTPError`](https://requests.readthedocs.io/en/latest/api/#requests.HTTPError) > if the request to the Hub API fails for any other reason. )repoTyper Acceptz text/plainz(https://huggingface.co/api/validate-yaml)headersiN) r]rYrpostraise_for_statusrequests exceptions HTTPError status_coder>r1)r#r]bodyrjr`excs r$validatezRepoCard.validates(/ "4y \*  ""#Mt]d"eA   "",, }}# ((  s,AB.&BBrepo_idcommit_messagecommit_descriptionrevision create_pr parent_commitc R|xs |j}|j|t5} t| tj z } | j t|dtt| tj |||||||| } ddd| S#1swY SxYw)aAPush a RepoCard to a Hugging Face Hub repo. Args: repo_id (`str`): The repo ID of the Hugging Face Hub repo to push to. Example: "nateraw/food". token (`str`, *optional*): Authentication token, obtained with `huggingface_hub.HfApi.login` method. Will default to the stored token. repo_type (`str`, *optional*, defaults to "model"): The type of Hugging Face repo to push to. Options are "model", "dataset", and "space". If this function is called by a child class, it will default to the child class's `repo_type`. commit_message (`str`, *optional*): The summary / title / first line of the generated commit. commit_description (`str`, *optional*) The description of the generated commit. revision (`str`, *optional*): The git revision to commit from. Defaults to the head of the `"main"` branch. create_pr (`bool`, *optional*): Whether or not to create a Pull Request with this commit. Defaults to `False`. parent_commit (`str`, *optional*): The OID / SHA of the parent commit, as a hexadecimal string. Shorthands (7 first characters) are also supported. If specified and `create_pr` is `False`, the commit will fail if `revision` does not point to `parent_commit`. If specified and `create_pr` is `True`, the pull request will be created from `parent_commit`. Specifying `parent_commit` ensures the repo has not changed before committing the changes, and can be especially useful if the repo is updated / committed to concurrently. Returns: `str`: URL of the commit which updated the card metadata. )r]rP)rT) path_or_fileobj path_in_reportr^r]rurvrxrwryN) r]rsrrrrb write_textrYr ) r#rtr^r]rurvrwrxrytmpdirtmp_pathurls r$ push_to_hubzRepoCard.push_to_hubsR/  * # % F|i&=&==H   D G  < #H &44#-#5#!+ C    s A%BB& card_data template_path template_strc trddl}n td|jj }|j ||t |j}|#t |jj}|j|}|jdd|ji|}||S)a'Initialize a RepoCard from a template. By default, it uses the default template. Templates are Jinja2 templates that can be customized by passing keyword arguments. Args: card_data (`huggingface_hub.CardData`): A huggingface_hub.CardData instance containing the metadata you want to include in the YAML header of the repo card on the Hugging Face Hub. template_path (`str`, *optional*): A path to a markdown file with optional Jinja template variables that can be filled in with `template_kwargs`. Defaults to the default template. Returns: [`huggingface_hub.repocard.RepoCard`]: A RepoCard instance with the specified card data and content from the template. rNzjUsing RepoCard.from_template requires Jinja2 to be installed. Please install it with `pip install Jinja2`.rr5) rjinja2 ImportErrorto_dictcopyupdater read_textdefault_template_pathTemplaterenderr/) rdrrrtemplate_kwargsrkwargstemplater s r$ from_templatezRepoCard.from_template"s0   9  ""$))+ o&  $ .88:L   9 9:DDFL??<0!(//JI,=,=,?J6J7|r&)F)NNFrH)NNNNNNNNN)__name__ __module__ __qualname__r rATEMPLATE_MODELCARD_PATHrr]rYboolr%propertyr setterrIr rr[ classmethodrrfrsrrr5r&r$rr&sO3I##T#JWW  ^^6s664U49-($(#', 3PsDy)3PC=3P} 3P !% 3P3Pj#(3-#P $#'(,,0"&$('+==}=C= = ! = %SM =3-=D>= }=~(,&* (( }(sm ((r&rc TeZdZeZeZdZe ddede e de e ffd Z xZ S) ModelCardrrrrc (t||||fi|S)a Initialize a ModelCard from a template. By default, it uses the default template, which can be found here: https://github.com/huggingface/huggingface_hub/blob/main/src/huggingface_hub/templates/modelcard_template.md Templates are Jinja2 templates that can be customized by passing keyword arguments. Args: card_data (`huggingface_hub.ModelCardData`): A huggingface_hub.ModelCardData instance containing the metadata you want to include in the YAML header of the model card on the Hugging Face Hub. template_path (`str`, *optional*): A path to a markdown file with optional Jinja template variables that can be filled in with `template_kwargs`. Defaults to the default template. Returns: [`huggingface_hub.ModelCard`]: A ModelCard instance with the specified card data and content from the template. Example: ```python >>> from huggingface_hub import ModelCard, ModelCardData, EvalResult >>> # Using the Default Template >>> card_data = ModelCardData( ... language='en', ... license='mit', ... library_name='timm', ... tags=['image-classification', 'resnet'], ... datasets=['beans'], ... metrics=['accuracy'], ... ) >>> card = ModelCard.from_template( ... card_data, ... model_description='This model does x + y...' ... ) >>> # Including Evaluation Results >>> card_data = ModelCardData( ... language='en', ... tags=['image-classification', 'resnet'], ... eval_results=[ ... EvalResult( ... task_type='image-classification', ... dataset_type='beans', ... dataset_name='Beans', ... metric_type='accuracy', ... metric_value=0.9, ... ), ... ], ... model_name='my-cool-model', ... ) >>> card = ModelCard.from_template(card_data) >>> # Using a Custom Template >>> card_data = ModelCardData( ... language='en', ... tags=['image-classification', 'resnet'] ... ) >>> card = ModelCard.from_template( ... card_data=card_data, ... template_path='./src/huggingface_hub/templates/modelcard_template.md', ... custom_template_var='custom value', # will be replaced in template if it exists ... ) ``` superrrdrrrr __class__s r$rzModelCard.from_templateSsRw$Y |___r&r) rrrrrArrr]rrrYr __classcell__rs@r$rrNs[#O3I(,&* H` H` }H`sm H`H`r&rc TeZdZeZeZdZe ddede e de e ffd Z xZ S) DatasetCarddatasetrrrc (t||||fi|S)aInitialize a DatasetCard from a template. By default, it uses the default template, which can be found here: https://github.com/huggingface/huggingface_hub/blob/main/src/huggingface_hub/templates/datasetcard_template.md Templates are Jinja2 templates that can be customized by passing keyword arguments. Args: card_data (`huggingface_hub.DatasetCardData`): A huggingface_hub.DatasetCardData instance containing the metadata you want to include in the YAML header of the dataset card on the Hugging Face Hub. template_path (`str`, *optional*): A path to a markdown file with optional Jinja template variables that can be filled in with `template_kwargs`. Defaults to the default template. Returns: [`huggingface_hub.DatasetCard`]: A DatasetCard instance with the specified card data and content from the template. Example: ```python >>> from huggingface_hub import DatasetCard, DatasetCardData >>> # Using the Default Template >>> card_data = DatasetCardData( ... language='en', ... license='mit', ... annotations_creators='crowdsourced', ... task_categories=['text-classification'], ... task_ids=['sentiment-classification', 'text-scoring'], ... multilinguality='monolingual', ... pretty_name='My Text Classification Dataset', ... ) >>> card = DatasetCard.from_template( ... card_data, ... pretty_name=card_data.pretty_name, ... ) >>> # Using a Custom Template >>> card_data = DatasetCardData( ... language='en', ... license='mit', ... ) >>> card = DatasetCard.from_template( ... card_data=card_data, ... template_path='./src/huggingface_hub/templates/datasetcard_template.md', ... custom_template_var='custom value', # will be replaced in template if it exists ... ) ``` rrs r$rzDatasetCard.from_templatesrw$Y |___r&r) rrrr rATEMPLATE_DATASETCARD_PATHrr]rrrYrrrs@r$rrsV%O5I(,&* 8`"8` }8`sm 8`8`r&rceZdZeZeZdZy) SpaceCardspaceN)rrrrrArrr]r5r&r$rrs#O3Ir&rr return) r( Nc|jd}|jd}|jd}||zdk(ry||k(r||k(ry||kDryy)zDetect the line ending of a string. Used by RepoCard to avoid making huge diff on newlines. Uses same implementation as in Hub server, keep it in sync. Returns: str: The detected line ending of the string. rr(rrN)count)r crlfcrlfs r$r,r,sY t B t B == D Bw!| rzdbj Bwr& local_pathct|j}tj|}|rE|j d}t j |}|t|tr|Stdy)Nr3r4) rrr6r7r8r:r;r<r=r>)rr rDrEr.s r$ metadata_loadrse:((*G  # #G ,E [[^ ~~j) <:dD1KDEEr&r.cd}d}tjj|rxt|ddd5}|j }t |j tr|j d}n&t |j tr |j }dddt|ddd5}t|d | }tj|}|r3|d|jd ||d |z||jdz}n d ||d ||}|j||jdddy#1swYxYw#1swYyxYw) a& Save the metadata dict in the upper YAML part Trying to preserve newlines as in the existing file. Docs about open() with newline="" parameter: https://docs.python.org/3/library/functions.html?highlight=open#open Does not work with "^M" linebreaks, which are replaced by r(rOr`utf8)rSrTrNrNF) sort_keysr*r))ospathexistsrWrcr<newlinestuplerYrr6r7startr9rXclose)rr.r*r readme data_yamlrDoutputs r$ metadata_savers>JG ww~~j! *c2 ? -6kkmG&//51#__Q/ FOOS1#__  - j#rF ; vde K  ''0 _u{{}-#j\)CPZ|0\\_fglgpgpgrgt_uuF:,ykZL JF V    - -  sA!D:+BE:EEF)metrics_configmetrics_verifieddataset_config dataset_splitdataset_revisionmetrics_verification_tokenmodel_pretty_nametask_pretty_nametask_idmetrics_pretty_name metrics_id metrics_valuedataset_pretty_name dataset_idrrrrrrcNdt|t||||||||| | | | |  giS)u Creates a metadata dict with the result from a model evaluated on a dataset. Args: model_pretty_name (`str`): The name of the model in natural language. task_pretty_name (`str`): The name of a task in natural language. task_id (`str`): Example: automatic-speech-recognition. A task id. metrics_pretty_name (`str`): A name for the metric in natural language. Example: Test WER. metrics_id (`str`): Example: wer. A metric id from https://hf.co/metrics. metrics_value (`Any`): The value from the metric. Example: 20.0 or "20.0 ± 1.2". dataset_pretty_name (`str`): The name of the dataset in natural language. dataset_id (`str`): Example: common_voice. A dataset id from https://hf.co/datasets. metrics_config (`str`, *optional*): The name of the metric configuration used in `load_metric()`. Example: bleurt-large-512 in `load_metric("bleurt", "bleurt-large-512")`. metrics_verified (`bool`, *optional*, defaults to `False`): Indicates whether the metrics originate from Hugging Face's [evaluation service](https://huggingface.co/spaces/autoevaluate/model-evaluator) or not. Automatically computed by Hugging Face, do not set. dataset_config (`str`, *optional*): Example: fr. The name of the dataset configuration used in `load_dataset()`. dataset_split (`str`, *optional*): Example: test. The name of the dataset split used in `load_dataset()`. dataset_revision (`str`, *optional*): Example: 5503434ddd753f426f4b38109466949a1217c2bb. The name of the dataset dataset revision used in `load_dataset()`. metrics_verification_token (`bool`, *optional*): A JSON Web Token that is used to verify whether the metrics originate from Hugging Face's [evaluation service](https://huggingface.co/spaces/autoevaluate/model-evaluator) or not. Returns: `dict`: a metadata dict with the result from a model evaluated on a dataset. Example: ```python >>> from huggingface_hub import metadata_eval_result >>> results = metadata_eval_result( ... model_pretty_name="RoBERTa fine-tuned on ReactionGIF", ... task_pretty_name="Text Classification", ... task_id="text-classification", ... metrics_pretty_name="Accuracy", ... metrics_id="accuracy", ... metrics_value=0.2662102282047272, ... dataset_pretty_name="ReactionJPEG", ... dataset_id="julien-c/reactionjpeg", ... dataset_config="default", ... dataset_split="test", ... ) >>> results == { ... 'model-index': [ ... { ... 'name': 'RoBERTa fine-tuned on ReactionGIF', ... 'results': [ ... { ... 'task': { ... 'type': 'text-classification', ... 'name': 'Text Classification' ... }, ... 'dataset': { ... 'name': 'ReactionJPEG', ... 'type': 'julien-c/reactionjpeg', ... 'config': 'default', ... 'split': 'test' ... }, ... 'metrics': [ ... { ... 'type': 'accuracy', ... 'value': 0.2662102282047272, ... 'name': 'Accuracy', ... 'verified': False ... } ... ] ... } ... ] ... } ... ] ... } True ``` model-index) task_name task_type metric_name metric_type metric_value dataset_name dataset_type metric_configverified verify_tokenrrr) model_name eval_results)rr)rrrrrrrrrrrrrrs r$metadata_eval_resultr(sQR 2(.% 3 *!.!4!+"0-!;#1"/%5  r&)r] overwriter^rurvrwrxryrtmetadatar]rr^rurvrwrxryc |||nd}||dk(rt} n&|dk(rt} n|dk(rt} ntd| | j |||} |jD]\} } | dk(r#d | d vrt| d || d d <t| \}}| jj#|| j_ || j_ n| jj}|D]}d }|D]t}|j|s||k7r(|s&td |jd|j dd}|j"|_|j$dusd|j&|_v|r| jjj)|0| jj+| /|s-| jj+| | k7rtd| d| | j| <| j-|||||||| S#t $r-|dk(r td| j t} YwxYw)a Updates the metadata in the README.md of a repository on the Hugging Face Hub. If the README.md file doesn't exist yet, a new one is created with metadata and an the default ModelCard or DatasetCard template. For `space` repo, an error is thrown as a Space cannot exist without a `README.md` file. Args: repo_id (`str`): The name of the repository. metadata (`dict`): A dictionary containing the metadata to be updated. repo_type (`str`, *optional*): Set to `"dataset"` or `"space"` if updating to a dataset or space, `None` or `"model"` if updating to a model. Default is `None`. overwrite (`bool`, *optional*, defaults to `False`): If set to `True` an existing field can be overwritten, otherwise attempting to overwrite an existing field will cause an error. token (`str`, *optional*): The Hugging Face authentication token. commit_message (`str`, *optional*): The summary / title / first line of the generated commit. Defaults to `f"Update metadata with huggingface_hub"` commit_description (`str` *optional*) The description of the generated commit revision (`str`, *optional*): The git revision to commit from. Defaults to the head of the `"main"` branch. create_pr (`boolean`, *optional*): Whether or not to create a Pull Request from `revision` with that commit. Defaults to `False`. parent_commit (`str`, *optional*): The OID / SHA of the parent commit, as a hexadecimal string. Shorthands (7 first characters) are also supported. If specified and `create_pr` is `False`, the commit will fail if `revision` does not point to `parent_commit`. If specified and `create_pr` is `True`, the pull request will be created from `parent_commit`. Specifying `parent_commit` ensures the repo has not changed before committing the changes, and can be especially useful if the repo is updated / committed to concurrently. Returns: `str`: URL of the commit which updated the card metadata. Example: ```python >>> from huggingface_hub import metadata_update >>> metadata = {'model-index': [{'name': 'RoBERTa fine-tuned on ReactionGIF', ... 'results': [{'dataset': {'name': 'ReactionGIF', ... 'type': 'julien-c/reactiongif'}, ... 'metrics': [{'name': 'Recall', ... 'type': 'recall', ... 'value': 0.7762102282047272}], ... 'task': {'name': 'Text Classification', ... 'type': 'text-classification'}}]}]} >>> url = metadata_update("hf-internal-testing/reactiongif-roberta-card", metadata) ``` z$Update metadata with huggingface_hubrrrzUnknown repo_type: )r^r]zJCannot update metadata on a Space that doesn't contain a `README.md` file.rnamerrFz6You passed a new value for the existing metric 'name: z, type: z6'. Set `overwrite=True` to overwrite existing metrics.Tz9You passed a new value for the existing meta data field 'z7'. Set `overwrite=True` to overwrite existing metadata.)r^r]rurvrxrwry)rrrr>rfrrr itemsgetattrrr.rris_equal_except_valuerrrrrappendgetr)rtrr]rr^rurvrwrxry card_classcardkeyvaluer new_resultsexisting_results new_result result_foundexisting_results r$metadata_updatersH(6'A^GmNI0 i  g  .yk:;;4weyInn&+' U - U1X%#*4w#Ga &A%&H #J yy%%-)4 &'1 $#'99#9#9 #.BJ#(L+; W%;;OL)_rs << 9.ML&HH   H %x.//+=@WW N11K?B[[2::RSeeP N`N`b>`(>`B 1I)J* eCI. 8D> eCI.dtT%)"$(#'&*04}}} }  }  }}}}SM}}SM}C=}sm}!) }  !}@ $$((,"#'R RR} R  R C= RSMR! RsmRRC=R RRr&