o
    h?id                     @   sT   d Z ddlmZ ddlmZ ddlmZ ddlmZ ee	Z
dZG dd deZd	S )
un   
ServiceGuardMiddleware — blocks inference requests while the LLM service
is in training or switching mode.
    )BaseHTTPMiddleware)Request)JSONResponse)
get_logger)z/api/v1/chatz/api/v1/completionsc                   @   s   e Zd ZdZdefddZdS )ServiceGuardMiddlewarezQReturn 503 for inference endpoints when the LLM service is not in INFERENCE mode.requestc           
   
      s   |j j t fddtD ruzJddlm}m} | }| }||jkr?|	 }dd|d}t
d  d	 td
|dW S ||jkrYddd}t
d  d td
|dW S W n tyt }	 zt
d|	  W Y d }	~	nd }	~	ww ||I d H S )Nc                 3   s    | ]}  |V  qd S )N)
startswith).0prefixpath D/lsinfo/ai/hellotax_ai/base_platform/app/middleware/service_guard.py	<genexpr>   s    z2ServiceGuardMiddleware.dispatch.<locals>.<genexpr>r   )get_status_managerServiceModezDLLM service is currently in training mode. Inference is unavailable.training)detailmodetraining_infozServiceGuard blocked z: training mode activei  )status_codecontentz5LLM service is switching modes. Please retry shortly.	switching)r   r   z: switching mode activez-ServiceGuardMiddleware error (failing open): )urlr   anyGUARDED_PREFIXES'app.services.llm.service_status_managerr   r   get_current_modeTRAININGget_training_infologgerinfor   	SWITCHING	Exceptionerror)
selfr   	call_nextr   r   managerr   r   bodyer   r   r   dispatch   s6   

zServiceGuardMiddleware.dispatchN)__name__
__module____qualname____doc__r   r*   r   r   r   r   r      s    r   N)r.   starlette.middleware.baser   starlette.requestsr   starlette.responsesr   app.core.loggingr   r+   r    r   r   r   r   r   r   <module>   s    