
    qi              &       T   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"j`                  e1      Z2de3dee3   de4e3ee3   f   fdZ5eD  cg c]  } | jl                  dk7  s| jl                    c} Z7dZ8ee3 ejr                  d      f   Z:eee3    ejv                  d      f   Z<eee    ejv                  d      f   Z=eee>e3       ejv                  ddd      f   Z?eee>e3       ejv                  ddd      f   Z@eee>e3       ejv                  d d!d"      f   ZAeee3    ejv                  d#d$      f   ZBeee3    ejv                  d%      f   ZCeee3    ejv                  d&      f   ZDeeE ejv                  d'd(d)      f   ZFeee3    ejv                  d*      f   ZGeee>e3       ejv                  d+d,      f   ZHeee3    ejv                  d-d.d/      f   ZIeeeE    ejv                  d0      f   ZJeeeE    ejv                  d1      f   ZKee3 ejr                  d2      f   ZLee3 ejr                  d3      f   ZMeee>e3       ejr                  d4      f   ZNee>e3    ejr                  d5      f   ZOee3 ejr                  d6      f   ZPeee>e3       ejr                  d7      f   ZQee3 ejr                  d8      f   ZR e/d9      ZSeSj                  d:d;d<ig d=>      	 	 	 	 	 	 	 	 	 	 dd?e:d@eOdAe?dBe@dCeAdDeBdEeCdFe=dGeDdHeFdeGdIe*ddfdJ       ZUeSj                  dKg dLM      	 	 	 	 ddePdNeeE ejv                  dOdPdQ      f   dReeeV    ejv                  dSdTdU      f   deGdIe*ddfdV       ZWdWeXe3e3f   dXe>e4e3e3e3f      deEfdYZYdZe>e>ee3eVf         d[e>e3   d\e>e3   d]ee3   ddf
d^ZZd_eVddfd`Z[de3daeeXe3ef      dbe>e3   dee4eEe3e>e>ee3eVf         f      fdcZ\eSj                  dddegM      	 	 	 ddfeQdeGdIe*ddfdg       Z]eSj                  dhdidjgM      	 	 	 	 	 	 	 ddkeeE ejv                  dldmdn      f   deGdIe*doeee>e3       ejv                  dOdpdq      f   dreee3    ejv                  ds      f   dte)dueeE ejv                  dvd<dwx      f   ddfdy       Z^eSj                  dzd{gM      dd|       Z_eSj                  d}d~gM      	 	 ddfee>e3    ejr                  d      f   deGdIe*ddfd       Z`eSj                  ddgM      	 	 ddePdeGdIe*ddfd       Za e/d      ZbeSj                  ebd       ebj                  d:d;d<ig d>      	 	 	 	 	 	 	 	 	 	 	 	 	 	 ddeMdeNd?e<dFe=dAe?dBe@dCeAdDeBdEeCdGeDdHeFdeGdIe*deHdeIddf d       Zd e/d      ZeeSj                  eed       eej                  d:d;d<idg>      	 	 	 	 	 	 	 	 	 	 	 ddeLd?e:d@eOdeJdeKdAe?dBe@dCeAdDeBdEeCdFe=dGeDdeGdIe*ddfd       Zfeej                  dhdgM      	 	 	 	 	 	 	 ddkeeE ejv                  dldmd      f   deGdIe*doeee>e3       ejv                  dOdpdq      f   dreee3    ejv                  ds      f   dte)dueeE ejv                  dvd<dwx      f   ddfd       Zgeej                  d}dgM      	 	 ddee>e3    ejr                  d      f   deGdIe*ddfd       Zheej                  ddgM      	 	 ddeRdeGdIe*ddfd       Zieej                  ddgM      	 	 ddeRdeGdIe*ddfd       Zjeej                  ddgM      	 	 ddeRdeGdIe*ddfd       Zk e/d      Zleej                  eld       elj                  d:d;d<iddg>      	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 ddeLdeMdeNdeJdeKd?e<dFe=dAe?dBe@dCeAdDeBdEeCdGeDdeGdIe*deHdeIddf$d       Zmdee>e3      deeXe3e3f      fdZndZe>e>ee3eVf         d[e>e3   de3fdZodee3e3f   fdZp ed      Zqdeeq   dedeeq   f   deXddfdZrdej                  j                  dedeeq   f   de>eX   deeq   fdZuy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)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                     | 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       J/opt/pipecat/venv/lib/python3.12/site-packages/huggingface_hub/cli/jobs.py_parse_namespace_from_job_idr,   d   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-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examplesimagecommandenvsecretslabelenv_filesecrets_fileflavortimeoutdetachtokenc           
      F   i }|rO|j                  t        t        |      j                         t        j
                  j                                      |xs g D ]:  }|j                  t        |t        j
                  j                                      < i }t               }|r3|j                  t        t        |      j                         |             |xs g D ]  }|j                  t        ||               t        |      }|j                  | |||t        |      |||
      }t        d|j                          t        d|j                          |	ry|j                  |j                  |j                  j                   d      D ]  }t        |        y)	z
