
    i              (          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mZ ddlm	Z	m
Z
 ddlmZ ddlmZ ddlmZmZ ddlmZmZmZ ddlZdd	lmZ dd
lmZmZ ddlmZ ddlmZ ddlm Z m!Z!m"Z"m#Z#m$Z$m%Z%m&Z&m'Z'm(Z(m)Z)m*Z*m+Z+m,Z,m-Z-m.Z.  ej^                  e0      Z1de2de2dz  de3e2e2dz  f   fdZ4eD  cg c]  } | jj                  dk7  s| jj                    c} Z6dZ7ee2 ejp                  d      f   Z9ee2dz   ejt                  d      f   Z;eedz   ejt                  d      f   Z<ee=e2   dz   ejt                  ddd      f   Z>ee2dz   ejt                  d      f   Z?ee@ ejt                  ddd      f   ZAee2dz   ejt                  d       f   ZBee=e2   dz   ejt                  d!d"      f   ZCee2dz   ejt                  d#d$d%      f   ZDee@dz   ejt                  d&      f   ZEee@dz   ejt                  d'      f   ZFee2 ejp                  d(      f   ZGee2 ejp                  d)      f   ZHee=e2   dz   ejp                  d*      f   ZIee=e2    ejp                  d+      f   ZJee2 ejp                  d,      f   ZKee=e2   dz   ejp                  d-      f   ZLee2 ejp                  d.      f   ZM e.d/      ZNeNj                  d0d1d2ig d34      	 	 	 	 	 	 	 	 	 	 	 dd5e9d6eJd7e!d8e%d9e>d:e'd;e d<e$d=e<d>e?d?eAdeBd@e&ddfdA       ZPeNj                  dBg dCD      	 	 	 	 ddeKdEee@ ejt                  dFdGdH      f   dIeeQdz   ejt                  dJdKdL      f   deBd@e&ddfdM       ZRdNeSe2e2f   dOe=e3e2e2e2f      de@fdPZTdQe=e=e2eQz        dRe=e2   dSe=e2   dTe2dz  ddf
dUZUdVeQddfdWZVde2dXe
eSe2ef      dYe=e2   de
e3e@e2e=e=e2eQz        f      fdZZWeNj                  d[d\gD      	 	 	 dd]eLdeBd@e&ddfd^       ZXeNj                  d_d`dagD      	 	 	 	 	 	 ddbee@ ejt                  dcddde      f   deBd@e&dfee=e2   dz   ejt                  dFdgdh      f   diee2dz   ejt                  dj      f   dke#ddfdl       ZYeNj                  dmdngD      ddo       ZZeNj                  dpdqgD      	 	 dd]ee=e2    ejp                  dr      f   deBd@e&ddfds       Z[eNj                  dtdugD      	 	 ddeKdeBd@e&ddfdv       Z\ e.dw      Z]eNj                  e]dxy       e]j                  d0d1d2ig dz4      	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 dd{eHd|eId5e;d=e<d7e!d8e%d9e>d:e'd;e d<e$d>e?d?eAdeBd@e&d}eCd~eDddf"d       Z_ e.d      Z`eNj                  e`dy       e`j                  d0d1d2idg4      	 	 	 	 	 	 	 	 	 	 	 	 ddeGd5e9d6eJdeEdeFd7e!d8e%d9e>d:e'd;e d<e$d=e<d>e?deBd@e&ddf d       Zae`j                  d_dgD      	 	 	 	 	 	 ddbee@ ejt                  dcddd      f   deBd@e&dfee=e2   dz   ejt                  dFdgdh      f   diee2dz   ejt                  dj      f   dke#ddfd       Zbe`j                  dpdgD      	 	 ddee=e2    ejp                  d      f   deBd@e&ddfd       Zce`j                  ddgD      	 	 ddeMdeBd@e&ddfd       Zde`j                  ddgD      	 	 ddeMdeBd@e&ddfd       Zee`j                  ddgD      	 	 ddeMdeBd@e&ddfd       Zf e.d      Zge`j                  egdxy       egj                  d0d1d2iddg4      	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 ddeGd{eHd|eIdeEdeFd5e;d=e<d7e!d8e%d9e>d:e'd;e d<e$d>e?deBd@e&d}eCd~eDddf&d       Zhde=e2   dz  deSe2e2f   dz  fdZidQe=e=e2eQz        dRe=e2   de2fdZj ed      Zkdeek   de	de
ek   f   deSddfdZldej                  j                  de	de
ek   f   de=eS   de
ek   fdZoyc c} w )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)CallableIterable)asdict)fnmatch)EmptyQueue)	AnnotatedAnyTypeVar)SpaceHardware)CLIErrorHfHubHTTPError)logging)_format_size   )
EnvFileOptEnvOptOutputFormatQuietOptSecretsFileOpt
SecretsOptTokenOpt
VolumesOpt_format_cellapi_object_to_dict
get_hf_apiparse_env_mapparse_volumesprint_list_outputtyper_factory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       i/var/www/vps2.regionflexible.com/Desarrollo/venv/lib/python3.12/site-packages/huggingface_hub/cli/jobs.py_parse_namespace_from_job_idr-   i   s     011||C1UV\U]]_`aa
&y  )/c1)=&mUV\U]]_`aa.A!A6ykAabuavvwx
 	
 ---    z	zero-a10gg?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-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--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.pyzVhf jobs run -v hf://gpt2:/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tokenc                    t        ||      }t        ||      }t        |      }|j                  | |||t        |      t	        |      ||	|	      }t        d|j                          t        d|j                          |
