ó
    Ú°›j—,  ã                   ó:  • S r SSKrSSKrSSKrSSKrSSKJrJrJrJ	r	J
r
JrJr  SSKrSSKJrJr  SSKJr  SSKJr  SS	KJr  S
SKJr  S
SKJrJr  S
SKJr  S
SKJ r J!r!J"r"  \#" \RH                  RK                  S5      5      RM                  S\ 5      r'\" 5       r(\"" 5       r)S\
\#   4S jr*S\S\\#   4S jr+SS\,4S jjr- SS\S\,S\
\\	\#\4         4S jjr.S\S\	\#\4   S\/4S jr0S\S\	\#\4   S\	\#\4   4S jr1S\S\	\#\4   S\\	\#\\#\4   4   S4   4S jr2g) 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Úreturnc                  óD   • S[         ;  a  g[         R                  SS5      $ )zþ
Prepare the URL for the worker's dedicated stop channel.

Derived from the job-take URL so it points at the same endpoint and worker,
preserving its query string (auth and routing params). Returns None when the
job-take URL is not in the expected form.
ú
/job-take/Nz
/job-stop/)ÚJOB_GET_URLÚreplace© ó    Ú]/home/mande/repo/quber/.venv/lib/python3.13/site-packages/runpod/serverless/modules/rp_job.pyÚ_job_stop_urlr"      s"   € ð œ;Ó&ØÜ×Ñ˜|¨\Ó:Ð:r    Úsessionc              ƒ   óŒ  #   • [        5       nU(       d  / $ U R                  U5       ISh  v•N nUR                  S:X  a  / sSSS5      ISh  v•N   $ UR                  S:X  a4  [        UR                  UR
                  UR                  UR                  S9eUR                  5         UR                  S:w  a5  [        R                  SUR                   35        / sSSS5      ISh  v•N   $  UR                  5       I Sh  v•N n[        U[         5      (       d>  [        R                  S[#        U5      R$                   35        / sSSS5      ISh  v•N   $ UR                  S	/ 5      n[        U[&        5      (       d>  [        R                  S
[#        U5      R$                   35        / sSSS5      ISh  v•N   $ U Vs/ s H  n[        U[(        5      (       d  M  UPM     nn[+        U5      [+        U5      :w  a.  [        R                  S[+        U5      [+        U5      -
   S35        UsSSS5      ISh  v•N   $  GN GNõ GN_ GNH! [        R                  [        4 a6  n[        R                  SU 35        / s SnAsSSS5      ISh  v•N    $ SnAff = f GNL Nés  snf  Nn! , ISh  v•N  (       d  f       g= f7f)ap  
Long-poll the dedicated stop channel for request ids the worker should stop.

The server is expected to hold the request open (long-poll) until a stop
signal is available or the poll times out, so cancellations and timeouts
reach the worker without waiting for the next heartbeat.

Returns:
    A list of request ids to stop. Empty when the poll returned no signals.
NéÌ   é­  ©ÚstatusÚmessageúapplication/jsonz4rp_job | get_stop_signals: unexpected content type: z5rp_job | get_stop_signals: failed to parse response: z4rp_job | get_stop_signals: unexpected payload type: Ú
jobsToStopz5rp_job | get_stop_signals: jobsToStop is not a list: z#rp_job | get_stop_signals: dropped z non-string job ids)r"   Úgetr(   r   Úrequest_infoÚhistoryÚreasonÚraise_for_statusÚcontent_typeÚlogÚwarnÚjsonÚaiohttpÚContentTypeErrorÚ
ValueErrorÚ
isinstanceÚdictÚtypeÚ__name__ÚlistÚstrÚlen)r#   Ústop_urlÚresponseÚpayloadÚerrorÚraw_idsÚjob_idÚjob_idss           r!   Úget_stop_signalsrF   *   s5  é € ô ‹€HÞØˆ	à�{‰{˜8×$Ô$¨Ø�?‰?˜cÓ!Ø÷ %×$Ñ$ð �?‰?˜cÓ!Ü!Ø×%Ñ%Ø× Ñ Ø—‘Ø Ÿ™ñ	ð ð 	×!Ñ!Ô#à× Ñ Ð$6Ó6Ü�H‰HØFÀx×G\ÑG\ÐF]Ð^ôð ÷% %×$Ñ$ð(	Ø$ŸM™M›O×+ˆGô
 ˜'¤4×(Ñ(Ü�H‰HØFÄtÈGÃ}×G]ÑG]ÐF^Ð_ôð ÷= %×$Ñ$ð@ —+‘+˜l¨BÓ/ˆÜ˜'¤4×(Ñ(Ü�H‰HØGÌÈWË×H^ÑH^ÐG_Ð`ôð ÷K %×$Ñ$ñN )0ÓKª˜f´:¸fÄc×3J—6©ˆÐKÜˆw‹<œ3˜w›<Ó'Ü�H‰HØ5´c¸'³lÄSÈÃ\Ñ6QÐ5RÐReÐfôð ÷Y %×$×$Ò$ò* ,øÜ×(Ñ(¬*Ð5ó 	Ü�H‰HÐLÈUÈGÐTÔUØŒI÷1 %×$Ò$ûð,	úô- %ùòN L÷O %×$×$Ð$üs&  ‚)K«H?¬K¯J*ÁKÁIÁKÁBJ*ÃKÃ&IÃ'KÃ-IÄ IÄIÄAJ*ÅKÅJÅKÅAJ*Æ+KÆ7J!Æ8KÆ=J*ÇJ#ÇJ#Ç$A	J*È-KÈ9J(È:KÉKÉKÉIÉJÉ%JÉ>JÉ?J*ÊKÊJÊKÊJÊJ*ÊKÊ!KÊ#J*Ê(KÊ*KÊ0J3Ê1KÊ=KÚ
batch_sizec                 óÖ   • U S:”  a  [         R                  SS5      nUSU  3-  nO[         n[        R                  5       (       a  SOSnUSU 3-  n[        R                  SU 35        U$ )	aH  
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   r   z/job-take-batch/z&batch_size=Ú1Ú0z&job_in_progress=zrp_job | get_job: )r   r   Újob_progressÚget_job_listr2   Údebug)rG   Újob_take_urlÚjob_in_progresss      r!   Ú_job_get_urlrP   h   sv   € ð �Aƒ~Ü"×*Ñ*¨<Ð9KÓLˆØ˜, z lÐ3Ñ3‰ä"ˆä)×6Ñ6×8Ñ8‘c¸c€OØÐ'¨Ð'8Ð9Ñ9€Lä‡I�IÐ" < .Ð1Ô2ØÐr    Únum_jobsc              ƒ   óö  #   • U R                  [        U5      5       ISh  v•N n[        R                  S[	        U5      R
                   SUR                   35        UR                  S:X  a'  [        R                  S5         SSS5      ISh  v•N   gUR                  S:X  a'  [        R                  S5         SSS5      ISh  v•N   gUR                  S:X  a4  [        UR                  UR                  UR                  UR                  S	9eUR                  5         UR                  S
:w  a4  [        R                  SUR                   35         SSS5      ISh  v•N   gUR                  S:X  a'  [        R                  S5         SSS5      ISh  v•N   g UR                  5       I Sh  v•N n[        R                  S5        ['        U[(        5      (       a+  SU;  d  SU;  a  [+        S5      eU/sSSS5      ISh  v•N   $ ['        U[,        5      (       a  UsSSS5      ISh  v•N   $ SSS5      ISh  v•N   g GN! GN¶ GN‚ Nì N· NŸ! [        R                    a6    [        R                  SUR"                   35         SSS5      ISh  v•N    g[$         a3  n[        R                  SU 35         SnASSS5      ISh  v•N    gSnAff = f NÕ N¯ N ! , ISh  v•N  (       d  f       g= f7f)a  
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: Ú r%   z&rp_job | Received 204 status, no jobs.i�  zArp_job | Received 400 status, expected when FlashBoot is enabled.r&   r'   r*   z"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.)r,   rP   r2   rM   r:   r;   r(   r   r-   r.   r/   r0   r1   Úcontent_lengthr4   r5   r6   Úcontentr7   r8   r9   Ú	Exceptionr<   )r#   rQ   r@   ÚjobsÚ
json_errors        r!   Úget_jobr[   €   sM  é € ð �{‰{œ<¨Ó1×2Ô2°hÜ�	‰	Ð'¬¨X«×(?Ñ(?Ð'@ÀÀ(Ç/Á/ÐARÐSÔTà�?‰?˜cÓ!Ü�I‰IÐ>Ô?Ø÷ 3×2Ð2ð �?‰?˜cÓ!Ü�I‰IÐYÔZØ÷ 3×2Ð2ð �?‰?˜cÓ!Ü!Ø×%Ñ%Ø× Ñ Ø—‘Ø Ÿ™ñ	ð ð 	×!Ñ!Ô#ð × Ñ Ð$6Ó6Ü�I‰IÐ:¸8×;PÑ;PÐ:QÐRÔSØ÷3 3×2Ð2ð8 ×"Ñ" aÓ'Ü�I‰IÐ5Ô6Ø÷= 3×2Ð2ð@	Ø!Ÿ™›×(ˆDÜ�I‰IÐ0Ô1ô �dœD×!Ñ!Ø˜4Ó 7°$Ó#6ÜÐ HÓIÐIØ�6÷] 3×2Ñ2ôb �dœD×!Ñ!Ø÷e 3×2×2×2×2×2ñB )øä×'Ñ'ó 	Ü�I‰IÐEÀh×FVÑFVÐEWÐXÔYØ÷K 3×2Ñ2ôL ó 	Ü�I‰IÐ@ÀÀÐMÔNÛ÷Q 3×2Ñ2ûðL	ú÷M 3×2×2Ô2üsT  ‚K9¡I¢K9¥AKÂK9ÂIÂK9Â&KÂ;K9ÃIÃK9ÃBKÅK9ÅIÅK9Å$&KÆ
K9ÆIÆK9ÆIÆ/IÆ0IÇ	.KÇ7K9ÈKÈK9È	KÈK9È+KÈ,K9È<KÈ=K9ÉK9ÉK9ÉK9ÉK9ÉIÉ6KÊKÊK9ÊJÊK9Ê	KÊ#KÊ;KÊ?K9Ë
KËK9ËKËKËK9ËK9ËK9ËK6Ë%K(Ë&K6Ë2K9Úconfigc              ƒ   ó†  #   • [        US   5      (       Ga  Sn[        US   U5      n[        R                  SUS   5        S/ 0nU  S h  v•N n[        R                  SU 3US   5        [	        UR                  S5      [        5      (       a,  US   R                  S5      (       a  S[        US   S   5      0nUR                  S5      (       a  Un  O]UR                  SS	5      (       a  US   R                  US   5        [        XU5      I S h  v•N   MÓ  S	n[        US   U5      I S h  v•N nUR                  S
S	5      (       a  [        R                  SUS   5        SUS'   UR                  S0 5      R                  SS	5      (       ac  [	        U[        5      (       aN  [        R                  " 5       US   S'   [        R                  SUS   5        US   [        -
  S-  nXuS   S   S'   O.[        R                  SUS   5        [        R                  " 5         [!        XX#S9I S h  v•N   g  GNè GN#
 GN	 GN N7f)NÚhandlerTz*Handler is a generator, streaming results.rT   ÚoutputzStream output: rB   Ú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_generatorr2   rM   r8   r,   r9   r=   Úappendr   Úrun_jobÚinfor   Úget_debugger_outputr   Úclear_debugger_outputr   )r#   r\   Újobrf   Úgenerator_outputÚ
job_resultÚstream_outputÚready_delays           r!   Ú
handle_jobrr   Ã   s  é € Ü�F˜9Ñ%×&Ò&Øˆ	Ü,¨V°IÑ->ÀÓDÐÜ�	‰	Ð>ÀÀDÁ	ÔJà �^ˆ
Ù#3÷ 	=�-Ü�I‰I˜¨ Ð7¸¸T¹ÔCä˜-×+Ñ+¨HÓ5´t×<Ñ<Ø  Ñ*×.Ñ.¨w×7Ñ7Ø%,¬c°-ÀÑ2IÈ'Ñ2RÓ.SÐ$T�Mà× Ñ  ×)Ñ)Ø*�
Ùà�z‰zÐ3°U×;Ñ;Ø˜8Ñ$×+Ñ+¨M¸(Ñ,CÔDä ¸Ó<×<Ò<àˆ	Ü" 6¨)Ñ#4°cÓ:×:ˆ
ð ‡z�zÐ" E×*Ñ*Ü�‰ÐCÀSÈÁYÔOØ $ˆ
�9Ñð ‡z�z�)˜RÓ ×$Ñ$ ]°E×:Ñ:¼zÈ*ÔVZ×?[Ñ?[Ü.9×.MÒ.MÓ.Oˆ
�8Ñ˜]Ñ+Ü�	‰	ÐFÈÈDÉ	ÔRð Ð7Ñ8¼>ÑIÈTÑQˆØ@K�8Ñ˜]Ñ+Ð,<Ò=ä�	‰	ÐIÈ3ÈtÉ9ÔUÜ×)Ò)Ô+ô �g¨3Ñ
D×DÑDòK	=ò =ò $4ò" ;ñ( Eùs\   ‚AIÁH9ÁH3ÁH9ÁCIÄH6ÄIÄ.H<Ä/C>IÈ-H?È.IÈ3H9È6IÈ9IÈ?Ir^   rm   c           	   ƒ   óp  #   • [         R                  SUS   5        0 n U " U5      n[        R                  " U5      (       a
  UI Sh  v•N OUn[         R	                  SU 3US   5        [        U[        5      (       a@  UR                  SS5      nUR                  SS5      nXBS'   U(       a  XRS'   U(       a  SUS	'   O[        U[        5      (       a  SU0nOSU0nUR                  S5      0 :X  a  UR                  S5        [        U5        [         R	                  SU 3US   5        U$  Nä! [         aÚ  n[        [        U5      5      [        U5      [        R                  " 5       [         R"                  R                  S
S5      [         R"                  R                  SS5      [$        S.n[         R'                  SUS   5        [         R'                  [(        R*                  " USS95        S[(        R*                  " U5      0n SnANÿSnAff = f! [         R	                  SU 3US   5        f = f7f)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.rT   NzHandler output: rB   ra   r_   Trb   Ú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: )r2   rj   ÚinspectÚisawaitablerM   r8   r9   ÚpopÚboolr,   r   rX   r=   r:   Ú	tracebackÚ
format_excÚosÚenvironr|   rB   r4   Údumps)	r^   rm   Ú
run_resultÚhandler_returnÚ
job_outputÚ	error_msgra   ÚerrÚ
error_infos	            r!   ri   ri   ò   sç  é € ô ‡H�HˆZ˜˜T™Ô#Ø€Jð.>Ù  ›ˆô ×"Ò" >×2Ñ2ð !× Ð àð 	ô 	�	‰	Ð$ Z LÐ1°3°t±9Ô=ä�j¤$×'Ñ'Ø"Ÿ™ w°Ó5ˆIØ'Ÿ^™^Ð,<¸dÓCˆNØ#-�xÑ æØ&/˜7Ñ#ÞØ(,�
˜9Ñ%øä˜
¤D×)Ñ)Ø" JÐ/‰Jð # JÐ/ˆJà�>‰>˜(Ó# rÓ)Ø�N‰N˜8Ô$ä˜*Ô%ô" 	�	‰	Ð$ Z LÐ1°3°t±9Ô=àÐñ[ !øô8 ó 7äœd 3›i›.Ü  ›XÜ(×3Ò3Ó5ÜŸ
™
Ÿ™Ð'<¸iÓHÜŸ™Ÿ™¨¸ÓCÜ,ñ
ˆ
ô 	�	‰	Ð.°°D±	Ô:Ü�	‰	”$—*’*˜Z°Ñ2Ô3ØœtŸzšz¨*Ó5Ð6�
ûð7ûô 	�	‰	Ð$ Z LÐ1°3°t±9Õ=üsN   ‚H6Ÿ(D. ÁD,ÁCD. ÄH6Ä,D. Ä.
HÄ8CHÈH ÈHÈH ÈH3È3H6c                ó|  #   • [         R                  " U 5      n[        R                  U(       a  SOSUS   5         U " U5      nU(       a0  U  Sh  v•N n[        R                  SU 3US   5        SU07v •  M.  U H&  n[        R                  SU 3US   5        SU07v •  M(      [        R                  SUS   5        g Np
 N! [         aK  n[        R                  XQS   5        SS	[        U5       S
[        R                  " 5        307v •   SnANnSnAff = f! [        R                  SUS   5        f = f7f)zU
Run generator job used to stream output.
Yields output partials from the generator.
zUsing Async GeneratorzUsing Standard GeneratorrT   NzAsync Generator output: r_   zGenerator output: rB   z	handler: z 
traceback: zFinished running generator.)
r   Úisasyncgenfunctionr2   rM   rX   rB   r=   rƒ   r„   rj   )r^   rm   Úis_async_genrŠ   Úoutput_partialrŒ   s         r!   rg   rg   3  s"  é € ô ×-Ò-¨gÓ6€LÜ‡I�IÞ#/ÑÐ5OØˆD‰	ôð
;Ù˜S“\ˆ
æÙ(2÷ 1�nÜ—	‘	Ð4°^Ð4DÐEÀsÈ4ÁyÔQØ Ð0Õ0ã",�Ü—	‘	Ð.¨~Ð.>Ð?ÀÀTÁÔKØ Ð0Õ0ò #-ô 	�‰Ð.°°D±	Õ:ñ1©
øô ó VÜ�	‰	�#˜4‘yÔ!Ø˜)¤C¨£H :¨^¼I×<PÒ<PÓ<RÐ;SÐTÐU×UÐUûðVûô 	�‰Ð.°°D±	Õ:üsl   ‚9D<¼C ÁCÁCÁCÁAC Â'D Â(D<ÃCÃC ÃD Ã
DÃADÄD ÄDÄD ÄD9Ä9D<)r   )3Ú__doc__r   r4   r…   rƒ   Útypingr   r   r   r   r   r   r	   r5   Úrunpod.http_clientr
   r   Ú#runpod.serverless.modules.rp_loggerr   Úversionr   r|   Úutilsr   Ú
rp_handlerr   Úrp_httpr   r   Úrp_tipsr   Úworker_stater   r   r   r=   r†   r,   r   r   r2   rK   r"   rF   ÚintrP   r[   r9   rr   ri   rg   r   r    r!   Ú<module>r�      sr  ðñó Û Û 	Û ß M× MÑ Mã ç =Ý <å 4Ý Ý $ß /Ý &ß AÑ Aá�"—*‘*—.‘.Ð!9Ó:Ó;×CÑCÀEÈ9ÓU€áƒn€Ù‹~€ð
;�x ‘}ô 
;ð; Mð ;°d¸3±iô ;ñ|˜Sõ ð2 -.ñ@Øð@Ø&)ð@àˆd�4˜˜S˜‘>Ñ"Ñ#õ@ðF,E˜mð ,E°T¸#¸s¸(±^ð ,EÈTô ,Eð^>˜8ð >¨$¨s°C¨x©.ð >¸TÀ#ÀsÀ(¹^ô >ðB;Øð;Ø   c ™Nð;à�D˜˜e C¨ H™oÐ-Ñ.°Ð4Ñ5õ;r    