o
    viU{                  $   @   s0	  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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 dd	lmZ dd
lm Z  ddl!m"Z" ddl#m$Z$m%Z%m&Z& e'e(Z)dd eD Z*dZ+ee,ej-ddf Z.eee, ej/ddf Z0eee ej/ddf Z1eee2e,  ej/ddddf Z3eee2e,  ej/ddddf Z4eee, ej/dddf Z5eee, ej/ddf Z6eee, ej/ddf Z7ee8ej/dd d!df Z9eee, ej/d"df Z:eee2e,  ej/d#d$df Z;eee, ej/d%d&d'df Z<eee8 ej/d(df Z=eee8 ej/d)df Z>ee,ej-d*df Z?ee,ej-d+df Z@eee2e,  ej-d,df ZAee2e, ej-d-df ZBee,ej-d.df ZCeee2e,  ej-d/df ZDee,ej-d0df ZEe&d1dZFeFjGd2d3d4d5id6							7		dd8e.d9eBd:e3d;e4d<e5d=e6d>e1d?e7d@e9dAe:dBe$dCdfdDdEZHeFjGdFdGd		ddHeCdAe:dBe$dCdfdIdJZIdKeJe,e,f dLeJe,e,f dCe8fdMdNZKdOe2e2ee,eLf   dPe2e, dQe2e, dRee, dCdf
dSdTZMdUeLdCdfdVdWZNdHe,dXeeJe,ef  dYe2e, dCeeOe8e,e2e2ee,eLf   f  fdZd[ZPeFjGd\d]d			dd^eDdAe:dBe$dCdfd_d`ZQeFjGdadbd	7				ddcee8ej/dddedfdf dAe:dBe$dgeee2e,  ej/dhdidjdf dkeee, ej/dldf dCdfdmdnZReFjGdodpdddqdrZSeFjGdsdtd		dd^ee2e, ej-dudf dAe:dBe$dCdfdvdwZTeFjGdxdyd		ddHeCdAe:dBe$dCdfdzd{ZUe&d|dZVeFjWeVd}d~ eVjGd2dd4d5id6									7				dde@deAd8e0d>e1d:e3d;e4d<e5d=e6d?e7d@e9dAe:dBe$de;de<dCdfddZXe&ddZYeFjWeYdd~ eYjGd2dd4d5id6										dde?d8e.d9eBde=de>d:e3d;e4d<e5d=e6d>e1d?e7dAe:dBe$dCdfddZZeYjGdadd	7				ddcee8ej/dddeddf dAe:dBe$dgeee2e,  ej/dhdidjdf dkeee, ej/ddldf dCdfddZ[eYjGdsdd		ddee2e, ej-ddf dAe:dBe$dCdfddZ\eYjGddd		ddeEdAe:dBe$dCdfddZ]eYjGddd		ddeEdAe:dBe$dCdfddZ^eYjGddd		ddeEdAe:dBe$dCdfddZ_e&ddZ`eYjWe`d}d~ e`jGd2dd4d5id6														dde?de@deAde=de>d8e0d>e1d:e3d;e4d<e5d=e6d?e7dAe:dBe$de;de<dCdf"ddZadOe2e2ee,eLf   dPe2e, dCe,fddZbdCee,e,f fddZcedZddeed dedeed f deJdCdfddZedejfjgdedeed f de2eJ dCeed fddZhd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 TEMPLATE]

    # Stream logs from a job
    hf jobs logs <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 TEMPLATE]

    # 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asdict)Path)EmptyQueue)	AnnotatedAnyCallableDictIterableOptionalTypeVarUnion)SpaceHardware	get_token)HfHubHTTPError)logging)_format_size)load_dotenv   )TokenOpt
