Ë
    -Œ:j—¬  ã            *       ó¾  — d 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
mZ ddlmZmZmZ ddlmZ ddlZddlmZmZ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!m"Z" ddl#m$Z$m%Z%m&Z&m'Z'm(Z(m)Z)m*Z*m+Z+m,Z,m-Z-m.Z.m/Z/m0Z0m1Z1 ddl2m3Z3m4Z4  ejj                  e6«      Z7de8de8dz  de9e8e8dz  f   fd„Z:dZ;ee8 ejx                  d¬«      f   Z=ee8dz   ej|                  d¬«      f   Z?ee8dz   ej|                  d e(e«      ¬«      f   Z@eeAe8   dz   ej|                  ddd¬«      f   ZBee8dz   ej|                  d¬«      f   ZCeeD ej|                  dd d!¬«      f   ZEee8dz   ej|                  d"¬«      f   ZFeeAeG   dz   ej|                  d#d$¬«      f   ZHeeD ej|                  d%d&¬«      f   ZIeeAe8   dz   ej|                  d'd(¬«      f   ZJee8dz   ej|                  d)d*d+¬«      f   ZKeeDdz   ej|                  d,¬«      f   ZLeeDdz   ej|                  d-¬«      f   ZMee8 ejx                  d.¬«      f   ZNee8 ejx                  d/¬«      f   ZOeeAe8   dz   ejx                  d0¬«      f   ZPeeAe8    ejx                  d1¬«      f   ZQee8 ejx                  d2¬«      f   ZReeAe8   dz   ejx                  d3¬«      f   ZSee8 ejx                  d4¬«      f   ZT e1d5¬«      ZUd6ed7eddfd8„ZVeUj¯                  d9d:d;ig d<¢¬=«      	 	 	 	 	 	 	 	 	 	 	 	 	 d¿d>e=d?eQd@e%dAe'dBeBdCe,dDe$dEe&dFe@dGeCdHeEdIeHdJeIdeFdKe+ddf dL„«       ZXeUj¯                  dMg dN¢¬O«      	 	 	 	 dÀdeRdPeeD ej|                  dQdRdS¬«      f   dTeeGdz   ej|                  dUdVdW¬«      f   deFdKe+ddfdX„«       ZYdYeZe8e8f   dZeAe9e8e8e8f      deDfd[„Z[d\eGddfd]„Z\de8d^eeZe8ef      d_eAe8   dee9eDe8eAeAe8eGz        f      fd`„Z]eUj¯                  dadbg¬O«      	 	 	 dÁdceSdeFdKe+ddfdd„«       Z^eUj¯                  dedfdgg¬O«      	 	 	 	 dÀdheeD ej|                  didjdk¬«      f   deFdKe+dleeAe8   dz   ej|                  dQdmdn¬«      f   ddf
do„«       Z_eUj¯                  dpdqg¬O«      dÂdr„«       Z`eUj¯                  dsdtg¬O«      	 	 dÃdceeAe8    ejx                  du¬«      f   deFdKe+ddfdv„«       ZaeUj¯                  dwdxg¬O«      	 	 dÃdeRdeFdKe+ddfdy„«       ZbeUj¯                  dzg d{¢¬O«      	 	 	 dÁdceeAe8    ejx                  d|¬«      f   dGee8dz   ej|                  d}¬«      f   deFdKe+ddf
d~„«       ZceUj¯                  dd€d�g¬O«      	 	 	 	 dÄdeRdBeBd‚eeD ej|                  dƒd„¬«      f   deFdKe+ddfd…„«       ZdeUj¯                  dJg d†¢¬O«      	 	 	 	 dÄdeRd‡e*dˆe)deFdKe+ddfd‰„«       Ze e1dŠ¬«      ZfeUjÏ                  efd‹¬Œ«       efj¯                  d9d:d;ig d�¢¬=«      	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 dÅdŽeOd�ePd>e?dFe@d@e%dAe'dBeBdCe,dDe$dEe&dGeCdHeEdIeHdJeIdeFdKe+d�eJd‘eKddf&d’„«       Zh e1d“¬«      ZieUjÏ                  eid”¬Œ«       eij¯                  d9d:d;id•g¬=«      	 	 	 	 	 	 	 	 	 	 	 	 	 dÆd–eNd>e=d?eQd—eLd˜eMd@e%dAe'dBeBdCe,dDe$dEe&dFe@dGeCdIeHdeFdKe+ddf"d™„«       Zjeij¯                  dedšg¬O«      	 	 	 	 dÀdheeD ej|                  didjd›¬«      f   deFdKe+dleeAe8   dz   ej|                  dQdmdn¬«      f   ddf
dœ„«       Zkeij¯                  dsd�g¬O«      	 	 dÃdžeeAe8    ejx                  dŸ¬«      f   deFdKe+ddfd „«       Zleij¯                  d¡d¢g¬O«      	 	 dÃd£eTdeFdKe+ddfd¤„«       Zmeij¯                  d—d¥g¬O«      	 	 dÃd£eTdeFdKe+ddfd¦„«       Zneij¯                  d§d¨g¬O«      	 	 dÃd£eTdeFdKe+ddfd©„«       Zoeij¯                  ddªd«g¬O«      	 	 	 	 dÄd£eTdBeBd‚eeD ej|                  dƒd¬¬«      f   deFdKe+ddfd­„«       Zp e1d®¬«      ZqeijÏ                  eqd‹¬Œ«       eqj¯                  d9d:d;id¯d°g¬=«      	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 dÇd–eNdŽeOd�ePd—eLd˜eMd>e?dFe@d@e%dAe'dBeBdCe,dDe$dEe&dGeCdIeHdeFdKe+d�eJd‘eKddf(d±„«       ZrdeAe8   dz  deZe8e8f   dz  fd²„Zsd³eAeAe8eGz        d´eAe8   de8fdµ„Zt ed¶«      Zud·eeu   d¸ed¹eeu   f   dºeZddfd»„Zvd¼ejî                  jð                  d¸ed¹eeu   f   d½eAeZ   deeu   fd¾„Zyy)ÈaÕ  Contains commands to interact with jobs on the Hugging Face Hub.

Usage:
    # run a job
    hf jobs run <image> <command>

    # List running or completed jobs
    hf jobs ps [-a] [-f key=value]

    # Print logs from a job (non-blocking)
    hf jobs logs <job-id>

    # Stream logs from a job (blocking, like `docker logs -f`)
    hf jobs logs -f <job-id>

    # Stream resources usage stats and metrics from a job
    hf jobs stats <job-id>

    # Inspect detailed information about a job
    hf jobs inspect <job-id>

    # Cancel a running job
    hf jobs cancel <job-id>

    # Wait until one or more jobs finish
    hf jobs wait <job-id> [<job-id>...]

    # List available hardware options
    hf jobs hardware

    # Run a UV script
    hf jobs uv run <script>

    # Schedule a job
    hf jobs scheduled run <schedule> <image> <command>

    # List scheduled jobs
    hf jobs scheduled ps [-a] [-f key=value]

    # Inspect a scheduled job
    hf jobs scheduled inspect <scheduled_job_id>

    # Suspend a scheduled job
    hf jobs scheduled suspend <scheduled_job_id>

    # Resume a scheduled job
    hf jobs scheduled resume <scheduled_job_id>

    # Delete a scheduled job
    hf jobs scheduled delete <scheduled_job_id>

é    N)ÚCallableÚIterable)Úfnmatch)ÚEmptyÚQueue)Ú	AnnotatedÚAnyÚTypeVar)Úurlsplit)ÚHfApiÚJobHardwareÚJobInfoÚJobStage)ÚTERMINAL_JOB_STAGES)ÚCLIError)Úlogging)Ú_format_size)Úformat_durationÚparse_durationé   )Ú
EnvFileOptÚEnvOptÚSecretsFileOptÚ
SecretsOptÚ
SoftChoiceÚSshDryRunOptÚSshIdentityFileOptÚTokenOptÚ
VolumesOptÚexec_sshÚ
get_hf_apiÚparse_env_mapÚparse_volumesÚtyper_factory)Ú_dataclass_to_dictÚoutÚjob_idÚ	namespaceÚreturnc                 óü   — | st        d«      ‚| j                  d«      dkD  rt        d| › d�«      ‚d| vr| |fS | j                  dd«      \  }}|r|st        d| › d�«      ‚|�||k7  rt        d|› d|› d�«      ‚||fS )	a&  Extract namespace from job_id if provided in 'namespace/job_id' format.

    Allows users to pass job IDs copied from the Hub UI (e.g. 'username/job_id')
    instead of only bare job IDs. If the namespace is also provided explicitly via
    --namespace and conflicts, a CLIError is raised.
    zJob ID cannot be empty.ú/r   z<Job ID must be in the form 'job_id' or 'namespace/job_id': 'z'.z(Conflicting namespace: got --namespace='z ' but job ID implies namespace='ú')r   ÚcountÚsplit)r'   r(   Úextracted_namespaceÚparsed_job_ids       úZ/var/www/html/tokenscope/api/venv/lib/python3.12/site-packages/huggingface_hub/cli/jobs.pyÚ_parse_namespace_from_job_idr2   l   sÁ   € ñ ÜÐ0Ó1Ð1à‡|�|�CÓ˜1ÒÜÐUÐV\ÐU]Ð]_Ð`ÓaÐaà