Run a Job.environr=   )r3   r4   r5   r6   labelsr:   r;   r"   Job started with ID: 	View at: NTr!   r"   follow)updater   r   	read_textosr@   copy_get_extended_environr   run_job_parse_labels_mapprintidurlfetch_job_logsownername)r3   r4   r5   r6   r7   r8   r9   r:   r;   r<   r"   r=   env_map	env_valuesecrets_mapextended_environsecretapijoblogs                       r+   jobs_runr\   .  sl   0 )+G{4>#;#;#=rzzGXYZYB J	{9bjjoo6GHIJ -/K,.;tL'9'C'C'EO_`a-R J;v7GHIJ 5
!C
++ '  	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>)r2   rF   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   rE   )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   rQ   r   rN   r   responsestatus_code)
r!   rF   r^   r"   r=   rY   r]   r[   estatuss
             r+   	jobs_logsri   i  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)rj   rk   keyop_strpatternvaluematchs          r+   _matches_filtersrv     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}})rx   N)	enumeratereplacestrrN   	_tabulate)
rw   rx   ry   rz   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)rangerN   )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   metricsr   rw   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   rS   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)	rO   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   ra   rb   rc   rd   zFailed to fetch job stats: )r,   appendr   whoami	list_jobsrh   stagerO   r   rN   multiprocessingpool
ThreadPooltimer   fetch_job_metricsiflatmap_unorderedr   popSTATS_UPDATE_MIN_INTERVALr   r   re   rf   r   )r   r"   r=   
parsed_idsr!   rY   rZ   r   headers_aliasesr   rows_per_job_idr   headerlast_update_time
total_rowsr   donerw   nowrg   rh   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\: 	+dFHO! 0.4X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}}')quiet	json_flagz--jsonz)Output as JSON (alias for --format json).)hiddenr.   c                    |rd}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.jsonrA   r   zlabel!=zlabel=Nrn   z6Warning: Ignoring invalid label filter format 'label!=z'. Use label!=key format.rm   *r   !)Warning: Ignoring invalid filter format ''. Use key=value format.r   r   r    )rO   r3   rh   r4    matching filters: , r   zNo jobs found[])r   IMAGE/SPACECOMMANDCREATEDSTATUS)rO   r3   r4   createdrh   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 )Nrh   r4   r   r   rO   r   docker_image
created_at   Tr   r   )ro   joinr~   r   r}   )r   rh   cmdcommand_strs       r+   row_fnzjobs_ps.<locals>.row_fn  s    (B'hhy!'R'*chhsmr"#.1:U;%9=,9ODs#++C5UZ

7I./
 	
r-   tabler   rO   itemsr   r   id_keyrx   r   )r   r   
startswithr   rN   r(   endswithr   rp   rh   r   r   r4   r   rO   rv   rB   r   r   r~   r
   listr   r   r   r   r   )#r   r"   r=   r   r   r   r   rY   jobsrk   labels_filtersf
