
    Zi              &          d Z ddlZddlZddlZddlZddlZddlZddl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 ddlZdd	l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(m)Z)m*Z*m+Z+m,Z,m-Z-m.Z.m/Z/  e"j0        e1          Z2de3dee3         de4e3ee3         f         fdZ5d eD             Z6dZ7ee3 ej8        d          f         Z9eee3          ej:        d          f         Z;eee          ej:        d          f         Z<eee=e3                   ej:        ddd          f         Z>eee=e3                   ej:        ddd          f         Z?eee=e3                   ej:        d d!d"          f         Z@eee3          ej:        d#d$          f         ZAeee3          ej:        d%          f         ZBeee3          ej:        d&          f         ZCeeD ej:        d'd(d)          f         ZEeee3          ej:        d*          f         ZFeee=e3                   ej:        d+d,          f         ZGeee3          ej:        d-d.d/          f         ZHeeeD          ej:        d0          f         ZIeeeD          ej:        d1          f         ZJee3 ej8        d2          f         ZKee3 ej8        d3          f         ZLeee=e3                   ej8        d4          f         ZMee=e3          ej8        d5          f         ZNee3 ej8        d6          f         ZOeee=e3                   ej8        d7          f         ZPee3 ej8        d8          f         ZQ e/d9          ZReRS                    d:d;d<ig d=>          	 	 	 	 	 	 	 	 	 	 dd@e9dAeNdBe>dCe?dDe@dEeAdFeBdGe<dHeCdIeEdeFdJe*ddfdK            ZTeRS                    dLg dMN          	 	 	 	 ddeOdOeeD ej:        dPdQdR          f         dSeeeU          ej:        dTdUdV          f         deFdJe*ddfdW            ZVdXeWe3e3f         dYe=e4e3e3e3f                  deDfdZZXd[e=e=ee3eUf                           d\e=e3         d]e=e3         d^ee3         ddf
d_ZYd`eUddfdaZZde3dbeeWe3ef                  dce=e3         dee4eDe3e=e=ee3eUf                           f                  fddZ[eRS                    dedfgN          	 	 	 ddgePdeFdJe*ddfdh            Z\eRS                    didjdkgN          	 	 	 	 	 	 	 ddleeD ej:        dmdndo          f         deFdJe*dpeee=e3                   ej:        dPdqdr          f         dseee3          ej:        dt          f         due)dveeD ej:        dwd<dxy          f         ddfdz            Z]eRS                    d{d|gN          dd}            Z^eRS                    d~dgN          	 	 ddgee=e3          ej8        d          f         deFdJe*ddfd            Z_eRS                    ddgN          	 	 ddeOdeFdJe*ddfd            Z` e/d          ZaeRb                    ead           eaS                    d:d;d<ig d>          	 	 	 	 	 	 	 	 	 	 	 	 	 	 ddeLdeMd@e;dGe<dBe>dCe?dDe@dEeAdFeBdHeCdIeEdeFdJe*deGdeHddf d            Zc e/d          ZdeRb                    edd           edS                    d:d;d<idg>          	 	 	 	 	 	 	 	 	 	 	 ddeKd@e9dAeNdeIdeJdBe>dCe?dDe@dEeAdFeBdGe<dHeCdeFdJe*ddfd            ZeedS                    didgN          	 	 	 	 	 	 	 ddleeD ej:        dmdnd          f         deFdJe*dpeee=e3                   ej:        dPdqdr          f         dseee3          ej:        dt          f         due)dveeD ej:        dwd<dxy          f         ddfd            ZfedS                    d~dgN          	 	 ddee=e3          ej8        d          f         deFdJe*ddfd            ZgedS                    ddgN          	 	 ddeQdeFdJe*ddfd            ZhedS                    ddgN          	 	 ddeQdeFdJe*ddfd            ZiedS                    ddgN          	 	 ddeQdeFdJe*ddfd            Zj e/d          Zkedb                    ekd           ekS                    d:d;d<iddg>          	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 ddeKdeLdeMdeIdeJd@e;dGe<dBe>dCe?dDe@dEeAdFeBdHeCdeFdJe*deGdeHddf$d            Zldee=e3                  deeWe3e3f                  fdZmd[e=e=ee3eUf                           d\e=e3         de3fdZndee3e3f         fdZo ed          Zpdeep         dedeep         f         deWddfdZqdejr        js        dedeep         f         de=eW         deep         fdZtdS )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] [--format table|json|TEMPLATE] [-q]

    # 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>

    # 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] [--format table|json] [-q]

    # 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)dequeasdict)fnmatch)Path)EmptyQueue)	AnnotatedAnyCallableDictIterableOptionalTypeVarUnion)SpaceHardware	get_token)CLIErrorHfHubHTTPError)logging)_format_size)load_dotenv   )OutputFormatQuietOptTokenOpt_format_cellapi_object_to_dict