�&ÑØ�yÐ Ð à)/¯©°c¸1Ó)=Ñ&Ð˜Ù¡mÜÐUÐV\ÐU]Ð]_Ð`ÓaÐaàÐ Ð.AÒ!AÜØ6°y°kÐAaÐbuÐavÐvwÐxó
ð 	
ð Ð-Ð-Ð-ó    gš™™™™™¹?zThe Docker image to use.)Úhelpz.Use a custom Docker image with `uv` installed.zcFlavor for the hardware. Run 'hf jobs hardware' to list available flavors. Defaults to `cpu-basic`.)r4   Ú
click_typez-lz--labelz3Set labels. E.g. --label KEY=VALUE or --label LABELzVMax duration: int/float with s (seconds, default), m (minutes), h (hours) or d (days).z-dz--detachz3Run the Job in the background and print the Job ID.zVThe namespace where the job will be running. Defaults to the current user's namespace.z--exposez÷Expose a container port through the jobs proxy. Repeat the flag for multiple ports (e.g. `--expose 8000 --expose 8001`). Each exposed port is reachable on the public jobs domain; access requires an HF token with read access to the job's namespace.z--sshz Make the job's container reachable over SSH. Connect with `hf jobs ssh <job_id>`. Requires an SSH public key registered on https://huggingface.co/settings/keys.z--withz%Run with the given packages installedz-pz--pythonz5The Python interpreter to use for the run environmentz!Suspend (pause) the scheduled Jobz8Allow multiple instances of this Job to run concurrentlyzWOne of annually, yearly, monthly, weekly, daily, hourly, or a CRON schedule expression.z$UV script to run (local file or URL)zArguments for the scriptzThe command to run.zJob ID (or 'namespace/job_id')zJob IDs (or 'namespace/job_id')z2Scheduled Job ID (or 'namespace/scheduled_job_id')zRun and manage Jobs on the Hub.ÚapiÚjobc                 óX  — | j                  |j                  |j                  j                  d¬«      D ]  }t	        j
                  |«       Œ | j                  |j                  |j                  j                  ¬«      }|j                  j                  t        j                  k7  rc|j                  j                  rd|j                  j                  › �nd}t        d|j                  › d|j                  j                  › d|› �«      ‚t	        j
                  d|j                  › d	�«       y
)zcStream Job logs until the Job ends, then fail the command if the Job did not complete successfully.T)r'   r(   Úfollow©r'   r(   z: Ú zJob z finished with stage 'r,   z
 completedN)Úfetch_job_logsÚidÚownerÚnamer&   ÚtextÚwait_for_jobÚstatusÚstager   Ú	COMPLETEDÚmessager   )r6   r7   ÚlogÚfinalrE   s        r1   Ú_stream_logs_and_check_statusrH   &  så   € à×!Ñ!¨¯©¸3¿9¹9¿>¹>ÐRVÐ!ÓWò ˆÜ�‰��ðð ×Ñ C§F¡F°c·i±i·n±nÐÓE€EØ‡|�|×ÑœX×/Ñ/Ò/Ø16·±×1EÒ1E�B�u—|‘|×+Ñ+Ð,Ñ-È2ˆÜ˜˜eŸh™h˜ZÐ'=¸e¿l¹l×>PÑ>PÐ=QÐQRÐSZÐR[Ð\Ó]Ð]Ü‡H�Hˆt�E—H‘H�:˜ZÐ(Õ)r3   ÚrunÚignore_unknown_optionsT)z3hf jobs run python:3.12 python -c 'print("Hello!")'z1hf jobs run --detach python:3.12 python script.pyz3hf jobs run -e FOO=foo python:3.12 python script.pyz;hf jobs run --secrets HF_TOKEN python:3.12 python script.pyz^hf jobs run -v hf://org/my-model:/data -v hf://buckets/org/b:/mnt python:3.12 python script.py)Úcontext_settingsÚexamplesÚimageÚcommandÚenvÚsecretsÚlabelÚvolumeÚenv_fileÚsecrets_fileÚflavorÚtimeoutÚdetachÚexposeÚsshÚtokenc                 ó,  — t        ||«      }t        ||«      }t        |¬«      }|j                  | |||t        |«      t	        |«      ||	|||¬«      }t        j                  d|j                  |j                  ¬«       t        |j                  j                  t        «      rDdj                  d„ |j                  j                  D «       «      }t        j                  d|› �«       t        |j                  j                  t         «      r:t        j                  d|j"                  j$                  › d	|j                  › d
�«       |
rB|j"                  j$                  › d	|j                  › �}t        j                  d|› d|› d�«       yt'        ||«       y)z
Run a Job.©rZ   )rM   rN   rO   rP   ÚlabelsÚvolumesrU   rV   rX   rY   r(   úJob started©r=   Úurlú
c              3   ó&   K  — | ]	  }d |› �–— Œ y­w©z  N© ©Ú.0ra   s     r1   ú	<genexpr>zjobs_run.<locals>.<genexpr>b  ó   è ø€ ÒF¨˜2˜c˜UœÑFùó   ‚úSExposed ports are reachable at (requires an HF token with read access to the job):
úUse `hf jobs ssh r+   ú&` to open an SSH session into the job.úUse `hf jobs logs -f ú&` to stream logs, or `hf jobs inspect ú` to check status.N)r"   r!   Úrun_jobÚ_parse_labels_mapr#   r&   Úresultr=   ra   Ú
isinstancerB   Úexpose_urlsÚlistÚjoinÚhintÚssh_urlÚstrr>   r?   rH   )rM   rN   rO   rP   rQ   rR   rS   rT   rU   rV   rW   rX   rY   r(   rZ   Úenv_mapÚsecrets_mapr6   r7   ÚurlsÚjob_refs                        r1   Újobs_runr   2  sQ  € ô: ˜C Ó*€GÜ ¨Ó6€Kä
˜5Ô
!€CØ
�+‰+ØØØØÜ  Ó'Ü˜fÓ%ØØØØØð ó €Cô ‡J�Jˆ} §¡¨S¯W©WÕ5Ü�#—*‘*×(Ñ(¬$Ô/Ø�y‰yÑF¨s¯z©z×/EÑ/EÔFÓFˆÜ�‰ÐgÐhlÐgmÐnÔoÜ�#—*‘*×$Ñ$¤cÔ*Ü�‰Ð$ S§Y¡Y§^¡^Ð$4°A°c·f±f°XÐ=cÐdÔeÙØ—Y‘Y—^‘^Ð$ A c§f¡f XÐ.ˆÜ�‰Ð(¨¨	Ð1WÐX_ÐW`Ð`rÐsÔtØÜ! # sÕ+r3   Úlogs)zhf jobs logs <job_id>zhf jobs logs -f <job_id>zhf jobs logs --tail 20 <job_id>z#hf jobs logs -f --tail 100 <job_id>)rL   r9   z-fz--followzqFollow log output (stream until the job completes). Without this flag, only currently available logs are printed.Útailz-nz--tailzvNumber of lines to show from the end of the logs. When combined with --follow, starts streaming from the last N lines.c                 óê   — t        | |«      \  } }t        |¬«      }|j                  | |||¬«      }|D ]  }t        j                  |«       Œ |r%|r|› d| › �n| }t        j
                  d|› d�«       yy)a­  Fetch the logs of a Job.

    By default, prints currently available logs and exits (non-blocking).
    Use --follow/-f to stream logs in real-time until the job completes.
    Use --tail/-n to limit the number of lines returned (server-side when supported).

    Note: following exits when the log stream ends, regardless of whether the Job
    succeeded or failed. Run `hf jobs inspect <job_id>` to check the final status.
    r\   )r'   r(   r9   r�   r+   z#Stream ended. Run `hf jobs inspect z6` to check the final status (e.g. COMPLETED or ERROR).N)r2   r!   r<   r&   r@   rx   )	r'   r9   r�   r(   rZ   r6   r€   rF   r~   s	            r1   Ú	jobs_logsrƒ   m  s‡   € ôN 5°V¸YÓGÑ€FˆIä
˜5Ô
!€CØ×Ñ V°yÈÐVZÐÓ[€DØò ˆÜ�‰��ðáÙ-6�Y�K˜q  Ñ)¸FˆÜ�‰Ð6°w°iÐ?uÐvÕwð r3   Újob_propertiesÚfiltersc                 óÂ   — |D ]Z  \  }}}| j                  |«      }|€|dk(  rŒ  yt        |j                  «       |j                  «       «      }|dk(  r|r	|dk(  sŒW|sŒZ y y)z5Check if scheduled job matches all specified filters.ú!=Fú=T)Úgetr   Úlower)r„   r…   ÚkeyÚop_strÚpatternÚvalueÚmatchs          r1   Ú_matches_filtersr�   Ÿ  sk   € à 'ò ÑˆˆV�WØ×"Ñ" 3Ó'ˆØˆ=Ø˜Š~ØÙÜ˜Ÿ™› w§}¡}£Ó7ˆØ�cŠM¡%¨V°t«^ÂÙðð r3   Únc                 óF   — d}d}t        | «      D ]  }t        ||¬«       Œ y )Nz[1Az[2K)Úend)ÚrangeÚprint)r‘   ÚLINE_UPÚ
LINE_CLEARÚis       r1   Ú_clear_liner™   ­  s)   € Ø€GØ€JÜ�1‹Xò 'ˆÜˆg˜:Ö&ñ'r3   Úmetrics_streamÚtable_headersc              #   óº  K  — |D �]J  }| |d   › d�t        |d   dz  d«      t        d|d   z  |d   z  d	«      › d�t        |d   «      › d
t        |d   «      › d�t        |d   «      › dt        |d   «      › d�g}|d   r§t        |d   t        «      r”|gdgt	        |«      z  gt	        |d   «      dz
  z  z   }t        |t        |d   «      «      D ]R  \  }}|d   |   }||d   › d�t        d|d   z  |d   z  d	«      › d�t        |d   «      › d
t        |d   «      › d�gz  }ŒT n!|dgt	        |«      t	        |«      z
  z  z  }|g}d| |f–— �ŒM d| g f–— y ­w)NÚcpu_usage_pctú%Úcpu_millicoresg     @�@r   éd   Úmemory_used_bytesÚmemory_total_bytesé   zB / ÚBÚrx_bpszbps / Útx_bpsÚbpsÚgpusr;   ÚutilizationúN/AFT)Úroundr   rt   ÚdictÚlenÚzipÚsorted)r'   rš   r›   ÚmetricsÚrowÚrowsÚgpu_idÚgpus           r1   Ú_get_jobs_stats_rowsrµ   ´  sê  è ø€ ð "ó "ˆàØ�Ñ'Ð(¨Ð*Ü�'Ð*Ñ+¨fÑ4°aÓ8Ü�S˜7Ð#6Ñ7Ñ7¸'ÐBVÑ:WÑWÐYZÓ[Ð\Ð\]Ð^Ü˜GÐ$7Ñ8Ó9Ð:¸$¼|ÈGÐThÑLiÓ?jÐ>kÐklÐmÜ˜G HÑ-Ó.Ð/¨v´lÀ7È8ÑCTÓ6UÐ5VÐVYÐZð
ˆð �6Š?œz¨'°&©/¼4Ô@Ø�5˜R˜D¤3 s£8™OÐ,´°G¸F±OÓ0DÀqÑ0HÑIÑIˆDÜ" 4¬°¸±Ó)@ÓAò ‘��VØ˜f‘o fÑ-�ØØ˜=Ñ)Ð*¨!Ð,Ü˜S 3Ð':Ñ#;Ñ;¸cÐBVÑ>WÑWÐYZÓ[Ð\Ð\]Ð^Ü# CÐ(;Ñ$<Ó=Ð>¸dÄ<ÐPSÐThÑPiÓCjÐBkÐklÐmðñ ‘ñð �E�7œc -Ó0´3°s³8Ñ;Ñ<Ñ<ˆCØ�5ˆDØ�V˜TÐ!Ô!ð+"ð, �˜Ð
Óùs   ‚EEÚstatszhf jobs stats <job_id>Újob_idsc           	      óº  — | �+g }| D ]"  }t        ||«      \  }}|j                  |«       Œ$ |} t        |¬«      }|€|j                  «       d   }| €O|j	                  |¬«      D �cg c]4  }|j
                  r|j
                  j                  nddv r|j                  ‘Œ6 } }t        | «      dk(  rt        j                  d«       yg d	¢}t        j                  j                  t        | «      «      5 }i }	| D ]+  }|g}
|
|d
d D �cg c]  }d|v sd|v rdnd‘Œ c}z  }
|
g|	|<   Œ- t        j                  «       }|	D ��
cg c]  }|	|   D ]  }
|
‘Œ Œ }}}
t        t!        ||¬«      «       | D �cg c]  }||j#                  ||¬«      |dœ‘Œ }}t%        |t&        |¬«      D ]‹  \  }}}|r|	j)                  |d«       n||	|<   t        j                  «       }||z
  t*        k\  sŒBt-        dt        |«      z   «       |	D ��
cg c]  }|	|   D ]  }
|
‘Œ Œ }}}
t        t!        ||¬«      «       |}Œ� 	 ddd«       yc c}w c c}w c c}
}w c c}w c c}
}w # 1 sw Y   yxY w)z7Fetch the resource usage statistics and metrics of JobsNr\   r?   ©r(   ÚUNKNOWN©ÚRUNNINGÚUPDATINGr   zNo running jobs found)	zJOB IDzCPU %zNUM CPUzMEM %z	MEM USAGEzNET I/Oz
GPU UTIL %z	GPU MEM %zGPU MEM USAGEr   r+   ÚUSAGEz-- / --z--)Úheadersr:   )r'   rš   r›   )Úkwargs_listr£   )r2   Úappendr!   ÚwhoamiÚ	list_jobsrB   rC   r=   r­   r&   r@   ÚmultiprocessingÚpoolÚ
ThreadPoolÚtimer•   Ú	_tabulateÚfetch_job_metricsÚiflatmap_unorderedrµ   ÚpopÚSTATS_UPDATE_MIN_INTERVALr™   )r·   r(   rZ   Ú
parsed_idsr'   r6   r7   r›   rÅ   Úrows_per_job_idr±   ÚheaderÚlast_update_timeÚ
total_rowsrÀ   Údoner²   Únows                     r1   Ú
jobs_statsrÔ   Ð  s¨  € ð ÐØˆ
Øò 	&ˆFÜ <¸VÀYÓ OÑˆF�IØ×Ñ˜fÕ%ð	&ð ˆÜ
˜5Ô
!€CØÐØ—J‘J“L Ñ(ˆ	Ø€ð —}‘}¨y�}Ó9ö
àØ$'§J¢J�—
‘
× Ò °IÐBYÑYð �F‹Fð
ˆð 
ô
 ˆ7ƒ|�qÒÜ�‰Ð(Ô)Øò
€Mô 
×	Ñ	×	(Ñ	(¬¨W«Ó	6ð '¸$Ø<>ˆØò 	,ˆFØ$* 8ˆCØÐ^kÐlmÐlnÐ^oÖpÐTZ #¨¡-°7¸fÑ3D‘IÈ4ÑOÒpÑpˆCØ'* eˆO˜FÒ#ð	,ô  Ÿ9™9›;ÐØ(7×[˜fÀ?ÐSYÑCZÒ[¸C’cÐ[�cÐ[ˆ
Ñ[ô 	Œi˜
¨MÔ:Ô;ð "ö
ð ð	 !Ø"%×"7Ñ"7¸vÐQZÐ"7Ó"[Ø!.óð
ˆð 
ô #5°TÔ;OÐ]hÔ"iò 
	'ÑˆD�&˜$ÙØ×#Ñ# F¨DÕ1à*.� Ñ'Ü—)‘)“+ˆCØÐ%Ñ%Ô)BÓBÜ˜A¤ J£Ñ/Ô0Ø0?×c fÈ?Ð[aÑKbÒcÀCšcÐc˜cÐc�
ÑcÜ”i 
°MÔBÔCØ#&Ñ ñ
	'÷)'ð 'ùò'
ùò. qùó \ùò

ùó  d÷9'ð 'úsO   Á%9H6Ã0IÄH;
Ä&IÄ<I ÅIÅ,IÆ
AIÇ IÇ<I
ÈIÈ;IÉIÚpsz
hf jobs pszhf jobs ps -aÚallz-az--allz*Show all Jobs (default shows just running)Úfilterz--filterz>Filter output based on conditions provided (format: key=value)c                 ó†  — t        |¬«      }|j                  |¬«      }g }g }|xs g D �]`  }|j                  d«      s|j                  d«      r¼|j                  d«      r3|t        d«      d }	d|	v rt	        j
                  d|	› d�«       Œc|	d	d
}}}
nG|t        d«      d }	d|	v r|	j                  dd«      \  }
}n|	d
}}
|
j                  d«      rd	}|
dd }
nd}|j                  |
j                  «       ||j                  «       f«       Œâd|v rb|j                  dd«      \  }}|j                  d«      rd	}|dd }nd}|j                  |j                  «       ||j                  «       f«       �ŒHt	        j
                  d|› d�«       �Œc g }|D ]º  }|j                  r|j                  j                  nd}| s|dvrŒ.|j                  xs d}|j                  xs g }|rdj                  |«      nd}|j                  ||j                  «       |dœ}t!        ||«      sŒ�t!        |j"                  xs i |«      sŒª|j                  |«       Œ¼ g }|D �]  }t%        |«      }|j'                  d«      xs i }|j'                  d«      xs g }|j'                  dd«      |d<   |j'                  d«      xs d|d<   |rdj                  |«      nd|d<   |j'                  d«      r|d   dd j)                  dd«      nd|d<   |j'                  d «      xs i j'                  d!d«      |d <   t+        |j'                  d"«      «      |d#<   |j                  |«       �Œ t	        j,                  |g d$¢d¬%«       |sO|r1d&j                  d'„ |D «       «      }t	        j.                  d(|› �«       y| s|st	        j0                  d)«       yyyy)*z
