§
    }Štj\  ã                   ó:  — 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 d dlmZ d dlmZ d d	lmZ  G d
„ dee¦  «        Z G d„ dee¦  «        Zej        ej        ej        ej        fZdZe G d„ d¦  «        ¦   «         Ze G d„ d¦  «        ¦   «         Ze G d„ d¦  «        ¦   «         Ze G d„ d¦  «        ¦   «         Ze G d„ d¦  «        ¦   «         Ze G d„ d¦  «        ¦   «         Z e G d„ d¦  «        ¦   «         Z!e G d„ d¦  «        ¦   «         Z"e G d„ d ¦  «        ¦   «         Z#e G d!„ d"¦  «        ¦   «         Z$e G d#„ d$¦  «        ¦   «         Z%d%ee	z  d&efd'„Z&d(ed&efd)„Z'd*e(e         d&efd+„Z)d,ed-e(e         d&efd.„Z*d/ed0e(e         d&efd1„Z+ddddd2dd3œd,ed-e(e         d4e,eef         dz  d5e,eef         dz  d6eez  dz  d7e-e.z  ez  dz  d(edz  d8e,eef         dz  d9e(e         dz  d:e(e-         dz  d;e/d<edz  d&e,eef         fd=„Z0dS )>é    N)Ú	dataclass)Údatetime)ÚEnum)ÚPath)ÚAny)Ú	constants©ÚVolume)Úparse_datetimec                   óz   — e Zd ZdZdZdZdZdZdZdZ	dZ
d	Zd
ZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdS )ÚJobHardwarea  
    Enumeration of hardware flavors available to run Jobs on the Hub.

    Value can be compared to a string:
    ```py
    assert JobHardware.CPU_BASIC == "cpu-basic"
    ```

    Both enums are kept in sync with the Hub API by `utils/check_hardware_flavors.py`.
    z	cpu-basiczcpu-upgradezcpu-performancezcpu-xlzt4-smallz	t4-mediumÚl4x1Úl4x4Úl40sx1Úl40sx4Úl40sx8z
a10g-smallz
a10g-largeza10g-largex2za10g-largex4z
a100-largeÚa100x4Úa100x8Úh200Úh200x2Úh200x4Úh200x8zrtx-pro-6000zrtx-pro-6000x2zrtx-pro-6000x4zrtx-pro-6000x8N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__Ú	CPU_BASICÚCPU_UPGRADEÚCPU_PERFORMANCEÚCPU_XLÚT4_SMALLÚ	T4_MEDIUMÚL4X1ÚL4X4ÚL40SX1ÚL40SX4ÚL40SX8Ú
A10G_SMALLÚ
A10G_LARGEÚA10G_LARGEX2ÚA10G_LARGEX4Ú
A100_LARGEÚA100X4ÚA100X8ÚH200ÚH200X2ÚH200X4ÚH200X8ÚRTX_PRO_6000ÚRTX_PRO_6000X2ÚRTX_PRO_6000X4ÚRTX_PRO_6000X8© ó    úW/var/www/html/CA-Chatbot/venv/lib/python3.11/site-packages/huggingface_hub/_jobs_api.pyr   r      sž   € € € € € ð	ð 	ð €IØ€KØ'€OØ€Fð €HØ€IØ€DØ€DØ€FØ€FØ€FØ€JØ€JØ!€LØ!€LØ€JØ€FØ€FØ€DØ€FØ€FØ€FØ!€LØ%€NØ%€NØ%€N€N€Nr8   r   c                   ó*   — e Zd ZdZdZdZdZdZdZdZ	dS )	ÚJobStageav  
    Enumeration of possible stage of a Job on the Hub.

    Value can be compared to a string:
    ```py
    assert JobStage.COMPLETED == "COMPLETED"
    ```
    Possible values are: `COMPLETED`, `CANCELED`, `ERROR`, `DELETED`, `SCHEDULING`, `RUNNING`.
    Taken from https://github.com/huggingface/moon-landing/blob/main/server/job_types/JobInfo.ts#L61 (private url).
    Ú	COMPLETEDÚCANCELEDÚERRORÚDELETEDÚ
SCHEDULINGÚRUNNINGN)
r   r   r   r   r<   r=   r>   r?   r@   rA   r7   r8   r9   r;   r;   G   s8   € € € € € ð	ð 	ð €IØ€HØ€EØ€GØ€JØ€G€G€Gr8   r;   )zhttps://huggingface.co/spaces/zhttps://hf.co/spaces/zhuggingface.co/spaces/zhf.co/spaces/c                   óV   — e Zd ZU eed<   edz  ed<   ee         dz  ed<   edz  ed<   dS )Ú	JobStatusÚstageNÚmessageÚexpose_urlsÚssh_url)r   r   r   r;   Ú__annotations__ÚstrÚlistr7   r8   r9   rC   rC   h   sP   € € € € € € à€O€O�OØ�4‰ZÐÐÑØ�c”˜TÑ!Ð!Ð!Ñ!Ø�4‰ZÐÐÑÐÐr8   rC   c                   ó.   — e Zd ZU eed<   eed<   eed<   dS )ÚJobOwnerÚidÚnameÚtypeN)r   r   r   rI   rH   r7   r8   r9   rL   rL   p   s+   € € € € € € à€G€G�GØ
€I€I�IØ
€I€I�I€I€Ir8   rL   c                   óL   — e Zd ZU dZedz  ed<   edz  ed<   edz  ed<   dd„ZdS )	ÚJobDurationsau  
    Timing breakdown for a Job, computed server-side.

    Args:
        scheduling_secs (`int` or `None`):
            Seconds the job spent in the scheduling stage before starting to run.
            `None` if the job never reached the running stage.
        running_secs (`int` or `None`):
            Seconds the job has been or was running. Recomputed on each request
            while the job is in progress. `None` if the job never started running.
        total_secs (`int` or `None`):
            Total seconds elapsed since the job was created. Recomputed on each
            request while the job is in progress.
    NÚscheduling_secsÚrunning_secsÚ