get_hf_apiprint_list_outputtyper_factoryjob_id	namespacereturnc                 0   | st          d          |                     d          dk    rt          d|  d          d| vr| |fS |                     dd          \  }}|r|st          d|  d          |||k    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'.Nz(Conflicting namespace: got --namespace='z ' but job ID implies namespace='')r   countsplit)r"   r#   extracted_namespaceparsed_job_ids       S/root/projects/butler/venv/lib/python3.11/site-packages/huggingface_hub/cli/jobs.py_parse_namespace_from_job_idr-   d   s      20111||C1`V\```aaa
&y  )/c1)=)=& bm b`V\```aaa.A!A!Axyxxbuxxx
 
 	
 ---    c                 2    g | ]}|j         d k    |j         S )z	zero-a10g)value).0items     r,   
<listcomp>r3      s&    WWWDTZ;=V=VTZ=V=V=Vr.   g?zThe Docker image to use.)helpz.Use a custom Docker image with `uv` installed.ztFlavor for the hardware, as in HF Spaces. Run 'hf jobs hardware' to list available flavors. Defaults to `cpu-basic`.z-ez--envz/Set environment variables. E.g. --env ENV=valuez-sz	--secretszvSet secret environment variables. E.g. --secrets SECRET=value or `--secrets HF_TOKEN` to pass your Hugging Face token.z-lz--labelz3Set labels. E.g. --label KEY=VALUE or --label LABELz
--env-filez(Read in a file of environment variables.z/Read in a file of secret environment variables.zVMax 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--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.runignore_unknown_optionsT)z3hf jobs run python:3.12 python -c 'print("Hello!")'z3hf jobs run -e FOO=foo python:3.12 python script.pyz;hf jobs run --secrets HF_TOKEN python:3.12 python script.py)context_settingsexamplesFimagecommandenvsecretslabelenv_filesecrets_fileflavortimeoutdetachtokenc           
         i }|r_|                     t          t          |                                          t          j                                                             |pg D ]B}|                     t          |t          j                                                             Ci }t                      }|rC|                     t          t          |                                          |                     |pg D ]&}|                     t          ||                     't          |          }|	                    | |||t          |          |||
          }t          d|j                    t          d|j                    |	rdS |                    |j        |j        j        d          D ]}t          |           dS )	z
Run a Job.environrC   )r9   r:   r;   r<   labelsr@   rA   r#   Job started with ID: 	View at: NTr"   r#   follow)updater   r   	read_textosrF   copy_get_extended_environr   run_job_parse_labels_mapprintidurlfetch_job_logsownername)r9   r:   r;   r<   r=   r>   r?   r@   rA   rB   r#   rC   env_map	env_valuesecrets_mapextended_environsecretapijoblogs                       r,   jobs_runrb   .  s   0 )+G [{4>>#;#;#=#=rzGXGXYYYZZZYB J J	{9bjoo6G6GHHHIIII,.K,.. b;tL'9'9'C'C'E'EO_```aaa-R J J;v7GHHHIIII
5
!
!
!C
++ ''  	 	C 

*#&
*
*+++	
cg

    !!39>RV!WW  c



 r.   logs)zhf jobs logs <job_id>zhf jobs logs -f <job_id>zhf jobs logs --tail 20 <job_id>)r8   rL   z-fz--followzqFollow log output (stream until the job completes). Without this flag, only currently available logs are printed.tailz-nz--tailz1Number of lines to show from the end of the logs.c                    t          | |          \  } }|r|t          d          t          |          }	 |                    | ||          }|t	          ||          }|D ]}t          |           dS # t          $ rY}|j        |j        j        nd}	|	dk    rt          d          ||	dk    rt          d	          |t          d
|           |d}~ww xY w)zFetch 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.
    NzcCannot use --follow and --tail together. Use --follow to stream logs or --tail to show recent logs.rG   rK   )maxlen  'Job not found. Please check the job ID.  <Access denied. You may not have permission to view this job.zFailed to fetch job logs: )	r-   r   r   rW   r   rT   r   responsestatus_code)
r"   rL   rd   r#   rC   r_   rc   ra   estatuss
             r,   	jobs_logsro   i  s1   : 5VYGGFI 
$"q
 
 	
 5
!
!
!CD!!9V!TTd+++D 	 	C#JJJJ	 	 D D D+,:+A''tS==DEE1Ls]]YZZ`aa;;;<<!CDs   ?A9 9
CACCjob_propertiesfiltersc                     |D ]n\  }}}|                      |          }|
|dk    r$ dS t          |                                |                                          }|dk    r|r|dk    r|r dS odS )z5Check if scheduled job matches all specified filters.N!=F=T)getr   lower)rp   rq   keyop_strpatternr0   matchs          r,   _matches_filtersr{     s     '  VW""3''=~~55w}}77cMM%MVt^^^554r.   rowsheadersaliasesfmtc           	      
   |rb|}| D ][}|}t          |          D ]8\  }}d| d}	|	|v r)|                    |	t          ||                             }9t          |           \dS t          t	          | |                     dS )z,Print output according to the chosen format.z{{.z}})r}   N)	enumeratereplacestrrT   	_tabulate)