get_hf_apityper_factoryc                 C   s   g | ]
}|j d kr|j qS )z	zero-a10g)value).0item r   W/home/air/biblejyuku/back/venv/lib/python3.10/site-packages/huggingface_hub/cli/jobs.py
<listcomp>U   s    r   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
--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 IDzJob IDszScheduled Job IDzRun and manage Jobs on the Hub.runz	Run a Jobignore_unknown_optionsT)r   context_settingsFimagecommandenvsecretsenv_filesecrets_fileflavortimeoutdetach	namespacetokenreturnc              	   C   s   i }|r| tt| tj d |pg D ]}| t|tj d qi }t }|r;| tt| |d |p>g D ]}| t||d q?t|
d}|j	| ||||||	d}t
d|j  t
d|j  |rpd S |j|jdD ]}t
| qwd S )Nenvironr-   )r#   r$   r%   r&   r)   r*   r,   Job started with ID: 	View at: job_id)updater   r   	read_textosr0   copy_get_extended_environr   run_jobprintidurlfetch_job_logs)r#   r$   r%   r&   r'   r(   r)   r*   r+   r,   r-   env_map	env_valuesecrets_mapextended_environsecretapijoblogr   r   r   jobs_run   s8    


rH   logszFetch the logs of a Jobr5   c                 C   s*   t |d}|j| |dD ]}t| qd S Nr1   r5   r,   )r   r?   r<   )r5   r,   r-   rE   rG   r   r   r   	jobs_logs*  s   

rL   job_propertiesfiltersc                 C   s   |  D ]<\}}|| vr dS d|v sd|v r3|dddd}td| d| | tjs2 dS q| | |  vr@ dS qdS )	z5Check if scheduled job matches all specified filters.F*?z.*.^$T)itemsreplaceresearch
IGNORECASElower)rM   rN   keypatternregex_patternr   r   r   _matches_filters5  s   r]   rowsheadersaliasesfmtc           
      C   sp   |r.|}| D ]%}|}t |D ]\}}d| d}	|	|v r&||	t|| }qt| qdS tt| |d dS )z,Print output according to the chosen format.z{{.z}})r_   N)	enumeraterU   strr<   	_tabulate)