ry|j                  |j                  |j                  j                  d      D ]  }t        |        y)z
Run a Job.r?   )	r4   r5   r6   r7   labelsvolumesr<   r=   r#   Job started with ID: 	View at: NTr"   r#   follow)r   r   run_job_parse_labels_mapr   printidurlfetch_job_logsownername)r4   r5   r6   r7   r8   r9   r:   r;   r<   r=   r>   r#   r?   env_mapsecrets_mapapijoblogs                     r,   jobs_runrU     s    4 C*G6K
5
!C
++ 'f%  
C 
!#&&
*+	IcggY
 !!399>>RV!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>)r3   rG   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        |      }	 |j                  | ||      }|t	        ||      }|D ]  }t        |        y# t        $ rZ}|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.rA   rF   )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   rM   r   rJ   r   responsestatus_code)
r"   rG   rW   r#   r?   rR   rV   rT   estatuss
             r,   	jobs_logsrb   G  s    : 5VYGFI$"q
 	
 5
!CD!!9V!Td+D 	C#J	 D+,::+A''tS=DE1Ls]YZ`aa7s;<!CDs   5A" "	C+AC  C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)rc   rd   keyop_strpatternvaluematchs          r,   _matches_filtersro   {  sk     ' VW""3'=~w}}7cM%Vt^ r.   rowsheadersaliasesfmtc           	          |rS|}| D ]K  }|}t        |      D ].  \  }}d| d}	|	|v s|j                  |	t        ||               }0 t        |       M yt        t	        | |             y)z,Print output according to the chosen format.z{{.z}})rq   N)	enumeratereplacestrrJ   	_tabulate)
rp   rq   rr   rs   templaterowlineifieldplaceholders
             r,   _print_outputr     s    
 	CD%g. B5 %eWD1$&<<SQ[ADB $K	 	ig./r.   nc                 F    d}d}t        |       D ]  }t        ||        y )Nz[1Az[2K)end)rangerJ   )r   LINE_UP