r|   r}   r~   r   templaterowlineifieldplaceholders
             r,   _print_outputr     s      0 	 	CD%g.. B B51e111$&&<<SQ[[AAD$KKKK	 	 	ig.../////r.   nc                 T    d}d}t          |           D ]}t          ||           d S )Nz[1Az[2K)end)rangerT   )r   LINE_UP
LINE_CLEARr   s       r,   _clear_liner     sA    GJ1XX ' 'g:&&&&&' 'r.   metrics_streamtable_headersc              #     K   |D ]}| |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         rt          |d         t                    r|gdgt	          |          z  gt	          |d                   dz
  z  z   }t          |t          |d                             D ]s\  }}|d         |         }||d          dt          d|d         z  |d         z  d	           dt          |d                    d
t          |d                    dgz  }tn)|dgt	          |          t	          |          z
  z  z  }|g}d| |fV  d| g fV  d S )Ncpu_usage_pct%cpu_millicoresg     @@r   d   memory_used_bytesmemory_total_bytes   zB / Brx_bpszbps / tx_bpsbpsgpus utilizationN/AFT)roundr   
isinstancedictlenzipsorted)r"   r   r   metricsr   r|   gpu_idgpus           r,   _get_jobs_stats_rowsr     sA      " " "'***'*+f4a88S7#677'BV:WWYZ[[^^^G$7899mm|GThLi?j?jmmmGH-..ZZl78CT6U6UZZZ
 6? 	z'&/4@@ 	5RD3s88O,GFO0D0Dq0HIID"4)@)@AA  Vfof-=),,,S3':#;;cBV>WWYZ[[^^^#C(;$<==mm<PSThPiCjCjmmm  E7c-003s88;<<C5DVT!!!!!

r.   statszhf jobs stats <job_id>job_idsc                    | 1g }| D ]*}t          |          \  }|                    |           +|} t          |                                          d         |  d                               D             } t          |           dk    rt          d           dS g dg d	}	 t          j        	                    t          |                     5 }i | D ]"}|g}|d
 dd         D             z  }|g|<   #t          j
                    }fdD             }	t          |	|d           fd| D             }
t          |t          |
          D ]\  }}}|r                    |d           n||<   t          j
                    }||z
  t          k    rAt!          dt          |	          z              fdD             }	t          |	|d           |}	 ddd           dS # 1 swxY w Y   dS # t"          $ rY}|j        |j        j        nd}|dk    rt)          d          ||dk    rt)          d          |t)          d|           |d}~ww xY w)z7Fetch the resource usage statistics and metrics of JobsNrG   rY   c                 J    g | ] }|j         r|j         j        nd dv |j        !S )UNKNOWNRUNNINGUPDATING)rn   stagerU   r1   r`   s     r,   r3   zjobs_stats.<locals>.<listcomp>  sA     
 
 
$'J=
  IBYYY FYYYr.   r#   r   zNo running jobs found)	JOB IDzCPU %zNUM CPUzMEM %z	MEM USAGEzNET I/Oz