r^   r_   r`   ra   templaterowlineifieldplaceholderr   r   r   _print_outputG  s   
	rk   nc                 C   s&   d}d}t | D ]}t||d qd S )Nz[1Az[2K)end)ranger<   )rl   LINE_UP
LINE_CLEARrh   r   r   r   _clear_lineZ  s
   rq   metrics_streamtable_headersc                 c   sz   |D ]}| |d  dt |d d dt d|d  |d  d	 dt|d  d
t|d  dt|d  dt|d  dg}|d rt|d tr|gdgt| gt|d d   }t|t|d D ]2\}}|d | }||d  dt d|d  |d  d	 dt|d  d
t|d  dg7 }qjn|dgt|t|  7 }|g}d| |fV  q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)r5   rr   rs   metricsrf   r^   gpu_idgpur   r   r   _get_jobs_stats_rowsa  s.   &r   statsz7Fetch the resource usage statistics and metrics of Jobsjob_idsc                    s  t |d d u r  d | d u rdd  jdD } t| dkr*td d S g dg d	}tjt| }i | D ]}|g}|d
d dd  D 7 }|g|< q?t }fddD }t	||d   fdd| D }	t
|t|	dD ]6\}
}}|
r|d  n||< t }|| tkrtdt|  fddD }t	||d  |}q}W d    d S 1 sw   Y  d S )Nr1   namec                 S   s(   g | ]}|j r|j jnd dv r|jqS )UNKNOWNRUNNINGUPDATING)statusstager=   r   rF   r   r   r   r     s
    zjobs_stats.<locals>.<listcomp>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)	r=   rt   rv   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                 S   s$   g | ]}d |v sd|v rdndqS )/USAGEz-- / --z--r   )r   headerr   r   r   r     s   $ r   c                       g | ]} | D ]}|qqS r   r   r   r5   rf   rows_per_job_idr   r   r         c                    s"   g | ]}| j |d dqS )rK   )r5   rr   rs   )fetch_job_metricsr   r5   )rE   r,   rs   r   r   r     s    )kwargs_listrz   c                    r   r   r   r   r   r   r   r     r   )r   whoami	list_jobsr   r<   multiprocessingpool
ThreadPooltimerk   iflatmap_unorderedr   popSTATS_UPDATE_MIN_INTERVALrq   )r   r,   r-   headers_aliasesr   r5   rf   last_update_time
total_rowsr   doner^   nowr   )rE   r,   r   rs   r   
jobs_stats}  sJ   

"r   psz	List Jobsallz-az--allz*Show all Jobs (default shows just running)filterz-fz--filterz>Filter output based on conditions provided (format: key=value)formatz%Format output using a custom templatec              
   C   s  zt |d}|j|d}g d}g d}g }	i }
|pg D ]}d|v r1|dd\}}||
| < qtd| d q|D ]L}|jrE|jjnd	}| sN|d
vrNq<|j}|jpUd}|j	pZg }|rbd
|nd}|jrm|jdnd}||| |d}t||
s~q<|	|||||g q<|	s|
rdd
dd |
 D  nd}td|  W d S t|	||| W d S  ty } ztd|  W Y d }~d S d }~w tttfy } ztd|  W Y d }~d S d }~w ty } ztdt|j d|  W Y d }~d S d }~ww )Nr1   r   )r   IMAGE/SPACECOMMANDCREATEDSTATUS)r=   r#   r$   createdr   =r   )Warning: Ignoring invalid filter format ''. Use key=value format.r   r   r    %Y-%m-%d %H:%M:%S)r=   r#   r   r$    matching filters: , c                 S      g | ]\}}| d | qS r   r   r   kvr   r   r   r     r   zjobs_ps.<locals>.<listcomp>r   zNo jobs foundzError fetching jobs data: zError processing jobs data: Unexpected error - : )r   r   splitrY   r<   r   r   r=   docker_imager$   join
created_atstrftimer]   appendrT   rk   r   KeyError
ValueError	TypeError	Exceptiontype__name__)r   r,   r-   r   r   rE   jobsrs   r   r^   rN   frZ   r   rF   r   r5   image_or_spacecmdcommand_strr   propsfilters_msger   r   r   jobs_ps  sR   



$(r   hardwarez(List available hardware options for Jobsc            
   
   C   sR  zot  } |  }g d}g d}g }|D ]H}d}|jr,|jj d|jj d|jj d}|jd ur8d|jdnd}|jd urHd|jd	 d
nd}||j|j	pRd|j
|j|||g q|sftd W d S t|||d  W d S  ty }	 ztd|	  W Y d }	~	d S d }	~	w ty }	 ztdt|	j d|	  W Y d }	~	d S d }	~	ww )N)NAMEzPRETTY NAMECPURAMACCELERATORzCOST/MINz	COST/HOUR)r   
prettyNamecpuramacceleratorcostMincostHourr   zx z ()rS   z.4f<   z.2fzNo hardware options foundzError fetching hardware data: r   r   )r   list_jobs_hardwarer   quantitymodelvramunit_cost_usdr   r   pretty_namer   r   r<   rk   r   r   r   r   )
rE   hardware_listrs   r   r^   hwaccelerator_infocost_min	cost_hourr   r   r   r   jobs_hardware  s0   " &(r   inspectz0Display detailed information on one or more JobszThe jobs to inspectc                    @   t |d  fdd| D }ttjdd |D dtd d S )Nr1   c                       g | ]	} j |d qS )rK   )inspect_jobr   rE   r,   r   r   r   E  s    z jobs_inspect.<locals>.<listcomp>c                 S      g | ]}t |qS r   r   r   r   r   r   r   F         indentdefaultr   r<   jsondumpsrc   )r   r,   r-   r   r   r  r   jobs_inspect9  s   
"r  cancelzCancel a Jobc                 C      t |d}|j| |d d S rJ   )r   
cancel_job)r5   r,   r-   rE   r   r   r   jobs_cancelI     
r  zERun UV scripts (Python with inline dependencies) on HF infrastructureuv)r   z8Run a UV script (local file or URL) on HF infrastructurescriptscript_argswith_pythonc                 C   s
  i }|r| tt| tj d |pg D ]}| t|tj d qi }t }|r;| tt| |d |p>g D ]}| t||d q?t|d}|j	| |pVg ||||||||
d
}t
d|j  t
d|j  |	rud S |j|jdD ]}t
| q|d S )Nr/   r1   )
r  r  dependenciesr  r#   r%   r&   r)   r*   r,   r2   r3   r4   )r6   r   r   r7   r8   r0   r9   r:   r   
run_uv_jobr<   r=   r>   r?   )r  r  r#   r)   r%   r&   r'   r(   r*   r+   r,   r-   r  r  r@   rA   rB   rC   rD   rE   rF   rG   r   r   r   jobs_uv_runW  s>    

r  z,Create and manage scheduled Jobs on the Hub.	scheduledzSchedule a Jobschedulesuspendconcurrencyc                 C   s   i }|r| tt| tj d |pg D ]}| t|tj d qi }t }|r;| tt| |d |p>g D ]}| t||d q?t|d}|j	||| |||||	|
|d
}t
d|j  d S )Nr/   r1   )
r#   r$   r  r  r  r%   r&   r)   r*   r,   Scheduled Job created with ID: )r6   r   r   r7   r8   r0   r9   r:   r   create_scheduled_jobr<   r=   )r  r#   r$   r  r  r%   r&   r'   r(   r)   r*   r,   r-   r@   rA   rB   rC   rD   rE   scheduled_jobr   r   r   scheduled_run  s2    
r!  zList scheduled Jobsz1Show all scheduled Jobs (default hides suspended)z--formatc              
   C   s6  zt |d}|j|d}g d}g d}g }	i }
|pg D ]}d|v r1|dd\}}||
| < qtd| d q|D ]_}|jpBd	}| sH|rHq<|j}|jpOd
}|jj	pUd
}|jj
p[g }|rcd|nd
}|jjrq|jjjdnd
}|jjr~|jjdnd
}||t||d}t||
sq<|	|||||||g q<|	s|
rdddd |
 D  nd}td|  W d S t|	||| W d S  ty } ztd|  W Y d }~d S d }~w tttfy } ztd|  W Y d }~d S d }~w ty } ztdt|j d|  W Y d }~d S d }~ww )Nr1   r   )IDSCHEDULEr   r   zLAST RUNzNEXT RUNSUSPEND)r=   r  r#   r$   lastnextr  r   r   r   r   Fr   r   r   )r=   r#   r  r$   r   r   c                 S   r   r   r   r   r   r   r   r     r   z scheduled_ps.<locals>.<listcomp>r   zNo scheduled jobs foundz$Error fetching scheduled jobs data: z&Error processing scheduled jobs data: r   r   )r   list_scheduled_jobsr   rY   r<   r  r=   r  job_specr   r$   r   r   last_jobatr   next_job_run_atrc   r]   r   rT   rk   r   r   r   r   r   r   r   )r   r,   r-   r   r   rE   scheduled_jobsrs   r   r^   rN   r   rZ   r   r   r  sj_idr  r   r   r   last_job_atr+  r   r   r   r   r   r   scheduled_ps  sb   



$(r/  z:Display detailed information on one or more scheduled Jobsscheduled_job_idszThe scheduled jobs to inspectc                    r   )Nr1   c                    r   )scheduled_job_idr,   )inspect_scheduled_job)r   r2  r  r   r   r     s    z%scheduled_inspect.<locals>.<listcomp>c                 S   r  r   r   )r   r   r   r   r   r   !  r  r  r  r	  )r0  r,   r-   r,  r   r  r   scheduled_inspect  s
   
"r4  deletezDelete a scheduled Jobr2  c                 C   r  Nr1   r1  )r   delete_scheduled_jobr2  r,   r-   rE   r   r   r   scheduled_delete$  r  r9  zSuspend (pause) a scheduled Jobc                 C   r  r6  )r   suspend_scheduled_jobr8  r   r   r   scheduled_suspend.  r  r;  resumez Resume (unpause) a scheduled Jobc                 C   r  r6  )r   resume_scheduled_jobr8  r   r   r   scheduled_resume8  r  r>  z(Schedule UV scripts on HF infrastructurec                 C   s   i }|	r| tt|	 tj d |pg D ]}| t|tj d qi }t }|
r;| tt|
 |d |p>g D ]}| t||d q?t|d}|j	||pVg | ||||||||||d}t
d|j  d S )Nr/   r1   )r  r  r  r  r  r  r  r#   r%   r&   r)   r*   r,   r  )r6   r   r   r7   r8   r0   r9   r:   r   create_scheduled_uv_jobr<   r=   )r  r  r  r  r  r#   r)   r%   r&   r'   r(   r*   r,   r-   r  r  r@   rA   rB   rC   rD   rE   rF   r   r   r   scheduled_uv_runF  s8    
r@  c           	      C   s&  dd t g | |R  D }tt jt|d }t|t| |krW|t|}||  d  < t|t| |krM|t| t| ||  ||< t|t| |ks$dt| j| }g }|	|j|  |	|jdd |D   | D ]}dd t ||D }|	|j|  qyd
|S )	z
    Inspired by:

    - stackoverflow.com/a/8356620/593036
    - stackoverflow.com/questions/9535954/printing-lists-as-tabular-data
    c                 S   s   g | ]}t d d |D qS )c                 s   s    | ]	}t t|V  qd S Nr   rc   )r   xr   r   r   	<genexpr>  s    z'_tabulate.<locals>.<listcomp>.<genexpr>)max)r   colr   r   r   r     r   z_tabulate.<locals>.<listcomp>   rz   z{{:{}}} c                 S   s   g | ]}d | qS )-r   )r   wr   r   r   r     r  c                 S   s@   g | ]\}}t t||krt|d |d  d nt|qS )N   z...rB  )r   rC  	col_widthr   r   r   r     s    .
)r   rE  r8   get_terminal_sizecolumnsr   sumindexr   r   r   )	r^   r_   
col_widthsterminal_widthcol_to_minimize
row_formatlinesrf   row_format_argsr   r   r   rd     s$    
rd   c                  C   s$   t j } t  }d ur|| d< | S )NHF_TOKEN)r8   r0   r9   r   )rC   r-   r   r   r   r:     s   
r:   Tqueuefunc.kwargsc                 C   s"   |di |D ]}|  | qd S )Nr   )put)rY  rZ  r[  resultr   r   r   _write_generator_to_queue  s   r^  r   r   c                #   s    t   fdd|D }zGz&	 z	jddV  W n ty3   tdd |D r1 r1Y nY nw qW n	 ty?   Y nw W z
dd |D  W d	S  tjyV   Y d	S w z	dd |D  W w  tjyj   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
    c                    s   g | ]} t |fqS r   )apply_asyncr^  )r   r[  rZ  r   rY  r   r   r     r   z&iflatmap_unordered.<locals>.<listcomp>T皙?r*   c                 s   s    | ]}|  V  qd S rA  )readyr   async_resultr   r   r   rD    s    z%iflatmap_unordered.<locals>.<genexpr>c                 S   s   g | ]}|j d dqS )ra  rb  )getrd  r   r   r   r     s    N)r   rf  r   r   emptyKeyboardInterruptr   TimeoutError)r   rZ  r   async_resultsr   r`  r   r     s8   r   )	NNNNNNFNN)NN)NNN)FNNNN)r.   N)NNNNNNNNFNNNN)