label_part	label_keyoplabel_valuerq   rt   filtered_jobsrZ   rh   image_or_spacer   r   propskovfilters_msgrx   ry   r   r   r   output_formats#                                      r+   jobs_psr	  8  sr   < 
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)rS   
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   rS   pretty_namer  r  rN   r   )	rY   hardware_listr   r   rw   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defaultNra   rb   rc   rd   zFailed to inspect job: )r,   r   r   inspect_jobrN   r   dumpsr   r~   r   re   rf   r   )
r   r"   r=   r   r!   rY   r   rZ   rg   rh   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   Nra   rb   rc   z>Access denied. You may not have permission to cancel this job.zFailed to cancel job: )r,   r   
cancel_jobr   re   rf   r   )r!   r"   r=   rY   rg   rh   s         r+   jobs_cancelr1    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)rS   )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                 T   i }|rO|j                  t        t        |      j                         t        j
                  j                                      |xs g D ]:  }|j                  t        |t        j
                  j                                      < i }t               }|r3|j                  t        t        |      j                         |             |xs g D ]  }|j                  t        ||               t        |      }|j                  | |xs g |||||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 infrastructurer?   rA   )r3  r4  dependenciesr6  r3   r5   r6   rB   r:   r;   r"   rC   rD   NTrE   )rG   r   r   rH   rI   r@   rJ   rK   r   
run_uv_jobrM   rN   rO   rP   rQ   rR   rS   )r3  r4  r3   r:   r5   r6   r7   r8   r9   r;   r<   r"   r=   r5  r6  rT   rU   rV   rW   rX   rY   rZ   r[   s                          r+   jobs_uv_runr;    sx   6 )+G{4>#;#;#=rzzGXYZYB J	{9bjjoo6GHIJ,.K,.;tL'9'C'C'EO_`a-R J;v7GHIJ 5
!C
..%2 '  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                    i }|rO|j                  t        t        |      j                         t        j
                  j                                      |xs g D ]:  }|j                  t        |t        j
                  j                                      < i }t               }|	r3|j                  t        t        |	      j                         |             |xs g D ]  }|j                  t        ||               t        |      }|j                  ||| ||||t        |      |
||      }t        d|j                          y)zSchedule a Job.r?   rA   )r3   r4   r=  r>  r?  r5   r6   rB   r:   r;   r"   Scheduled Job created with ID: N)rG   r   r   rH   rI   r@   rJ   rK   r   create_scheduled_jobrM   rN   rO   )r=  r3   r4   r>  r?  r5   r6   r7   r8   r9   r:   r;   r"   r=   rT   rU   rV   rW   rX   rY   scheduled_jobs                        r+   scheduled_runrD  K  s*   , )+G{4>#;#;#=rzzGXYZYB J	{9bjjoo6GHIJ,.K,.;tL'9'C'C'EO_`a-R J;v7GHIJ 5
!C,, ' - M 
+M,<,<+=
>?r-   zhf jobs scheduled psz1Show all scheduled Jobs (default hides suspended)c                    |rd}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 Jobsr   rA   r   rn   r   r   rm   Nr   r   r   Fr   r   )rO   r3   r>  r4   r   r   r   zNo scheduled jobs foundr   )IDSCHEDULEr   r   zLAST RUNzNEXT RUNSUSPEND)rO   r=  r3   r4   lastnextr>  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_specrh   last_jobr4   r   atr   r   r   next_job_run_atrO   r   r=  r   r>  F)ro   r}   r   r~   r   )r   rL  rh   rM  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   rO   r   )r   list_scheduled_jobsr(   r   r   rp   rN   r>  rL  r   r4   r   rO   r~   rv   r   r   r
   r   r   r   r   r   r   ) r   r"   r=   r   r   r   r   rY   scheduled_jobsrk   r   rq   rt   r   r  rC  r>  r  r   r   r  r  r  r  r  rx   ry   sjr   r   r   r  s                                    r+   scheduled_psrU  ~  sw   < 
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3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_jobrN   r   r,  r   r~   )	rV  r"   r=   r   r!   rY   rY  rS  rC  s	            r+   scheduled_inspectr[    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>rY  c                 `    t        | |      \  } }t        |      }|j                  | |       y)zDelete a scheduled Job.rA   rX  N)r,   r   delete_scheduled_jobrY  r"   r=   rY   s       r+   scheduled_deleter`    6     #??OQZ"[i
5
!C.>)Tr-   zhf jobs scheduled suspend <id>c                 `    t        | |      \  } }t        |      }|j                  | |       y)z Suspend (pause) a scheduled Job.rA   rX  N)r,   r   suspend_scheduled_jobr_  s       r+   scheduled_suspendrd    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   rX  N)r,   r   resume_scheduled_jobr_  s       r+   scheduled_resumerh    ra  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 }|
rO|j                  t        t        |
      j                         t        j
                  j                                      |xs g D ]:  }|j                  t        |t        j
                  j                                      < i }t               }|r3|j                  t        t        |      j                         |             |xs g D ]  }|j                  t        ||               t        |      }|j                  ||xs g | |||||||t        |	      |||      }t        d|j                          y)r8  r?   rA   )r3  r4  r=  r>  r?  r9  r6  r3   r5   r6   rB   r:   r;   r"   rA  N)rG   r   r   rH   rI   r@   rJ   rK   r   create_scheduled_uv_jobrM   rN   rO   )r=  r3  r4  r>  r?  r3   r:   r5   r6   r7   r8   r9   r;   r"   r=   r5  r6  rT   rU   rV   rW   rX   rY   rZ   s                           r+   scheduled_uv_runrk  /  s5   8 )+G{4>#;#;#=rzzGXYZYB J	{9bjjoo6GHIJ,.K,.;tL'9'C'C'EO_`a-R J;v7GHIJ 5
!C

%
%%2 ' & 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.
    Nrn   r   r   )r(   )rB   