GPU UTIL %z	GPU MEM %zGPU MEM USAGE)	rU   r   r   memory_used_bytes_pct!memory_used_bytes_and_total_bytesrx_bps_and_tx_bpsgpu_utilizationgpu_memory_used_bytes_pct%gpu_memory_used_bytes_and_total_bytesc                 &    g | ]}d |v sd|v rdndS )r&   USAGEz-- / --z-- )r1   headers     r,   r3   zjobs_stats.<locals>.<listcomp>  s/    tttX^cVmmw&7H7H		ttttr.   r   c                 *    g | ]}|         D ]}|S r   r   r1   r"   r   rows_per_job_ids      r,   r3   zjobs_stats.<locals>.<listcomp>  s,    ___&W]G^__#____r.   c                 F    g | ]}|                     |           dS )r"   r#   )r"   r   r   )fetch_job_metrics)r1   r"   r_   r#   r   s     r,   r3   zjobs_stats.<locals>.<listcomp>  sO        	 %&)&;&;6U^&;&_&_%2   r.   )kwargs_listr   c                 *    g | ]}|         D ]}|S r   r   r   s      r,   r3   zjobs_stats.<locals>.<listcomp>+  s,    !g!g!g&_eOf!g!g#!g!g!g!gr.   rg   rh   ri   rj   zFailed to fetch job stats: )r-   appendr   whoami	list_jobsr   rT   multiprocessingpool
ThreadPooltimer   iflatmap_unorderedr   popSTATS_UPDATE_MIN_INTERVALr   r   rk   rl   r   )r   r#   rC   
parsed_idsr"   headers_aliasesr   r   last_update_time
total_rowsr   doner|   nowrm   rn   r_   r   r   s    `              @@@r,   
jobs_statsr     s    
 	& 	&F <VY O OFIf%%%%
5
!
!
!CJJLL(	
 
}}y}99
 
 

 7||q%&&&
 
 
M
 
 
O%E!,,S\\:: 	+dFHO! 0 0.4Xttbopqprprbstttt+.%''#y{{____O___J*m_dKKK      &  K '9?Sal&m&m&m 
+ 
+"fd 3#''5555.2OF+ikk))-FFFC
OO 3444!g!g!g!gO!g!g!gJ!*m_dSSS'*$
+%	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+:  E E E+,:+A''tS==DEE1Ls]]YZZ`aa<<<==1DEs>   3,H D	G6)H 6G::H =G:>H 
I&A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)formatzKOutput format: 'table' (default), 'json', or a Go template (e.g. '{{.id}}')quiet	json_flagz--jsonz)Output as JSON (alias for --format json).)hiddenr4   c                    |rd}t          |          }|                    |          }g }	g }
|pg D ]}|                    d          s|                    d          r|                    d          r6|t          d          d         }d|v rt	          d| d	           q|d
d}}}n]|t          d          d         }d|v r|                    dd          \  }}n|d}}|                    d          rd
}|dd         }nd}|
                    |                                ||                                f           d|v r{|                    dd          \  }}|                    d          rd
}|dd         }nd}|	                    |                                ||                                f           t	          d| d           g }|D ]}|j	        r|j	        j
        nd}| s|dvr|j        pd}|j        pg }|rd                    |          nd}|j        ||                                |d}t          ||	          sxt          |j        pi |
          s|                    |           |sX|s?|dk    r9|	r"dd                    d |	D                        nd}t	          d|            n|dk    rt	          d           dS g d}g d}d |D             }dt"          t$          t&          f         d t(          t$                   fd!|r$|d"vr t+          fd#|D             |||           dS |dk    rt,          j        nt,          j        }t3          |||d$|%           dS )&z
List Jobs.jsonrG   r   zlabel!=zlabel=Nrt   z6Warning: Ignoring invalid label filter format 'label!=z'. Use label!=key format.rs   *r   !)Warning: Ignoring invalid filter format ''. Use key=value format.r   r   r    )rU   r9   rn   r:    matching filters: , c                 &    g | ]\  }}}| | | S r   r   r1   kovs       r,   r3   zjobs_ps.<locals>.<listcomp>  +    :_:_:_GAqRSa<<A<<:_:_:_r.   r   zNo jobs found[])r   IMAGE/SPACECOMMANDCREATEDSTATUS)rU   r9   r:   createdrn   c                 ,    g | ]}t          |          S r   r   r   s     r,   r3   zjobs_ps.<locals>.<listcomp>  s!    >>>$$>>>r.   r2   r$   c           
         |                      di           }|                      d          pg }|rd                    |          nd}t          |                      dd                    t          |                      d          pd          t          |          |                      d          r$| d         d d	                             d
