
    &`i00                     8   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ZddlmZm	Z	 ddl
mZmZmZ ddlm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  ej        e          ZdedefdZ dedee         fdZ! G d d          Z" G d de          Z#dS )z'Util class to install packages via uv.
    N)create_taskget_running_loop)DictListOptional)try_to_create_directory)dependency_utilsvirtualenv_utils)Protocol	parse_uri)RuntimeEnvPlugincheck_output_cmd)get_directory_size_bytesuv_dictreturnc                     t          j        | d          }t          j        |                    d                                                    }|S )z=Get a deterministic hash value for `uv` related runtime envs.T)	sort_keyszutf-8)jsondumpshashlibsha1encode	hexdigest)r   serialized_uv_spechash_vals      o/home/jaya/work/projects/VOICE-AGENT/VIET/agent-env/lib/python3.11/site-packages/ray/_private/runtime_env/uv.py_get_uv_hashr      sF    Gt<<<|.55g>>??IIKKHO    runtime_envc                 B   |                      d          }|t          |t                    rdt          |          z   }n^t          |t                    r"dt          t          |                    z   }n't          dt          |          j         d          d}|S )zAReturn `"uv://<hashed_dependencies>"`, or None if no GC required.uvNzuv://)r   )packagesz?uv field received by RuntimeEnvAgent must be list or dict, not .)get
isinstancedictr   list	TypeErrortype__name__)r    r"   uris      r   get_urir-      s    			B	~b$ 	L4444CCD!! 	Lr1B1B1BCCCCCC:%)"XX%6: : :  
 Jr   c            
           e Zd Zefdedddeej                 fdZdedede	dej        fd	Z
deded
e	dej        def
dZdededej        ddfdZdedee         dededej        f
dZd Zd ZdS )UvProcessor
target_dirr    
RuntimeEnvloggerc                    	 dd l }n+# t          $ r t          dt          j         d          w xY w|                    d|           || _        t          j        	                    | j        d          | _
        || _        || _        | j                                        | _        t          j                                        | _        | j                            | j                                                   d S )Nr   zPlease install virtualenv `z4 -m pip install virtualenv`to enable uv runtime env.z!Setting up uv for runtime_env: %sexec_cwd)
virtualenvImportErrorRuntimeErrorsys
executabledebug_target_dirospathjoin	_exec_cwd_runtime_env_logger	uv_config
_uv_configenvironcopy_uv_envupdateenv_vars)selfr0   r    r2   r5   s        r   __init__zUvProcessor.__init__2   s    	 	 	 	-N- - -  	 	8+FFF%d&6
CC'+5577z((D-668899999s    (/r=   cwdpip_envc                     K   t          j        |          }t          j        |          }dt          f fd}|ddddd |            g}|                    d|           t          ||||	           d
{V  d
S )zjBefore package install, make sure the required version `uv` (if specifieds)
        is installed.
        r   c                  L    j                             dd          } | rd|  S dS )z,Get `uv` executable with version to install.
uv_versionNr"   )rC   r%   )rO   rI   s    r   _get_uv_exec_to_installz8UvProcessor._install_uv.<locals>._get_uv_exec_to_installU   s5    ,,\4@@J )(J(((4r   -mpipinstallz--disable-pip-version-checkz--no-cache-dirzInstalling package uv to %sr2   rK   envN)r
   get_virtualenv_pathget_virtualenv_pythonstrinfor   )	rI   r=   rK   rL   r2   virtualenv_pathpythonrP   uv_install_cmds	   `        r   _install_uvzUvProcessor._install_uvL   s       +>tDD!7==	 	 	 	 	 	 	 )##%%
 	1?CCC~f#7SSSSSSSSSSSSr   rU   r   c                    K   t          j        |          }|dddg}	 t          ||||           d{V  dS # t          $ r Y dS w xY w)z6Check and return the existence of `uv` in virtual env.rQ   r"   versionrT   NTF)r
   rW   r   	Exception)rI   r=   rK   rU   r2   r[   check_existence_cmds          r   _check_uv_existencezUvProcessor._check_uv_existencei   s       "7== 	
	"#6v3TWXXXXXXXXXX4 	 	 	55	s   9 
AAr[   Nc                 H   K   |ddddg}t          |||           d{V  dS )zCheck virtual env dependency compatibility.
        If any incompatibility detected, exception will be thrown.

        param:
            python: the path for python executable within virtual environment.
        rQ   r"   rR   check)r2   rK   Nr   )sefr[   rK   r2   cmds        r   	_uv_checkzUvProcessor._uv_check}   s`       tT5'2
 
 
 	
 	
 	
 	
 	
 	
 	
 	
 	
r   uv_packagesc                   K   t          j        |          }t          j        |          }t          j        ||          }|                     ||||           d{V }	|	r| j                            dd          |                     ||||           d{V  t                      }
|

                    dt          j        ||           d{V  |ddddd|g}| j                            dd	g          }|r||z  }|                    d
