
    )`i                         d 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 ddlmZ dd	lmZ  G d
 de
          Z G d de	          Z e            Zd ZdS )a  Handler resolution logic for SageMaker container standards.

This module provides SageMaker-specific handler resolution using the generic
handler resolver framework.

## Handler Resolution Priority Order

### For Ping Handlers:
1. **Environment variable** specified function (CUSTOM_FASTAPI_PING_HANDLER)
2. **Registry** @custom_ping_handler decorated function
3. **Customer script** def custom_sagemaker_ping_handler function
4. **Default** handler (if any)

### For Invoke Handlers:
1. **Environment variable** specified function (CUSTOM_FASTAPI_INVOCATION_HANDLER)
2. **Registry** @custom_invocation_handler decorated function
3. **Customer script** def custom_sagemaker_invocation_handler function
4. **Default** handler (if any)

## Error Handling

- Environment variable errors are raised immediately (configuration errors)
- Customer script errors are raised if script exists but can't be loaded
- Missing handlers return None (graceful degradation)
    )AnyCallableOptionalUnion   )handler_registry)GenericHandlerResolverHandlerConfig)HandlerFileNotFoundErrorHandlerNotFoundError)logger   )SageMakerFunctionLoaderc                   z    e Zd ZdZdddZdedeedef         edf         fd	Z	dede
edef                  fd
ZdS )SageMakerHandlerConfigz)SageMaker-specific handler configuration.#custom_sagemaker_invocation_handlercustom_sagemaker_ping_handler)invokepinghandler_typereturn.Nc                 j    |dk    rt          j                    S |dk    rt          j                    S dS )z1Get handler from SageMaker environment variables.r   r   N)r   get_ping_handler_from_envget_invocation_handler_from_env)selfr   s     /home/jaya/work/projects/VOICE-AGENT/VIET/agent-env/lib/python3.11/site-packages/model_hosting_container_standards/sagemaker/handler_resolver.pyget_env_handlerz&SageMakerHandlerConfig.get_env_handler-   s=     6!!*DFFFX%%*JLLL4    c           	      v   | j                             |          }|st          j        d|            dS 	 t	          j        d|           S # t          t          f$ r7}t          j        d| dt          |          j	                    Y d}~dS d}~wt          $ r t          j        d| d            w xY w)z+Get handler from SageMaker customer script.z#No mapping found for handler type: Nzmodel:zNo customer script z function found: zCustomer script z function failed to load)HANDLER_TYPE_TO_FUNCTION_NAMEgetr   debugr   load_function_from_specr   r   type__name__	Exceptionerror)r   r   custom_function_namees       r   get_customer_script_handlerz2SageMakerHandlerConfig.get_customer_script_handler8   s	     $AEElSS# 	LM|MMNNN4	*B/-//   )*>? 	 	 	L_&:__TRSWWM]__   44444 	 	 	LQ#7QQQ   	s   A B8,B'B8)r%   
__module____qualname____doc__r    strr   r   r   r   r   r*    r   r   r   r   $   s        33 8/% %!
			xS!3,	-	 	 	 		(38$	%     r   r   c                   $     e Zd ZdZd fdZ xZS )SageMakerHandlerResolverzMSageMaker-specific handler resolver inheriting from generic resolution logic.r   Nc                 b    t                                          t                                 dS )z*Initialize the SageMaker handler resolver.N)super__init__r   )r   	__class__s    r   r4   z!SageMakerHandlerResolver.__init__V   s(    /1122222r   )r   N)r%   r+   r,   r-   r4   __classcell__)r5   s   @r   r1   r1   S   sC        WW3 3 3 3 3 3 3 3 3 3r   r1   c                  8    d }  | d            | d           d S )Nc                 l    t                               |           }|rt          j        | |           d S d S )N)	_resolverresolve_handlerr   set_handler)r   handlers     r   r;   z1register_sagemaker_overrides.<locals>.set_handler`   sC    ++L99 	@(w?????	@ 	@r   r   r   r/   )r;   s    r   register_sagemaker_overridesr=   _   s<    @ @ @
 KKr   N)r-   typingr   r   r   r   common.handler.registryr   common.handler.resolverr	   r
   
exceptionsr   r   logging_configr   sagemaker_loaderr   r   r1   r9   r=   r/   r   r   <module>rD      s   4 2 1 1 1 1 1 1 1 1 1 1 1 6 6 6 6 6 6 K K K K K K K K G G G G G G G G # # # # # # 5 5 5 5 5 5, , , , ,] , , ,^3 3 3 3 35 3 3 3 %$&&	    r   