List Jobs.r\   r¹   zlabel!=zlabel=Nrˆ   z-Ignoring invalid label filter format 'label!=z'. Use label!=key format.r‡   Ú*r   ú!éÿÿÿÿú Ignoring invalid filter format 'ú'. Use key=value format.rº   r»   rª   ú )r=   rM   rB   rN   Ú	durationsrN   r=   r;   r'   Údocker_imageúimage/spaceÚ
created_até   ÚTÚcreatedrB   rC   Úrunning_secsÚruntime)r'   rá   rN   rå   rB   rç   ©r¿   Úid_keyú, c              3   ó4   K  — | ]  \  }}}|› |› |› �–— Œ y ­w©Nre   ©rg   ÚkÚoÚvs       r1   rh   zjobs_ps.<locals>.<genexpr>v  s"   è ø€ Ò#H±W°Q¸¸1 q c¨!¨¨Q¨C¤LÑ#Hùó   ‚zNo jobs matched filters: zHNo running jobs. Use `-a`/`--all` to include finished (and failed) jobs.)r!   rÃ   Ú
startswithr­   r&   Úwarningr.   ÚendswithrÁ   rŠ   rB   rC   rà   rN   rw   r=   r�   r]   r%   r‰   Úreplacer   Útabler@   rx   )rÖ   r(   rZ   r×   r6   Újobsr…   Úlabels_filtersÚfÚ
label_partÚ	label_keyÚopÚlabel_valuer‹   rŽ   Úfiltered_jobsr7   rB   Úimage_or_spaceÚcmdÚcommand_strÚpropsÚitemsÚitemrß   Úfilters_msgs                             r1   Újobs_psr    s«  € ô, ˜5Ô
!€CØ�=‰= 9ˆ=Ó-€Dà*,€GØ13€NØŠ\�ró XˆØ�<‰<˜	Ô" a§l¡l°8Ô&<Ø�|‰|˜IÔ&Øœs 9›~Ð/Ð0�
Ø˜*Ñ$Ü—K‘KÐ"OÐPZÈ|Ð[tÐ uÔvØØ-7¸¸s˜{˜2‘	àœs 8›}˜Ð/�
Ø˜*Ñ$Ø-7×-=Ñ-=¸cÀ1Ó-EÑ*�I™{à-7¸˜{�Ià×%Ñ% cÔ*Ø�BØ )¨#¨2 ‘Ià�BØ×!Ñ! 9§?¡?Ó#4°b¸+×:KÑ:KÓ:MÐ"NÕOØ�A‰XØŸ™  a›‰JˆC�à�|‰|˜CÔ Ø�Ø˜#˜2�h‘à�Ø�N‰N˜CŸI™I›K¨¨U¯[©[«]Ð;Ö<ä�K‰KÐ:¸1¸#Ð=UÐVÖWð?XðD €MØò "ˆØ%(§Z¢Z�—‘×!Ò!°YˆÙ�vÐ%<Ñ<ØØ×)Ñ)Ò2¨UˆØ�k‰kÒ˜RˆÙ'*�c—h‘h˜s”m°ˆØ—v‘v¨À&Ç,Á,Ã.Ð]hÑiˆÜ  wÔ/ØÜ §
¡
Ò 0¨b°.ÔAØØ×Ñ˜SÕ!ð"ð #%€EØó 
ˆÜ! #Ó&ˆØ—H‘H˜[Ó)Ò/¨Rˆ	Ø�h‰h�yÓ!Ò' RˆØŸ™ $¨Ó+ˆˆX‰Ø"Ÿh™h ~Ó6Ò?¸%ˆˆ]ÑÙ+.˜#Ÿ(™( 3œ-°EˆˆY‰ØGKÇxÁxÐP\ÔG]˜$˜|Ñ,¨S¨bÐ1×9Ñ9¸#¸sÔCÐchˆˆY‰ØŸ(™( 8Ó,Ò2°×7Ñ7¸ÀÓKˆˆX‰Ü)¨)¯-©-¸Ó*GÓHˆˆY‰Ø�‰�TÖð
ô ‡I�IØÚTØõñ
 ÙØŸ)™)Ñ#HÀÔ#HÓHˆKÜ�H‰HÐ0°°Ð>Õ?Ù™^Ü�H‰HÐ_Õ`ð ,�ð	 r3   Úhardwarezhf jobs hardwarec                  ó^  — t        «       } | j                  «       }g }|D ]â  }d}|j                  rG|j                  j                  › d|j                  j                  › d|j                  j
                  › d�}|j                  rd|j                  d›�nd}|j                  rd|j                  dz  d	›�nd}|j                  |j                  |j                  |j                  |j                  |j                  |||d