LINE_CLEARr|   s       r,   _clear_liner     s)    GJ1X 'g:&'r.   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   rt        |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gpus utilizationN/AFT)roundr   
isinstancedictlenzipsorted)r"   r   r   metricsrz   rp   gpu_idgpus           r,   _get_jobs_stats_rowsr     s     " "'(*'*+f4a8S7#677'BV:WWYZ[\\]^G$789:$|GThLi?j>kklmGH-./vl78CT6U5VVYZ
 6?z'&/4@5RD3s8O,GFO0Dq0HIID"4)@A Vfof-=)*!,S3':#;;cBV>WWYZ[\\]^#C(;$<=>d<PSThPiCjBkklm  E7c-03s8;<<C5DVT!!+", 
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        d       yg d	}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        |||d       | 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        |||d       |} 	 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# t*        $ rZ}|j,                  |j,                  j.                  nd}|dk(  rt1        d      ||dk(  rt1        d      |t1        d|       |d}~ww xY w)z7Fetch the resource usage statistics and metrics of JobsNrA   rO   r#   UNKNOWNRUNNINGUPDATINGr   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)	rK   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_bytesr   r&   USAGEz-- / --z--r"   r#   )r"   r   r   )kwargs_listr   rZ   r[   r\   r]   zFailed to fetch job stats: )r-   appendr   whoami	list_jobsra   stagerK   r   rJ   multiprocessingpool
ThreadPooltimer   fetch_job_metricsiflatmap_unorderedr   popSTATS_UPDATE_MIN_INTERVALr   r   r^   r_   r   )r   r#   r?   
parsed_idsr"   rR   rS   r   headers_aliasesr   rows_per_job_idrz   headerlast_update_time
total_rowsr   donerp   nowr`   ra   s                        r,   
jobs_statsr     s    
 	&F <VY OFIf%	& 
5
!CJJL(	 }}y}9
$'JJ

  IBYY FF
 

 7|q%&
M
O%E!!,,S\: 	+d@BO! 0(.xbopqprbstX^cVmw&7H	tStt+.%'0  $yy{,;_&W]G^_#_#_J_*m_dK & 	 %&)&;&;6U^&;&_%2K  '9?Sal&m 
+"fd#''5.2OF+iik))-FFC
O 344C!g&_eOf!g#!g#!gJ!g!*m_dS'*$
+%	+ 	+?
F u `  "h5	+ 	+:  E+,::+A''tS=DE1Ls]YZ`aa8<=1DEsz   %9H!(I +H<>H&
&H<7H+
H<H1=AH<H</H6
H<I &H<<II I 	J+AJ&&J+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}}')quietc                    t        |      }|j                  |      }g }g }	|xs g D ]L  }
|
j                  d      s|
j                  d      r|
j                  d      r)|
t        d      d }d|v rt	        d| d       Y|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       >t	        d|
 d       O 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                  |        |s[|sH|dk7  rC|r0ddj                  |D cg c]  \  }}}| | |  c}}}       nd}t	        d|        y|dk(  rt	        d       yg d}g d}|D cg c]  }t#        |       }}dt$        t&        t(        f   dt*        t&           fd}|r'|d vr#t-        |D  cg c]
  }  ||        c} |||       y|dk(  rt.        j0                  nt.        j2                  }!t5        ||!|d!||"       yc c}}}w c c}w c c} w )#z
List Jobs.rA   r   zlabel!=zlabel=Nrg   z6Warning: Ignoring invalid label filter format 'label!=z'. Use label!=key format.rf   *r   !)Warning: Ignoring invalid filter format ''. Use key=value format.r   r   r    )rK   r4   ra   r5   json matching filters: , r   zNo jobs found[])r   IMAGE/SPACECOMMANDCREATEDSTATUS)rK   r4   r5   createdra   itemr$   c           
         | j                  di       }| j                  d      xs g }|rdj                  |      nd}t        | j                  dd            t        | j                  d      xs d      t        |      | j                  d      r| d   d d	 j	                  d