total_secsÚreturnc                 ó  — |                      d|                      d¦  «        ¦  «        | _        |                      d|                      d¦  «        ¦  «        | _        |                      d|                      d¦  «        ¦  «        | _        d S )NÚschedulingSecsrR   ÚrunningSecsrS   Ú	totalSecsrT   )ÚgetrR   rS   rT   ©ÚselfÚkwargss     r9   Ú__init__zJobDurations.__init__Œ   sm   € Ø%ŸzšzÐ*:¸F¿JºJÐGXÑ<YÔ<YÑZÔZˆÔØ"ŸJšJ }°f·j²jÀÑ6PÔ6PÑQÔQˆÔØ Ÿ*š* [°&·*²*¸\Ñ2JÔ2JÑKÔKˆŒˆˆr8   ©rU   N)r   r   r   r   ÚintrH   r^   r7   r8   r9   rQ   rQ   w   sl   € € € € € € ðð ð ˜4‘ZÐÐÑØ˜‘*ÐÐÑØ�d‘
ÐÐÑðLð Lð Lð Lð Lð Lr8   rQ   c                   ó<   — e Zd ZU dZeed<   eed<   dZedz  ed<   dS )ÚJobInitiatoraJ  
    Contains information about what triggered a Job.

    Args:
        type (`str`): Initiator kind, for example `"user"`, `"org"`, `"scheduled-job"`, or `"duplicated-job"`.
        id (`str`): Identifier of the initiator.
        name (`str` or `None`): Human-readable name when available, usually for user/org initiators.
    rO   rM   NrN   )r   r   r   r   rI   rH   rN   r7   r8   r9   rb   rb   ’   sD   € € € € € € ðð ð €I€I�IØ€G€G�GØ€Dˆ#�‰*ÐÐÑÐÐr8   rb   c                   ó‚  — e Zd ZU dZeed<   edz  ed<   edz  ed<   edz  ed<   edz  ed<   edz  ed<   ee         dz  ed	<   ee         dz  ed
<   eee	f         dz  ed<   eee	f         dz  ed<   e
dz  ed<   eeef         dz  ed<   ee         dz  ed<   eed<   edz  ed<   eed<   edz  ed<   eed<   eed<   dd„ZdS )ÚJobInfoaé  
    Contains information about a Job.

    Args:
        id (`str`):
            Job ID.
        created_at (`datetime` or `None`):
            When the Job was created.
        started_at (`datetime` or `None`):
            When the Job started running. None while the Job is still scheduling.
        finished_at (`datetime` or `None`):
            When the Job finished. None while the Job is still scheduling or running.
        docker_image (`str` or `None`):
            The Docker image from Docker Hub used for the Job.
            Can be None if space_id is present instead.
        space_id (`str` or `None`):
            The Docker image from Hugging Face Spaces used for the Job.
            Can be None if docker_image is present instead.
        command (`list[str]` or `None`):
            Command of the Job, e.g. `["python", "-c", "print('hello world')"]`
        arguments (`list[str]` or `None`):
            Arguments passed to the command
        environment (`dict[str]` or `None`):
            Environment variables of the Job as a dictionary.
        secrets (`dict[str]` or `None`):
            Secret environment variables of the Job (encrypted).
        flavor (`str` or `None`):
            Flavor for the hardware. See [`JobHardware`] for possible values.
            E.g. `"cpu-basic"`.
        labels (`dict[str, str]` or `None`):
            Labels to attach to the job (key-value pairs).
        volumes (`list[Volume]` or `None`):
            Volumes mounted in the job container (buckets, models, datasets, spaces).
        status: (`JobStatus` or `None`):
            Status of the Job, e.g. `JobStatus(stage="RUNNING", message=None)`
            See [`JobStage`] for possible stage values.
        durations (`JobDurations` or `None`):
            Timing breakdown of the Job. Present for all job states including SCHEDULING.
        owner: (`JobOwner` or `None`):
            Owner of the Job, e.g. `JobOwner(id="5e9ecfc04957053f60648a3e", name="lhoestq", type="user")`
        initiator (`JobInitiator` or `None`):
            What triggered the Job, e.g. `JobInitiator(type="scheduled-job", id="...")` for a cron-triggered run.
        expose_urls (`list[str]` or `None`):
            Public URLs through which the Job's exposed ports are reachable (one per port exposed via `expose=`),
            e.g. `["https://687fb701029421ae5549d998--8000.hf.jobs"]`. `None` when no port is exposed.
            Accessing a URL requires an HF token with read access to the Job's namespace.
        ssh_url (`str` or `None`):
            SSH endpoint of the Job, e.g. `"ssh://687fb701029421ae5549d998@ssh.hf.jobs"`. Only present when the Job
            was started with `ssh=True`. Connecting requires write access to the Job's namespace and an SSH public
            key registered on the Hub (https://huggingface.co/settings/keys).

    Example:

    ```python
    >>> from huggingface_hub import run_job
    >>> job = run_job(
    ...     image="python:3.12",
    ...     command=["python", "-c", "print('Hello from the cloud!')"]
    ... )
    >>> job
    JobInfo(id='687fb701029421ae5549d998', created_at=datetime.datetime(2025, 7, 22, 16, 6, 25, 79000, tzinfo=datetime.timezone.utc), started_at=datetime.datetime(2025, 7, 22, 16, 6, 31, 79000, tzinfo=datetime.timezone.utc), finished_at=None, docker_image='python:3.12', space_id=None, command=['python', '-c', "print('Hello from the cloud!')"], arguments=[], environment={}, secrets={}, flavor='cpu-basic', labels=None, status=JobStatus(stage='RUNNING', message=None), durations=JobDurations(scheduling_secs=6, running_secs=2, total_secs=8), owner=JobOwner(id='5e9ecfc04957053f60648a3e', name='lhoestq', type='user'), initiator=JobInitiator(type='user', id='5e9ecfc04957053f60648a3e', name='lhoestq'), endpoint='https://huggingface.co', url='https://huggingface.co/jobs/lhoestq/687fb701029421ae5549d998')
    >>> job.id
    '687fb701029421ae5549d998'
    >>> job.url
    'https://huggingface.co/jobs/lhoestq/687fb701029421ae5549d998'
    >>> job.status.stage
    'RUNNING'
    ```
    rM   NÚ
created_atÚ
started_atÚfinished_atÚdocker_imageÚspace_idÚcommandÚ	argumentsÚenvironmentÚsecretsÚflavorÚlabelsÚvolumesÚstatusÚ	durationsÚownerÚ	initiatorÚendpointÚurlrU   c                 óÎ  — |d         | _         |                     d¦  «        p|                     d¦  «        }|rt          |¦  «        nd | _        |                     d¦  «        p|                     d¦  «        }|rt          |¦  «        nd | _        |                     d¦  «        p|                     d¦  «        }|rt          |¦  «        nd | _        |                     d¦  «        p|                     d	¦  «        | _        |                     d
¦  «        p|                     d¦  «        | _        |                     di ¦  «        }t          |d         |d         |d         ¬¦  «        | _	        |                     d¦  «        | _
        |                     d¦  «        | _        |                     d¦  «        | _        |                     d¦  «        | _        |                     d¦  «        | _        |                     d¦  «        | _        |                     d¦  «        }|rd„ |D ¦   «         nd | _        |                     di ¦  «        }t#          |d         |                     d¦  «        |                     d¦  «        |                     d¦  «        ¬¦  «        | _        |                     d¦  «        }|rt'          d$i |¤Žnd | _        |                     d¦  «        }	|	r1t+          |	d         |	d         |	                     d¦  «        ¬ ¦  «        nd | _        |                     d!t.          j        ¦  «        | _        | j        › d"| j	        j        › d#| j         › �| _        d S )%NrM   Ú	createdAtre   Ú	startedAtrf   Ú