œ«       Œä t        j                  |«       t        j                  d«       y)z(List available hardware options for Jobsr;   zx ú (ú)ú$z.4fÚfreeé<   z.2f)r?   zpretty nameÚcpuÚramÚstorageÚacceleratorzcost/minz	cost/hourzLUse `hf jobs run --flavor <name> ...` to request a specific hardware flavor.N)r!   Úlist_jobs_hardwarer  ÚquantityÚmodelÚvramÚunit_cost_usdrÁ   r?   Úpretty_namer  r  Úephemeral_storager&   rö   rx   )r6   Úhardware_listr  ÚhwÚaccelerator_infoÚcost_minÚ	cost_hours          r1   Újobs_hardwarer  |  s  € ô ‹,€CØ×*Ñ*Ó,€MØ€EØò 
ˆØÐØ�>Š>Ø"$§.¡.×"9Ñ"9Ð!:¸"¸R¿^¹^×=QÑ=QÐ<RÐRTÐUW×UcÑUc×UhÑUhÐTiÐijÐkÐØ13×1AÒ1A�Q�r×'Ñ'¨Ð,Ñ-ÀvˆØ79×7GÒ7G�a˜×(Ñ(¨2Ñ-¨cÐ2Ñ3ÈVˆ	Ø�‰àŸ™Ø!Ÿ~™~Ø—v‘vØ—v‘vØ×/Ñ/Ø/Ø$Ø&ñ	õ	
ð
ô$ ‡I�IˆeÔÜ‡H�HÐ[Õ\r3   Úinspectzhf jobs inspect <job_id>z*Job IDs to inspect (or 'namespace/job_id')c                 ó  — g }| D ]"  }t        ||«      \  }}|j                  |«       Œ$ |} t        |¬«      }| D �cg c]  }|j                  ||¬«      ‘Œ }}t	        j
                  |D �cg c]  }t        |«      ‘Œ c}«       yc c}w c c}w )z0Display detailed information on one or more Jobsr\   r:   N)r2   rÁ   r!   Úinspect_jobr&   rö   r%   )r·   r(   rZ   rÍ   r'   r6   r÷   r7   s           r1   Újobs_inspectr"  ˜  sŽ   € ð €JØò "ˆÜ8¸ÀÓKÑˆ�	Ø×Ñ˜&Õ!ð"ð €GÜ
˜5Ô
!€CØNUÖVÀFˆC�O‰O 6°YˆOÕ?ÐV€DÐVÜ‡I�I°$Ö7¨3Ô! #Õ&Ò7Õ8ùò WùÚ7ó   ¼BÁ+B
Úcancelzhf jobs cancel <job_id>c                 óŽ   — t        | |«      \  } }t        |¬«      }|j                  | |¬«       t        j                  d| ¬«       y)zCancel a Jobr\   r:   zJob cancelled©r=   N)r2   r!   Ú
cancel_jobr&   rs   )r'   r(   rZ   r6   s       r1   Újobs_cancelr(  ®  s=   € ô 5°V¸YÓGÑ€FˆIÜ
˜5Ô
!€CØ‡N�N˜&¨I€NÔ6Ü‡J�Jˆ 6Ö*r3   Úwait)zhf jobs wait <job_id>z"hf jobs wait <job_id_1> <job_id_2>z"hf jobs ps -q | xargs hf jobs waitz,Job IDs to wait for (or 'namespace/job_id').zZMax time to wait: int/float with s (seconds, default), m (minutes), h (hours) or d (days).c           
      ó*  — g }t        «       }| D ]3  }t        ||«      \  }}|j                  |«       |j                  |«       Œ5 t	        |«      dkD  r3t        ddj                  d„ t        |t        ¬«      D «       «      z   «      ‚|j                  «       }|�t        |«      nd}	t        |¬«      }
