
    )`i                     p    d Z ddlZddlmZ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  G d	 d
          ZdS )a  SageMaker function loader for loading handlers from environment variables.

Usage:
    # Load handlers from environment variables
    ping_handler = SageMakerFunctionLoader.get_ping_handler_from_env()
    invoke_handler = SageMakerFunctionLoader.get_invocation_handler_from_env()

    # Load specific functions
    handler = SageMakerFunctionLoader.load_function_from_spec("model:predict_fn")
    N)AnyCallableOptionalUnion   )FastAPIEnvVars)HandlerSpecparse_handler_spec   )SageMakerDefaultsSageMakerEnvVarsc                   H   e Zd ZU dZdZee         ed<   ed             Z	eddee
         de
fd            Zede
defd	            Ze	 dd
e
dee
         dee         fd            Ze	 dde
dee
         deedef         e
df         fd            Ze	 ddee
         deedef         e
df         fd            Ze	 ddee
         deedef         e
df         fd            Zede
dee         fd            Zedee         fd            Zedee         fd            ZdS )SageMakerFunctionLoaderzUtility class for SageMaker function loading from environment variables.

    This class provides class methods for loading handlers and functions
    in SageMaker environments. All methods are class methods - no instantiation needed.
    N_default_function_loaderc                     | j         Ct          j        t          j        t
          j                  }|                     |          | _         | j         S )z=Get or create the default SageMaker function loader (cached).)r   osgetenvr   SAGEMAKER_MODEL_PATHr   SCRIPT_PATH_create_function_loader)clsscript_paths     /home/jaya/work/projects/VOICE-AGENT/VIET/agent-env/lib/python3.11/site-packages/model_hosting_container_standards/sagemaker/sagemaker_loader.pyget_function_loaderz+SageMakerFunctionLoader.get_function_loader   sK     '/) 57H7T K ,/+F+F{+S+SC(++    default_scriptreturnc                 \    |pt           j        }t          j        t          j        |          S )z7Get custom script filename from environment or default.)r   SCRIPT_FILENAMEr   r   r   CUSTOM_SCRIPT_FILENAME)r   r   defaults      r   get_custom_script_filenamez2SageMakerFunctionLoader.get_custom_script_filename)   s(     !E$5$Ey)@'JJJr   r   c                 2   t          j        t          j        t          j                  }|g}t           j                            ||          }ddlm	} d|i} |||          }t           j        
                    |          r|                    |           |S )z3Create a function loader for the given script path.r   )FunctionLoadermodel)r   r   r   r    r   r   pathjoin/common.custom_code_ref_resolver.function_loaderr$   isfileload_module_from_file)r   r   script_filenamesearch_pathsmodel_file_pathr$   module_aliasesfunction_loaders           r   r   z/SageMakerFunctionLoader._create_function_loader/   s     )35F5V
 
 $}',,{ODDTTTTTT!?3(.~FF 7>>/** 	C11/BBBr   speccustom_script_pathc                 ^   t          |          }|j        s|                                sdS t          j        t
          j        t          j                  }|||k    r'| 	                                
                    |          S |                     |          }|
                    |          S )z(Load function from specification string.N)r	   is_router_pathis_valid_function_specr   r   r   r   r   r   r   load_functionr   )r   r0   r1   handler_specdefault_script_pathr/   s         r   load_function_from_specz/SageMakerFunctionLoader.load_function_from_specD   s     #4(( & 	l.Q.Q.S.S 	4 !i13D3P
 

 %);?R)R)R**,,::4@@@ 556HII,,T222r   env_var.c                     t          j        |          }t          |          }|r0|j        r|j        S |j        r|                     |j        |          S dS )a  Generic method to get handler from environment variable.

        Returns:
        - Callable: When spec is a function/method specification
        - str: When spec is a router URL (starts with "/")
        - None: When environment variable is not set
        N)r   r   r
   r3   router_pathis_functionr8   r0   )r   r9   r1   spec_stringr0   s        r   _get_handler_from_envz-SageMakerFunctionLoader._get_handler_from_env]   sh     i((!+.. 	R" R''! R2249>PQQQtr   c                 B    |                      t          j        |          S )z9Get custom ping handler from CUSTOM_FASTAPI_PING_HANDLER.)r>   r   CUSTOM_FASTAPI_PING_HANDLERr   r1   s     r   get_ping_handler_from_envz1SageMakerFunctionLoader.get_ping_handler_from_envr   s%    
 ((68J
 
 	
r   c                 B    |                      t          j        |          S )zEGet custom invocation handler from CUSTOM_FASTAPI_INVOCATION_HANDLER.)r>   r   !CUSTOM_FASTAPI_INVOCATION_HANDLERrA   s     r   get_invocation_handler_from_envz7SageMakerFunctionLoader.get_invocation_handler_from_env{   s%    
 ((<>P
 
 	
r   c                 H    t          j        |          }t          |          S )zFGeneric method to get handler specification from environment variable.)r   r   r
   )r   r9   r=   s      r   _get_handler_specz)SageMakerFunctionLoader._get_handler_spec   s!     i((!+...r   c                 @    |                      t          j                  S )z&Get ping handler specification object.)rG   r   r@   r   s    r   get_ping_handler_specz-SageMakerFunctionLoader.get_ping_handler_spec   s     $$^%OPPPr   c                 @    |                      t          j                  S )z,Get invocation handler specification object.)rG   r   rD   rI   s    r   get_invocation_handler_specz3SageMakerFunctionLoader.get_invocation_handler_spec   s     $$^%UVVVr   )N)__name__
__module____qualname____doc__r   r   r   __annotations__classmethodr   strr"   r   r   r8   r   r>   rB   rE   r	   rG   rJ   rL    r   r   r   r      s          /3hsm222, , [, K K KQT K K K [K
 # #    [( <@3 33,4SM3	(	3 3 3 [30 ?C /7}	xS!3,	-   [( 15
 
!)#
	xS!3,	-
 
 
 [
 15
 
!)#
	xS!3,	-
 
 
 [
 / /0E / / / [/
 Qh{&; Q Q Q [Q WH[,A W W W [W W Wr   r   )rP   r   typingr   r   r   r   common.fastapi.configr   common.handler.specr	   r
   configr   r   r   rT   r   r   <module>rY      s   	 	 
			 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 A A A A A A A A 7 7 7 7 7 7 7 7~W ~W ~W ~W ~W ~W ~W ~W ~W ~Wr   