d          ndt          |                     dd                    gS )Nrn   r:   r   r   rU   r   docker_image
created_at   Tr   r   )ru   joinr   r   r   )r2   rn   cmdcommand_strs       r,   row_fnzjobs_ps.<locals>.row_fn  s    (B''hhy!!'R'*5chhsmmmr""##.11:U;;%%9=,9O9OZDss#++C555UZ

7I..//
 	
r.   tabler   c                 &    g | ]} |          S r   r   r1   r2   r  s     r,   r3   zjobs_ps.<locals>.<listcomp>  !    666vvd||666r.   rU   itemsr   r   id_keyr}   r  )r   r   
startswithr   rT   r)   endswithr   rv   rn   r   r   r:   r  rU   r{   rH   r   r   r   listr   r   r   r  r    )r   r#   rC   r   r   r   r   r_   jobsrq   labels_filtersf
label_part	label_keyoplabel_valuerw   r0   filtered_jobsr`   rn   image_or_spacer  r  propsfilters_msgr}   r~   r  output_formatr  s                                 @r,   jobs_psr  8  se   <  
5
!
!
!C==9=--D*,G13N\r ![ ![<<	""  	[all8&<&<  	[||I&& s9~~//0
*$$vQ[vvv   -7s{2		s8}}/
*$$-7-=-=c1-E-E*I{{-7{I%%c** B )#2#IIB!!9??#4#4b+:K:K:M:M"NOOOOAXXaJC||C   #2#hNNCIIKKU[[]];<<<<YaYYYZZZZ M " "%(Z>!!Y 	v%<<<)2UkR'*5chhsmmmv&,,..]hiiw// 	
 0b.AA 	S!!!!  	6))fmub		:_:_W^:_:_:_0`0`bbbsuK/+//0000v$KKKGGGG===G>>>>>E

T#s(^ 

S	 

 

 

 

  
& 1116666666&QQQQQ-3v-=-=))<CU 	
 	
 	
 	
 	
 	
r.   hardwarezhf jobs hardwarec            
         t                      } |                                 }g d}g d}g }|D ]}d}|j        r)|j        j         d|j        j         d|j        j         d}|j        d|j        d	nd}|j        d|j        d
z  dnd}|                    |j        |j	        pd|j
        |j        |||g           |st          d           dS t          |||d           dS )z(List available hardware options for Jobs)NAMEzPRETTY NAMECPURAMACCELERATORzCOST/MINz	COST/HOUR)rY   
prettyNamecpuramacceleratorcostMincostHourr   zx z ()N$z.4f<   z.2fzNo hardware options found)r   list_jobs_hardwarer'  quantitymodelvramunit_cost_usdr   rY   pretty_namer%  r&  rT   r   )	r_   hardware_listr   r   r|   hwaccelerator_infocost_min	cost_hours	            r,   jobs_hardwarer8    s>    ,,C**,,MaaaM```O(*D o o > 	l"$."9kkR^=QkkUWUcUhkkk131A1M-r'----SX797G7S3(2-3333Y^	RWbn5rvrvGWYaclmnnnn )***$=====r.   inspectzhf jobs inspect <job_id>z*Job IDs to inspect (or 'namespace/job_id')c                    g }| D ]*}t          |          \  }|                    |           +|} t          |          	 fd| D             }t          t	          j        d |D             dt                               dS # t          $ rY}|j        |j        j	        nd}|dk    rt          d          ||d	k    rt          d
          |t          d|           |d}~ww xY w)z0Display detailed information on one or more JobsrG   c                 >    g | ]}                     |           S )r   )inspect_job)r1   r"   r_   r#   s     r,   r3   z jobs_inspect.<locals>.<listcomp>  s)    ZZZvCCZZZr.   c                 ,    g | ]}t          |          S r   r   r   s     r,   r3   z jobs_inspect.<locals>.<listcomp>  s    666#&++666r.      indentdefaultNrg   rh   ri   rj   zFailed to inspect job: )r-   r   r   rT   r   dumpsr   r   rk   rl   r   )	r   r#   rC   r   r"   r  rm   rn   r_   s	    `      @r,   jobs_inspectrC    s8    J " "8KK	&!!!!G
5
!
!
!C
AZZZZZRYZZZdj66666q#NNNOOOOO A A A+,:+A''tS==DEE1Ls]]YZZ`aa8Q8899q@As   AB	 	
C,AC''C,cancelzhf jobs cancel <job_id>c                 H   t          | |          \  } }t          |          }	 |                    | |           dS # t          $ rY}|j        |j        j        nd}|dk    rt          d          ||dk    rt          d          |t          d|           |d}~ww xY w)	zCancel a JobrG   r   Nrg   rh   ri   z>Access denied. You may not have permission to cancel this job.zFailed to cancel job: )r-   r   
cancel_jobr   rk   rl   r   )r"   r#   rC   r_   rm   rn   s         r,   jobs_cancelrG    s     5VYGGFI
5
!
!
!C	@f	::::: @ @ @+,:+A''tS==DEE1Ls]][\\bcc7A7788a?@s   > 
B!ABB!zFRun UV scripts (Python with inline dependencies) on HF infrastructure.uv)rY   )zhf jobs uv run my_script.pyz1hf jobs uv run ml_training.py --flavor a10g-smallz+hf jobs uv run --with transformers train.pyscriptscript_argswith_pythonc                    i }|r_|                     t          t          |                                          t          j                                                             |pg D ]B}|                     t          |t          j                                                             Ci }t                      }|rC|                     t          t          |                                          |                     |pg D ]&}|                     t          ||                     't          |          }|	                    | |pg |||||t          |          ||	|          }t          d|j                    t          d|j                    |
rdS |                    |j        |j        j        d          D ]}t          |           dS )	8Run a UV script (local file or URL) on HF infrastructurerE   rG   )rI  rJ  dependenciesrL  r9   r;   r<   rH   r@   rA   r#   rI   rJ   NTrK   )rM   r   r   rN   rO   rF   rP   rQ   r   
run_uv_jobrS   rT   rU   rV   rW   rX   rY   )rI  rJ  r9   r@   r;   r<   r=   r>   r?   rA   rB   r#   rC   rK  rL  rZ   r[   r\   r]   r^   r_   r`   ra   s                          r,   jobs_uv_runrQ    s   6 )+G [{4>>#;#;#=#=rzGXGXYYYZZZYB J J	{9bjoo6G6GHHHIIII,.K,.. b;tL'9'9'C'C'E'EO_```aaa-R J J;v7GHHHIIII
5
!
!
!C
..%2 ''   C 

*#&
*
*+++	
cg

    !!39>RV!WW  c



 r.   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                    i }|r_|                     t          t          |                                          t          j                                                             |pg D ]B}|                     t          |t          j                                                             Ci }t                      }|	rC|                     t          t          |	                                          |                     |pg D ]&}|                     t          ||                     't          |          }|	                    ||| ||||t          |          |
||          }t          d|j                    dS )zSchedule a Job.rE   rG   )r9   r:   rS  rT  rU  r;   r<   rH   r@   rA   r#   Scheduled Job created with ID: N)rM   r   r   rN   rO   rF   rP   rQ   r   create_scheduled_jobrS   rT   rU   )rS  r9   r:   rT  rU  r;   r<   r=   r>   r?   r@   rA   r#   rC   rZ   r[   r\   r]   r^   r_   scheduled_jobs                        r,   scheduled_runrZ  K  s   , )+G [{4>>#;#;#=#=rzGXGXYYYZZZYB J J	{9bjoo6G6GHHHIIII,.K,.. b;tL'9'9'C'C'E'EO_```aaa-R J J;v7GHHHIIII
5
!
!
!C,, '' -  M 