finishedAtrg   ÚdockerImagerh   ÚspaceIdri   rs   rN   rO   ©rM   rN   rO   rj   rk   rl   rm   rn   ro   rp   c                 ó&   — g | ]}t          d i |¤Ž‘ŒS ©r7   r	   ©Ú.0Úvs     r9   ú
<listcomp>z$JobInfo.__init__.<locals>.<listcomp>  ó"   € Ð5Ð5Ð5¨�˜˜ ˜˜Ð5Ð5Ð5r8   rq   rD   rE   Ú
exposeUrlsÚsshUrl)rD   rE   rF   rG   rr   rt   )rO   rM   rN   ru   z/jobs/ú/r7   )rM   rZ   r   re   rf   rg   rh   ri   rL   rs   rj   rk   rl   rm   rn   ro   rp   rC   rq   rQ   rr   rb   rt   r   ÚENDPOINTru   rN   rv   )
r\   r]   re   rf   rg   rs   rp   rq   rr   rt   s
             r9   r^   zJobInfo.__init__   sþ  € Ø˜”,ˆŒØ—Z’Z Ñ,Ô,ÐH°·
²
¸<Ñ0HÔ0Hˆ
Ø8BÐL�.¨Ñ4Ô4Ð4ÈˆŒØ—Z’Z Ñ,Ô,ÐH°·
²
¸<Ñ0HÔ0Hˆ
Ø8BÐL�.¨Ñ4Ô4Ð4ÈˆŒØ—j’j Ñ.Ô.ÐK°&·*²*¸]Ñ2KÔ2KˆØ:EÐO�>¨+Ñ6Ô6Ð6È4ˆÔØ"ŸJšJ }Ñ5Ô5ÐS¸¿ºÀNÑ9SÔ9SˆÔØŸ
š
 9Ñ-Ô-ÐG°·²¸JÑ1GÔ1GˆŒØ—