t        j                  dt	        |«      › d	�«      }	 |
j                  ||	|¬
«      }|j!                  t	        |«      › d�«       t        j"                  |D �cg c]C  }|j$                  t        |j                  j&                  «      |j                  j(                  dœ‘ŒE c}«       |D �cg c],  }|j                  j&                  t*        j,                  k7  sŒ+|‘Œ. }}|r<t        t	        |«      › dt	        |«      › d�dj                  d„ |D «       «      z   «      ‚y# t        $ r" |j!                  d«       t        d|› d�«      d‚w xY wc c}w c c}w )a  Wait for one or more Jobs to reach a terminal state.

    Blocks until every Job has finished, then exits with code 0 if all Jobs completed
    successfully, or a non-zero exit code if any Job was canceled, errored or deleted.

    All Jobs must belong to the same namespace.
    r   z0All Job IDs must be in the same namespace, got: rê   c              3   ó2   K  — | ]  }t        |«      –— Œ y ­wrì   )rz   )rg   Únss     r1   rh   zjobs_wait.<locals>.<genexpr>ã  s   è ø€ ÒF Bœ˜BŸÑFùs   ‚)r‹   Nr\   zWaiting for z Job(s) to finish...)rV   r(   z
Timed out.zTimed out after z waiting for Job(s) to finish.z Job(s) finished.)r=   rC   rE   z of z' Job(s) did not complete successfully: c              3   óh   K  — | ]*  }|j                   › d |j                  j                  › d�–— Œ, y­w)r	  r
  N)r=   rB   rC   )rg   r7   s     r1   rh   zjobs_wait.<locals>.<genexpr>ö  s,   è ø€ ÒK¸S˜3Ÿ6™6˜( " S§Z¡Z×%5Ñ%5Ð$6°aÔ8ÑKùs   ‚02)Úsetr2   rÁ   Úaddr­   r   rw   r¯   rz   rË   r   r!   r&   rB   rA   ÚTimeoutErrorrÒ   rö   r=   rC   rE   r   rD   )r·   rV   r(   rZ   rÍ   Ú
namespacesr'   Ú	parsed_idÚparsed_namespaceÚtimeout_secsr6   rB   r÷   r7   Úfaileds                  r1   Ú	jobs_waitr6  »  só  € ð> €JÜ“€JØò )ˆÜ&BÀ6È9Ó&UÑ#ˆ	Ð#Ø×Ñ˜)Ô$Ø�‰Ð'Õ(ð)ô ˆ:ƒ˜ÒÜØ>Ø�i‰iÑF¬&°ÄÔ*EÔFÓFñGó
ð 	
ð —‘Ó €IØ.5Ð.A”> 'Ô*Àt€Lä
˜5Ô
!€CÜ�Z‰Z˜,¤s¨:£Ð&7Ð7KÐLÓM€Fð]Ø×Ñ 
°LÈIÐÓVˆð ‡K�K”3�t“9�+Ð.Ð/Ô0ä‡I�IÐhlÖmÐad�c—f‘f¤s¨3¯:©:×+;Ñ+;Ó'<ÈÏÉ×I[ÑI[Ó\ÒmÔnØ!ÖL�c S§Z¡Z×%5Ñ%5¼×9KÑ9KÓ%KŠcÐL€FÐLÙÜÜ�6‹{ˆm˜4¤ D£	˜{Ð*QÐRØ�i‰iÑKÀFÔKÓKñLó
ð 	
ð øô ò ]Ø�‰�LÔ!ÜÐ)¨'¨Ð2PÐQÓRÐX\Ð\ð]üò
 nùÚLs   ÃG ÄAHÅ+,HÆHÇ+Hr]   z8hf jobs labels <job_id> --label env=prod --label team=mlzhf jobs labels <job_id> --clearÚclearz--clearzRemove all labels from the job.c                 óþ   — |s|st        d«      ‚|r|rt        d«      ‚t        | |«      \  } }t        |«      xs i }t        |¬«      }|j	                  | ||¬«      }t        j                  d|j                  ¬«       y)z5Update labels on a Job. Replaces all existing labels.úOPlease set at least one label with --label. To remove all labels, pass --clear.úbCannot set labels and clear them at the same time. Please use either --label or --clear, not both.r\   )r'   r]   r(   úLabels updatedr&  N)r   r2   rr   r!   Úupdate_job_labelsr&   rs   r=   )r'   rQ   r7  r(   rZ   r]   r6   r7   s           r1   Újobs_labelsr=  ú  s€   € ñ ™ÜÐhÓiÐiÙ‘ÜØpó
ð 	
ô 5°V¸YÓGÑ€FˆIÜ˜uÓ%Ò+¨€FÜ
˜5Ô
!€CØ
×
Ñ
 v°fÈ	Ð