>M,<
>
>?????r.   zhf jobs scheduled psz1Show all scheduled Jobs (default hides suspended)c                    |rd}t          |          }|                    |          }g }	|pg D ]}
d|
v rz|
                    dd          \  }}|                    d          rd}|dd	         }nd}|	                    |                                ||                                f           t          d
|
 d           g }|D ]}|j        pd}| s|r|j        j	        pd}|j        j
        pg }|rd                    |          nd}|j        |t          |          |d}t          ||	          so|                    |           |sX|s?|dk    r9|	r"dd                    d |	D                        nd}t          d|            n|dk    rt          d           dS g d}g d}d |D             }dt          t          t           f         dt"          t                   fd|r$|dvr t%          fd|D             |||           dS |dk    rt&          j        nt&          j        }t-          |||d|           dS ) zList scheduled Jobsr   rG   r   rt   r   r   rs   Nr   r   r   Fr   r   )rU   r9   rT  r:   r   r   c                 &    g | ]\  }}}| | | S r   r   r   s       r,   r3   z scheduled_ps.<locals>.<listcomp>  r   r.   r   zNo scheduled jobs foundr   )IDSCHEDULEr   r   zLAST RUNzNEXT RUNSUSPEND)rU   rS  r9   r:   lastnextrT  c                 ,    g | ]}t          |          S r   r   )r1   sjs     r,   r3   z scheduled_ps.<locals>.<listcomp>  s!    <<<##<<<r.   r2   r$   c                    |                      di           }|                      di           }|                     d          }|                     d          pg }d}|r9|                     d          r$|d         d d                             dd	          }d}|                     d
          r$|d
         d d                             dd	          }|rd	                    |          nd}t          |                      dd                    t          |                      d          pd          t	          |                     d          pd          t	          |          ||t          |                      dd                    gS )Njob_specrn   last_jobr:   r   atr   r  r   next_job_run_atrU   r   rS  r   rT  F)ru   r   r  r   r   )r2   re  rn   rf  r  last_job_atnext_runr  s           r,   r  zscheduled_ps.<locals>.row_fn  so   88J++(B''::j))ll9%%+ 	@T** 	@"4."-55c3??K::'(( 	H/0"5==c3GGH'*5chhsmmmr""##$$-..n55>??%%E**++
 	
r.   r  c                 &    g | ]} |          S r   r   r	  s     r,   r3   z scheduled_ps.<locals>.<listcomp>  r
  r.   rU   r  )r   list_scheduled_jobsr)   r  r   rv   rT   rT  re  r   r:   r  rU   r   r{   r   r   r  r   r   r   r  r    )r   r#   rC   r   r   r   r   r_   scheduled_jobsrq   r  rw   r0   r  r  rY  rT  r  r  r  r  r  r}   r~   r  r  r  s                             @r,   scheduled_psrn  ~  s   <  
5
!
!
!C,,y,AAN*,G\r [ [!88aJC||C   #2#hNNCIIKKU[[]];<<<<YaYYYZZZZ M' 
, 
,'05 	w 	&/<E$,2'*5chhsmmm$'.SQX\\fqrrw// 	]++++  	6))fmub		:_:_W^:_:_:_0`0`bbbsuK9K99::::v$KKK]]]GOOOG<<m<<<E
T#s(^ 
S	 
 
 
 
.  
& 1116666666&QQQQQ-3v-=-=))<CU 	
 	
 	
 	
 	
 	
r.   zhf jobs scheduled inspect <id>scheduled_job_idsz>Scheduled Job IDs to inspect (or 'namespace/scheduled_job_id')c                    g }| D ]*}t          |          \  }|                    |           +|} t          |          fd| D             }t          t	          j        d |D             dt                               dS )z:Display detailed information on one or more scheduled JobsrG   c                 >    g | ]}                     |           S )scheduled_job_idr#   )inspect_scheduled_job)r1   rs  r_   r#   s     r,   r3   z%scheduled_inspect.<locals>.<listcomp>   s=        	!!3Cy!YY  r.   c                 ,    g | ]}t          |          S r   r   )r1   rY  s     r,   r3   z%scheduled_inspect.<locals>.<listcomp>  s     PPPf]++PPPr.   r>  r?  N)r-   r   r   rT   r   rB  r   )ro  r#   rC   r   r"   rm  r_   s    `    @r,   scheduled_inspectrv    s     J# " "8KK	&!!!!"
5
!
!
!C     1  N 
$*PPPPPYZdg
h
h
hiiiiir.   deletezhf jobs scheduled delete <id>rs  c                 z    t          | |          \  } }t          |          }|                    | |           dS )zDelete a scheduled Job.rG   rr  N)r-   r   delete_scheduled_jobrs  r#   rC   r_   s       r,   scheduled_deleter{    K     #??OQZ"["[i
5
!
!
!C.>)TTTTTr.   zhf jobs scheduled suspend <id>c                 z    t          | |          \  } }t          |          }|                    | |           dS )z Suspend (pause) a scheduled Job.rG   rr  N)r-   r   suspend_scheduled_jobrz  s       r,   scheduled_suspendr    sK     #??OQZ"["[i
5
!
!
!C/?9UUUUUr.   resumezhf jobs scheduled resume <id>c                 z    t          | |          \  } }t          |          }|                    | |           dS )z!Resume (unpause) a scheduled Job.rG   rr  N)r-   r   resume_scheduled_jobrz  s       r,   scheduled_resumer    r|  r.   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                    i }|
r_|                     t          t          |
                                          t          j                                                             |pg D ]B}|                     t          |t          j                                                             Ci }t                      }|rC|                     t          t          |                                          |                     |pg D ]&}|                     t          ||                     't          |          }|	                    ||pg | |||||||t          |	          |||          }t          d|j                    dS )rN  rE   rG   )rI  rJ  rS  rT  rU  rO  rL  r9   r;   r<   rH   r@   rA   r#   rW  N)rM   r   r   rN   rO   rF   rP   rQ   r   create_scheduled_uv_jobrS   rT   rU   )rS  rI  rJ  rT  rU  r9   r@   r;   r<   r=   r>   r?   rA   r#   rC   rK  rL  rZ   r[   r\   r]   r^   r_   r`   s                           r,   scheduled_uv_runr  /  s   8 )+G [{4>>#;#;#=#=rzGXGXYYYZZZYB J J	{9bjoo6G6GHHHIIII,.K,.. b;tL'9'9'C'C'E'EO_```aaa-R J J;v7GHHHIIII