’
˜7 BÑ'Ô'ˆÝ  t¤°5¸´=ÀuÈVÄ}ÐUÑUÔUˆŒ
Ø—z’z )Ñ,Ô,ˆŒØŸš KÑ0Ô0ˆŒØ!Ÿ:š: mÑ4Ô4ˆÔØ—z’z )Ñ,Ô,ˆŒØ—j’j Ñ*Ô*ˆŒØ—j’j Ñ*Ô*ˆŒØ—*’*˜YÑ'Ô'ˆØ9@ÐJÐ5Ð5¨WÐ5Ñ5Ô5Ð5ÀdˆŒØ—’˜H bÑ)Ô)ˆÝØ˜”/Ø—J’J˜yÑ)Ô)ØŸ
š
 <Ñ0Ô0Ø—J’J˜xÑ(Ô(ð	
ñ 
ô 
ˆŒð —J’J˜{Ñ+Ô+ˆ	Ø6?ÐI�Ð2Ð2¨	Ð2Ð2Ð2ÀTˆŒØ—J’J˜{Ñ+Ô+ˆ	àdmÐw�L˜i¨Ô/°I¸d´OÈ)Ï-Ê-ÐX^ÑJ_ÔJ_Ð`Ñ`Ô`Ð`Ðswð 	Œð
 Ÿ
š
 :­yÔ/AÑBÔBˆŒØ”mÐFÐF¨4¬:¬?ÐFÐF¸T¼WÐFÐFˆŒˆˆr8   r_   )r   r   r   r   rI   rH   r   rJ   Údictr   r   r
   rC   rQ   rL   rb   r^   r7   r8   r9   rd   rd   ¢   s~  € € € € € € ðDð DðL 	€G€G�GØ˜4‘ÐÐÑØ˜4‘ÐÐÑØ˜D‘Ð Ð Ñ Ø˜‘*ÐÐÑØ�D‰jÐÐÑØ�#ŒY˜ÑÐÐÑØ�CŒy˜4ÑÐÐÑØ�c˜3�h” $Ñ&Ð&Ð&Ñ&Ø�#�s�(Œ^˜dÑ"Ð"Ð"Ñ"Ø˜$ÑÐÐÑØ��c�ŒN˜TÑ!Ð!Ð!Ñ!Ø�&Œ\˜DÑ Ð Ð Ñ ØÐÐÑØ˜dÑ"Ð"Ð"Ñ"Ø€O€O�OØ˜dÑ"Ð"Ð"Ñ"ð €M€M�MØ	€H€H�Hð$Gð $Gð $Gð $Gð $Gð $Gr8   rd   c                   ó8  — e Zd ZU edz  ed<   edz  ed<   ee         dz  ed<   ee         dz  ed<   eeef         dz  ed<   eeef         dz  ed<   edz  ed<   e	dz  ed	<   ee         dz  ed
<   edz  ed<   eeef         dz  ed<   ee
         dz  ed<   dd„ZdS )ÚJobSpecNrh   ri   rj   rk   rl   rm   rn   ÚtimeoutÚtagsÚarchro   rp   rU   c                 óê  — |                      d¦  «        p|                      d¦  «        | _        |                      d¦  «        p|                      d¦  «        | _        |                      d¦  «        | _        |                      d¦  «        | _        |                      d¦  «        | _        |                      d¦  «        | _        |                      d	¦  «        | _        |                      d
¦  «        | _        |                      d¦  «        | _	        |                      d¦  «        | _
        |                      d¦  «        | _        |                      d¦  «        }|rd„ |D ¦   «         nd | _        d S )Nr{   rh   r|   ri   rj   rk   rl   rm   rn   rŒ   r�   rŽ   ro   rp   c                 ó&   — g | ]}t          d i |¤Ž‘ŒS r   r	   r€   s     r9   rƒ   z$JobSpec.__init__.<locals>.<listcomp>C  r„   r8   )rZ   rh   ri   rj   rk   rl   rm   rn   rŒ   r�   rŽ   ro   rp   )r\   r]   rp   s      r9   r^   zJobSpec.__init__6  s,  € Ø"ŸJšJ }Ñ5Ô5ÐS¸¿ºÀNÑ9SÔ9SˆÔØŸ