d      ndt        |j                  dd            gS )Nra   r5   r   r   rK   r   docker_image
created_at   Tr   r   )rh   joinrw   r   rv   )r   ra   cmdcommand_strs       r,   row_fnzjobs_ps.<locals>.row_fnt  s    (B'hhy!'R'*chhsmr"#.1:U;%9=,9ODs#++C5UZ

7I./
 	
r.   tabler   rK   itemsr   r   id_keyrq   r   )r   r   
startswithr   rJ   r)   endswithr   ri   ra   r   r   r5   r   rK   ro   rB   r   r   rw   r   listr   r   r   r   r    )"r   r#   r?   r   r   r   rR   jobsrd   labels_filtersf
label_part	label_keyoplabel_valuerj   rm   filtered_jobsrS   ra   image_or_spacer   r   propskovfilters_msgrq   rr   r   r   r   output_formats"                                     r,   jobs_psr     sj   6 5
!C==9=-D*,G13N\r ![<<	"all8&<||I&s9~/0
*$PQ[P\\uv -7s{2	s8}/
*$-7-=-=c1-E*I{-7{I%%c*B )#2IB!!9??#4b+:K:K:M"NOAXaJC||C #2hNNCIIKU[[];<=aS@XYZC![H M "%(ZZ!!Yv%<<))2UkkR'*chhsmvv&,,.]hiw/

 0b.AS!" 6)fm/		W^:_:_GAqRSaSA3<:_0`/absuKM+/0 	 v$KGG=G0=>$>E>

T#s(^ 

S	 

 & 116vd|6&Q-3v-=))<CUCU 	
7 ;` ?  7s   L;#M*Mhardwarezhf jobs hardwarec            
      B   t               } | j                         }g d}g d}g }|D ]  }d}|j                  rG|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                  |j                  xs d|j                  |j                  |||g        |st        d       yt        |||d       y)z(List available hardware options for Jobs)NAMEzPRETTY NAMECPURAMACCELERATORzCOST/MINz	COST/HOUR)rO   
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   rO   pretty_namer  r	  rJ   r   )	rR   hardware_listr   r   rp   hwaccelerator_infocost_min	cost_hours	            r,   jobs_hardwarer    s"    ,C**,MaM`O"$D o >>"$.."9"9!:"R^^=Q=Q<RRTUWUcUcUhUhTiijk131A1A1MQr'',-SX797G7G7Sa((2-c23Y^	RWWbnn5rvvrvvGWYaclmno )*$=r.   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	        t        j                  |D cg c]  }t        |       c}dt                     yc c}w c c}w # t        $ rZ}|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 JobsrA   r      indentdefaultNrZ   r[   r\   r]   zFailed to inspect job: )r-   r   r   inspect_jobrJ   r   dumpsr   rw   r   r^   r_   r   )
r   r#   r?   r   r"   rR   r   rS   r`   ra   s
             r,   jobs_inspectr$    s    J "8K	&!" G
5
!C
ARYZvCZZdjj6#&+6q#NO [6 A+,::+A''tS=DE1Ls]YZ`aa4QC89q@As5   B  BB  1BB  
B   	D)AC>>Dcancelzhf jobs cancel <job_id>c                 .   t        | |      \  } }t        |      }	 |j                  | |       y# t        $ rZ}|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 JobrA   r   NrZ   r[   r\   z>Access denied. You may not have permission to cancel this job.zFailed to cancel job: )r-   r   
cancel_jobr   r^   r_   r   )r"   r#   r?   rR   r`   ra   s         r,   jobs_cancelr(    s     5VYGFI
5
!C	@f	: @+,::+A''tS=DE1Ls][\bcc3A378a?@s   1 	BABBzFRun UV scripts (Python with inline dependencies) on HF infrastructure.uv)rO   )zhf jobs uv run my_script.pyz1hf jobs uv run ml_training.py --flavor a10g-smallz+hf jobs uv run --with transformers train.pyzFhf jobs uv run -v hf://gpt2:/data -v hf://buckets/org/b:/mnt script.pyscriptscript_argswith_pythonc                    t        ||      }t        ||	      }t        |      }|j                  | |xs g |||||t        |      t	        |      ||
|      }t        d|j                          t        d|j                          |ry|j                  |j                  |j                  j                  d      D ]  }t        |        y)8Run a UV script (local file or URL) on HF infrastructurerA   )r*  r+  dependenciesr-  r4   r6   r7   rB   rC   r<   r=   r#   rD   rE   NTrF   )r   r   
run_uv_jobrI   r   rJ   rK   rL   rM   rN   rO   )r*  r+  r4   r<   r6   r7   r8   r9   r:   r;   r=   r>   r#   r?   r,  r-  rP   rQ   rR   rS   rT   s                        r,   jobs_uv_runr2    s    : C*G6K
5
!C
..%2 'f%  C 
!#&&
*+	IcggY
 !!399>>RV!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                     t        ||	      }t        ||
      }t        |      }|j                  ||| ||||t        |      t	        |      |||      }t        d|j                          y)zSchedule a Job.rA   )r4   r5   r4  r5  r6  r6   r7   rB   rC   r<   r=   r#   Scheduled Job created with ID: N)r   r   create_scheduled_jobrI   r   rJ   rK   )r4  r4   r5   r5  r6  r6   r7   r8   r9   r:   r;   r<   r=   r#   r?   rP   rQ   rR   scheduled_jobs                      r,   scheduled_runr;    s    . C*G6K