Ó
R€CÜ‡J�JÐ C§F¡FÖ+r3   )zhf jobs ssh <job_id>zhf jobs ssh <job_id> --dry-runz)hf jobs ssh <job_id> -i ~/.ssh/id_ed25519Úidentity_fileÚdry_runc                 óê  — t        | |«      \  } }t        |¬«      }|j                  | |¬«      }|j                  j                  €t        d«      ‚|j                  j                  t        v r0t        d|j                  › d|j                  j                  › d�«      ‚|j                  j                  t        j                  k7  ràt        j                  d|j                  › d	|j                  j                  › d
�«      }|j                  |j                  |t        j                  g¬«      }|j                  j                  t        j                  k7  rA|j                  d«       t        d|j                  › d|j                  j                  › d�«      ‚|j                  d«       t        |j                  j                  «      }t        |j                   › d|j"                  › �|j$                  ||¬«       y)a   SSH into a running Job.

    If the Job is not yet running, waits until it reaches the RUNNING state before
    connecting. Requires the Job to be started with SSH enabled (`hf jobs run --ssh ...`)
    and your SSH public key to be registered at https://huggingface.co/settings/keys.
    r\   r:   Nz[SSH is not enabled on this job. Start a job with SSH support using `hf jobs run --ssh ...`.zCannot SSH into job 'z%': job has already finished (stage: 'z').zWaiting for job 'z' to be running (stage: 'z')...)r'   r(   ÚstageszJob finished.z1': job finished before reaching RUNNING (stage: 'zJob is running.ú@)Úportr>  r?  )r2   r!   r!  rB   ry   r   rC   r   r=   r   r¼   r&   rA   rÒ   r   r    ÚusernameÚhostnamerC  )	r'   r>  r?  r(   rZ   r6   r7   rB   ry   s	            r1   Újobs_sshrF    s¨  € ô* 5°V¸YÓGÑ€FˆIÜ
˜5Ô
!€CØ
�/‰/ °9ˆ/Ó
=€CØ
‡z�z×ÑÐ!ÜÐtÓuÐuØ
‡z�z×ÑÔ.Ñ.ÜÐ.¨s¯v©v¨hÐ6[Ð\_×\fÑ\f×\lÑ\lÐ[mÐmpÐqÓrÐrØ
‡z�z×Ñœ8×+Ñ+Ò+Ü—‘Ð/°·±¨xÐ7PÐQT×Q[ÑQ[×QaÑQaÐPbÐbgÐhÓiˆØ×Ñ c§f¡f¸	Ì8×K[ÑK[ÐJ\ÐÓ]ˆØ�:‰:×Ñœx×/Ñ/Ò/Ø�K‰K˜Ô(ÜØ'¨¯© xÐ/`Ðad×akÑak×aqÑaqÐ`rÐruÐvóð ð 	�‰Ð%Ô&Ü�s—z‘z×)Ñ)Ó*€GÜØ×ÑÐ
˜A˜g×.Ñ.Ð/Ð0Ø�\‰\Ø#Øö	r3   zFRun UV scripts (Python with inline dependencies) on HF infrastructure.Úuv)r?   )zhf jobs uv run my_script.pyz$hf jobs uv run --detach my_script.pyz1hf jobs uv run ml_training.py --flavor a10g-smallz+hf jobs uv run --with transformers train.pyzNhf jobs uv run -v hf://org/my-model:/data -v hf://buckets/org/b:/mnt script.pyÚscriptÚscript_argsÚwith_Úpythonc                 ó:  — t        ||«      }t        ||	«      }t        |¬«      }|j                  | |xs g |||||t        |«      t	        |«      ||
|||¬«      }t        j                  d|j                  |j                  ¬«       t        |j                  j                  t        «      rDdj                  d„ |j                  j                  D «       «      }t        j                  d|› �«       t        |j                  j                  t         «      r:t        j                  d|j"                  j$                  › d	|j                  › d
�«       |rB|j"                  j$                  › d	|j                  › �}t        j                  d|› d|› d�«       yt'        ||«       y)ú8Run a UV script (local file or URL) on HF infrastructurer\   )rH  rI  ÚdependenciesrK  rM   rO   rP   r]   r^   rU   rV   rX   rY   r(   r_   r`   rb   c              3   ó&   K  — | ]	  }d |› �–— Œ y­wrd   re   rf   s     r1   rh   zjobs_uv_run.<locals>.<genexpr>~  ri   rj   rk   rl   r+   rm   rn   ro   rp   N)r"   r!   Ú
run_uv_jobrr   r#   r&   rs   r=   ra   rt   rB   ru   rv   rw   rx   ry   rz   r>   r?   rH   )rH  rI  rM   rU   rO   rP   rQ   rR   rS   rT   rV   rW   rX   rY   r(   rZ   rJ  rK  r{   r|   r6   r7   r}   r~   s                           r1   Újobs_uv_runrQ  H  s`  € ô@ ˜C Ó*€GÜ ¨Ó6€Kä
˜5Ô
!€CØ
�.‰.ØØÒ% 2ØØØØØÜ  Ó'Ü˜fÓ%ØØØØØð ó €Cô  ‡J�Jˆ} §¡¨S¯W©WÕ5Ü�#—*‘*×(Ñ(¬$Ô/Ø�y‰yÑF¨s¯z©z×/EÑ/EÔFÓFˆÜ�‰ÐgÐhlÐgmÐnÔoÜ�#—*‘*×$Ñ$¤cÔ*Ü�‰Ð$ S§Y¡Y§^¡^Ð$4°A°c·f±f°XÐ=cÐdÔeÙØ—Y‘Y—^‘^Ð$ A c§f¡f XÐ.ˆÜ�‰Ð(¨¨	Ð1WÐX_ÐW`Ð`rÐsÔtØÜ! # sÕ+r3   z,Create and manage scheduled Jobs on the Hub.Ú	scheduledz>hf jobs scheduled run "0 0 * * *" python:3.12 python script.pyÚscheduleÚsuspendÚconcurrencyc                 ó4  — t        ||	«      }t        ||
«      }t        |¬«      }|j                  ||| ||||t        |«      t	        |«      ||||¬«      }t        j                  d|j                  ¬«       t        j                  d|j                  › d�«       y)zSchedule a Job.r\   )rM   rN   rS  rT  rU  rO   rP   r]   r^   rU   rV   rX   r(   úScheduled Job createdr&  úUse `hf jobs scheduled inspect ú` to view its details.N)	r"   r!   Úcreate_scheduled_jobrr   r#   r&   rs   r=   rx   )rS  rM   rN   rT  rU  rO   rP   rQ   rR   rS   rT   rU   rV   rX   r(   rZ   r{   r|   r6   Úscheduled_jobs                       r1   Úscheduled_runr\  �  s¡   € ô0 ˜C Ó*€GÜ ¨Ó6€Kä
˜5Ô
!€CØ×,Ñ,ØØØØØØØÜ  Ó'Ü˜fÓ%ØØØØð -ó €Mô ‡J�JÐ&¨=×+;Ñ+;Õ<Ü‡H�HÐ.¨}×/?Ñ/?Ð.@Ð@VÐWÕXr3   zhf jobs scheduled psz1Show all scheduled Jobs (default hides suspended)c                 ón  — t        |¬«      }|j                  |¬«      }g }|xs g D ]€  }d|v ra|j                  dd«      \  }}	|j                  d«      rd}
|dd }nd}
|j	                  |j                  «       |
|	j                  «       f«       Œht        j                  d	|› d
�«       Œ‚ g }|D ]˜  }|j                  xs d}| s|rŒ|j                  j                  xs d}|j                  j                  xs g }|rdj                  |«      nd}|j                  |t        |«      |dœ}t        ||«      sŒˆ|j	                  |«       Œš g }|D �]  }t!        |«      }|j#                  d«      xs i }|j#                  d«      xs i }|j#                  d«      }|j#                  d«      xs g }|j#                  d«      xs d|d<   |rdj                  |«      nd|d<   |r)|j#                  d«      r|d   dd j%                  dd«      nd|d<   |j#                  d«      r|d   dd j%                  dd«      nd|d<   |j#                  d«      xs d|d<   |j	                  |«       �Œ t        j&                  |g d¢d¬«       |s4|r1dj                  d „ |D «       «      }t        j(                  d!|› �«       yyy)"zList scheduled Jobsr\   r¹   rˆ   r   rÚ   r‡   NrÛ   rÜ   rÝ   Frª   rÞ   )r=   rM   rT  rN   Újob_specrB   Úlast_jobrN   rà   rá   Úatrã   rä   Úlast_runÚnext_job_run_atÚnext_runrT  )r=   rS  rá   rN   ra  rc  rT  r=   rè   rê   c              3   ó4   K  — | ]  \  }}}|› |› |› �–— Œ y ­wrì   re   rí   s       r1   rh   zscheduled_ps.<locals>.<genexpr>  s"   è ø€ ÒD±°°A°q 1 # a S¨¨¤ÑDùrñ   z#No scheduled jobs matched filters: )r!   Úlist_scheduled_jobsr.   rô   rÁ   rŠ   r&   ró   rT  r^  rà   rN   rw   r=   rz   r�   r%   r‰   rõ   rö   r@   )rÖ   r(   rZ   r×   r6   Úscheduled_jobsr…   rù   r‹   rŽ   rü   rþ   r[  rT  rÿ   r   r  r  r  Úsjr  r^  Ústatus_dictr_  r  s                            r1   Úscheduled_psri  ¼  s¾  € ô, ˜5Ô
!€CØ×,Ñ,°yÐ,ÓA€NØ*,€GØŠ\�rò XˆØ�!‰8ØŸ™  a›‰JˆC�à�|‰|˜CÔ Ø�Ø˜#˜2�h‘à�Ø�N‰N˜CŸI™I›K¨¨U¯[©[«]Ð;Õ<ä�K‰KÐ:¸1¸#Ð=UÐVÕWðXð €MØ'ò 
,ˆØ×'Ñ'Ò0¨5ˆÙ‘wØØ&×/Ñ/×<Ñ<ÒEÀˆØ×$Ñ$×,Ñ,Ò2°ˆÙ'*�c—h‘h˜s”m°ˆØ$×'Ñ'°.ÌSÐQXË\ÐfqÑrˆÜ  wÔ/ØØ×Ñ˜]Õ+ð
,ð #%€EØó ˆÜ! "Ó%ˆØ—8‘8˜JÓ'Ò-¨2ˆØ—h‘h˜xÓ(Ò.¨BˆØ—?‘? :Ó.ˆØ�l‰l˜9Ó%Ò+¨ˆØ&Ÿl™l¨>Ó:ÒC¸eˆˆ]ÑÙ+.˜#Ÿ(™( 3œ-°EˆˆY‰ÙDLÐQY×Q]ÑQ]Ð^bÔQc˜8 D™>¨#¨2Ð.×6Ñ6°s¸CÔ@ÐinˆˆZÑàEPÇ_Á_ÐUfÔEgˆKÐ)Ñ*¨3¨BÐ/×7Ñ7¸¸SÔAÐmrð 	ˆZÑð Ÿ(™( 9Ó-Ò6°ˆˆY‰Ø�‰�TÖðô ‡I�IØÚ_Øõñ
 ‘WØ—i‘iÑD¸GÔDÓDˆÜ�‰Ð6°{°mÐDÕEð ˆ5r3   zhf jobs scheduled inspect <id>Úscheduled_job_idsz>Scheduled Job IDs to inspect (or 'namespace/scheduled_job_id')c                 ó  — g }| D ]"  }t        ||«      \  }}|j                  |«       Œ$ |} t        |¬«      }| D �cg c]  }|j                  ||¬«      ‘Œ }}t	        j
                  |D �cg c]  }t        |«      ‘Œ c}«       yc c}w c c}w )z:Display detailed information on one or more scheduled Jobsr\   ©Úscheduled_job_idr(   N)r2   rÁ   r!   Úinspect_scheduled_jobr&   rö   r%   )	rj  r(   rZ   rÍ   r'   r6   rm  rf  r[  s	            r1   Úscheduled_inspectro    s£   € ð €JØ#ò "ˆÜ8¸ÀÓKÑˆ�	Ø×Ñ˜&Õ!ð"ð #ÐÜ
˜5Ô
!€Cð !2öàð 	×!Ñ!Ð3CÈyÐ!ÕYð€Nð ô ‡I�IÀnÖU°]Ô! -Õ0ÒUÕVùò	ùò Vr#  Údeletezhf jobs scheduled delete <id>rm  c                 óŽ   — t        | |«      \  } }t        |¬«      }|j                  | |¬«       t        j                  d| ¬«       y)zDelete a scheduled Job.r\   rl  zScheduled Job deletedr&  N)r2   r!   Údelete_scheduled_jobr&   rs   ©rm  r(   rZ   r6   s       r1   Úscheduled_deletert  $  óF   € ô #?Ð?OÐQZÓ"[ÑÐ�iÜ
˜5Ô
!€CØ×ÑÐ.>È)ÐÔTÜ‡J�JÐ&Ð+;Ö<r3   zhf jobs scheduled suspend <id>c                 óÀ   — t        | |«      \  } }t        |¬«      }|j                  | |¬«       t        j                  d| ¬«       t        j
                  d| › d�«       y)z Suspend (pause) a scheduled Job.r\   rl  zScheduled Job suspendedr&  zUse `hf jobs scheduled resume z` to resume it.N)r2   r!   Úsuspend_scheduled_jobr&   rs   rx   rs  s       r1   Úscheduled_suspendrx  1  s^   € ô #?Ð?OÐQZÓ"[ÑÐ�iÜ