š
 9Ñ-Ô-ÐG°·²¸JÑ1GÔ1GˆŒØ—z’z )Ñ,Ô,ˆŒØŸš KÑ0Ô0ˆŒØ!Ÿ:š: mÑ4Ô4ˆÔØ—z’z )Ñ,Ô,ˆŒØ—j’j Ñ*Ô*ˆŒØ—z’z )Ñ,Ô,ˆŒØ—J’J˜vÑ&Ô&ˆŒ	Ø—J’J˜vÑ&Ô&ˆŒ	Ø—j’j Ñ*Ô*ˆŒØ—*’*˜YÑ'Ô'ˆØ9@ÐJÐ5Ð5¨WÐ5Ñ5Ô5Ð5ÀdˆŒˆˆr8   r_   )r   r   r   rI   rH   rJ   r‰   r   r   r`   r
   r^   r7   r8   r9   r‹   r‹   '  s   € € € € € € à˜‘*ÐÐÑØ�D‰jÐÐÑØ�#ŒY˜ÑÐÐÑØ�CŒy˜4ÑÐÐÑØ�c˜3�h” $Ñ&Ð&Ð&Ñ&Ø�#�s�(Œ^˜dÑ"Ð"Ð"Ñ"Ø˜$ÑÐÐÑØ�4‰ZÐÐÑØ
ˆsŒ)�dÑ
ÐÐÑØ
�‰*ÐÐÑØ��c�ŒN˜TÑ!Ð!Ð!Ñ!Ø�&Œ\˜DÑ Ð Ð Ñ ðKð Kð Kð Kð Kð Kr8   r‹   c                   ó,   — e Zd ZU eed<   eed<   dd„ZdS )ÚLastJobInforM   ÚatrU   Nc                 óT   — |d         | _         t          |d         ¦  «        | _        d S )NrM   r“   )rM   r   r“   r[   s     r9   r^   zLastJobInfo.__init__K  s$   € Ø˜”,ˆŒÝ  ¨¤Ñ.Ô.ˆŒˆˆr8   r_   )r   r   r   rI   rH   r   r^   r7   r8   r9   r’   r’   F  s<   € € € € € € à€G€G�GØ€L€L�Lð/ð /ð /ð /ð /ð /r8   r’   c                   ó8   — e Zd ZU edz  ed<   edz  ed<   dd„ZdS )ÚScheduledJobStatusNÚlast_jobÚnext_job_run_atrU   c                 ó"  — |                      d¦  «        p|                      d¦  «        }|rt          di |¤Žnd | _        |                      d¦  «        p|                      d¦  «        }|rt          t	          |¦  «        ¦  «        nd | _        d S )NÚlastJobr—   ÚnextJobRunAtr˜   r7   )rZ   r’   r—   r   rI   r˜   )r\   r]   r—   r˜   s       r9   r^   zScheduledJobStatus.__init__U  s�   € Ø—:’:˜iÑ(Ô(ÐB¨F¯JªJ°zÑ,BÔ,BˆØ3;ÐE�Ð/Ð/ hÐ/Ð/Ð/ÀˆŒØ Ÿ*š* ^Ñ4Ô4ÐU¸¿
º
ÐCTÑ8UÔ8UˆØGVÐ`�~­c°/Ñ.BÔ.BÑCÔCÐCÐ\`ˆÔÐÐr8   r_   )r   r   r   r’   rH   r   r^   r7   r8   r9   r–   r–   P  sQ   € € € € € € à˜DÑ Ð Ð Ñ Ø ‘_Ð$Ð$Ñ$ðað að að að að ar8   r–   c                   ó„   — e Zd ZU dZeed<   edz  ed<   eed<   edz  ed<   edz  ed<   edz  ed<   e	ed	<   e
ed
<   dd„ZdS )ÚScheduledJobInfoaÅ  
    Contains information about a Job.

    Args:
        id (`str`):
            Scheduled Job ID.
        created_at (`datetime` or `None`):
            When the scheduled Job was created.
        tags (`list[str]` or `None`):
            The tags of the scheduled Job.
        schedule (`str` or `None`):
            One of "@annually", "@yearly", "@monthly", "@weekly", "@daily", "@hourly", or a
            CRON schedule expression (e.g., '0 9 * * 1' for 9 AM every Monday).
        suspend (`bool` or `None`):
            Whether the scheduled job is suspended (paused).
        concurrency (`bool` or `None`):
            Whether multiple instances of this Job can run concurrently.
        status (`ScheduledJobStatus` or `None`):
            Status of the scheduled Job.
        owner: (`JobOwner` or `None`):
            Owner of the scheduled Job, e.g. `JobOwner(id="5e9ecfc04957053f60648a3e", name="lhoestq", type="user")`
        job_spec: (`JobSpec` or `None`):
            Specifications of the Job.

    Example:

    ```python
    >>> from huggingface_hub import run_job
    >>> scheduled_job = create_scheduled_job(
    ...     image="python:3.12",
    ...     command=["python", "-c", "print('Hello from the cloud!')"],
    ...     schedule="@hourly",
    ... )
    >>> scheduled_job.id
    '687fb701029421ae5549d999'
    >>> scheduled_job.status.next_job_run_at
    datetime.datetime(2025, 7, 22, 17, 6, 25, 79000, tzinfo=datetime.timezone.utc)
    ```
    rM   Nre   Újob_specÚscheduleÚsuspendÚconcurrencyrq   rs   rU   c                 ó*  — |d         | _         |                     d¦  «        p|                     d¦  «        }|rt          |¦  «        nd | _        t	          di |                     d¦  «        p|                     di ¦  «        ¤Ž| _        |                     d¦  «        | _        |                     d¦  «        | _        |                     d¦  «        | _        |                     d	i ¦  «        }t          |                     d
¦  «        p|                     d¦  «        |                     d¦  «        p|                     d¦  «        ¬¦  «        | _
        |                     di ¦  «        }t          |d         |d         |d         ¬¦  «        | _        d S )NrM   rx   re   rž   ÚjobSpecrŸ   r    r¡   rq   r—   rš   r˜   r›   )r—   r˜   rs   rN   rO   r}   r7   )rM   rZ   r   re   r‹   rž   rŸ   r    r¡   r–   rq   rL   rs   )r\   r]   re   rq   rs   s        r9   r^   zScheduledJobInfo.__init__�  s\  € Ø˜”,ˆŒØ—Z’Z Ñ,Ô,ÐH°·
²
¸<Ñ0HÔ0Hˆ
Ø8BÐL�.¨Ñ4Ô4Ð4ÈˆŒÝÐXÐX 6§:¢:¨jÑ#9Ô#9Ð#V¸V¿ZºZÈ	ÐSUÑ=VÔ=VÐXÐXˆŒØŸ
š
 :Ñ.Ô.ˆŒØ—z’z )Ñ,Ô,ˆŒØ!Ÿ:š: mÑ4Ô4ˆÔØ—’˜H bÑ)Ô)ˆÝ(Ø—Z’Z 
Ñ+Ô+ÐD¨v¯zªz¸)Ñ/DÔ/DØ"ŸJšJÐ'8Ñ9Ô9ÐW¸V¿ZºZÈÑ=WÔ=Wð
ñ 
ô 
ˆŒð —
’
˜7 BÑ'Ô'ˆÝ  t¤°5¸´=ÀuÈVÄ}ÐUÑUÔUˆŒ
ˆ
ˆ
r8   r_   )r   r   r   r   rI   rH   r   r‹   Úboolr–   rL   r^   r7   r8   r9   r�   r�   \  s§   € € € € € € ð&ð &ðP 	€G€G�GØ˜4‘ÐÐÑØÐÐÑØ�D‰jÐÐÑØ�D‰[ÐÐÑØ˜‘ÐÐÑØÐÐÑØ€O€O�OðVð Vð Vð Vð Vð Vr8   r�   c                   óN   — e Zd ZU dZeed<   eed<   eed<   eed<   eed<   d
d	„ZdS )ÚJobAcceleratoraý  
    Contains information about a Job accelerator (GPU).

    Args:
        type (`str`):
            Type of accelerator, e.g. `"gpu"`.
        model (`str`):
            Model of accelerator, e.g. `"T4"`, `"A10G"`, `"A100"`, `"L4"`, `"L40S"`.
        quantity (`str`):
            Number of accelerators, e.g. `"1"`, `"2"`, `"4"`, `"8"`.
        vram (`str`):
            Total VRAM, e.g. `"16 GB"`, `"24 GB"`.
        manufacturer (`str`):
            Manufacturer of the accelerator, e.g. `"Nvidia"`.
    rO   ÚmodelÚquantityÚvramÚmanufacturerrU   Nc                 óˆ   — |d         | _         |d         | _        |d         | _        |d         | _        |d         | _        d S )NrO   r§   r¨   r©   rª   )rO   r§   r¨   r©   rª   r[   s     r9   r^   zJobAccelerator.__init__¸  sB   € Ø˜6”NˆŒ	Ø˜G”_ˆŒ
Ø˜zÔ*ˆŒØ˜6”NˆŒ	Ø" >Ô2ˆÔÐÐr8   r_   )r   r   r   r   rI   rH   r^   r7   r8   r9   r¦   r¦      sf   € € € € € € ðð ð  €I€I�IØ€J€J�JØ€M€M�MØ
€I€I�IØÐÐÑð3ð 3ð 3ð 3ð 3ð 3r8   r¦   c                   ó|   — e Zd ZU dZeed<   eed<   eed<   eed<   eed<   edz  ed<   eed	<   eed
<   eed<   dd„Z	dS )ÚJobHardwareInfoa$  
    Contains information about available Job hardware.

    Args:
        name (`str`):
            Machine identifier, e.g. `"cpu-basic"`, `"a10g-large"`.
        pretty_name (`str`):
            Human-readable name, e.g. `"CPU Basic"`, `"Nvidia A10G - large"`.
        cpu (`str`):
            CPU specification, e.g. `"2 vCPU"`, `"12 vCPU"`.
        ram (`str`):
            RAM specification, e.g. `"16 GB"`, `"46 GB"`.
        ephemeral_storage (`str`):
            Ephemeral storage specification, e.g. `"20 GB"`, `"100 GB"`.
        accelerator (`JobAccelerator` or `None`):
            GPU/accelerator details if available.
        unit_cost_micro_usd (`int`):
            Cost in micro-dollars per unit, e.g. `167` (= $0.000167).
        unit_cost_usd (`float`):
            Cost in USD per unit, e.g. `0.000167`.
        unit_label (`str`):
            Cost unit period, e.g. `"minute"`.

    Example:

    ```python
    >>> from huggingface_hub import list_jobs_hardware
    >>> hardware_list = list_jobs_hardware()
    >>> hardware_list[0]
    JobHardwareInfo(name='cpu-basic', pretty_name='CPU Basic', cpu='2 vCPU', ram='16 GB', ephemeral_storage='20 GB', accelerator=None, unit_cost_micro_usd=167, unit_cost_usd=0.000167, unit_label='minute')
    >>> hardware_list[0].name
    'cpu-basic'
    ```
    rN   Úpretty_nameÚcpuÚramÚephemeral_storageNÚacceleratorÚunit_cost_micro_usdÚunit_cost_usdÚ
unit_labelrU   c                 óF  — |d         | _         |d         | _        |d         | _        |d         | _        |                     dd¦  «        | _        |                     d¦  «        }|rt          di |¤Žnd | _        |d         | _        |d	         | _	        |d
         | _
        d S )NrN   Ú
prettyNamer¯   r°   ÚephemeralStoragezN/Ar²   ÚunitCostMicroUSDÚunitCostUSDÚ	unitLabelr7   )rN   r®   r¯   r°   rZ   r±   r¦   r²   r³   r´   rµ   )r\   r]   r²   s      r9   r^   zJobHardwareInfo.__init__ï  s£   € Ø˜6”NˆŒ	Ø! ,Ô/ˆÔØ˜%”=ˆŒØ˜%”=ˆŒØ!'§¢Ð,>ÀÑ!FÔ!FˆÔØ—j’j Ñ/Ô/ˆØ<GÐQ�>Ð8Ð8¨KÐ8Ð8Ð8ÈTˆÔØ#)Ð*<Ô#=ˆÔ Ø# MÔ2ˆÔØ  Ô-ˆŒˆˆr8   r_   )
r   r   r   r   rI   rH   r¦   r`   Úfloatr^   r7   r8   r9   r­   r­   À  sœ   € € € € € € ð!ð !ðF €I€I�IØÐÐÑØ	€H€H�HØ	€H€H�HØÐÐÑØ $Ñ&Ð&Ð&Ñ&ØÐÐÑØÐÐÑØ€O€O�Oð
.ð 
.ð 
.ð 
.ð 
.ð 
.r8   r­   ÚsourcerU   c                 ó\  — t          | ¦  «                             ¦   «                              ¦   «         }t          j        t          j        ¦   «         › d|› �                     ¦   «         ¦  «                             ¦   «         dd…         }|j	         
                    dd¦  «        pd}|› d|› �S )a—  Derive a stable remote folder name for a local directory synced as a Job volume.

    The name is `{dirname}-{hash}` where the hash fingerprints the absolute path and the machine's
    hostname: re-syncing the same directory from the same machine reuses the same remote folder
    (so only changed files are re-uploaded), while same-named directories from different paths or
    machines don't collide.
    ú:Né   ú Ú_Úrootú-)r   Ú