|           t          ||||           d{V  | j                            dd          r|                     |||           d{V  dS dS )z*Install required python packages via `uv`.NrO   rQ   r"   rR   rS   z-ruv_pip_install_optionsz
--no-cachez$Installing python requirements to %srT   uv_checkF)r
   rV   rW   r	   get_requirements_filerb   rC   r%   r]   r   run_in_executorgen_requirements_txtrY   r   rg   )rI   r=   rh   rK   rL   r2   rZ   r[   requirements_file	uv_existsloopr\   uv_opt_lists                r   _install_uv_packagesz UvProcessor._install_uv_packages   s      +>tDD!7==,B4UU 224gvNNNNNNNN	  	?t22<FFR""4gv>>>>>>>>>  !!"""79JK
 
 	
 	
 	
 	
 	
 	
 	
 
 o))*B\NSS 	*k)N:OLLL~f#7SSSSSSSSSS ?z511 	6..f55555555555	6 	6r   c                 `  K   | j         }| j        }| j        d         }t          j        | j        d           	 t          j        || j        |           d {V  t          j        |          }t          j
        || j        |          4 d {V  |                     ||| j        | j        |           d {V  d d d           d {V  d S # 1 d {V swxY w Y   d S # t          $ rC |                    d|           t          j        |d           |                    d            w xY w)Nr#   T)exist_okz Delete incomplete virtualenv: %s)ignore_errorszFailed to install uv packages.)r;   rA   rC   r<   makedirsr?   r
   create_or_get_virtualenvrW   r	   	check_rayrs   rF   r`   rY   shutilrmtree	exception)rI   r=   r2   rh   r[   s        r   _runzUvProcessor._run   s
     oj1 	DNT2222	";dnf         &;DAAF'1&$.&QQ        //NL                                       	 	 	KK:DAAAM$d3333=>>>		s1   AC  *C:C  
CC  CC   AD-c                 N    |                                                                  S N)r}   	__await__)rI   s    r   r   zUvProcessor.__await__   s    yy{{$$&&&r   )r+   
__module____qualname__default_loggerrX   r   loggingLoggerrJ   r'   r]   boolrb   rg   r   r   rs   r}   r    r   r   r/   r/   1   sl       
 ,:	: :: ": (	: : : :4TT!T,0T:A.T T T T:!(,6=n	   (
S 
s 
GN 
t 
 
 
 
2626 #Y26 	26
 26 26 26 26 26h  8' ' ' ' 'r   r/   c                       e Zd ZdZdefdZdedefdZdddee         fd	Ze	fd
ede
ej                 defdZe	fd
eddddde
ej                 def
dZe	fdee         dddddej        fdZdS )UvPluginr"   resources_dirc                     t           j                            |d          | _        i | _        i | _        i | _        t          | j                   d S )Nr"   )r<   r=   r>   _uv_resource_dir_creating_task_create_locks_created_hash_bytesr   )rI   r   s     r   rJ   zUvPlugin.__init__   sK     "]D A A  7935  566666r   r   r   c                 L    t           j                            | j        |          S )zGenerate a path from the hash of a uv spec.

        Example output:
            /tmp/ray/session_2021-11-03_16-33-59_356303_41018/runtime_resources
                /uv/ray-9a7972c3a75f55e976e620484f58410c920db091
        )r<   r=   r>   r   )rI   r   s     r   _get_path_from_hashzUvPlugin._get_path_from_hash   s     w||D18<<<r   r    r1   c                 8    |                                 }|r|gS g S )zCReturn the uv URI from the RuntimeEnv if it exists, else return [].)uv_uri)rI   r    r   s      r   get_uriszUvPlugin.get_uris   s'    ##%% 	8O	r   r,   r2   c           	         |                     d|           t          |          \  }}|t          j        k    rt	          d| d|           | j                            |d          }||                                 | j        |= | 	                    |          }t          |          }| j        |= 	 t          j        |           n@# t          $ r3}|                    d| dt!          |                      Y d}~dS d}~ww xY w|S )z2Delete URI and return the number of bytes deleted.zGot request to delete uv URI %szBUvPlugin can only delete URIs with protocol uv. Received protocol z, URI NzError when deleting uv env z: r   )rY   r   r   UV
ValueErrorr   popcancelr   r   r   r   rz   r{   OSErrorwarningrX   )	rI   r,   r2   protocolr   taskuv_env_pathlocal_dir_sizees	            r   
delete_urizUvPlugin.delete_uri   s?    	5s;;;&s^^(x{""?)1? ?9<? ?   "&&x66KKMMM$X...x881+>>s#	M+&&&& 	 	 	NNPPPAPPQQQ11111	 s   4C	 	
D(DDcontextRuntimeEnvContextc                 >   	
K                                    sdS t          |          \  }	                     	          

fd}| j        vrt	          j                     j        |<    j        |         4 d {V  	 j        v r j        	         cd d d           d {V  S t           |                      x j        	<   }|	                    	 fd           | d {V }| j        	<   |cd d d           d {V  S # 1 d {V swxY w Y   d S )Nr   c                     K   t                     d {V  t                      } |                     d t                     d {V S r   )r/   r   rm   r   )rq   r2   r    r0   s    r   _create_for_hashz)UvPlugin.create.<locals>._create_for_hash'  s               $%%D--.
        r   c                 :    j                             d           S r   )r   r   )_r   rI   s    r   <lambda>z!UvPlugin.create.<locals>.<lambda>;  s    T-@-D-DXt-T-T r   )
has_uvr   r   r   asyncioLockr   r   r   add_done_callback)rI   r,   r    r   r2   r   r   r   uv_dir_bytesr   r0   s   ` ` `    @@r   createzUvPlugin.create  s"      !!## 	1&s^^(--h77

	 
	 
	 
	 
	 
	 
	 d(((&-lnnDs#%c* 	  	  	  	  	  	  	  	 4333/9	  	  	  	  	  	  	  	  	  	  	  	  	  	  4??O?O?Q?Q3R3RRD)D""#T#T#T#T#TUUU!%::::::L1=D$X.	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	 s   D,AD
DDurisc                 t   |                                 sd S |d         }t          |          \  }}|                     |          }t          j        |          }	t
          j                            |	          st          d| d| d          |	|_	        |xj
        t          j        |          z  c_
        d S )Nr   zLocal directory z	 for URI zm does not exist on the cluster. Something may have gone wrong while installing the runtime_env `uv` packages.)r   r   r   r
   rW   r<   r=   existsr   py_executablecommand_prefixget_virtualenv_activate_command)
rI   r   r    r   r2   r,   r   r   r0   virtualenv_pythons
             r   modify_contextzUvPlugin.modify_context@  s     !!## 	F1g&s^^(--h77
,B:NNw~~/00 	<: < < < < <  
 !2"2"R#
 #
 	
r   N)r+   r   r   namerX   rJ   r   r   r   r   r   r   r   intr   r   r   r   r   r   r   r      s[       D7c 7 7 7 7=C =C = = = =L T#Y     <J  ( 8	   F ,:$  $ $  "$  %	$ 
 ($  
$  $  $  $ V "0
 
3i
 "
 %	

 
 
 
 
 
 
r   r   )$__doc__r   r   r   r   r<   rz   r8   r   r   typingr   r   r   ray._common.utilsr   ray._private.runtime_envr	   r
   "ray._private.runtime_env.packagingr   r   ray._private.runtime_env.pluginr   ray._private.runtime_env.utilsr   ray._private.utilsr   	getLoggerr+   r   rX   r   r-   r/   r   r   r   r   <module>r      s        				  



 1 1 1 1 1 1 1 1 ' ' ' ' ' ' ' ' ' ' 5 5 5 5 5 5 G G G G G G G G B B B B B B B B < < < < < < ; ; ; ; ; ; 7 7 7 7 7 7""8,,$ 3     (3-    $k' k' k' k' k' k' k' k'\z
 z
 z
 z
 z
 z
 z
 z
 z
 z
r   