
    tni"                     V   d Z ddlZddlZddlZddlZddlmZmZ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 d
dlmZ d
dlm Z m!Z!m"Z"  e#ej$        %                    d                    &                    de           Z' e            Z( e"            Z)dde*fdZ+	 ddede*de
ee	e#ef                           fdZ,dede	e#ef         de-fdZ.dede	e#ef         de	e#ef         fdZ/dede	e#ef         dee	e#ee#ef         f         df         fdZ0dS )z
Job related helpers.
    N)AnyAsyncGeneratorCallableDictOptionalUnionList)ClientSessionTooManyRequests)RunPodLogger   )__version__   )rp_debugger   )is_generator)send_resultstream_result)check_return_size)	WORKER_IDREF_COUNT_ZEROJobsProgressRUNPOD_WEBHOOK_GET_JOBz$ID
batch_sizec                     | dk    r$t                               dd          }|d|  z  }nt           }t                                          rdnd}|d| z  }t                              d|            |S )	a`  
    Prepare the URL for making a 'get' request to the serverless API (sls).

    This function constructs the appropriate URL for sending a 'get' request to the serverless API,
    ensuring that the request will be correctly routed and processed by the API.

    Returns:
        str: The prepared URL for the 'get' request to the serverless API.
    r   z
/job-take/z/job-take-batch/z&batch_size=10z&job_in_progress=zrp_job | get_job: )JOB_GET_URLreplacejob_progressget_job_listlogdebug)r   job_take_urljob_in_progresss      ]/var/www/html/gpu-tools/venv/lib/python3.11/site-packages/runpod/serverless/modules/rp_job.py_job_get_urlr'      s     A~~"**<9KLL3z333")6688AcccO9999LII1<11222    sessionnum_jobsreturnc                   K   |                      t          |                    4 d{V }t                              dt	          |          j         d|j                    |j        dk    r.t                              d           	 ddd          d{V  dS |j        dk    r.t                              d           	 ddd          d{V  dS |j        dk    r't          |j        |j	        |j        |j
        	          |                                 |j        d
k    r6t                              d|j                    	 ddd          d{V  dS |j        dk    r.t                              d           	 ddd          d{V  dS 	 |                                 d{V }t                              d           n# t          j        $ r7 t                              d|j                    Y ddd          d{V  dS t$          $ r9}t                              d|            Y d}~ddd          d{V  dS d}~ww xY wt'          |t(                    r,d|vsd|vrt+          d          |gcddd          d{V  S t'          |t,                    r|cddd          d{V  S 	 ddd          d{V  dS # 1 d{V swxY w Y   dS )a3  
    Get a job from the job-take API.

    `num_jobs = 1` will query the legacy singular job-take API.

    `num_jobs > 1` will query the batch job-take API.

    Args:
        session (ClientSession): The aiohttp ClientSession to use for the request.
        num_jobs (int): The number of jobs to get.
    Nzrp_job | Response:     z&rp_job | Received 204 status, no jobs.i  zArp_job | Received 400 status, expected when FlashBoot is enabled.i  )statusmessagezapplication/jsonz"rp_job | Unexpected content type: r   zrp_job | No content to parse.zrp_job | Received Job(s)z-rp_job | Response content is not valid JSON. z(rp_job | Failed to parse JSON response: idinputz&Job has missing field(s): id or input.)getr'   r"   r#   type__name__r/   r   request_infohistoryreasonraise_for_statuscontent_typecontent_lengthjsonaiohttpContentTypeErrorcontent
ValueError
isinstancedict	Exceptionlist)r)   r*   responsejobs
json_errors        r&   get_jobrH   5   sC      {{<1122 2 2 2 2 2 2 2h		SX(?SS(/SSTTT?c!!II>???2 2 2 2 2 2 2 2 2 2 2 2 2 2 ?c!!IIYZZZ2 2 2 2 2 2 2 2 2 2 2 2 2 2 ?c!!!%  	    	!!###  $666IIR8;PRRSSS32 2 2 2 2 2 2 2 2 2 2 2 2 28 "a''II5666=2 2 2 2 2 2 2 2 2 2 2 2 2 2@	!((((((DII01111' 	 	 	IIXhFVXXYYYK2 2 2 2 2 2 2 2 2 2 2 2 2 2L  	 	 	IIMMMNNNFFFQ2 2 2 2 2 2 2 2 2 2 2 2 2 2L	
 dD!! 	47$#6#6 HIII6]2 2 2 2 2 2 2 2 2 2 2 2 2 2b dD!! 	e2 2 2 2 2 2 2 2 2 2 2 2 2 2b	c2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2sa   AK&KA4K&K4G
K1I<K	II6KI1KK
K Kconfigc                 4  K   t          |d                   r7d}t          |d         |          }t                              d|d                    dg i}|2 3 d {V }t                              d| |d                    t	          |                    d                    t          k    r8|d                             d          rdt          |d         d                   i}|                    d          r|} nP|                    dd	          r!|d                             |d                    t          | ||           d {V  6 nd	}t          |d         |           d {V }|                    d
d	          r&t                              d|d                    d|d<   |                    di                               dd	          rwt          |t                    rbt          j                    |d         d<   t                              d|d                    |d         t          z
  dz  }||d         d         d<   n4t                              d|d                    t          j                     t#          | |||           d {V  d S )NhandlerTz*Handler is a generator, streaming results.r1   outputzStream output: errorreturn_aggregate_streamFrefresh_workerz0refresh_worker flag set, stopping pod after job.stopPodrp_argsr   z2rp_debugger | Flag set, returning debugger output.reference_counter_starti  ready_delay_msz5rp_debugger | Flag not set, skipping debugger output.)	is_stream)r   run_job_generatorr"   r#   r4   r3   rB   strappendr   run_jobinforA   r   get_debugger_outputr   clear_debugger_outputr   )r)   rI   jobrT   generator_output
job_resultstream_outputready_delays           r&   
handle_jobra   x   s     F9%&& ;	,VI->DD		>D	JJJ^
#3 	= 	= 	= 	= 	= 	= 	=-II777TCCCM%%h//00D88 *..w77 U%,c-2I'2R.S.S$TM  )) *
zz3U;; E8$++M(,CDDD<<<<<<<<<< $4  	"6)#4c::::::::
 zz"E** %CSYOOO $
9 zz)R  $$]E:: 	,z*VZ?[?[ 	,.9.M.O.O
8]+		FD	RRR 78>ITQ@K
8]+,<==		I3t9UUU)+++ gz3)
D
D
DDDDDDDDDDs   ErK   r\   c           	        K   t                               d|d                    i }	  | |          }t          j        |          r| d{V n|}t                               d| |d                    t          |t                    r@|                    dd          }|                    dd          }||d<   |r||d<   |rd|d	<   nt          |t                    rd|i}nd|i}|	                    d          i k    r|                    d           t          |           n# t          $ r}t          t          |                    t          |          t          j                    t           j        	                    d
d          t           j        	                    dd          t$          d}t                               d|d                    t                               t)          j        |d                     dt)          j        |          i}Y d}~nd}~ww xY wt                               d| |d                    n)# t                               d| |d                    w xY w|S )z
    Run the job using the handler.

    Args:
        handler (Callable): The handler function to use.
        job (Dict[str, Any]): The job to run.

    Returns:
        Dict[str, Any]: The result of running the job.
    zStarted.r1   NzHandler output: rM   rO   rL   TrP   RUNPOD_POD_HOSTNAMEunknownRUNPOD_POD_ID)
error_typeerror_messageerror_tracebackhostname	worker_idrunpod_versionzCaptured Handler Exception   )indentzrun_job return: )r"   rY   inspectisawaitabler#   rA   rB   popboolr3   r   rC   rV   r4   	traceback
format_excosenvironrk   rM   r<   dumps)	rK   r\   
run_resulthandler_return
job_output	error_msgrO   err
error_infos	            r&   rX   rX      s      HHZT###J.>  ">22 .        	 			1Z113t9===j$'' 	0"w55I'^^,<dCCN#-Jx  0&/
7# -(,
9%
D)) 	0"J/JJ #J/J>>(##r))NN8$$$*%%%% 7 7 7d3ii.. XX(355
'<iHHCC,
 

 			.D	:::		$*Z222333tz*556





7 			1Z113t9====		1Z113t9====s1   C=D% $I %
H /C'HI H  I &I.c                  K   t          j        |           }t                              |rdnd|d                    	  | |          }|r7|2 3 d{V }t                              d| |d                    d|iW V  36 n0|D ]-}t                              d| |d                    d|iW V  .nc# t          $ rV}t                              ||d                    dd	t          |           d
t          j                     iW V  Y d}~nd}~ww xY wt          	                    d|d                    dS # t          	                    d|d                    w xY w)za
    Run generator job used to stream output.
    Yields output partials from the generator.
    zUsing Async GeneratorzUsing Standard Generatorr1   NzAsync Generator output: rL   zGenerator output: rM   z	handler: z 
traceback: zFinished running generator.)
rn   isasyncgenfunctionr"   r#   rC   rM   rV   rr   rs   rY   )rK   r\   is_async_genry   output_partialr{   s         r&   rU   rU      s      -g66LII#/O5OD	  
;WS\\
 	1(2 1 1 1 1 1 1 1n		E^EEs4yQQQ000000 )3
 #- 1 1		?~??TKKK000000 V V V		#s4y!!!TCHHTTI<P<R<RTTUUUUUUUUUUV 	.D	:::::.D	::::s=   B2 A?AB2 1D8 2
D<ADD8 DD8 8#E)r   )1__doc__rn   r<   rt   rr   typingr   r   r   r   r   r   r	   r=   runpod.http_clientr
   r   #runpod.serverless.modules.rp_loggerr   versionr   rk   utilsr   
rp_handlerr   rp_httpr   r   rp_tipsr   worker_stater   r   r   rV   ru   r3   r   r   r"   r    intr'   rH   rB   ra   rX   rU    r(   r&   <module>r      s      				     M M M M M M M M M M M M M M M M M M  = = = = = = = = < < < < < < 4 4 4 4 4 4       $ $ $ $ $ $ / / / / / / / / & & & & & & A A A A A A A A A Ac"*..!9::;;CCE9UUlnn|~~ S    2 -.@ @@&)@d4S>"#@ @ @ @F,Em ,ET#s(^ ,ET ,E ,E ,E ,E^>8 >$sCx. >T#s(^ > > > >B;; cN;DeCHo-.45; ; ; ; ; ;r(   