˜5Ô
!€CØ×ÑÐ/?È9ÐÔUÜ‡J�JÐ(Ð-=Õ>Ü‡H�HÐ-Ð.>Ð-?¸ÐOÕPr3   Úresumezhf jobs scheduled resume <id>c                 óŽ   — t        | |«      \  } }t        |¬«      }|j                  | |¬«       t        j                  d| ¬«       y)z!Resume (unpause) a scheduled Job.r\   rl  zScheduled Job resumedr&  N)r2   r!   Úresume_scheduled_jobr&   rs   rs  s       r1   Úscheduled_resumer|  ?  ru  r3   z>hf jobs scheduled labels <id> --label env=prod --label team=mlz%hf jobs scheduled labels <id> --clearz)Remove all labels from the scheduled job.c                 óþ   — |s|st        d«      ‚|r|rt        d«      ‚t        | |«      \  } }t        |«      xs i }t        |¬«      }|j	                  | ||¬«      }t        j                  d|j                  ¬«       y)z?Update labels on a scheduled Job. Replaces all existing labels.r9  r:  r\   )rm  r]   r(   r;  r&  N)r   r2   rr   r!   Úupdate_scheduled_job_labelsr&   rs   r=   )rm  rQ   r7  r(   rZ   r]   r6   r[  s           r1   Úscheduled_labelsr  L  sŒ   € ñ ™ÜÐhÓiÐiÙ‘ÜØpó
ð 	
ô #?Ð?OÐQZÓ"[ÑÐ�iÜ˜uÓ%Ò+¨€FÜ
˜5Ô
!€CØ×3Ñ3Ø)°&ÀIð 4ó €Mô ‡J�JÐ M×$4Ñ$4Ö5r3   z)Schedule UV scripts on HF infrastructure.z.hf jobs scheduled uv run "0 0 * * *" script.pyz<hf jobs scheduled uv run "0 0 * * *" script.py --with pandasc                 óB  — t        ||«      }t        ||«      }t        |¬«      }|j                  ||xs g | |||||||t        |	«      t	        |
«      ||||¬«      }t        j                  d|j                  ¬«       t        j                  d|j                  › d�«       y)rM  r\   )rH  rI  rS  rT  rU  rN  rK  rM   rO   rP   r]   r^   rU   rV   rX   r(   rW  r&  rX  rY  N)	r"   r!   Úcreate_scheduled_uv_jobrr   r#   r&   rs   r=   rx   )rS  rH  rI  rT  rU  rM   rU   rO   rP   rQ   rR   rS   rT   rV   rX   r(   rZ   rJ  rK  r{   r|   r6   r7   s                          r1   Úscheduled_uv_runr‚  n  sª   € ô< ˜C Ó*€GÜ ¨Ó6€Kä
˜5Ô
!€CØ
×
%Ñ
%ØØÒ% 2ØØØØØØØØÜ  Ó'Ü˜fÓ%ØØØØð! &ó €Cô$ ‡J�JÐ&¨3¯6©6Õ2Ü‡H�HÐ.¨s¯v©v¨hÐ6LÐMÕNr3   c                 ób   — | syi }| D ]$  }d|v r|j                  dd«      n|df\  }}|||<   Œ& |S )a  Parse label key-value pairs from CLI arguments.

    Args:
        labels: List of label strings in KEY=VALUE format. If KEY only, then VALUE is set to empty string.

    Returns:
        Dictionary mapping label keys to values, or None if no labels provided.
    Nrˆ   r   r;   )r.   )r]   Ú
labels_mapÚ	label_varr‹   rŽ   s        r1   rr   rr   ©  sQ   € ñ ØØ!#€JØò  ˆ	Ø03°yÑ0@�Y—_‘_ S¨!Ô,ÀyÐRTÀo‰
ˆˆUØˆ
�3Šð ð Ðr3   r²   r¿   c           
      óô  — t        g | ¢|‘­Ž D �cg c]  }t        d„ |D «       «      ‘Œ }}t        t        j                  «       j                  t        |«      dz  «      }t        |«      t        |«      z   |kD  r|j                  t        |«      «      }||xx   dz  cc<   t        |«      t        |«      z   |k  r#|t        |«      z
  t        |«      z
  ||   z   ||<   t        |«      t        |«      z   |kD  rŒ dt        |«      z  j                  |Ž }g }|j                   |j                  |Ž «       |j                   |j                  |D �cg c]  }d|z  ‘Œ	 c}Ž «       | D ]r  }	t        |	|«      D �
�cg c];  \  }
}t        t        |
«      «      |kD  rt        |
«      d|dz
   dz   n
t        |
«      ‘Œ= }}
}|j                   |j                  |Ž «       Œt d	j                  |«      S c c}w c c}w c c}}
w )
z‰
    Inspired by:

    - stackoverflow.com/a/8356620/593036
    - stackoverflow.com/questions/9535954/printing-lists-as-tabular-data
    c              3   óD   K  — | ]  }t        t        |«      «      –— Œ y ­wrì   )r­   rz   )rg   Úxs     r1   rh   z_tabulate.<locals>.<genexpr>Â  s   è ø€ Ò/ a”cœ#˜a›&—kÑ/ùs   ‚ é   r£   z{{:{}}} ú-Né   z...rb   )r®   ÚmaxÚshutilÚget_terminal_sizeÚcolumnsr­   ÚsumÚindexÚformatrÁ   rz   rw   )r²   r¿   ÚcolÚ
col_widthsÚterminal_widthÚcol_to_minimizeÚ
row_formatÚlinesÚwr±   rˆ  Ú	col_widthÚrow_format_argss                r1   rÈ   rÈ   »  sê  € ô <?Ð;NÀÐ;NÀgÒ;NÖO°C”#Ñ/¨3Ô/Õ/ÐO€JÐOÜœ×1Ñ1Ó3×;Ñ;¼SÀ»\ÈBÑ=NÓO€NÜ
ˆg‹,œ˜Z›Ñ
(¨>Ò
9Ø$×*Ñ*¬3¨z«?Ó;ˆØ�?Ó#¨Ñ)Ó#Üˆw‹<œ#˜j›/Ñ)¨^Ò;Ø*8¼3¸z»?Ñ*JÌSÐQXË\Ñ*YÐ\fÐgvÑ\wÑ*wˆJ�Ñ'ô	 ˆg‹,œ˜Z›Ñ
(¨>Ó
9ð
 4�*œs 7›|Ñ+×3Ñ3°ZÐ@€JØ€EØ	‡L�LÐ"�×"Ñ" GÐ,Ô-Ø	‡L�LÐ"�×"Ñ"°jÖ$A° S¨1£WÒ$AÐBÔCØò :ˆô !$ C¨Ó 4÷
á��9ô 03´3°q³6«{¸YÒ/FŒC�‹F�?�Y ‘]Ð# eÒ+ÌCÐPQËFÑRð
ˆñ 
ð 	�‰Ð&�Z×&Ñ&¨Ð8Õ9ð:ð �9‰9�UÓÐùò# Pùò %Bùó
s   �G*ÅG/Å6A G4rä   ÚqueueÚfunc.Úkwargsc                 ó@   —  |di |¤ŽD ]  }| j                  |«       Œ y )Nre   )Úput)rœ  r�  rž  rs   s       r1   Ú_write_generator_to_queuer¡  Ù  s#   € Ù‘.˜‘.ò ˆØ�	‰	�&Õñr3   rÅ   rÀ   c          	   #   ó6  K  — t        «       }|D �cg c]  }| j                  t        |||f«      ‘Œ }}	 	 	 |j                  d¬«      –— Œc c}w # t        $ r' t        d„ |D «       «      r|j                  «       rY nY Œ5w xY wn# t        $ r Y nw xY w	 |D �cg c]  }|j                  d¬«      ‘Œ nc c}w c} y# t        j                  $ r Y yw xY w# 	 |D �cg c]  }|j                  d¬«      ‘Œ nc c}w c} w # t        j                  $ r Y w w xY wxY w­w)a;  
    Takes a function that returns an iterable of items, and run it in parallel using threads to return the flattened iterable of items as they arrive.

    This is inspired by those three `map()` variants, and is the mix of all three:

    * `imap()`: like `map()` but returns an iterable instead of a list of results
    * `imap_unordered()`: like `imap()` but the output is sorted by time of arrival
    * `flatmap()`: like `map()` but given a function which returns a list, `flatmap()` returns the flattened list that is the concatenation of all the output lists
    gš™™™™™©?)rV   c              3   ó<   K  — | ]  }|j                  «       –— Œ y ­wrì   )Úready)rg   Úasync_results     r1   rh   z%iflatmap_unordered.<locals>.<genexpr>ô  s   è ø€ ÒN°�|×)Ñ)×+ÑNùs   ‚N)
