o
    Ղi                     @   s   U d Z ddlmZ ddlmZ ddlZddlZddlmZ ee	Z
dZdZG dd	 d	eeZG d
d dZdaee ed< defddZdS )zZ
Redis-based LLM service status manager.
Manages inference/training mode switching state.
    )Enum)OptionalN)
get_loggerzllm:service:statuszllm:training:infoc                   @   s   e Zd ZdZdZdZdZdS )ServiceMode	inferencetrainingmedia_processing	switchingN)__name__
__module____qualname__	INFERENCETRAININGMEDIA_PROCESSING	SWITCHING r   r   O/lsinfo/ai/hellotax_ai/base_platform/app/services/llm/service_status_manager.pyr      s
    r   c                   @   sf   e Zd ZdejfddZdefddZdded	ee	 ddfd
dZ
dee	 fddZdefddZdS )ServiceStatusManagerredis_clientc                 C   s
   || _ d S N)_redis)selfr   r   r   r   __init__   s   
zServiceStatusManager.__init__returnc              
   C   s~   z| j t}|du rtjW S t|tr| n|}t|W S  tj	t
fy> } ztd|  tjW  Y d}~S d}~ww )zIReturn current service mode from Redis. Defaults to INFERENCE if not set.Nz*Failed to read service status from Redis: )r   getREDIS_KEY_STATUSr   r   
isinstancebytesdecoderedis
RedisError
ValueErrorloggerwarningr   valuedecodeder   r   r   get_current_mode   s   
z%ServiceStatusManager.get_current_modeNmodetraining_infoc              
   C   s   z1| j t|j |tjkr|r| j tt| n|tj	kr&| j 
t td|j  W dS  tjyG } z	td|   d}~ww )z&Set the current service mode in Redis.zService mode set to: z%Failed to set service mode in Redis: N)r   setr   r%   r   r   REDIS_KEY_TRAINING_INFOjsondumpsr   deleter"   infor   r    error)r   r)   r*   r'   r   r   r   set_mode(   s   
zServiceStatusManager.set_modec              
   C   s~   z| j t}|du rW dS t|tr| n|}t|W S  tj	tj
tfy> } ztd|  W Y d}~dS d}~ww )z7Return training task metadata stored in Redis, or None.Nz)Failed to read training info from Redis: )r   r   r,   r   r   r   r-   loadsr   r    JSONDecodeErrorr!   r"   r#   r$   r   r   r   get_training_info5   s   z&ServiceStatusManager.get_training_infoc                 C   s   |   tjkS )z(Return True only when mode is INFERENCE.)r(   r   r   )r   r   r   r   is_inference_availableA   s   z+ServiceStatusManager.is_inference_availabler   )r
   r   r   r   Redisr   r   r(   r   dictr2   r5   boolr6   r   r   r   r   r      s    r   _status_managerr   c                  C   sX   t du r*ddlm}  | jrtj| jddd}ntj| j| j| j	| j
ddd}t|a t S )z7Return the module-level ServiceStatusManager singleton.Nr   )settingsF   )decode_responsessocket_connect_timeout)hostportdbpasswordr=   r>   )r:   
app.configr;   	REDIS_URLr   from_urlr7   
REDIS_HOST
REDIS_PORTREDIS_DBREDIS_PASSWORDr   )r;   clientr   r   r   get_status_managerJ   s   rK   )__doc__enumr   typingr   r-   r   app.core.loggingr   r
   r"   r   r,   strr   r   r:   __annotations__rK   r   r   r   r   <module>   s    /