labels_map	label_varrq   rt   s        r+   rM   rM   n  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   r~   ).0xs     r+   	<genexpr>z_tabulate.<locals>.<genexpr>  s     /ac#a&k/s       r   z{{:{}}} -N   z...
)r   maxshutilget_terminal_sizecolumnsr   sumindexr   r   r~   r   )rw   rx   col
col_widthsterminal_widthcol_to_minimize
row_formatlineswr   rs  	col_widthrow_format_argss                r+   r   r     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c                  d    t         j                  j                         } t               x}|| d<   | S )NHF_TOKEN)rI   r@   rJ   r   )rW   r=   s     r+   rK   rK     s1    zz()',$r-   r   queuefunc.kwargsc                 @     |di |D ]  }| j                  |        y )N )put)r  r  r  results       r+   _write_generator_to_queuer    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rq  )ready)rr  async_results     r+   rt  z%iflatmap_unordered.<locals>.<genexpr>  s     N|))+Ns   N)
r   apply_asyncr  ro   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)
NNNNNNNFNN)FNNN)NNN)FNNNNFF)r#   N)NN)NNNNNNNNNFNNNN)NNNNNNNNNNN)NNNNNNNNNNNNNNN)v__doc__r   r   multiprocessing.poolrI   rz  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,   rt   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_clir4   r\   intri   r   rv   r   r   r   r   r	  r$  r-  r1  uv_app	add_typerr;  scheduled_apprD  rU  r[  r`  rd  rh  scheduled_uv_apprk  rM   r   rK   r   r  r   r   r   )r   s   0r+   <module>r     s  0d    	        U U U  4 ; ) = 5	 	 	 
		H	%. .# .5QTV^_bVcQcKd .8 -:WDTZZ;=VTZZW   ENN' SMELL= ]ELL D	 
T#YELL>
 T#YELL F
 T#YELLB	 SMELL7
 SMELL> SMELLe
 ELLB	 SMELLe T#YELL4 SMELLD	 TNELL0
 TNELLG ENNf ENN3	 T#YENN' IENN"
 ENN- T#YENN.	 ENNA  ?@ 
	.5   #'"/// 
/ 	/
 / / !/ / / / / / 
//d 

m   	 	"'.D.D E	
	.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&'3 '4 '!)$sCx.!9JNs)eD#tDsCx$9::;<8 
'%=$>?"SESESE SE 
	SE @SEl 
$,!@A 	" 	 	 	5}
	=	
	
}
 }
 }
 cQ	
	}
& gh	j'}
. /}
0 lell8D7bcc1}
6 
7}
 B}
@ 
*(:';<> =>, 
)'A&BC #AS	=	
	A A A 
A DA< 
(&?%@A #@@@ @ 
	@ B@( 
d	e   6  % 	.5   "&#'"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   "&#'"+@+@+@ +@ 	+@
  +@ 
+@ +@ +@ +@ !+@ +@ +@ +@ +@ 
+@
+@\ t'=&>? 	" 	 	 	5l
	D	
	
l
 l
 l
 cQ	
	l
& gh	j'l
. /l
0 lell8D7bcc1l
6 
7l
 @l
^ 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   "&"&#'"#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~  CLU1X Xc8A;>N5O Y] bf 




)
)
3#
$ d	
 a[U! Xs   4b%	b%