NNNNNNNNNN)NNNNNNNNNNNNNN)i__doc__r
  r   multiprocessing.poolr8   rV   r   dataclassesr   pathlibr   rY  r   r   typingr   r   r	   r
   r   r   r   r   typerhuggingface_hubr   r   huggingface_hub.errorsr   huggingface_hub.utilsr   $huggingface_hub.utils._cache_managerr   huggingface_hub.utils._dotenvr   
_cli_utilsr   r   r   
get_loggerr   loggerSUGGESTED_FLAVORSr   rc   ArgumentImageArgOptionImageOpt	FlavorOptlistEnvOpt
SecretsOpt
EnvFileOptSecretsFileOpt
TimeoutOptbool	DetachOptNamespaceOptWithOpt	PythonOpt
SuspendOptConcurrencyOptScheduleArg	ScriptArgScriptArgsArg
CommandArgJobIdArg	JobIdsArgScheduledJobIdArgjobs_clir$   rH   rL   r   r]   intrk   rq   tupler   r   r   r   r  r  uv_app	add_typerr  scheduled_appr!  r/  r4  r9  r;  r>  scheduled_uv_appr@  rd   r:   rX  r^  r   r   r   r   r   r   r   <module>   s  /(

	
		
	


	
/&

 
F		

X	
		

3	
+		

Q			
		
*4*