5
!C,, 'f% - M 
+M,<,<+=
>?r.   zhf jobs scheduled psz1Show all scheduled Jobs (default hides suspended)c                    t        |      }|j                  |      }g }|xs g D ]v  }	d|	v ra|	j                  dd      \  }
}|
j                  d      rd}|
dd }
nd}|j	                  |
j                         ||j                         f       ht        d	|	 d
       x 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	                  |        |s[|sH|dk7  rC|r0ddj                  |D cg c]  \  }}}| | |  c}}}       nd}t        d|        y|dk(  rt        d       yg d}g d}|D cg c]  }t        |       }}dt         t        t"        f   dt$        t           fd}|r'|dvr#t'        |D cg c]
  } ||       c}|||       y|dk(  rt(        j*                  nt(        j,                  }t/        |||d||       yc c}}}w c c}w c c}w )zList scheduled JobsrA   r   rg   r   r   rf   Nr   r   r   Fr   r   )rK   r4   r5  r5   r   r   r   r   zNo scheduled jobs foundr   )IDSCHEDULEr   r   zLAST RUNzNEXT RUNSUSPEND)rK   r4  r4   r5   lastnextr5  r   r$   c                 h   | j                  di       }| j                  di       }|j                  d      }|j                  d      xs g }d}|r)|j                  d      r|d   d d j                  dd	      }d}|j                  d
      r|d
   d d j                  dd	      }|rd	j                  |      nd}t        | j                  dd            t        | j                  d      xs d      t	        |j                  d      xs d      t	        |      ||t        | j                  dd            gS )Njob_specra   last_jobr5   r   atr   r   r   next_job_run_atrK   r   r4  r   r5  F)rh   rv   r   rw   r   )r   rC  ra   rD  r   last_job_atnext_runr   s           r,   r   zscheduled_ps.<locals>.row_fn  s   88J+(B'::j)ll9%+T*"4."-55c3?K::'(/0"5==c3GH'*chhsmr"#$-.n5>?%E*+
 	
r.   r   rK   r   )r   list_scheduled_jobsr)   r   r   ri   rJ   r5  rC  r   r5   r   rK   rw   ro   r   r   r   r   r   r   r   r   r    )r   r#   r?   r   r   r   rR   scheduled_jobsrd   r   rj   rm   r   r   r:  r5  r   r   r   r   r   r   r   r   rq   rr   sjr   r   r   r   s                                  r,   scheduled_psrL  G  so   6 5
!C,,y,AN*,G\r [!8aJC||C #2hNNCIIKU[[];<=aS@XYZ[ M' 
,''05w&//<<E$$,,2'*chhsm$''.SQX\fqrw/]+
, 6)fm/		W^:_:_GAqRSaSA3<:_0`/absuK+K=9: 	 v$K]GOG.;<#<E<
T#s(^ 
S	 
. & 116vd|6&Q-3v-=))<CUCU 	
K ;` =4 7s   I (I/I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	        t        j                  |D cg c]  }t        |       c}dt                     yc c}w c c}w )z:Display detailed information on one or more scheduled JobsrA   scheduled_job_idr#   r  r  N)	r-   r   r   inspect_scheduled_jobrJ   r   r#  r   rw   )	rM  r#   r?   r   r"   rR   rP  rJ  r:  s	            r,   scheduled_inspectrR    s     J# "8K	&!" #
5
!C !2 	!!3Cy!YN  
$**Pf]+PYZdg
hi	 Qs   B0Bdeletezhf jobs scheduled delete <id>rP  c                 `    t        | |      \  } }t        |      }|j                  | |       y)zDelete a scheduled Job.rA   rO  N)r-   r   delete_scheduled_jobrP  r#   r?   rR   s       r,   scheduled_deleterW    6     #??OQZ"[i
5
!C.>)Tr.   zhf jobs scheduled suspend <id>c                 `    t        | |      \  } }t        |      }|j                  | |       y)z Suspend (pause) a scheduled Job.rA   rO  N)r-   r   suspend_scheduled_jobrV  s       r,   scheduled_suspendr[    s6     #??OQZ"[i
5
!C/?9Ur.   resumezhf jobs scheduled resume <id>c                 `    t        | |      \  } }t        |      }|j                  | |       y)z!Resume (unpause) a scheduled Job.rA   rO  N)r-   r   resume_scheduled_jobrV  s       r,   scheduled_resumer_    rX  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                     t        ||      }t        ||      }t        |      }|j                  ||xs g | |||||||t        |	      t	        |
      |||      }t        d|j                          y)r/  rA   )r*  r+  r4  r5  r6  r0  r-  r4   r6   r7   rB   rC   r<   r=   r#   r8  N)r   r   create_scheduled_uv_jobrI   r   rJ   rK   )r4  r*  r+  r5  r6  r4   r<   r6   r7   r8   r9   r:   r;   r=   r#   r?   r,  r-  rP   rQ   rR   rS   s                         r,   scheduled_uv_runrb    s    : C*G6K
5
!C

%
%%2 'f% & C" 
+CFF8
45r.   rB   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.
    Nrg   r   r   )r)   )rB   
labels_map	label_varrj   rm   s        r,   rI   rI   *  sQ     !#J  	03y0@Y__S!,yRTo
U
3  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N)r   rw   ).0xs     r,   	<genexpr>z_tabulate.<locals>.<genexpr>C  s     /ac#a&k/s       r   z{{:{}}} -N   z...
)r   maxshutilget_terminal_sizecolumnsr   sumindexr   r   rw   r   )rp   rq   col
col_widthsterminal_widthcol_to_minimize
row_formatlineswrz   rj  	col_widthrow_format_argss                r,   rx   rx   <  s    <?;N;Ng;NOC#/3//OJO113;;S\B=NON
g,Z
(>
9$**3z?;?#)#w<#j/)^;*83z?*JSQX\*Y\fgv\w*wJ'	 g,Z
(>
9
 4*s7|+33Z@JE	LL"""G,-	LL"""j$AS1W$ABC : !$C 4
9 033q6{Y/FCF?Y]#e+CPQFR
 
 	&Z&&89: 99U# P %B
s   G*G/6A G4r   queuefunc.kwargsc                 @     |di |D ]  }| j                  |        y )N )put)r  r  r  results       r,   _write_generator_to_queuer  Z  s#    .. 		&r.   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?)r=   c              3   <   K   | ]  }|j                           y wrh  )ready)ri  async_results     r,   rk  z%iflatmap_unordered.<locals>.<genexpr>u  s     N|))+Ns   N)
r	   apply_asyncr  rh   r   r   emptyKeyboardInterruptr   TimeoutError)r   r  r   r  r  async_resultsr  s          r,   r   r   _  s     gEfqr\bT%%&?%vAVWrMriii--  s
  NNNSXS^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)NNNNNNNNFNN)FNNN)NNN)FNNNNF)r$   N)NN)NNNNNNNNNNFNNNN)NNNNNNNNNNNN)NNNNNNNNNNNNNNNN)p__doc__r   r   multiprocessing.poolrq  r   collectionsr   collections.abcr   r   dataclassesr   r   r  r   r	   typingr
   r   r   typerhuggingface_hubr   huggingface_hub.errorsr   r   huggingface_hub.utilsr   $huggingface_hub.utils._cache_managerr   
_cli_utilsr   r   r   r   r   r   r   r   r   r   r   r   r   r    r!   
get_logger__name__loggerrw   tupler-   rm   SUGGESTED_FLAVORSr   ArgumentImageArgOptionImageOpt	FlavorOptr   	LabelsOpt
TimeoutOptbool	DetachOptNamespaceOptWithOpt	PythonOpt
SuspendOptConcurrencyOptScheduleArg	ScriptArgScriptArgsArg
CommandArgJobIdArg	JobIdsArgScheduledJobIdArgjobs_clir5   rU   intrb   r   ro   r   r   r   r   r   r  r$  r(  uv_app	add_typerr2  scheduled_appr;  rL  rR  rW  r[  r_  scheduled_uv_apprb  rI   rx   r   r  r   r   r   )r   s   0r,   <module>r     s  0d       .    * *  ) ; ) =    & 
		H	%. .t .cSVY]S]oH^ .8 -:WDTZZ;=VTZZW   ENN' $JELL= DELL D	 IELLB	 $JELLe
 ELLB	 $JELLe IELL4 $JELLD	 4KELL0
 4KELLG ENNf ENN3	 IENN' IENN"
 ENN- IENN.	 ENNA  ?@ 
	.5  	 #'"''' 
' 	'
 ' ' ' !' ' ' ' ' ' 
'	'T 

m   	 	"'.D.D E	
	.D d
D	
	.D$ %.D& '.D( 
).D.DbT#s(^ d5cSVCW>X ]a 0T#)_- 0S	 0DQTI 0\_bf\f 0ko 0"'3 '4 '!)$sCx.!9JNs)eD#tDsO44568 
'%=$>?"SESESE SE 
	SE @SEl 
$,!@A 	" 	 	/w
	=	
	
w
 w
 w
 S	DQ	
	w
& d
gh	j'w
. /w
0 
1w
 Bw
t 
*(:';<> =>, 
)'A&BC #AS	=	
	A A A 
A DA< 
(&?%@A #@@@ @ 
	@ B@( 
d	e   6  % 	.5  	 "&#'"!,,, , 	,
 
, , , , , !, , , , , ,  !," 
#,	,^ #QR   ={  3 	.5NO   "&#'"$@$@$@ $@ 	$@
  $@ 
$@ $@ $@ $@ $@ !$@ $@ $@ $@ $@  
!$@
$@N t'=&>? 	" 	 	/f
	D	
	
f
 f
 f
 S	DQ	
	f
& d
gh	j'f
. /f
0 
1f
 @f
R y,L+MN #j S	Q	
	j j j 
j Oj0 x+J*KL #U'UU U 
	U MU y,L+MN #V'VV V 
	V OV x+J*KL #U'UU U 
	U MU !&QR    (t  4 	.58F   "&"&#'"%*6*6*6 *6 	*6
  *6 *6 *6 
*6 *6 *6 *6 *6 !*6 *6 *6  !*6" #*6$ %*6& 
'*6*6`d3i$. 4S>D3H $DcCi) DI # 6 CLU1X Xc8A;>N5O Y] bf 




)
)
3#
$ d	
 a[u Xs   ._-_-