expanduserÚresolveÚhashlibÚsha256ÚplatformÚnodeÚencodeÚ	hexdigestrN   Úreplace)r½   ÚresolvedÚdigestÚdirnames       r9   Ú_derive_job_volume_namerÑ   ü  sž   € õ �F‰|Œ|×&Ò&Ñ(Ô(×0Ò0Ñ2Ô2€HÝŒ^�xœ}™œÐ;Ð;°Ð;Ð;×BÒBÑDÔDÑEÔE×OÒOÑQÔQÐRTÐSTÐRTÔU€FØŒm×#Ò# C¨Ñ-Ô-Ð7°€GØÐ Ð ˜Ð Ð Ð r8   rN   c                 ó.   — t          j        dd| ¦  «        S )zþSanitize a string so it is a valid Job `name` label.

    Job names must match `^[a-zA-Z0-9._-]*$` and are also stored as tags, which only allow
    alphanumerics, `-` and `_`. Every other character (including `/`, `:` and `.`) is replaced with `-`.
    z[^a-zA-Z0-9_-]rÄ   )ÚreÚsub)rN   s    r9   Ú_sanitize_job_namerÕ   
  s   € õ Œ6Ð# S¨$Ñ/Ô/Ð/r8   Úpartsc                 ó¨   — t          j        d                     | ¦  «                             ¦   «         ¦  «                             ¦   «         dd…         S )z·Short, stable hash of a Job invocation (image/script + command line).

    Appended to auto-generated names so reruns of the same command share a name while different ones don't.
    ú NrÀ   )rÇ   rÈ   ÚjoinrË   rÌ   )rÖ   s    r9   Ú_short_invocation_hashrÚ     sA   € õ
 Œ>˜&Ÿ+š+ eÑ,Ô,×3Ò3Ñ5Ô5Ñ6Ô6×@Ò@ÑBÔBÀ2ÀAÀ2ÔFÐFr8   Úimagerj   c                 ó8  — t           D ]?}|                      |¦  «        r(t          | t          |¦  «        d…         p| ¦  «        } n>Œ@t          |                      d¦  «                             d¦  «        d         p| ¦  «        }|› dt          | g|¢¦  «        › �S )a›  Derive a default Job name from a Docker image or Space reference and its command.

    A short hash of the full command line is appended to group reruns of the same command.
    e.g. python:3.12 + [foo, --truc]             -> python-3-12-1a2b3c4d
         hf.co/spaces/lhoestq/duckdb             -> lhoestq-duckdb-<hash>
         pytorch/pytorch:2.6.0-cuda12.4-...      -> pytorch-2-6-0-cuda12-4-...-<hash>
    Nr‡   éÿÿÿÿrÄ   )Ú_SPACE_IMAGE_PREFIXESÚ