r   Úapply_asyncr¡  r‰   r   rÖ   ÚemptyÚKeyboardInterruptrÄ   r0  )rÅ   r�  rÀ   rœ  rž  Úasync_resultsr¥  s          r1   rÊ   rÊ   Þ  s  è ø€ ô “g€EØfqÖrÐ\b�T×%Ñ%Ô&?À%ÈÈvÐAVÕWÐr€MÐrðØðØ—i‘i¨�iÓ-Ò-ð ùò søô
 ò ÜÑNÀÔNÔNÐSX×S^ÑS^ÔS`ÙùðúàøÜò Ùðúð	Ø@MÖN°ˆ\×Ñ dÐÕ+ÑNùÖNøÜ×+Ñ+ò 	Ùð	ûð	Ø@MÖN°ˆ\×Ñ dÐÕ+ÑNùÖNøÜ×+Ñ+ò 	Ùð	ÿsÇ   ‚D‘ A±D´B ¶A Á
B ÁDÁ+B Á;B Á?B Â B ÂC Â	BÂC ÂBÂC ÂB; ÂB2Â1	B; Â:DÂ;CÃDÃCÃDÃDÃC=ÃC4Ã3	C=Ã<DÃ=DÄDÄDÄDÄD)NNNNNNNNFNFNN)FNNN)NNN)r)   N)NN)NFNN)NNNNNNNNNNFNFNNNN)NNNNNNNNNNNNN)NNNNNNNNNNNNNNNNN)zÚ__doc__rÄ   Úmultiprocessing.poolr�  rÇ   Úcollections.abcr   r   r   rœ  r   r   Útypingr   r	   r
   Úurllib.parser   ÚtyperÚhuggingface_hubr   r   r   r   Úhuggingface_hub._jobs_apir   Úhuggingface_hub.errorsr   Úhuggingface_hub.utilsr   Ú$huggingface_hub.utils._cache_managerr   Úhuggingface_hub.utils._parsingr   r   Ú
_cli_utilsr   r   r   r   r   r   r   r   r   r    r!   r"   r#   r$   Ú_outputr%   r&   Ú
get_loggerÚ__name__Úloggerrz   Útupler2   rÌ   ÚArgumentÚImageArgÚOptionÚImageOptÚ	FlavorOptrv   Ú	LabelsOptÚ
TimeoutOptÚboolÚ	DetachOptÚNamespaceOptÚintÚ	ExposeOptÚSshEnabledOptÚWithOptÚ	PythonOptÚ
SuspendOptÚConcurrencyOptÚScheduleArgÚ	ScriptArgÚScriptArgsArgÚ
CommandArgÚJobIdArgÚ	JobIdsArgÚScheduledJobIdArgÚjobs_clirH   rN   r   rƒ   r¬   r�   r™   rµ   rÔ   r  r  r"  r(  r6  r=  rF  Úuv_appÚ	add_typerrQ  Úscheduled_appr\  ri  ro  rt  rx  r|  r  Úscheduled_uv_appr‚  rr   rÈ   rä   r¡  rÅ   rÆ   rÊ   re   r3   r1   ú<module>rÙ     sü  ðñ3ój Û Û Û ß .Ý ß ß *Ñ *Ý !ã ç AÓ AÝ 9Ý +Ý )Ý =ß J÷÷ ÷ ÷ ÷  -ð 
ˆ×	Ñ	˜HÓ	%€ð.¨ð .¸¸t¹ð .ÈÈcÐSVÐY]ÑS]ÈoÑH^ó .ð8  Ð ð ØØ€E‡N�NØ'ôðñ€ð Øˆ$�JØ€E‡L�LØ=ôðñ€ð Øˆ$�JØ€E‡L�LØrÙ˜kÓ*ôðñ€	ð Øˆ�I�ÑØ€E‡L�LØØØBôðñ€	ð Øˆ$�JØ€E‡L�LØeôðñ€
ð ØØ€E‡L�LØØØBôðñ€	ð Øˆ$�JØ€E‡L�LØeôðñ€ð Øˆ�I�ÑØ€E‡L�LØð Gôðñ€	ð ØØ€E‡L�LØð pôðñ€ð Øˆ�I�ÑØ€E‡L�LØØ4ôðñ€ð Øˆ$�JØ€E‡L�LØØØDôðñ€	ð Øˆ4�KØ€E‡L�LØ0ôðñ€
ð Øˆ4�KØ€E‡L�LØGôðñ€ð ØØ€E‡N�NØfôðñ€ð ØØ€E‡N�NØ3ôðñ€	ð Øˆ�I�ÑØ€E‡N�NØ'ôðñ€ð Øˆ�IØ€E‡N�NØ"ôðñ€
ð ØØ€E‡N�NØ-ôðñ€ð Øˆ�I�ÑØ€E‡N�NØ.ôðñ€	ð ØØ€E‡N�NØAôðñÐ ñ Ð?Ô@€ð	* uð 	*°7ð 	*¸tó 	*ð 
×ÑØ	Ø.°Ð5òð ó 
ð ØØØØØ#'ØØØØØØ"Øñ-,Øð-,àð-,ð 
ð-,ð ð	-,ð
 ð-,ð ð-,ð ð-,ð !ð-,ð ð-,ð ð-,ð ð-,ð ð-,ð 
ð-,ð ð-,ð ð-,ð  
ò!-,ó
ð-,ð` 
×ÑØ
òð ó ð$ 	ð 	Ø"Øñ'&xØð&xàØØˆ�‰ØØð Eô	
ð	ñð&xð Øˆd‰
Øˆ�‰ØØð Jô	
ð	ñð&xð$ ð%&xð& ð'&xð( 
ò)&xóð&xðR T¨#¨s¨(¡^ð ¸dÀ5ÈÈcÐSVÈÑCWÑ>Xð Ð]aó ð'�3ð '˜4ó 'ðØðØ!)¨$¨s°C¨x©.Ñ!9ðØJNÈsÉ)ðàˆe�D˜#˜t D¨¨s©¡OÑ4Ð4Ñ5Ñ6óð8 
×Ñ�'Ð%=Ð$>ÐÓ?àØ"ØñA'ØðA'àðA'ð ðA'ð 
ò	A'ó @ðA'ðH 
×Ñ�$ ,°Ð!@ÐÓAð 	Ø"Øð 	ñ%caØ	ØØˆ�‰ØØØ=ô	
ð	ñ
ðcað ðcað ðcað ØˆS‰	�DÑØˆ�‰ØØØQô	
ð	ñðcað& 
ò'caó BðcaðL 
×Ñ�*Ð(:Ð';ÐÓ<ò]ó =ð]ð6 
×Ñ�)Ð'AÐ&BÐÓCð #Øñ9ØØˆS‰	Øˆ�‰Ø=ô	
ð	ñð9ð ð9ð ð9ð 
ò9ó Dð9ð* 
×Ñ�(Ð&?Ð%@ÐÓAð #Øñ	+Øð	+àð	+ð ð	+ð 
ò		+ó Bð	+ð 
×ÑØ
òð ó ð( 	Ø"Øñ4
ØØˆS‰	Øˆ�‰Ø?ô	
ð	ñð4
ð Øˆd‰
Øˆ�‰Ømô	
ð	ñð4
ð ð4
ð ð4
ð 
ò4
óð4
ðn 
×ÑØàBØ)ðð ó ð Ø^cØ"Øñ,Øð,àð,ð �T˜<˜5Ÿ<™<¨	Ð8YÔZÐZÑ[ð,ð ð	,ð
 ð,ð 
ò,óð,ð* 
×ÑØ	òð ó ð )-Ø!Ø"Øñ#Øð#à%ð#ð ð#ð ð	#ð
 ð#ð 
ò#óð#ñL 
ÐdÔ	e€Ø × Ñ �6 Ð Ô %ð ‡�Ø	Ø.°Ð5òð ó 
ð "&ØØØØØØØØ#'ØØØØØ"ØØØñ%3,Øð3,àð3,ð ð3,ð ð	3,ð
 
ð3,ð ð3,ð ð3,ð ð3,ð ð3,ð !ð3,ð ð3,ð ð3,ð ð3,ð 
ð3,ð ð3,ð  ð!3,ð" ð#3,ð$ ð%3,ð& 
ò'3,ó
ð3,ñl Ð#QÔR€Ø × Ñ �= {Ð Ô 3ð ×ÑØ	Ø.°Ð5ØNÐOð ó ð Ø"&ØØØØØØ#'ØØØØ"Øñ!'YØð'Yàð'Yð ð'Yð ð	'Yð
  ð'Yð 
ð'Yð ð'Yð ð'Yð ð'Yð ð'Yð !ð'Yð ð'Yð ð'Yð ð'Yð ð'Yð  ð!'Yð" 
ò#'Yóð
'YðT ×Ñ�tÐ'=Ð&>ÐÓ?ð 	Ø"Øð 	ñ%KFØ	ØØˆ�‰ØØØDô	
ð	ñ
ðKFð ðKFð ðKFð ØˆS‰	�DÑØˆ�‰ØØØQô	
ð	ñðKFð& 
ò'KFó @ðKFð\ ×Ñ�yÐ,LÐ+MÐÓNð #ØñWØ ØˆS‰	Øˆ�‰ØQô	
ð	ñðWð ðWð ðWð 
òWó OðWð0 ×Ñ�xÐ+JÐ*KÐÓLð #Øñ	=Ø'ð	=àð	=ð ð	=ð 
ò		=ó Mð	=ð ×Ñ�yÐ,LÐ+MÐÓNð #Øñ
QØ'ð
Qàð
Qð ð
Qð 
ò	
Qó Oð
Qð ×Ñ�xÐ+JÐ*KÐÓLð #Øñ	=Ø'ð	=àð	=ð ð	=ð 
ò		=ó Mð	=ð ×ÑØàHØ/ðð ó ð ØhmØ"Øñ6Ø'ð6àð6ð �T˜<˜5Ÿ<™<¨	Ð8cÔdÐdÑeð6ð ð	6ð
 ð6ð 
ò6óð6ñ. !Ð&QÔRÐ Ø × Ñ Ð(¨tÐ Ô 4ð ×ÑØ	Ø.°Ð5à8ØFðð ó ð "&ØØ"&ØØØØØØØØ#'ØØØ"ØØØñ'-OØð-Oàð-Oð ð-Oð ð	-Oð
  ð-Oð ð-Oð ð-Oð 
ð-Oð ð-Oð ð-Oð ð-Oð ð-Oð !ð-Oð ð-Oð ð-Oð  ð!-Oð" ð#-Oð$ ð%-Oð& ð'-Oð( 
ò)-Oóð-Oðf˜d 3™i¨$Ñ.ð °4¸¸S¸±>ÀDÑ3Hó ð$�D˜˜c C™i™Ñ)ð °D¸±Ið À#ó ñ6 ˆCƒL€ð U¨1¡Xð °X¸cÀ8ÈAÁ;Ð>NÑ5Oð ÐY]ð Ðbfó ð
Ø
×
Ñ
×
)Ñ
)ðà
�3˜ ™Ð#Ñ
$ðð �d‘ð	ð
 ˆa�[ôr3   