5
!
!
!C

%
%%2 '' &  C  

4CF
4
455555r.   rH   c                 h    | sdS i }| D ](}d|v r|                     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.
    Nrt   r   r   )r)   )rH   
labels_map	label_varrw   r0   s        r,   rS   rS   n  sa      t!#J    	03y0@0@Y__S!,,,yRTo
U
3r.   c                    d t          g | |R  D             }t          t          j                    j        t          |          dz            }t          |          t          |          z   |k    r|                    t          |                    }||xx         dz  cc<   t          |          t          |          z   |k    r.|t          |          z
  t          |          z
  ||         z   ||<   t          |          t          |          z   |k     dt          |          z  j        | }g }|	                     |j        |            |	                     |j        d |D                         | D ]9}d t          ||          D             }|	                     |j        |            :d
                    |          S )z
    Inspired by:

    - stackoverflow.com/a/8356620/593036
    - stackoverflow.com/questions/9535954/printing-lists-as-tabular-data
    c                 @    g | ]}t          d  |D                       S )c              3   N   K   | ] }t          t          |                    V  !d S Nr   r   )r1   xs     r,   	<genexpr>z'_tabulate.<locals>.<listcomp>.<genexpr>  s.      //ac#a&&kk//////r.   )max)r1   cols     r,   r3   z_tabulate.<locals>.<listcomp>  s/    OOOC#//3/////OOOr.      r   z{{:{}}} c                     g | ]}d |z  S )-r   )r1   ws     r,   r3   z_tabulate.<locals>.<listcomp>  s    $A$A$AS1W$A$A$Ar.   c                     g | ]Q\  }}t          t          |                    |k    rt          |          d |dz
           dz   nt          |          RS )N   z...r  )r1   r  	col_widths      r,   r3   z_tabulate.<locals>.<listcomp>  sf     
 
 
9 033q66{{Y/F/FCFF?Y]?#e++CPQFF
 
 
r.   
)r   r  shutilget_terminal_sizecolumnsr   sumindexr   r   r  )	r|   r}   
col_widthsterminal_widthcol_to_minimize
row_formatlinesr   row_format_argss	            r,   r   r     s    PO3;N;Ng;N;N;NOOOJ133;S\\B=NOON
g,,Z
(>
9
9$**3z??;;?###)###w<<#j//)^;;*83z??*JSQX\\*Y\fgv\w*wJ'	 g,,Z
(>
9
9
 4*s7||+3Z@JE	LL""G,---	LL""$A$Aj$A$A$ABCCC : :
 
 #C 4 4
 
 
 	&Z&8999999Ur.   c                  l    t           j                                        } t                      x}|| d<   | S )NHF_TOKEN)rO   rF   rP   r   )r]   rC   s     r,   rQ   rQ     s4    z(()',$r.   r  queuefunc.kwargsc                 F     |di |D ]}|                      |           d S )Nr   )put)r  r  r  results       r,   _write_generator_to_queuer    s<    $....  		& r.   r   r   c             #      K   t                       fd|D             }	 	 	                     d          V  n?# t          $ r2 t          d |D                       r                                rY nY nw xY wZn# t
          $ r Y nw xY w	 d |D              dS # t          j        $ r Y dS w xY w# 	 d |D              w # t          j        $ r Y w w xY wxY 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
    c                 L    g | ] }                     t          |f          !S r   )apply_asyncr  )r1   r  r  r   r  s     r,   r3   z&iflatmap_unordered.<locals>.<listcomp>  s2    rrr\bT%%&?%vAVWWrrrr.   T皙?rA   c              3   >   K   | ]}|                                 V  d S r  )readyr1   async_results     r,   r  z%iflatmap_unordered.<locals>.<genexpr>  s.      NN|))++NNNNNNr.   c                 :    g | ]}|                     d           S )r  r  )ru   r  s     r,   r3   z&iflatmap_unordered.<locals>.<listcomp>  s)    NNN\d++NNNr.   N)r	   ru   r   r   emptyKeyboardInterruptr   TimeoutError)r   r  r   async_resultsr  s   ``  @r,   r   r     sf      ggErrrrrrfqrrrM	iii------   NNNNNNN SXS^S^S`S` E	
    	NNNNNNNN+ 	 	 	DD		NNNNNNN+ 	 	 	D	s   B A  B  7A<7B ;A<<B  B6 