startswithrÕ   ÚlenÚrstripÚsplitrÚ   )rÛ   rj   ÚprefixÚbases       r9   Ú_default_job_name_from_imagerå     s®   € õ (ð Mð MˆØ×Ò˜FÑ#Ô#ð 	Ý% e­C°©K¬K¨M¨MÔ&:Ð&C¸eÑDÔDˆDØˆEð	õ " %§,¢,¨sÑ"3Ô"3×"9Ò"9¸#Ñ">Ô">¸rÔ"BÐ"KÀeÑLÔLˆØÐ@Ð@Õ+¨UÐ,=°WÐ,=Ñ>Ô>Ð@Ð@Ð@r8   ÚscriptÚscript_argsc                 óp  — |                       dd¦  «        d                               dd¦  «        d                              d¦  «                              d¦  «        d         }|                     d¦  «        r|dt          d¦  «         …         }t	          |p| ¦  «        }|› d	t          | g|¢¦  «        › �S )
aa  Derive a default Job name from a UV script path, URL, or command and its arguments.

    A short hash of the full command line is appended to group reruns of the same command.
    e.g. my_script.py + [--epochs, 3]  -> my_script-1a2b3c4d
         https://.../sft.py?raw=1      -> sft-<hash>
         lighteval                     -> lighteval-<hash>
    ú?é   r   ú#r‡   rÝ   z.pyNrÄ   )râ   rá   Úendswithrà   rÕ   rÚ   )ræ   rç   rN   rä   s       r9   Ú_default_job_name_from_scriptrí   ,  s²   € ð �<Š<˜˜QÑÔ Ô"×(Ò(¨¨aÑ0Ô0°Ô3×:Ò:¸3Ñ?Ô?×EÒEÀcÑJÔJÈ2ÔN€DØ‡}‚}�UÑÔð #Ø�M•s˜5‘z”z�k�MÔ"ˆÝ˜d˜n fÑ-Ô-€DØÐEÐEÕ+¨VÐ,B°kÐ,BÑCÔCÐEÐEÐEr8   F)rN   ro   rp   ÚexposeÚsshÚresource_group_idÚenvrm   rn   rŒ   ro   rp   rî   rï   rð   c                 óD  — |�|�d|v rt          d¦  «        ‚i |pi ¥d|i¥}|g |pi |pt          j        dœ}|r||d<   |roddddd	œ}t          |t          ¦  «        rA|d
         |v r7t          t          |d d
…         ¦  «        ||d
                  z  ¦  «        |d<   nt          |¦  «        |d<   |r||d<   |rd„ |D ¦   «         |d<   |	rd|	i|d<   |
rddi|d<   |r||d<   t          D ]3}|                      |¦  «        r| t          |¦  «        d …         |d<    nŒ4| |d<   |S )NrN   z>`name` and the `name` key in `labels` cannot both be provided.)rj   rk   rl   rn   rm   rê   é<   i  i€Q )ÚsÚmÚhÚdrÝ   ÚtimeoutSecondsro   c                 ó6   — g | ]}|                      ¦   «         ‘ŒS r7   )Úto_dict)r�   Úvols     r9   rƒ   z$_create_job_spec.<locals>.<listcomp>e  s    € Ð@Ð@Ð@°˜sŸ{š{™}œ}Ð@Ð@Ð@r8   rp   Úportsrî   ÚenabledTrï   ÚresourceGroupIdr|   r{   )
Ú
ValueErrorr   r   Ú
isinstancerI   r`   r¼   rÞ   rß   rà   )rÛ   rj   rñ   rm   rn   rŒ   rN   ro   rp   rî   rï   rð   rž   Útime_units_factorsrã   s                  r9   Ú_create_job_specr  ;  sË  € ð ÐØÐ &¨FÐ"2Ð"2ÝÐ]Ñ^Ô^Ð^Ø1�V�\˜rÐ1 F¨DÐ1Ð1ˆð ØØ�y˜bØÐ1�KÔ1ð	 ð  €Hð ð &Ø%ˆ�Ñàð 6Ø#$¨2°D¸yÐIÐIÐÝ�g�sÑ#Ô#ð 	6¨°¬Ð7IÐ(IÐ(IÝ),­U°7¸3¸B¸3´<Ñ-@Ô-@ÐCUÐV]Ð^`ÔVaÔCbÑ-bÑ)cÔ)cˆHÐ%Ñ&Ð&å),¨W©¬ˆHÐ%Ñ&àð $Ø#ˆ�Ñàð AØ@Ð@¸Ð@Ñ@Ô@ˆ�Ñàð /Ø% vÐ.ˆ�Ñà
ð ,Ø$ dÐ+ˆ�‰àð 8Ø&7ˆÐ"Ñ#å'ð (ð (ˆØ×Ò˜FÑ#Ô#ð 	Ø"'­¨F©¬¨¨Ô"6ˆH�YÑØˆEð	ð #(ˆ�ÑØ€Or8   )1rÇ   rÉ   rÓ   Údataclassesr   r   Úenumr   Úpathlibr   Útypingr   Úhuggingface_hubr   Úhuggingface_hub._space_apir
   Úhuggingface_hub.utils._datetimer   rI   r   r;   r<   r=   r>   r?   ÚTERMINAL_JOB_STAGESrÞ   rC   rL   rQ   rb   rd   r‹   r’   r–   r�   r¦   r­   rÑ   rÕ   rJ   rÚ   rå   rí   r‰   r`   r¼   r¤   r  r7   r8   r9   ú<module>r     s£  ðð €€€Ø €€€Ø 	€	€	€	Ø !Ð !Ð !Ð !Ð !Ð !Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð à %Ð %Ð %Ð %Ð %Ð %Ø -Ð -Ð -Ð -Ð -Ð -Ø :Ð :Ð :Ð :Ð :Ð :ð(&ð (&ð (&ð (&ð (&�#�tñ (&ô (&ð (&ðVð ð ð ð ˆs�Dñ ô ð ð,  Ô)¨8Ô+<¸h¼nÈhÔN^Ð_Ð ðÐ ð ðð ð ð ð ñ ô ñ „ðð ðð ð ð ð ñ ô ñ „ðð ðLð Lð Lð Lð Lñ Lô Lñ „ðLð4 ðð ð ð ð ñ ô ñ „ðð ðAGð AGð AGð AGð AGñ AGô AGñ „ðAGðH ðKð Kð Kð Kð Kñ Kô Kñ „ðKð< ð/ð /ð /ð /ð /ñ /ô /ñ „ð/ð ðað að að að añ aô añ „ðað ð@Vð @Vð @Vð @Vð @Vñ @Vô @Vñ „ð@VðF ð3ð 3ð 3ð 3ð 3ñ 3ô 3ñ „ð3ð> ð8.ð 8.ð 8.ð 8.ð 8.ñ 8.ô 8.ñ „ð8.ðv! C¨$¡Jð !°3ð !ð !ð !ð !ð0˜Sð 0 Sð 0ð 0ð 0ð 0ðG $ s¤)ð G°ð Gð Gð Gð GðA¨ð A°d¸3´ið AÀCð Að Að Að Að"F¨#ð F¸DÀ¼Ið FÈ#ð Fð Fð Fð Fð. Ø$(Ø#'Ø#ØØ$(ð;ð ;ð ;àð;ð �#ŒYð;ð 
ˆc�3ˆhŒ˜$Ñ	ð	;ð
 �#�s�(Œ^˜dÑ"ð;ð ˜#Ñ Ñ$ð;ð �5‰[˜3Ñ Ñ%ð;ð �‰*ð;ð ��c�ŒN˜TÑ!ð;ð �&Œ\˜DÑ ð;ð �ŒI˜Ñð;ð 
ð;ð ˜T‘zð;ð 
ˆ#ˆsˆ(„^ð;ð ;ð ;ð ;ð ;ð ;r8   