BB6 BB6 B   B32B36C8CCCCCC)
NNNNNNNFNN)FNNN)NNN)FNNNNFF)r$   N)NN)NNNNNNNNNFNNNN)NNNNNNNNNNN)NNNNNNNNNNNNNNN)u__doc__r   r   multiprocessing.poolrO   r  r   collectionsr   dataclassesr   r   pathlibr   r  r   r	   typingr
   r   r   r   r   r   r   r   typerhuggingface_hubr   r   huggingface_hub.errorsr   r   huggingface_hub.utilsr   $huggingface_hub.utils._cache_managerr   huggingface_hub.utils._dotenvr   
_cli_utilsr   r   r   r   r   r   r    r!   
get_logger__name__loggerr   tupler-   SUGGESTED_FLAVORSr   ArgumentImageArgOptionImageOpt	FlavorOptr  EnvOpt
SecretsOpt	LabelsOpt
EnvFileOptSecretsFileOpt
TimeoutOptbool	DetachOptNamespaceOptWithOpt	PythonOpt
SuspendOptConcurrencyOptScheduleArg	ScriptArgScriptArgsArg
CommandArgJobIdArg	JobIdsArgScheduledJobIdArgjobs_clir:   rb   intro   r   r{   r   r   r   r   r  r8  rC  rG  uv_app	add_typerrQ  scheduled_apprZ  rn  rv  r{  r  r  scheduled_uv_appr  rS   r   rQ   r  r  r   r   r   r   r.   r,   <module>r     s  0 0d          				                                   U U U U U U U U U U U U U U U U U U U U  4 4 4 4 4 4 4 4 ; ; ; ; ; ; ; ; ) ) ) ) ) ) = = = = = = 5 5 5 5 5 5	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 
	H	%	%. .# .5QTV^_bVcQcKd . . . .8 XWMWWW   EN'   SMEL=   ]EL D  	 
T#YEL>  
 T#YEL F  
 T#YELB  	 SMEL7  
 SMEL>   SMELe  
 ELB  	 SMELe   T#YEL4   SMELD  	 TNEL0  
 TNELG   ENf   EN3  	 T#YEN'   IEN"  
 EN-   T#YEN.  	 ENA    =?@@@ 
	.5      #'"/ /// 
/ 	/
 / / !/ / / / / / 
/ / / /d 

mmm    	 	"'.D .D.D E	
 	
 	
	.D D	
 	
 	
	.D$ %.D& '.D( 
).D .D .D .DbT#s(^ d5cSVCW>X ]a    0
tE#s(O$
%004S	0DHI0T\]`Ta0	0 0 0 0&'3 '4 ' ' ' '!)$sCx.!9JNs)eD#tDsCx$9::;<   8 
'%=$>??"SE SESESE SE 
	SE SE SE @?SEl 
$,!@AA 	" 	 	 	5}
 }
	=	
 	
 	
	
}
 }
 }
 cQ	
 	
 	
	}
& ghhh	j'}
. /}
0 lel8D7bcccc1}
6 
7}
 }
 }
 BA}
@ 
*(:';<<> > > =<>, 
)'A&BCC #A AS	=	
 	
 	
	A A A 
A A A DCA< 
(&?%@AA #@ @@@ @ 
	@ @ @ BA@( 
d	e	e	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RR   ={  3 3 3 	.5NO    "&#'"+@ +@+@+@ +@ 	+@
  +@ 
+@ +@ +@ +@ !+@ +@ +@ +@ +@ 
+@ +@ +@ 
+@\ t'=&>?? 	" 	 	 	5l
 l
	D	
 	
 	
	
l
 l
 l
 cQ	
 	
 	
	l
& ghhh	j'l
. /l
0 lel8D7bcccc1l
6 
7l
 l
 l
 @?l
^ y,L+MNN #j j S	Q	
 	
 	
	j j j 
j j j ONj0 x+J*KLL #U U'UU U 
	U U U MLU y,L+MNN #V V'VV V 
	V V V ONV x+J*KLL #U U'UU U 
	U U U MLU !=&QRRR    (t  4 4 4 	.58F    "&"&#'"#16 161616 16 	16
  16 16 16 
16 16 16 16 !16 16 16 16  !16" #16$ 
%16 16 16 16nhtCy1 htCH~6N    $DeCHo./ $s)     6tCH~     GCLLU1X Xc8A;>N5O Y] bf    



)
3#
$ d	
 a[     r.   